From 5782aba15d4b0f700003647f2e9db511de56b9aa Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 04:12:32 -0600 Subject: [PATCH 001/136] fix(runtime): preserve safe retained diagnostics --- scripts/live-required.test.mjs | 30 ++++++++++++++++--- .../tangle-sandbox-braid-stress-support.mjs | 28 +++++++++++++++++ .../tangle-sandbox-braid-stress.mjs | 10 +++++-- src/app/provider-values.ts | 17 +++++++++-- src/app/run-replay.ts | 6 ++-- test/application.test.ts | 25 ++++++++++++++++ ...angle-sandbox-braid-stress-script.test.mjs | 9 ++++++ test/w8-runs.test.ts | 21 +++++++++++++ 8 files changed, 134 insertions(+), 12 deletions(-) diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index 64fbcf3a..d4d6670c 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -653,15 +653,37 @@ test('nested credential fields and error text are redacted before public output' test('retained Sandbox error details are safe for direct proof output', () => { const secret = 'retained-sandbox-error-secret-canary-4f8c' + const networkError = Object.assign(new Error(`transport failed ${secret}`), { + name: 'NetworkError', + code: 'NETWORK_ERROR', + status: 503, + }) const rawDetails = errorDetails( - new MissingIntegrationError('provider rejected the request', { - authorization: secret, - nested: { token: secret }, - }), + Object.assign( + new MissingIntegrationError('provider rejected the request', { + authorization: secret, + nested: { token: secret }, + }), + { + cause: Object.assign(new Error(`runtime failed ${secret}`), { + code: 'RETAINED_RESULT_READ_FAILED', + cause: networkError, + }), + }, + ), ) const output = safeJson({ status: 'failed', failure: rawDetails }, { TANGLE_API_KEY: secret }) assert.doesNotMatch(output, new RegExp(secret, 'u')) assert.match(output, /\[REDACTED\]/u) + assert.deepEqual(rawDetails.fingerprint, { + name: 'MissingIntegrationError', + code: 'BRAID_LIVE_INTEGRATION_MISSING', + cause: { + name: 'Error', + code: 'RETAINED_RESULT_READ_FAILED', + cause: { name: 'NetworkError', code: 'NETWORK_ERROR', status: 503 }, + }, + }) }) test('configured supervisor failures stay unavailable and redact environment credentials', async () => { diff --git a/scripts/live-required/tangle-sandbox-braid-stress-support.mjs b/scripts/live-required/tangle-sandbox-braid-stress-support.mjs index cc1023ff..be43dc88 100644 --- a/scripts/live-required/tangle-sandbox-braid-stress-support.mjs +++ b/scripts/live-required/tangle-sandbox-braid-stress-support.mjs @@ -773,15 +773,43 @@ export function proofCoordinates() { } export function errorDetails(error) { + const fingerprint = errorFingerprint(error) return { name: error instanceof Error ? error.name : 'Error', message: error instanceof Error ? error.message : String(error), + ...(fingerprint === undefined ? {} : { fingerprint }), ...(error instanceof MissingIntegrationError ? { code: error.code, details: error.details } : {}), } } +function errorFingerprint(error, depth = 0) { + if (depth > 4 || error === null || typeof error !== 'object') return undefined + const code = + typeof error.code === 'string' && /^[A-Z][A-Z0-9_]{1,127}$/u.test(error.code) + ? error.code + : undefined + const status = + Number.isSafeInteger(error.status) && error.status >= 100 && error.status <= 599 + ? error.status + : undefined + const name = + typeof error.name === 'string' && /^[A-Za-z][A-Za-z0-9]{0,79}$/u.test(error.name) + ? error.name + : undefined + const cause = errorFingerprint(error.cause, depth + 1) + if (code === undefined && status === undefined && name === undefined && cause === undefined) { + return undefined + } + return { + ...(name === undefined ? {} : { name }), + ...(code === undefined ? {} : { code }), + ...(status === undefined ? {} : { status }), + ...(cause === undefined ? {} : { cause }), + } +} + export function terminalStatus(run) { return run && TERMINAL_STATUSES.has(run.status) ? run.status : undefined } diff --git a/scripts/live-required/tangle-sandbox-braid-stress.mjs b/scripts/live-required/tangle-sandbox-braid-stress.mjs index 099f2e84..738353d3 100644 --- a/scripts/live-required/tangle-sandbox-braid-stress.mjs +++ b/scripts/live-required/tangle-sandbox-braid-stress.mjs @@ -134,6 +134,10 @@ function sha256(value) { return createHash('sha256').update(value).digest('hex') } +export function continuityDigestMatches(value, expectedDigest) { + return value === expectedDigest || value === `${expectedDigest}\n` +} + function shellQuote(value) { return `'${String(value).replaceAll("'", "'\\''")}'` } @@ -258,8 +262,10 @@ async function verifyRetainedWorkspace(client, controlRef, coordinates, continui responsePath: continuity.responsePath, challengeBytes: continuity.bytes, expectedDigest: continuity.expectedDigest, - responseDigest: continuityResponse.trim(), - matched: continuityResponse === `${continuity.expectedDigest}\n`, + responseDigest: continuityDigestMatches(continuityResponse, continuity.expectedDigest) + ? continuity.expectedDigest + : null, + matched: continuityDigestMatches(continuityResponse, continuity.expectedDigest), }, git: { exitCode: gitExitCode, diff --git a/src/app/provider-values.ts b/src/app/provider-values.ts index 06879cef..cd4fe29d 100644 --- a/src/app/provider-values.ts +++ b/src/app/provider-values.ts @@ -16,6 +16,13 @@ function safeProperty(value: object, key: string): unknown { } } +function nestedRuntimeCode(value: unknown, depth = 0): string { + if (depth > 4 || typeof value !== 'object' || value === null) return '' + const code = safeProviderDiagnostic(safeProperty(value, 'code'), '') + if (code.length > 0) return code + return nestedRuntimeCode(safeProperty(value, 'cause'), depth + 1) +} + /** * Provider payloads are untrusted input to durable state. * @@ -28,10 +35,16 @@ function safeProperty(value: object, key: string): unknown { export function safeRuntimeDiagnostic(value: unknown, fallback: string): string { if (typeof value === 'object' && value !== null) { + const code = safeProviderDiagnostic(safeProperty(value, 'code'), '') + if (code.length > 0) { + const causeCode = nestedRuntimeCode(safeProperty(value, 'cause')) + if (causeCode.length > 0 && causeCode !== code) { + return safeProviderDiagnostic(`${code}.${causeCode}`, code) + } + return code + } const message = safeProviderDiagnostic(safeProperty(value, 'message'), '') if (message.length > 0) return message - const code = safeProviderDiagnostic(safeProperty(value, 'code'), '') - if (code.length > 0) return code const name = safeProperty(value, 'name') if (typeof name === 'string') { const typedName = name diff --git a/src/app/run-replay.ts b/src/app/run-replay.ts index 5d898c6a..759689f5 100644 --- a/src/app/run-replay.ts +++ b/src/app/run-replay.ts @@ -4,6 +4,7 @@ import type { ProviderRunSnapshot } from '../ports/execution.js' import type { ReconnectInput, ReplayPort } from './application-ports.js' import { AppError } from './errors.js' import { safeSnapshotDetail, safeSnapshotText, safeSnapshotUsage } from './provider-snapshot.js' +import { safeRuntimeDiagnostic } from './provider-values.js' import { retainedExecutionRecoveryContext } from './run-recovery-context.js' interface RecoveryReconnectInput extends ReconnectInput { @@ -69,10 +70,7 @@ export async function reconnectRun( await context.commitAndWait({ kind: 'run.unknown', runId: run.id, - detail: safeSnapshotDetail( - error instanceof Error ? error.message : error, - 'RUNTIME_RECONCILIATION_ERROR', - ), + detail: safeRuntimeDiagnostic(error, 'RUNTIME_RECONCILIATION_ERROR'), }) } return structuredClone(context.currentState()) diff --git a/test/application.test.ts b/test/application.test.ts index 770b81fc..31e17687 100644 --- a/test/application.test.ts +++ b/test/application.test.ts @@ -890,6 +890,31 @@ test('provider diagnostic getters cannot break execution failure handling', () = assert.equal(safeRuntimeDiagnostic(hostile, 'RUNTIME_EXECUTION_ERROR'), 'RUNTIME_EXECUTION_ERROR') }) +test('provider diagnostics prefer a stable code over an unsafe message', () => { + const diagnostic = Object.assign(new Error('request failed with provider-private detail'), { + code: 'RETAINED_RESULT_READ_FAILED', + }) + + assert.equal( + safeRuntimeDiagnostic(diagnostic, 'RUNTIME_EXECUTION_ERROR'), + 'RETAINED_RESULT_READ_FAILED', + ) +}) + +test('provider diagnostics retain a safe nested transport code', () => { + const diagnostic = Object.assign(new Error('request failed with provider-private detail'), { + code: 'RETAINED_RESULT_READ_FAILED', + cause: Object.assign(new Error('transport detail'), { + code: 'NETWORK_ERROR', + }), + }) + + assert.equal( + safeRuntimeDiagnostic(diagnostic, 'RUNTIME_EXECUTION_ERROR'), + 'RETAINED_RESULT_READ_FAILED.NETWORK_ERROR', + ) +}) + test('subscriber failures cannot alter a completed run', async () => { const app = createBraidApplication({ fixture: 'deterministic' }) app.subscribe(() => { diff --git a/test/tangle-sandbox-braid-stress-script.test.mjs b/test/tangle-sandbox-braid-stress-script.test.mjs index f47b13c8..dc419142 100644 --- a/test/tangle-sandbox-braid-stress-script.test.mjs +++ b/test/tangle-sandbox-braid-stress-script.test.mjs @@ -3,6 +3,7 @@ import test from 'node:test' import { cloudFailureEventTimeline, + continuityDigestMatches, hasSingleMarkerLine, runIdForOperation, sandboxWorkspaceRelativePath, @@ -42,6 +43,14 @@ const controlRef = { requestDigest: `sha256:${'a'.repeat(64)}`, } +test('workspace continuity accepts one exact digest with an optional final newline', () => { + const digest = 'a'.repeat(64) + assert.equal(continuityDigestMatches(digest, digest), true) + assert.equal(continuityDigestMatches(`${digest}\n`, digest), true) + assert.equal(continuityDigestMatches(`${digest}\n\n`, digest), false) + assert.equal(continuityDigestMatches(` ${digest}`, digest), false) +}) + function event(kind, payload) { const { provider, ...rest } = payload return { diff --git a/test/w8-runs.test.ts b/test/w8-runs.test.ts index e9fd807f..e0cfbc74 100644 --- a/test/w8-runs.test.ts +++ b/test/w8-runs.test.ts @@ -270,6 +270,27 @@ test('failed dispatch preserves its typed diagnostic when exact status is unavai assert.equal(state.lastError, 'CLOUD_PROVISION_REJECTED') }) +test('reconnect preserves its typed diagnostic when replay itself fails', async () => { + const execution: ExecutionPort = { + capabilities: () => REPLAY_CAPABILITIES, + streamTurn: () => failedAsyncIterable(new Error('transport disconnected')), + reconnect: () => + failedAsyncIterable( + Object.assign(new Error('[{"unrecognized":"runControlRef"}]'), { + code: 'RETAINED_CONTROL_REF_REJECTED', + }), + ), + status: async () => null, + } + const app = appFor(execution) + + const state = await app.send({ operationId: 'op-reconnect-diagnostic', text: 'resume once' }) + .completion + + assert.equal(state.runs[0]?.status, 'unknown') + assert.equal(state.lastError, 'RETAINED_CONTROL_REF_REJECTED') +}) + test('explicit cancellation is acknowledged and reaches cancelled, while legacy abort remains distinct', async () => { let release: (() => void) | undefined const execution: ExecutionPort = { From a49ab2c5be977ec8d53c4bb8989103033143b55b Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 04:05:04 -0600 Subject: [PATCH 002/136] fix(stream): sanitize provider output across event boundaries --- docs/components/run-stream-sanitizer.md | 20 + scripts/run-tests.mjs | 2 + src/app/application-port-builder.ts | 5 + src/app/application-ports.ts | 14 +- src/app/run-controls.ts | 44 +- src/app/run-event-mapper.ts | 27 +- src/app/run-execution.ts | 19 +- src/app/run-ingestion.ts | 35 +- src/app/run-stream-sanitizer.ts | 86 ++++ src/domain/events-legacy.ts | 3 + src/domain/reducer-helpers.ts | 4 +- src/domain/reducer-interactions.ts | 10 +- src/domain/reducer-legacy.ts | 1 + src/domain/reducer-lifecycle.ts | 21 +- src/domain/secret-sanitizer.ts | 510 +++++++++++++++++++- src/domain/terminal-sanitizer.ts | 47 +- test/run-event-mapper-stream-safety.test.ts | 344 +++++++++++++ test/scripts.test.ts | 2 + test/security.test.ts | 5 +- 19 files changed, 1146 insertions(+), 53 deletions(-) create mode 100644 docs/components/run-stream-sanitizer.md create mode 100644 src/app/run-stream-sanitizer.ts create mode 100644 test/run-event-mapper-stream-safety.test.ts diff --git a/docs/components/run-stream-sanitizer.md b/docs/components/run-stream-sanitizer.md new file mode 100644 index 00000000..a556ea35 --- /dev/null +++ b/docs/components/run-stream-sanitizer.md @@ -0,0 +1,20 @@ +# Run stream sanitizer + +The application ingestion boundary owns one incremental sanitizer for every active run stream. +Each input is a trusted-boundary candidate containing untrusted provider text and an application stream name. +Each output is safe text that may be committed to the local event journal and projected to any client surface. +The sanitizer carries terminal-control, credential-candidate, and split-Unicode state between input calls. +The sanitizer keeps stream state separate for text, reasoning, and message-part delta streams. +The sanitizer rejects terminal control payloads after the bounded control length instead of reopening visible output. +The sanitizer replaces credential assignments, bearer values, known token forms, unsafe URLs, and bidirectional controls. +The sanitizer preserves printable text and safe URLs after complete stream finalization. +The application resets all stream state after an accepted terminal event or a terminal recovery transition. +Duplicate provider events are rejected before they reach the sanitizer, so retries cannot duplicate output or advance state. +Sequence gaps are recorded without feeding the missing event placeholder into the sanitizer. +The registry refuses new streams after its bounded active-stream limit, which fails closed under orphaned provider runs. +The incremental scanner bounds candidate state while allowing the reducer's existing content budget to bound durable output. +The terminal event uses append mode for a small finalized suffix so previously committed output does not pass through a large journal payload. +The implementation does not parse provider-native protocols, launch runners, or own provider session state. +The implementation does not persist raw candidate text, sanitizer state, terminal frames, or credential values. +Focused tests cover split controls, credentials, duplicate events, replay, disconnect, cancellation, finalization, isolation, Unicode, and long safe output. +The complete local test suite remains the required proof for reducer, journal, TUI, and headless projections. diff --git a/scripts/run-tests.mjs b/scripts/run-tests.mjs index 4ae027ff..d6ed12e3 100644 --- a/scripts/run-tests.mjs +++ b/scripts/run-tests.mjs @@ -54,6 +54,7 @@ const scopeFiles = { 'plain-accessibility.test.js', 'property.test.js', 'reducer.test.js', + 'run-event-mapper-stream-safety.test.js', 'sanitize.test.js', 'scripts.test.js', 'terminal-usage-status.test.js', @@ -131,6 +132,7 @@ const scopeFiles = { 'plain-accessibility.test.js', 'profile-connection-actions.test.js', 'profile-save-recovery.test.js', + 'run-event-mapper-stream-safety.test.js', 'sanitize.test.js', 'security.test.js', 'storage-snapshots.test.js', diff --git a/src/app/application-port-builder.ts b/src/app/application-port-builder.ts index dbc222db..e3650bbf 100644 --- a/src/app/application-port-builder.ts +++ b/src/app/application-port-builder.ts @@ -25,6 +25,7 @@ import type { RunExecutionSnapshot } from './run-execution-snapshot.js' import { ingestRuntimeEvent } from './run-ingestion.js' import type { RunLedger } from './run-ledger.js' import { reconnectRun } from './run-replay.js' +import { ApplicationStreamSanitizer } from './run-stream-sanitizer.js' export interface PortViews { readonly state: StateReader @@ -72,6 +73,7 @@ export interface PortBuilderInput { } export function buildPortViews(input: PortBuilderInput): PortViews { + const streamSanitizer = new ApplicationStreamSanitizer() const restart: RestartPort = { ...input.state, ...input.journal, @@ -83,6 +85,7 @@ export function buildPortViews(input: PortBuilderInput): PortViews { ...input.journal, execution: input.execution, ledger: input.ledger, + streamSanitizer, executeControl: input.executeControl, currentEffect: (operationId) => input.effects.current(operationId), } @@ -90,6 +93,7 @@ export function buildPortViews(input: PortBuilderInput): PortViews { ...input.state, ...input.journal, ledger: input.ledger, + streamSanitizer, } const ingest = ( envelope: RuntimeEventEnvelopeLike, @@ -123,6 +127,7 @@ export function buildPortViews(input: PortBuilderInput): PortViews { clock: input.clock, execution: input.execution, ledger: input.ledger, + streamSanitizer, ingestRuntimeEvent: ingestion.ingestRuntimeEvent, reconnectRun: (request) => reconnectRun(replay, request), send: input.send, diff --git a/src/app/application-ports.ts b/src/app/application-ports.ts index dd4a930f..b357f60e 100644 --- a/src/app/application-ports.ts +++ b/src/app/application-ports.ts @@ -13,6 +13,7 @@ import type { IdSource } from '../ports/ids.js' import type { SendInput, SendReceipt } from './application-types.js' import type { RunExecutionSnapshot } from './run-execution-snapshot.js' import type { RunLedger } from './run-ledger.js' +import type { RuntimeStreamSanitizer } from './run-stream-sanitizer.js' export interface StateReader { readonly currentState: () => BraidState @@ -128,19 +129,28 @@ export type ExecutionRunPort = StateReader & LedgerAccess & RuntimeIngestionAccess & ReconnectAccess & - SendAccess + SendAccess & + RuntimeStreamSanitizerAccess export type ControlPort = StateReader & JournalWriter & ExecutionAccess & LedgerAccess & + RuntimeStreamSanitizerAccess & ControlDispatchAccess & { readonly currentEffect: (operationId: string) => EffectRecord | undefined } export type QueuePort = StateReader & JournalWriter -export type IngestionPort = StateReader & JournalWriter & LedgerAccess +export type IngestionPort = StateReader & + JournalWriter & + LedgerAccess & + RuntimeStreamSanitizerAccess + +export interface RuntimeStreamSanitizerAccess { + readonly streamSanitizer: RuntimeStreamSanitizer +} export type ReplayPort = StateReader & JournalWriter & diff --git a/src/app/run-controls.ts b/src/app/run-controls.ts index 0f9ceda3..695f3a27 100644 --- a/src/app/run-controls.ts +++ b/src/app/run-controls.ts @@ -330,15 +330,17 @@ async function control( } context.ledger.clearDetached(request.runId) if (ack.outcome === 'unknown' && !context.isTerminal(context.findRun(request.runId).status)) { - const unknown = context.commitAndWait({ - kind: 'run.unknown', - runId: request.runId, - detail: + const unknown = context.commitAndWait( + unknownEventWithPendingText( + context, + request.runId, controlKind === 'cancel' ? unknownCancellationDetail(ack.detail) : (ack.detail ?? 'Control outcome is unknown'), - }) + ), + ) if (unknown !== undefined) await unknown + context.streamSanitizer.reset(request.runId) } resolveCompletion(structuredClone(context.currentState())) })() @@ -396,12 +398,15 @@ async function settleLateControl( context.ledger.clearCancellationPending(request.runId) context.ledger.clearCancelStatus(request.runId) if (!context.isTerminal(context.findRun(request.runId).status)) { - const unknown = context.commitAndWait({ - kind: 'run.unknown', - runId: request.runId, - detail: unknownCancellationDetail(acknowledgement.detail), - }) + const unknown = context.commitAndWait( + unknownEventWithPendingText( + context, + request.runId, + unknownCancellationDetail(acknowledgement.detail), + ), + ) if (unknown !== undefined) await unknown + context.streamSanitizer.reset(request.runId) } } } @@ -451,21 +456,38 @@ async function applyAcceptedCancellation( }) if (reconciled !== undefined) await reconciled } else if (!context.isTerminal(run.status)) { + const pendingText = context.streamSanitizer.finish(request.runId, 'text') const finished = context.commitAndWait({ kind: 'run.finished', runId: request.runId, status, - finalText: '', + finalText: pendingText, + ...(pendingText.length === 0 ? {} : { finalTextMode: 'append' as const }), usage: usageSnapshotForRun(originalRun), reason: terminalReason, }) if (finished !== undefined) await finished + context.streamSanitizer.reset(request.runId) } context.ledger.clearExplicitlyCancelled(request.runId) context.ledger.clearCancellationPending(request.runId) context.ledger.clearCancelStatus(request.runId) } +function unknownEventWithPendingText( + context: ControlPort, + runId: string, + detail: string, +): BraidEvent { + const pendingText = context.streamSanitizer.finish(runId, 'text') + return { + kind: 'run.unknown', + runId, + detail, + ...(pendingText.length === 0 ? {} : { pendingText }), + } +} + function confirmedCancellationDetail(detail: string | undefined): string { return detail === undefined || detail === 'CONTROL_ACKNOWLEDGED' || diff --git a/src/app/run-event-mapper.ts b/src/app/run-event-mapper.ts index caba72fa..d0253a27 100644 --- a/src/app/run-event-mapper.ts +++ b/src/app/run-event-mapper.ts @@ -31,6 +31,7 @@ import { safeProviderDiagnostic, safePublicIdentifier, } from './provider-values.js' +import type { RuntimeStreamSanitizer } from './run-stream-sanitizer.js' function safeText(value: unknown, fallback = ''): string { return typeof value === 'string' ? redactSensitiveText(value) : fallback @@ -326,6 +327,7 @@ export function providerEventFor( runId: string, event: BraidRuntimeEvent, provider: ProviderEventMeta, + streamSanitizer?: RuntimeStreamSanitizer, ): BraidEvent { const detailEvent = event.type === 'raw' @@ -335,13 +337,18 @@ export function providerEventFor( : event switch (event.type) { case 'text_delta': - return { kind: 'run.text.delta', runId, text: safeText(event.text), provider } + return { + kind: 'run.text.delta', + runId, + text: streamSanitizer?.push(runId, 'text', event.text) ?? safeText(event.text), + provider, + } case 'reasoning_delta': return { kind: 'run.reasoning.delta', runId, partId: `${runId}:reasoning`, - text: safeText(event.text), + text: streamSanitizer?.push(runId, 'reasoning', event.text) ?? safeText(event.text), provider, } case 'tool_call': @@ -409,7 +416,10 @@ export function providerEventFor( kind: 'run.finished', runId, status: terminalStatus(event.status), - finalText: safeText(event.text), + finalText: + typeof event.text !== 'string' || event.text.length === 0 + ? (streamSanitizer?.finish(runId, 'text') ?? safeText(event.text)) + : (streamSanitizer?.complete(runId, 'final', event.text) ?? safeText(event.text)), usage: usageFromMetadata(event.metadata), ...(event.error === undefined ? {} @@ -429,7 +439,16 @@ export function providerEventFor( kind: 'run.part.updated', runId, part, - ...(event.delta === undefined ? {} : { delta: safeText(event.delta) }), + ...(typeof event.delta !== 'string' + ? {} + : { + delta: + streamSanitizer?.push( + runId, + `part:${safePublicIdentifier(event.part.id) ?? 'part-unknown'}`, + event.delta, + ) ?? safeText(event.delta), + }), provider, } } diff --git a/src/app/run-execution.ts b/src/app/run-execution.ts index c5762718..4800300d 100644 --- a/src/app/run-execution.ts +++ b/src/app/run-execution.ts @@ -139,7 +139,7 @@ async function finishWithoutTerminal( abort.signal.reason instanceof Error ? abort.signal.reason.message : 'Cancelled by user', }) } else { - await context.commitAndWait({ + await commitRequiredRecovery(context, { kind: 'run.unknown', runId: admission.runId, detail: 'The normalized event stream ended without a terminal event', @@ -211,9 +211,24 @@ async function commitRequiredRecovery( context: ExecutionRunPort, event: import('../domain/events.js').BraidEvent, ): Promise { + let durableEvent = event + if (event.kind === 'run.finished' && event.finalText.length === 0) { + const pending = finishPendingText(context, event.runId) + if (pending.length > 0) durableEvent = { ...event, finalText: pending, finalTextMode: 'append' } + } else if (event.kind === 'run.unknown') { + const pending = finishPendingText(context, event.runId) + if (pending.length > 0) durableEvent = { ...event, pendingText: pending } + } const commit = context.commitAndWaitRecovery ?? context.commitAndWait - const result = commit(event) + const result = commit(durableEvent) if (result !== undefined) await result + if (event.kind === 'run.finished' || event.kind === 'run.unknown') + context.streamSanitizer.reset(event.runId) +} + +function finishPendingText(context: ExecutionRunPort, runId: string): string { + const pending = context.streamSanitizer.finish(runId, 'text') + return pending } export async function drainQueue(context: ExecutionRunPort & SendAccess): Promise { diff --git a/src/app/run-ingestion.ts b/src/app/run-ingestion.ts index bd08aaf4..ca471515 100644 --- a/src/app/run-ingestion.ts +++ b/src/app/run-ingestion.ts @@ -34,7 +34,7 @@ export function ingestRuntimeEvent( envelope.sequence <= (range.toSequence ?? range.fromSequence), ) if (!isMissing) return { accepted: false, duplicate: true } - return afterCommit(context.commitAndWait(eventFromEnvelope(envelope)), { + return afterCommit(context, envelope, commitEnvelope(context, envelope), { accepted: true, duplicate: false, }) @@ -68,17 +68,41 @@ export function ingestRuntimeEvent( ) return afterCommits(commits, { accepted: false, duplicate: false, sequenceGap: gap }) } - return afterCommit(context.commitAndWait(eventFromEnvelope(envelope)), { + return afterCommit(context, envelope, commitEnvelope(context, envelope), { accepted: true, duplicate: false, }) } function afterCommit( + context: IngestionPort, + envelope: RuntimeEventEnvelope, commit: void | Promise, result: RuntimeEventIngestionResult, ): RuntimeEventIngestionResult | Promise { - return isPromiseLike(commit) ? commit.then(() => result) : result + if (isPromiseLike(commit)) + return commit.then(() => { + if (envelope.event.type === 'final') context.streamSanitizer.reset(envelope.runId) + return result + }) + if (envelope.event.type === 'final') context.streamSanitizer.reset(envelope.runId) + return result +} + +function commitEnvelope( + context: IngestionPort, + envelope: RuntimeEventEnvelope, +): void | Promise { + const event = eventFromEnvelope(context, envelope) + if ( + event.kind !== 'run.finished' || + envelope.event.type !== 'final' || + (envelope.event.text !== undefined && envelope.event.text.length > 0) || + event.finalText.length === 0 + ) + return context.commitAndWait(event) + + return context.commitAndWait({ ...event, finalTextMode: 'append' }) } function afterCommits( @@ -98,7 +122,7 @@ function isPromiseLike(value: unknown): value is Promise { ) } -function eventFromEnvelope(envelope: RuntimeEventEnvelope) { +function eventFromEnvelope(context: IngestionPort, envelope: RuntimeEventEnvelope) { const meta: ProviderEventMeta = safeProviderMeta( { eventId: envelope.eventId, @@ -109,5 +133,6 @@ function eventFromEnvelope(envelope: RuntimeEventEnvelope) { }, envelope.sequence, ) - return providerEventFor(envelope.runId, envelope.event, meta) + const event = providerEventFor(envelope.runId, envelope.event, meta, context.streamSanitizer) + return event } diff --git a/src/app/run-stream-sanitizer.ts b/src/app/run-stream-sanitizer.ts new file mode 100644 index 00000000..2cd0f54e --- /dev/null +++ b/src/app/run-stream-sanitizer.ts @@ -0,0 +1,86 @@ +import { IncrementalSecretTextSanitizer } from '../domain/secret-sanitizer.js' + +/** Bounds the number of provider streams that one application retains. */ +export const MAX_ACTIVE_RUNTIME_STREAMS = 256 + +/** A stream name is application-owned and never contains provider payload data. */ +export type RuntimeStreamName = 'text' | 'reasoning' | 'final' | `part:${string}` + +export interface RuntimeStreamSanitizer { + readonly push: (runId: string, stream: RuntimeStreamName, text: string) => string + readonly complete: (runId: string, stream: RuntimeStreamName, text: string) => string + readonly finish: (runId: string, stream: RuntimeStreamName) => string + readonly reset: (runId: string) => void +} + +interface ActiveStream { + readonly sanitizer: IncrementalSecretTextSanitizer + finished: boolean +} + +/** Owns incremental provider text state at the application ingestion boundary. */ +export class ApplicationStreamSanitizer implements RuntimeStreamSanitizer { + readonly #streams = new Map>() + readonly #maxActiveStreams: number + #activeStreams = 0 + + constructor(maxActiveStreams = MAX_ACTIVE_RUNTIME_STREAMS) { + if (!Number.isSafeInteger(maxActiveStreams) || maxActiveStreams < 1) + throw new RangeError('maxActiveStreams must be a positive safe integer') + this.#maxActiveStreams = maxActiveStreams + } + + push(runId: string, stream: RuntimeStreamName, text: string): string { + if (typeof text !== 'string' || text.length === 0) return '' + const active = this.#getOrCreate(runId, stream) + if (active === undefined || active.finished) return '' + return active.sanitizer.push(text) + } + + complete(runId: string, stream: RuntimeStreamName, text: string): string { + if (typeof text !== 'string') return this.finish(runId, stream) + const active = this.#getOrCreate(runId, stream) + if (active === undefined) return '' + if (active.finished) return '' + const output = `${active.sanitizer.push(text)}${active.sanitizer.finish()}` + active.finished = true + return output + } + + finish(runId: string, stream: RuntimeStreamName): string { + const active = this.#streams.get(runId)?.get(stream) + if (active === undefined) return '' + if (active.finished) return '' + active.finished = true + return active.sanitizer.finish() + } + + reset(runId: string): void { + const streams = this.#streams.get(runId) + if (streams === undefined) return + this.#activeStreams -= streams.size + this.#streams.delete(runId) + } + + get activeStreamCount(): number { + return this.#activeStreams + } + + #getOrCreate(runId: string, stream: RuntimeStreamName): ActiveStream | undefined { + let streams = this.#streams.get(runId) + const existing = streams?.get(stream) + if (existing !== undefined) return existing + if (this.#activeStreams >= this.#maxActiveStreams) return undefined + if (streams === undefined) { + streams = new Map() + this.#streams.set(runId, streams) + } + const active = { + sanitizer: new IncrementalSecretTextSanitizer(Number.POSITIVE_INFINITY), + finished: false, + } + streams.set(stream, active) + this.#activeStreams += 1 + return active + } +} diff --git a/src/domain/events-legacy.ts b/src/domain/events-legacy.ts index 6cd1302c..8a94ecf5 100644 --- a/src/domain/events-legacy.ts +++ b/src/domain/events-legacy.ts @@ -174,6 +174,8 @@ export type LegacyBraidEvent = readonly runId: string readonly status: RunTerminalStatus readonly finalText: string + /** Appends a sanitized terminal suffix to already persisted stream text. */ + readonly finalTextMode?: 'append' readonly usage: TurnUsage readonly error?: string readonly reason?: string @@ -223,6 +225,7 @@ export type LegacyBraidEvent = readonly kind: 'run.unknown' readonly runId: string readonly detail: string + readonly pendingText?: string } | { readonly kind: 'application.shutdown.requested' diff --git a/src/domain/reducer-helpers.ts b/src/domain/reducer-helpers.ts index 01f4587a..fb227043 100644 --- a/src/domain/reducer-helpers.ts +++ b/src/domain/reducer-helpers.ts @@ -419,14 +419,16 @@ export function updateMessageFinal( status: BraidMessage['status'], partStatus: NonNullable, at: string, + mode: 'replace' | 'append' = 'replace', ): BraidState { const message = state.messages.find( (entry) => entry.runId === runId && entry.role === 'assistant', ) if (!message) throw new DomainInvariantError(`Assistant message for run ${runId} does not exist`) + const nextText = mode === 'append' ? `${message.text}${text}` : text const nextMessage = { ...message, - text: text || message.text, + text: nextText || message.text, status, complete: status === 'complete', parts: message.parts.map((part) => diff --git a/src/domain/reducer-interactions.ts b/src/domain/reducer-interactions.ts index 316f21fc..031cd1ac 100644 --- a/src/domain/reducer-interactions.ts +++ b/src/domain/reducer-interactions.ts @@ -421,17 +421,21 @@ function reduceFinishedEvent( messages: updateMessage(state, event.runId, (message) => { const source = sourceFromProvider(event.provider) const existingTextPart = message.parts.find((part) => part.kind === 'text') - const withFinalPart = event.finalText + const finalText = + event.finalTextMode === 'append' + ? `${message.text}${finalReservation.value}` + : finalReservation.value + const withFinalPart = finalText ? upsertPart(message, { id: existingTextPart?.id ?? `${event.runId}:text`, kind: 'text', - text: finalReservation.value, + text: finalText, ...(source === undefined ? {} : { source }), }) : message return { ...withFinalPart, - text: finalReservation.value || withFinalPart.text, + text: finalText || withFinalPart.text, status: messageStatus, complete: event.status !== 'unknown' && !hasMissingHistory, parts: withFinalPart.parts.map((part) => diff --git a/src/domain/reducer-legacy.ts b/src/domain/reducer-legacy.ts index 83a986b7..99f04f8a 100644 --- a/src/domain/reducer-legacy.ts +++ b/src/domain/reducer-legacy.ts @@ -203,6 +203,7 @@ export function reduceLegacyEvent( messageStatus, terminalPartStatus(event.status), at, + event.finalTextMode === 'append' ? 'append' : 'replace', ) const turn = next.turns.find((entry) => entry.id === run.turnId) if (turn) diff --git a/src/domain/reducer-lifecycle.ts b/src/domain/reducer-lifecycle.ts index 620d2e68..5b2661b5 100644 --- a/src/domain/reducer-lifecycle.ts +++ b/src/domain/reducer-lifecycle.ts @@ -21,6 +21,7 @@ import { terminalPartStatus, updateMessage, updateRun, + upsertPart, } from './reducer-support.js' import { LEGACY_RUN_CAPABILITIES } from './runtime-projection.js' import type { BraidState } from './state.js' @@ -246,7 +247,11 @@ export function reduceLifecycleEvent( activeRunId: state.activeRunId === event.runId ? null : state.activeRunId, messages: state.messages.map((message) => message.runId === event.runId && message.role === 'assistant' - ? { ...message, status: 'incomplete', complete: false } + ? { + ...withPendingText(message, event.runId, event.pendingText), + status: 'incomplete', + complete: false, + } : message, ), runs: updateRun(state, event.runId, (run) => @@ -264,6 +269,20 @@ export function reduceLifecycleEvent( } } +function withPendingText( + message: import('./state.js').BraidMessage, + runId: string, + pendingText: string | undefined, +): import('./state.js').BraidMessage { + if (pendingText === undefined || pendingText.length === 0) return message + const textPart = message.parts.find((part) => part.kind === 'text') + return upsertPart(message, { + id: textPart?.id ?? `${runId}:text`, + kind: 'text', + text: `${message.text}${pendingText}`, + }) +} + function reduceRequestedRun( state: BraidState, event: Extract, diff --git a/src/domain/secret-sanitizer.ts b/src/domain/secret-sanitizer.ts index b8ffcf84..6e03151b 100644 --- a/src/domain/secret-sanitizer.ts +++ b/src/domain/secret-sanitizer.ts @@ -5,6 +5,7 @@ export const SECRET_TRUNCATION_MARKER = '… [truncated]' const MAX_PENDING_BYTES = 4096 const MAX_LOOKBEHIND_CHARS = 1024 const BIDI_CONTROLS = /\p{Bidi_Control}/gu +const BIDI_CHARACTER = /\p{Bidi_Control}/u const SECRET_ASSIGNMENT = /(^|[\s,;{[(])(?:password|passwd|passphrase|token|secret|credential|authorization|auth|key|api[_ -]*key|access[_ -]*key|private[_ -]*key|client[_ -]*secret|signature|cookie|header|query|fragment)\s*[:=]\s*(?:"[^"]*"|'[^']*'|[^\s,;}\])}]*)/giu const BEARER_ASSIGNMENT = /\bBearer(?:\s+|\s*=\s*)[^\s,;]*/giu @@ -19,8 +20,147 @@ const INCOMPLETE_ASSIGNMENT = const INCOMPLETE_BARE_CREDENTIAL = /(?:sk-|github_pat_|gh[pousr]_|AKIA|AIza|xox[baprs]-)[A-Za-z0-9_-]*$/u +const STREAM_BEARER_PREFIX = 'bearer' +const STREAM_URL_PREFIXES = ['http://', 'https://'] as const +const STREAM_SECRET_NAMES = [ + 'password', + 'passwd', + 'passphrase', + 'token', + 'secret', + 'credential', + 'authorization', + 'auth', + 'key', + 'api_key', + 'api-key', + 'api key', + 'access_key', + 'access-key', + 'access key', + 'private_key', + 'private-key', + 'private key', + 'client_secret', + 'client-secret', + 'client secret', + 'signature', + 'cookie', + 'header', + 'query', + 'fragment', +] as const +const STREAM_BARE_PREFIXES = [ + { prefix: 'sk-', minimumBodyBytes: 20 }, + { prefix: 'github_pat_', minimumBodyBytes: 20 }, + { prefix: 'ghp_', minimumBodyBytes: 20 }, + { prefix: 'gho_', minimumBodyBytes: 20 }, + { prefix: 'ghu_', minimumBodyBytes: 20 }, + { prefix: 'ghs_', minimumBodyBytes: 20 }, + { prefix: 'ghr_', minimumBodyBytes: 20 }, + { prefix: 'AKIA', minimumBodyBytes: 16 }, + { prefix: 'AIza', minimumBodyBytes: 30 }, + { prefix: 'xoxb-', minimumBodyBytes: 20 }, + { prefix: 'xoxa-', minimumBodyBytes: 20 }, + { prefix: 'xoxp-', minimumBodyBytes: 20 }, + { prefix: 'xoxr-', minimumBodyBytes: 20 }, + { prefix: 'xoxs-', minimumBodyBytes: 20 }, +] as const +const STREAM_MAX_PENDING_BYTES = 4096 + type PendingSecret = 'bearer' | 'assignment' | 'bare' | 'url' +type IncrementalRedactionState = + | 'normal' + | 'candidate' + | 'assignment-gap' + | 'assignment-value' + | 'bearer-gap' + | 'bearer-discard' + | 'bare-token' + | 'bare-discard' + | 'url-body' + | 'url-discard' + +function isHighSurrogate(character: string): boolean { + return ( + character.length === 1 && character.charCodeAt(0) >= 0xd800 && character.charCodeAt(0) <= 0xdbff + ) +} + +function isLowSurrogate(character: string): boolean { + return ( + character.length === 1 && character.charCodeAt(0) >= 0xdc00 && character.charCodeAt(0) <= 0xdfff + ) +} + +function isStreamAssignmentBoundary(character: string | undefined): boolean { + return character === undefined || /[\s,;{[(]/u.test(character) +} + +function isStreamBearerBoundary(character: string | undefined): boolean { + return character === undefined || !/[A-Za-z0-9_]/u.test(character) +} + +function isStreamUrlCharacter(character: string): boolean { + const code = character.codePointAt(0) ?? 0 + return code > 0x20 && code !== 0x7f && !/[<>"']/u.test(character) +} + +function isStreamAssignmentDelimiter(character: string): boolean { + return /[\s,;}\])}]/u.test(character) +} + +function isStreamBearerDelimiter(character: string): boolean { + return /[\s,;]/u.test(character) +} + +function isStreamBareCharacter(character: string): boolean { + return /[A-Za-z0-9_-]/u.test(character) +} + +function streamCaseInsensitivePrefix(value: string, prefix: string): boolean { + return prefix.startsWith(value.toLowerCase()) +} + +function streamCandidateIsPrefix(value: string): boolean { + return ( + streamCaseInsensitivePrefix(value, STREAM_BEARER_PREFIX) || + STREAM_URL_PREFIXES.some((prefix) => streamCaseInsensitivePrefix(value, prefix)) || + streamSecretNameIsPrefix(value) || + STREAM_BARE_PREFIXES.some(({ prefix }) => prefix.startsWith(value)) + ) +} + +function streamAssignmentName(value: string): boolean { + return STREAM_SECRET_NAMES.some((name) => streamSecretNameMatches(value, name, true)) +} + +function streamSecretNameIsPrefix(value: string): boolean { + if (value.length === 0) return false + return STREAM_SECRET_NAMES.some((name) => streamSecretNameMatches(value, name, false)) +} + +function streamSecretNameMatches(value: string, name: string, complete: boolean): boolean { + const words = name.split(/[_ -]+/u) + const lowerValue = value.toLowerCase() + let offset = 0 + for (const [index, word] of words.entries()) { + if (offset === lowerValue.length) return !complete || index < words.length + const remainder = lowerValue.slice(offset) + if (remainder.length < word.length) return !complete && word.startsWith(remainder) + if (!remainder.startsWith(word)) return false + offset += word.length + if (index === words.length - 1) return offset === lowerValue.length + while (offset < lowerValue.length && /[_ -]/u.test(lowerValue[offset] ?? '')) offset += 1 + } + return !complete && offset === lowerValue.length +} + +function streamBarePrefix(value: string): (typeof STREAM_BARE_PREFIXES)[number] | undefined { + return STREAM_BARE_PREFIXES.find(({ prefix }) => prefix === value) +} + function isUrlDelimiter(character: string | undefined): boolean { if (character === undefined || /\s/u.test(character)) return true const code = character.codePointAt(0) ?? 0 @@ -66,15 +206,17 @@ function isSensitiveName(value: string): boolean { } function redactUrls(value: string): string { - return value.replace(WEB_URL, (candidate) => { - let url = candidate - let suffix = '' - while (/[),.;!?\]}]$/u.test(url)) { - suffix = `${url.at(-1)}${suffix}` - url = url.slice(0, -1) - } - return safeUrl(url) ? candidate : `[redacted link]${suffix}` - }) + return value.replace(WEB_URL, redactUrl) +} + +function redactUrl(candidate: string): string { + let url = candidate + let suffix = '' + while (/[),.;!?\]}]$/u.test(url)) { + suffix = `${url.at(-1)}${suffix}` + url = url.slice(0, -1) + } + return safeUrl(url) ? candidate : `[redacted link]${suffix}` } function redactStable(value: string): string { @@ -249,6 +391,356 @@ export class SecretTextSanitizer { } } +/** Emits safe text promptly while retaining only an active control or credential candidate. */ +export class IncrementalSecretTextSanitizer { + readonly #terminal = new TerminalControlSanitizer() + readonly #maxOutputBytes: number + #state: IncrementalRedactionState = 'normal' + #pending = '' + #pendingBytes = 0 + #assignmentEligible = false + #assignmentQuote: string | undefined + #assignmentValueStarted = false + #bareMinimumBodyBytes = 0 + #bareBodyBytes = 0 + #outputBytes = 0 + #truncated = false + #lastCharacter: string | undefined + #pendingHighSurrogate: string | undefined + + constructor(maxOutputBytes = MAX_SANITIZED_TEXT_BYTES) { + this.#maxOutputBytes = maxOutputBytes + } + + push(input: string): string { + if (typeof input !== 'string' || input.length === 0) return '' + const normalized = this.#normalizeChunk(input) + if (normalized.length === 0) return '' + return this.#consumeVisible(this.#terminal.push(normalized)) + } + + finish(): string { + const output: string[] = [] + if (this.#pendingHighSurrogate !== undefined) { + this.#pendingHighSurrogate = undefined + output.push(this.#consumeVisible(this.#terminal.push('\ufffd'))) + } + this.#finishRedaction(output) + this.#terminal.finish() + if (this.#truncated && this.#outputBytes < this.#maxOutputBytes) { + this.#append( + output, + takeUtf8Prefix(SECRET_TRUNCATION_MARKER, this.#maxOutputBytes - this.#outputBytes), + ) + } + return output.join('') + } + + #normalizeChunk(input: string): string { + let normalized = '' + for (const character of input) { + if (this.#pendingHighSurrogate !== undefined) { + if (isLowSurrogate(character)) { + normalized += `${this.#pendingHighSurrogate}${character}` + this.#pendingHighSurrogate = undefined + continue + } + normalized += '\ufffd' + this.#pendingHighSurrogate = undefined + } + if (isHighSurrogate(character)) this.#pendingHighSurrogate = character + else normalized += character + } + return normalized + } + + #consumeVisible(input: string): string { + const output: string[] = [] + for (const character of input) { + if (BIDI_CHARACTER.test(character)) continue + this.#consumeCharacter(character, output) + } + return output.join('') + } + + #consumeCharacter(character: string, output: string[]): void { + for (;;) { + if (this.#state === 'normal') { + if (streamCandidateIsPrefix(character)) { + this.#state = 'candidate' + this.#pending = character + this.#pendingBytes = Buffer.byteLength(character, 'utf8') + this.#assignmentEligible = isStreamAssignmentBoundary(this.#lastCharacter) + return + } + this.#append(output, character) + this.#lastCharacter = character + return + } + if (this.#state === 'candidate') { + if (!this.#assignmentEligible && /\s/u.test(character)) { + this.#emitLiteral(output, this.#pending) + this.#clearPending() + this.#state = 'normal' + continue + } + const candidate = `${this.#pending}${character}` + if (streamCandidateIsPrefix(candidate)) { + this.#pending = candidate + this.#pendingBytes += Buffer.byteLength(character, 'utf8') + const bare = streamBarePrefix(candidate) + if (bare !== undefined) { + this.#state = 'bare-token' + this.#bareMinimumBodyBytes = bare.minimumBodyBytes + this.#bareBodyBytes = 0 + } else if (STREAM_URL_PREFIXES.some((prefix) => prefix === candidate.toLowerCase())) { + this.#state = 'url-body' + } + return + } + if (this.#assignmentEligible && streamAssignmentName(this.#pending)) { + if (/\s/u.test(character)) { + this.#pending += character + this.#pendingBytes += Buffer.byteLength(character, 'utf8') + this.#state = 'assignment-gap' + return + } + if (character === ':' || character === '=') { + this.#beginAssignment(output) + return + } + } + if ( + this.#pending.toLowerCase() === STREAM_BEARER_PREFIX && + isStreamBearerBoundary(this.#lastCharacter) + ) { + if (/\s|=/u.test(character)) { + this.#pending += character + this.#pendingBytes += Buffer.byteLength(character, 'utf8') + this.#state = 'bearer-gap' + return + } + } + this.#emitLiteral(output, this.#pending) + this.#clearPending() + this.#state = 'normal' + continue + } + if (this.#state === 'assignment-gap') { + if (/\s/u.test(character)) { + this.#pending += character + this.#pendingBytes += Buffer.byteLength(character, 'utf8') + if (this.#pendingBytes > STREAM_MAX_PENDING_BYTES) this.#beginAssignment(output) + return + } + if (character === ':' || character === '=') { + this.#beginAssignment(output) + return + } + this.#emitLiteral(output, this.#pending) + this.#clearPending() + this.#state = 'normal' + continue + } + if (this.#state === 'assignment-value') { + if (!this.#assignmentValueStarted) { + if (/\s/u.test(character)) return + if (character === '"' || character === "'") { + this.#assignmentQuote = character + this.#assignmentValueStarted = true + return + } + if (isStreamAssignmentDelimiter(character)) { + this.#resetRedactionState() + continue + } + this.#assignmentValueStarted = true + return + } + if (this.#assignmentQuote !== undefined) { + if (character === this.#assignmentQuote) this.#resetRedactionState() + return + } + if (isStreamAssignmentDelimiter(character)) { + this.#resetRedactionState() + continue + } + return + } + if (this.#state === 'bearer-gap') { + if (/\s|=/u.test(character)) { + this.#pending += character + this.#pendingBytes += Buffer.byteLength(character, 'utf8') + if (this.#pendingBytes > STREAM_MAX_PENDING_BYTES) this.#beginBearerDiscard(output) + return + } + if (character === ',' || character === ';') { + this.#beginBearerDiscard(output) + this.#resetRedactionState() + continue + } + this.#beginBearerDiscard(output) + return + } + if (this.#state === 'bearer-discard') { + if (isStreamBearerDelimiter(character)) { + this.#resetRedactionState() + continue + } + return + } + if (this.#state === 'bare-token') { + if (isStreamBareCharacter(character)) { + this.#pending += character + this.#pendingBytes += Buffer.byteLength(character, 'utf8') + this.#bareBodyBytes += Buffer.byteLength(character, 'utf8') + if ( + this.#bareBodyBytes >= this.#bareMinimumBodyBytes || + this.#pendingBytes > STREAM_MAX_PENDING_BYTES + ) + this.#beginBareDiscard(output) + return + } + if (this.#bareBodyBytes >= this.#bareMinimumBodyBytes) this.#beginBareDiscard(output) + else this.#emitLiteral(output, this.#pending) + this.#clearPending() + this.#state = 'normal' + continue + } + if (this.#state === 'bare-discard') { + if (!isStreamBareCharacter(character)) { + this.#resetRedactionState() + continue + } + return + } + if (this.#state === 'url-body') { + if (isStreamUrlCharacter(character)) { + this.#pending += character + this.#pendingBytes += Buffer.byteLength(character, 'utf8') + if (this.#pendingBytes > STREAM_MAX_PENDING_BYTES) this.#beginUrlDiscard(output) + return + } + const redacted = redactStable(`${redactUrl(this.#pending)}${character}`) + this.#append(output, redacted) + this.#clearPending() + this.#state = 'normal' + this.#lastCharacter = character + if (redacted.includes('[redacted bearer]')) this.#state = 'bearer-discard' + else if (redacted.includes('[redacted secret]')) this.#state = 'assignment-value' + else if (redacted.includes('[redacted credential]')) this.#state = 'bare-discard' + return + } + if (this.#state === 'url-discard') { + if (!isStreamUrlCharacter(character)) { + this.#resetRedactionState() + continue + } + return + } + const exhaustive: never = this.#state + throw new Error(`Unknown incremental redaction state: ${exhaustive}`) + } + } + + #beginAssignment(output: string[]): void { + this.#append(output, '[redacted secret]') + this.#lastCharacter = ']' + this.#clearPending() + this.#state = 'assignment-value' + this.#assignmentQuote = undefined + this.#assignmentValueStarted = false + } + + #beginBearerDiscard(output: string[]): void { + this.#append(output, '[redacted bearer]') + this.#lastCharacter = ']' + this.#clearPending() + this.#state = 'bearer-discard' + } + + #beginBareDiscard(output: string[]): void { + this.#append(output, '[redacted credential]') + this.#lastCharacter = ']' + this.#clearPending() + this.#state = 'bare-discard' + } + + #beginUrlDiscard(output: string[]): void { + this.#append(output, '[redacted link]') + this.#lastCharacter = ']' + this.#clearPending() + this.#state = 'url-discard' + } + + #finishRedaction(output: string[]): void { + switch (this.#state) { + case 'candidate': + this.#emitLiteral(output, this.#pending) + break + case 'assignment-gap': + this.#beginAssignment(output) + break + case 'assignment-value': + case 'bearer-discard': + case 'bare-discard': + case 'url-discard': + break + case 'bearer-gap': + this.#beginBearerDiscard(output) + break + case 'bare-token': + if (this.#bareBodyBytes >= this.#bareMinimumBodyBytes) this.#beginBareDiscard(output) + else this.#emitLiteral(output, this.#pending) + break + case 'url-body': + this.#append(output, redactStable(redactUrl(this.#pending))) + break + case 'normal': + break + default: { + const exhaustive: never = this.#state + throw new Error(`Unknown incremental redaction state: ${exhaustive}`) + } + } + this.#clearPending() + this.#state = 'normal' + } + + #emitLiteral(output: string[], value: string): void { + if (value.length === 0) return + this.#append(output, value) + this.#lastCharacter = [...value].at(-1) + } + + #append(output: string[], value: string): void { + if (value.length === 0) return + const remaining = this.#maxOutputBytes - this.#outputBytes + if (remaining <= 0) { + this.#truncated = true + return + } + const bounded = takeUtf8Prefix(value, remaining) + this.#outputBytes += Buffer.byteLength(bounded, 'utf8') + if (bounded.length !== value.length) this.#truncated = true + output.push(bounded) + } + + #clearPending(): void { + this.#pending = '' + this.#pendingBytes = 0 + this.#bareMinimumBodyBytes = 0 + this.#bareBodyBytes = 0 + } + + #resetRedactionState(): void { + this.#clearPending() + this.#state = 'normal' + this.#assignmentQuote = undefined + this.#assignmentValueStarted = false + } +} + function incompleteSecret( stable: string, tail: string, diff --git a/src/domain/terminal-sanitizer.ts b/src/domain/terminal-sanitizer.ts index bbc36877..8dd1f7bf 100644 --- a/src/domain/terminal-sanitizer.ts +++ b/src/domain/terminal-sanitizer.ts @@ -1,6 +1,13 @@ -const MAX_CONTROL_BYTES = 4096 +export const MAX_TERMINAL_CONTROL_BYTES = 4096 -type ControlState = 'normal' | 'escape' | 'csi' | 'osc' | 'string' | 'string-escape' +type ControlState = + | 'normal' + | 'escape' + | 'escape-intermediate' + | 'csi' + | 'osc' + | 'string' + | 'string-escape' function isStringIntroducer(code: number): boolean { return code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f @@ -14,6 +21,7 @@ function isC1(code: number): boolean { export class TerminalControlSanitizer { #state: ControlState = 'normal' #controlBytes = 0 + #controlOverflowed = false push(input: string): string { let output = '' @@ -44,46 +52,63 @@ export class TerminalControlSanitizer { finish(): string { this.#state = 'normal' this.#controlBytes = 0 + this.#controlOverflowed = false return '' } #startControl(state: ControlState): void { this.#state = state this.#controlBytes = 1 + this.#controlOverflowed = false } #consumeControl(character: string, code: number): void { - this.#controlBytes += 1 - if (this.#controlBytes > MAX_CONTROL_BYTES) { - this.#state = 'normal' - this.#controlBytes = 0 - return + if (!this.#controlOverflowed) { + this.#controlBytes += Buffer.byteLength(character, 'utf8') + if (this.#controlBytes > MAX_TERMINAL_CONTROL_BYTES) { + this.#controlBytes = MAX_TERMINAL_CONTROL_BYTES + this.#controlOverflowed = true + } } if (this.#state === 'escape') { if (character === '[') this.#state = 'csi' else if (character === ']') this.#state = 'osc' else if (character === 'P' || character === 'X' || character === '^' || character === '_') this.#state = 'string' - else this.#state = 'normal' + else if (code >= 0x20 && code <= 0x2f) this.#state = 'escape-intermediate' + else this.#reset() + return + } + if (this.#state === 'escape-intermediate') { + if (character === '\u001b') this.#state = 'escape' + else if (character === '\u009c' || code === 0x18 || code === 0x1a) this.#reset() + else if (code >= 0x30 && code <= 0x7e) this.#reset() + else if (!(code >= 0x20 && code <= 0x2f)) this.#reset() return } if (this.#state === 'csi') { - if (character === '\u009c' || (code >= 0x40 && code <= 0x7e)) this.#reset() + if (character === '\u001b') this.#state = 'escape' + else if (character === '\u009c' || code === 0x18 || code === 0x1a) this.#reset() + else if (code >= 0x40 && code <= 0x7e) this.#reset() return } if (this.#state === 'osc' || this.#state === 'string') { - if (character === '\u0007' || character === '\u009c') this.#reset() + if (character === '\u0007' || character === '\u009c' || code === 0x18 || code === 0x1a) + this.#reset() else if (character === '\u001b') this.#state = 'string-escape' return } if (this.#state === 'string-escape') { - this.#state = character === '\\' ? 'normal' : 'string' + if (character === '\\' || character === '\u009c' || code === 0x18 || code === 0x1a) + this.#reset() + else if (character !== '\u001b') this.#state = 'string' } } #reset(): void { this.#state = 'normal' this.#controlBytes = 0 + this.#controlOverflowed = false } } diff --git a/test/run-event-mapper-stream-safety.test.ts b/test/run-event-mapper-stream-safety.test.ts new file mode 100644 index 00000000..6157807d --- /dev/null +++ b/test/run-event-mapper-stream-safety.test.ts @@ -0,0 +1,344 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import type { RuntimeStreamEvent } from '@tangle-network/agent-runtime' +import { buildBraidViewModel } from '../src/adapters/tui/ui-view-model.js' +import { BraidApplication } from '../src/app/application.js' +import { DETERMINISTIC_PROFILE } from '../src/app/composition.js' +import { MemoryJournal } from '../src/app/journal.js' +import { providerEventFor } from '../src/app/run-event-mapper.js' +import { + ApplicationStreamSanitizer, + MAX_ACTIVE_RUNTIME_STREAMS, +} from '../src/app/run-stream-sanitizer.js' +import { redactSensitiveText } from '../src/domain/secret-sanitizer.js' +import { replayEvents } from '../src/domain/reducer.js' +import { initialState } from '../src/domain/state.js' +import { FixedClock } from '../src/ports/clock.js' +import type { ExecutionPort } from '../src/ports/execution.js' +import { SequenceIds } from '../src/ports/ids.js' +import { DEFAULT_RUN_CAPABILITIES } from '../src/ports/execution.js' + +const CONTROL_CANARY = 'STREAM_CONTROL_CANARY' +const BEARER_CANARY = 'STREAM_BEARER_CANARY' +const ASSIGNMENT_CANARY = 'STREAM_ASSIGNMENT_CANARY' +const URL_CANARY = 'STREAM_URL_CANARY' + +const REPLAY_CAPABILITIES = { + ...DEFAULT_RUN_CAPABILITIES, + streaming: { live: true, replay: true, detach: true, turnIdempotency: true }, + sessions: { continue: true, messages: true }, + controls: { cancel: true, steer: true, queue: true, status: true, recreate: true }, + events: { stableIdentity: true, sequence: true, cursor: true }, +} as const + +function provider(sequence: number) { + return { + eventId: `stream-event-${sequence}`, + providerSequence: sequence, + receivedAt: '2026-08-28T00:00:00.000Z', + } +} + +function mappedText( + sanitizer: ApplicationStreamSanitizer, + runId: string, + sequence: number, + text: string, +): string { + const event = providerEventFor(runId, { type: 'text_delta', text }, provider(sequence), sanitizer) + assert.equal(event.kind, 'run.text.delta') + return event.text +} + +function streamAtBoundary(value: string, boundary: number): string { + const sanitizer = new ApplicationStreamSanitizer() + const runId = `boundary-${boundary}` + const first = mappedText(sanitizer, runId, 1, value.slice(0, boundary)) + const second = mappedText(sanitizer, runId, 2, value.slice(boundary)) + return `${first}${second}${sanitizer.finish(runId, 'text')}` +} + +test('incremental mapper redaction matches complete redaction at every credential boundary', () => { + const values = [ + `prefix Bearer ${BEARER_CANARY} suffix`, + `prefix token=${ASSIGNMENT_CANARY} suffix`, + `prefix API___key: ${ASSIGNMENT_CANARY} suffix`, + `prefix client secret=${ASSIGNMENT_CANARY} suffix`, + `prefix https://provider.example/callback?token=${URL_CANARY} suffix`, + `prefix sk-${'c'.repeat(20)} suffix`, + `prefix github_pat_${'g'.repeat(20)} suffix`, + `prefix ghp_${'h'.repeat(20)} suffix`, + `prefix AKIA${'A'.repeat(16)} suffix`, + `prefix AIza${'Z'.repeat(30)} suffix`, + `prefix xoxb-${'x'.repeat(20)} suffix`, + ] + for (const value of values) { + const expected = redactSensitiveText(value) + for (let boundary = 0; boundary <= value.length; boundary += 1) { + assert.equal( + streamAtBoundary(value, boundary), + expected, + `${value.slice(0, 32)} at ${boundary}`, + ) + } + } +}) + +test('incremental controls remain suppressed across OSC and CSI boundaries, including overflow', () => { + const sanitizer = new ApplicationStreamSanitizer() + const runId = 'control-boundary' + let output = mappedText(sanitizer, runId, 1, `before\u001b]52;c;${CONTROL_CANARY}`) + output += mappedText(sanitizer, runId, 2, `\u0007after\u001b[31mvisible`) + output += mappedText( + sanitizer, + runId, + 3, + `\u001bP${'x'.repeat(5_000)}${CONTROL_CANARY}still-hidden`, + ) + output += mappedText(sanitizer, runId, 4, 'after-overflow') + output += sanitizer.finish(runId, 'text') + assert.equal(output.includes(CONTROL_CANARY), false) + assert.equal(output, 'beforeaftervisible') +}) + +test('stream finalization preserves pending safe text and resets the run', () => { + const sanitizer = new ApplicationStreamSanitizer() + const runId = 'finalize-stream' + assert.equal(mappedText(sanitizer, runId, 1, 'safe Bearer '), 'safe ') + assert.equal(mappedText(sanitizer, runId, 2, `${BEARER_CANARY} tail`), '[redacted bearer] tail') + assert.equal(sanitizer.activeStreamCount, 1) + assert.equal(sanitizer.finish(runId, 'text'), '') + sanitizer.reset(runId) + assert.equal(sanitizer.activeStreamCount, 0) + assert.equal(mappedText(sanitizer, runId, 1, 'new stream'), 'new stream') +}) + +test('interleaved streams and application instances never share sanitizer state', () => { + const first = new ApplicationStreamSanitizer() + const second = new ApplicationStreamSanitizer() + const runId = 'same-run-id' + const firstPrefix = mappedText(first, runId, 1, 'token=') + const secondBody = mappedText(second, runId, 1, ASSIGNMENT_CANARY) + const firstBody = mappedText(first, runId, 2, `${ASSIGNMENT_CANARY} tail`) + assert.equal(firstPrefix, '[redacted secret]') + assert.equal(secondBody, ASSIGNMENT_CANARY) + assert.equal(firstBody, ' tail') + + const interleaved = new ApplicationStreamSanitizer() + const runA = mappedText(interleaved, 'run-a', 1, 'Bearer ') + const runB = mappedText(interleaved, 'run-b', 1, 'safe output') + const runATail = mappedText(interleaved, 'run-a', 2, `${BEARER_CANARY} done`) + assert.equal(`${runA}${runATail}${interleaved.finish('run-a', 'text')}`, '[redacted bearer] done') + assert.equal(`${runB}${interleaved.finish('run-b', 'text')}`, 'safe output') +}) + +test('Unicode surrogate pairs survive a chunk boundary without malformed output', () => { + const sanitizer = new ApplicationStreamSanitizer() + const runId = 'unicode-boundary' + const emoji = '👩🏽‍💻' + const units = [...emoji] + const first = mappedText(sanitizer, runId, 1, units[0] ?? '') + const second = mappedText(sanitizer, runId, 2, `${units.slice(1).join('')} after`) + const output = `${first}${second}${sanitizer.finish(runId, 'text')}` + assert.equal(output, `${emoji} after`) + assert.equal([...output].length, [...`${emoji} after`].length) +}) + +test('long safe streams stay complete while orphaned stream state remains bounded', () => { + const sanitizer = new ApplicationStreamSanitizer() + const safe = 'safe output '.repeat(20_000) + let output = '' + for (let offset = 0; offset < safe.length; offset += 127) { + output += mappedText(sanitizer, 'long-safe', offset + 1, safe.slice(offset, offset + 127)) + } + output += sanitizer.finish('long-safe', 'text') + assert.equal(output, safe) + + for (let index = 0; index < MAX_ACTIVE_RUNTIME_STREAMS; index += 1) + mappedText(sanitizer, `orphan-${index}`, 1, 'orphan') + assert.equal(sanitizer.activeStreamCount, MAX_ACTIVE_RUNTIME_STREAMS) + assert.equal(mappedText(sanitizer, 'orphan-overflow', 1, 'must not accumulate'), '') +}) + +test('application ingestion keeps split controls and credentials out of journal, replay, TUI, and headless state', async () => { + const execution: ExecutionPort = { + async *streamTurn(): AsyncIterable { + yield { type: 'text_delta', text: `A\u001b` } + yield { type: 'text_delta', text: `]52;c;${CONTROL_CANARY}\u0007B token=` } + yield { type: 'text_delta', text: `${ASSIGNMENT_CANARY} after` } + yield { + type: 'final', + status: 'completed', + reason: 'stream safety test', + text: '', + metadata: { tokenUsage: { input: 1, output: 1 } }, + task: { id: 'stream-safety-task', intent: 'stream safety test' }, + timestamp: '2026-08-28T00:00:00.000Z', + } + }, + } + const clock = new FixedClock() + const journal = new MemoryJournal(clock) + const app = new BraidApplication({ + profile: DETERMINISTIC_PROFILE, + execution, + clock, + ids: new SequenceIds(), + journal, + effectStorage: journal, + }) + app.initialize('/workspace') + const state = await app.send({ operationId: 'op-stream-safety', text: 'hello' }).completion + const view = buildBraidViewModel(state) + const serialized = JSON.stringify({ state, view, events: app.events() }) + assert.equal(serialized.includes(CONTROL_CANARY), false) + assert.equal(serialized.includes(ASSIGNMENT_CANARY), false) + assert.equal(state.messages.at(-1)?.text, 'AB [redacted secret] after') + assert.equal(buildBraidViewModel(state).messages.at(-1)?.text, 'AB [redacted secret] after') + const replayed = replayEvents(initialState(DETERMINISTIC_PROFILE), app.events()) + assert.equal(JSON.stringify(replayed).includes(CONTROL_CANARY), false) + assert.equal(JSON.stringify(replayed).includes(ASSIGNMENT_CANARY), false) + assert.equal(replayed.messages.at(-1)?.text, 'AB [redacted secret] after') +}) + +test('disconnect replay continues the same sanitizer state before terminal finalization', async () => { + let attempts = 0 + const execution: ExecutionPort = { + capabilities: () => REPLAY_CAPABILITIES, + async *streamTurn(): AsyncIterable { + attempts += 1 + yield { type: 'text_delta', text: 'prefix Bearer ' } + throw new Error('transport disconnected') + }, + reconnect: (input) => ({ + async *[Symbol.asyncIterator](): AsyncIterator<{ + readonly runId: string + readonly eventId: string + readonly sequence: number + readonly receivedAt: string + readonly event: RuntimeStreamEvent + }> { + yield { + runId: input.runId, + eventId: 'replayed-body', + sequence: 2, + receivedAt: '2026-08-28T00:00:00.000Z', + event: { type: 'text_delta', text: `${BEARER_CANARY} suffix` }, + } + yield { + runId: input.runId, + eventId: 'replayed-final', + sequence: 3, + receivedAt: '2026-08-28T00:00:00.000Z', + event: { + type: 'final', + status: 'completed', + reason: 'replayed', + text: '', + metadata: { tokenUsage: { input: 1, output: 1 } }, + task: { id: 'replayed-task', intent: 'replayed' }, + timestamp: '2026-08-28T00:00:00.000Z', + }, + } + }, + }), + } + const clock = new FixedClock() + const journal = new MemoryJournal(clock) + const app = new BraidApplication({ + profile: DETERMINISTIC_PROFILE, + execution, + clock, + ids: new SequenceIds(), + journal, + effectStorage: journal, + }) + app.initialize('/workspace') + const state = await app.send({ operationId: 'op-stream-replay', text: 'hello' }).completion + assert.equal(attempts, 1) + assert.equal(state.messages.at(-1)?.text, `prefix [redacted bearer] suffix`) + assert.equal(JSON.stringify(app.events()).includes(BEARER_CANARY), false) +}) + +test('duplicate provider events do not advance stream sanitizer state twice', async () => { + let release: (() => void) | undefined + const execution: ExecutionPort = { + async *streamTurn(): AsyncIterable { + await new Promise((resolve) => { + release = resolve + }) + }, + } + const clock = new FixedClock() + const journal = new MemoryJournal(clock) + const app = new BraidApplication({ + profile: DETERMINISTIC_PROFILE, + execution, + clock, + ids: new SequenceIds(), + journal, + effectStorage: journal, + }) + app.initialize('/workspace') + const receipt = app.send({ operationId: 'op-stream-duplicate', text: 'hello' }) + await receipt.admissionReady + await new Promise((resolve) => setImmediate(resolve)) + const runId = receipt.runId + const envelope = { + runId, + eventId: 'duplicate-stream-event', + sequence: 1, + receivedAt: '2026-08-28T00:00:00.000Z', + event: { type: 'text_delta' as const, text: 'token=' }, + } + assert.deepEqual(app.ingestRuntimeEvent(envelope), { accepted: true, duplicate: false }) + assert.deepEqual(app.ingestRuntimeEvent(envelope), { accepted: false, duplicate: true }) + assert.equal(app.events().filter((entry) => entry.event.kind === 'run.text.delta').length, 1) + release?.() + app.cancelActive() + await receipt.completion +}) + +test('cancellation finalization retains only sanitized pending text', async () => { + const canary = 'CANCEL_PENDING_CANARY' + const execution: ExecutionPort = { + capabilities: () => DEFAULT_RUN_CAPABILITIES, + async *streamTurn(input): AsyncIterable { + yield { type: 'text_delta', text: `safe https://example.test/path?token=${canary}` } + await new Promise((resolve) => { + if (input.signal.aborted) { + resolve() + return + } + input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + }, + } + const clock = new FixedClock() + const journal = new MemoryJournal(clock) + const app = new BraidApplication({ + profile: DETERMINISTIC_PROFILE, + execution, + clock, + ids: new SequenceIds(), + journal, + effectStorage: journal, + }) + app.initialize('/workspace') + const receipt = app.send({ operationId: 'op-stream-cancel', text: 'hello' }) + await receipt.admissionReady + for (let attempt = 0; attempt < 100 && !app.canCancel(); attempt += 1) + await new Promise((resolve) => setImmediate(resolve)) + assert.equal(app.canCancel(), true) + const cancellation = await app.cancelRun({ + operationId: 'op-stream-cancel-control', + runId: receipt.runId, + legacy: true, + terminalStatus: 'aborted', + }) + await cancellation.completion + const state = await receipt.completion + const serialized = JSON.stringify({ state, events: app.events() }) + assert.equal(serialized.includes(canary), false) + assert.match(state.messages.at(-1)?.text ?? '', /^safe \[redacted link\]/u) +}) diff --git a/test/scripts.test.ts b/test/scripts.test.ts index 5dda38e7..121ed634 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -221,6 +221,7 @@ test('every scoped package alias forwards its declared file set', () => { 'plain-accessibility.test.js', 'property.test.js', 'reducer.test.js', + 'run-event-mapper-stream-safety.test.js', 'sanitize.test.js', 'scripts.test.js', 'terminal-usage-status.test.js', @@ -305,6 +306,7 @@ test('every scoped package alias forwards its declared file set', () => { 'plain-accessibility.test.js', 'profile-connection-actions.test.js', 'profile-save-recovery.test.js', + 'run-event-mapper-stream-safety.test.js', 'sanitize.test.js', 'security.test.js', 'storage-snapshots.test.js', diff --git a/test/security.test.ts b/test/security.test.ts index fd34a8d0..27f3ad08 100644 --- a/test/security.test.ts +++ b/test/security.test.ts @@ -91,10 +91,7 @@ test('terminal control sanitization remains safe when hostile sequences split ac const sanitizer = new TerminalControlSanitizer() assert.equal(sanitizer.push('before\u001b]0;owned'), 'before') assert.equal(sanitizer.push('\u0007after'), 'after') - assert.equal( - sanitizer.push(`before\u001bP${'x'.repeat(5_000)}visible`), - `before${'x'.repeat(905)}visible`, - ) + assert.equal(sanitizer.push(`before\u001bP${'x'.repeat(5_000)}visible`), 'before') assert.equal(sanitizer.finish(), '') }) From 6a329db846b493a76aa462b558756460dd497274 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 04:15:12 -0600 Subject: [PATCH 003/136] feat(runtime): route exact native continuation --- docs/components/native-continuation.md | 73 ++++ .../runtime/cli-bridge-retained-execution.ts | 2 + .../production-tangle-sandbox-backend.ts | 5 +- .../runtime/retained-execution-contract.ts | 5 + .../runtime/retained-execution-state.ts | 1 + src/adapters/runtime/retained-execution.ts | 93 ++++- .../runtime/retained-native-continuation.ts | 108 ++++++ .../runtime/tangle-retained-execution.ts | 3 + src/adapters/runtime/tangle-retained-run.ts | 140 +++++++- src/adapters/tui/ui-capabilities.ts | 9 +- src/adapters/tui/ui-core-dispatch.ts | 17 +- src/app/application.ts | 28 ++ src/app/run-admission-continuation.ts | 54 ++- src/app/run-admission-request.ts | 3 + src/app/run-admission-validation.ts | 54 +-- src/app/run-continuation.ts | 68 ++-- src/app/run-replay.ts | 12 +- src/domain/run-contracts.ts | 14 +- src/ports/execution.ts | 35 +- test/retained-native-continuation.test.ts | 307 ++++++++++++++++ test/tangle-retained-control-lookup.test.ts | 155 ++++++++ test/tui-native-continuation.test.ts | 332 ++++++++++++++++++ test/w8-runs.test.ts | 78 +++- 23 files changed, 1474 insertions(+), 122 deletions(-) create mode 100644 docs/components/native-continuation.md create mode 100644 src/adapters/runtime/retained-native-continuation.ts create mode 100644 test/retained-native-continuation.test.ts create mode 100644 test/tangle-retained-control-lookup.test.ts create mode 100644 test/tui-native-continuation.test.ts diff --git a/docs/components/native-continuation.md b/docs/components/native-continuation.md new file mode 100644 index 00000000..9aa99d43 --- /dev/null +++ b/docs/components/native-continuation.md @@ -0,0 +1,73 @@ +# Native continuation + +## Purpose + +Native continuation adds one turn to the exact runner-owned session at the current branch tip. + +It preserves provider-native context without copying hidden history into Braid. + +## Ownership + +`agent-interface` owns the boundary proof, exact run reference, request digest, and acknowledgement schemas. + +`agent-runtime` owns exact reconnection, boundary observation, idempotent continuation, and result validation. + +Braid owns branch-tip selection, capability presentation, durable admission, restart recovery, and terminal dispatch. + +Providers own the live session and must advertise both atomic boundary checks and request idempotency. + +## Best simple implementation + +Braid selects only the completed run at the open branch tip with the same profile and connection. + +The run must contain an exact six-field provider control reference. + +The environment capability document must advertise session continuation, an atomic boundary, and request idempotency. + +Braid reconnects the exact source run and asks Runtime for a canonical boundary proof. + +Braid stores that proof in the destination run receipt before dispatch. + +Runtime binds one stable operation identifier to the exact turn, source run, and expected boundary. + +Runtime calls `continueNative` and accepts only an accepted or replayed acknowledgement. + +The returned run must stay in the same provider, environment, and provider session. + +This path does not create a new environment, parse runner output, or reconstruct provider history. + +## Restart behavior + +A crash after durable admission leaves the destination run in a recoverable state. + +Restart rebuilds the same continuation input from the stored receipt. + +Runtime repeats the same request digest and requires the provider to return the original result. + +The replay path never falls back to a generic send when an exact boundary check fails. + +## Tangle recovery + +Tangle lookup scans bounded personal sandbox pages and matches the retained environment metadata. + +It then reads the exact session status and validates the provider, environment, session, and execution identifiers. + +An environment-phase crash reuses the recorded environment and execution identity. + +Duplicate environments, changed identity, missing capabilities, and malformed control references fail closed. + +## User interface + +The terminal routes an ordinary send through native continuation when the current branch tip qualifies. + +Generic providers keep the ordinary send path. + +Stale runs, incomplete runs, profile changes, connection changes, and unsupported providers do not expose continuation. + +## Verification + +Focused tests cover accepted continuation, replay after restart, exact control binding, and same-session advancement. + +They also cover cross-process Tangle lookup, environment-admission recovery, stale tips, incomplete tips, and boundary failure. + +The complete Braid test suite remains the final regression check before integration. diff --git a/src/adapters/runtime/cli-bridge-retained-execution.ts b/src/adapters/runtime/cli-bridge-retained-execution.ts index 05308629..6e447f42 100644 --- a/src/adapters/runtime/cli-bridge-retained-execution.ts +++ b/src/adapters/runtime/cli-bridge-retained-execution.ts @@ -22,6 +22,8 @@ export class CliBridgeRetainedExecutionPort extends RetainedExecutionPort { super({ resolve: async (input) => createCliBridgeRetainedPlan(await options.resolve(input), input.runId), + continue: async (input, controlRef) => + createCliBridgeRetainedPlan(await options.resolve(input), input.runId, controlRef), recover: async ({ runId, providerSessionId, controlRef, signal, ...recovery }) => createCliBridgeRetainedPlan( await options.recover({ diff --git a/src/adapters/runtime/production-tangle-sandbox-backend.ts b/src/adapters/runtime/production-tangle-sandbox-backend.ts index dcbe877c..562bd469 100644 --- a/src/adapters/runtime/production-tangle-sandbox-backend.ts +++ b/src/adapters/runtime/production-tangle-sandbox-backend.ts @@ -135,6 +135,7 @@ export interface PreparedTangleRetainedConnection { readonly discoverControlRef: ( braidRunId: string, signal?: AbortSignal, + executionId?: string, ) => Promise readonly materializationReceipt: Readonly> } @@ -234,12 +235,12 @@ export async function resolveTangleSandboxRetainedConnection( environmentName: identity.name, environmentMetadata: identity.metadata, idleTtlSeconds, - discoverControlRef: (braidRunId, signal) => + discoverControlRef: (braidRunId, signal, executionId = safeExecutionId(braidRunId)) => retainedControlLookup({ connectionId, braidRunId, providerSessionId, - executionId: safeExecutionId(braidRunId), + executionId, environmentIdempotencyKey: identity.environmentIdempotencyKey, ...(signal === undefined ? {} : { signal }), }), diff --git a/src/adapters/runtime/retained-execution-contract.ts b/src/adapters/runtime/retained-execution-contract.ts index 32cc3d50..dfe3aecb 100644 --- a/src/adapters/runtime/retained-execution-contract.ts +++ b/src/adapters/runtime/retained-execution-contract.ts @@ -63,6 +63,11 @@ export interface RetainedExecutionPlan { export interface RetainedExecutionDriver { readonly resolve: (input: ExecuteTurnInput) => Promise + /** Resolve the provider connection for a verified same-session continuation. */ + readonly continue?: ( + input: ExecuteTurnInput, + controlRef: AgentExactRunControlRef, + ) => Promise readonly recover: ( input: { readonly runId: string diff --git a/src/adapters/runtime/retained-execution-state.ts b/src/adapters/runtime/retained-execution-state.ts index 3f0da199..a5b5470c 100644 --- a/src/adapters/runtime/retained-execution-state.ts +++ b/src/adapters/runtime/retained-execution-state.ts @@ -29,6 +29,7 @@ export function retainedExecutionKey( workspaceRoot: input.workspaceRoot ?? null, sessionId: input.sessionId ?? null, contextBoundary: input.contextBoundary ?? null, + nativeContextBoundaryProof: input.nativeContextBoundaryProof ?? null, }) } diff --git a/src/adapters/runtime/retained-execution.ts b/src/adapters/runtime/retained-execution.ts index 9ac1e9cf..e2375cb7 100644 --- a/src/adapters/runtime/retained-execution.ts +++ b/src/adapters/runtime/retained-execution.ts @@ -17,6 +17,7 @@ import type { RetainedRunAdmissionRecord, RetainedRunAdmissionRecorder, } from '../../ports/execution.js' +import { runSupportsNativeContinuation } from '../../ports/execution.js' import { canonicalAgentProfileDigestHex } from '../agent-interface/profile-runtime.js' import type { RetainedExecutionDriver, @@ -24,6 +25,11 @@ import type { } from './retained-execution-contract.js' import { RetainedExecutionState, retainedExecutionKey } from './retained-execution-state.js' import { streamRetainedExecution } from './retained-execution-stream.js' +import { + continueRetainedNative, + controlRefFromBoundaryProof, + nativeContinuationInputFromRecovery, +} from './retained-native-continuation.js' export type { RetainedExecutionDriver, @@ -48,7 +54,25 @@ export class RetainedExecutionPort implements ExecutionPort { } async admit(input: ExecuteTurnInput): Promise { - const plan = await this.#driver.resolve(input) + const continueNative = this.#driver.continue + let plan: RetainedExecutionPlan + if (input.nativeContextBoundaryProof === undefined) { + plan = await this.#driver.resolve(input) + } else { + if (continueNative === undefined) { + throw new Error('Provider does not implement verified same-session continuation') + } + plan = await continueNative( + input, + controlRefFromBoundaryProof(input.nativeContextBoundaryProof), + ) + } + if ( + input.nativeContextBoundaryProof !== undefined && + !runSupportsNativeContinuation(plan.capabilities) + ) { + throw new Error('Provider does not support verified same-session continuation') + } this.#state.rememberPrepared(input.runId, retainedExecutionKey(input, plan.capabilities), plan) return { capabilities: plan.capabilities, @@ -74,7 +98,11 @@ export class RetainedExecutionPort implements ExecutionPort { if (plan === undefined) { throw new Error('Retained run was not admitted with this exact request') } - const starting = Promise.resolve().then(() => plan.start(input)) + const starting = Promise.resolve().then(() => + input.nativeContextBoundaryProof === undefined + ? plan.start(input) + : continueRetainedNative(plan, input), + ) this.#state.rememberStartingHandle(input.runId, starting) let handle: RetainedRunHandle try { @@ -114,14 +142,40 @@ export class RetainedExecutionPort implements ExecutionPort { assertRecoveryIdentity(input.retainedAdmission, input.providerSessionId, input.controlRef) const persistedControlRef = controlRefFromAdmission(input.retainedAdmission) const suppliedControlRef = input.controlRef ?? persistedControlRef - const providerSessionId = this.#recoverySessionId(input.providerSessionId, suppliedControlRef) + const continuationInput = + suppliedControlRef === undefined + ? nativeContinuationInputFromRecovery(input.runId, input, input.signal) + : undefined + const recoveryControlRef = + continuationInput === undefined + ? suppliedControlRef + : controlRefFromBoundaryProof(continuationInput.nativeContextBoundaryProof) + const providerSessionId = this.#recoverySessionId(input.providerSessionId, recoveryControlRef) const plan = await this.#planFor( input.runId, providerSessionId, - suppliedControlRef, + recoveryControlRef, input, input.signal, ) + if (continuationInput !== undefined) { + if (!runSupportsNativeContinuation(plan.capabilities)) { + throw new Error('Provider does not support verified same-session continuation') + } + const handle = await continueRetainedNative(plan, continuationInput) + this.#state.rememberHandle(input.runId, plan, handle) + this.#state.markDetached(input.runId, false) + yield* streamRetainedExecution({ + runId: input.runId, + handle, + plan, + state: this.#state, + signal: input.signal, + includeObservation: true, + afterSequence: 0, + }) + return + } const recovered = await this.#recoverHandle(plan, input, input.onRetainedAdmission) if (recovered !== undefined) { if (recovered === null) return @@ -307,6 +361,23 @@ export class RetainedExecutionPort implements ExecutionPort { readonly signal?: AbortSignal } & RetainedExecutionRecoveryContext, ): Promise { + if ( + input.controlRef === undefined && + controlRefFromAdmission(input.retainedAdmission) === undefined + ) { + const continuation = nativeContinuationInputFromRecovery( + input.runId, + input, + input.signal ?? new AbortController().signal, + ) + if (continuation !== undefined) { + return { + runId: input.runId, + status: 'reconnecting', + sessionId: continuation.nativeContextBoundaryProof.sessionId, + } + } + } const resolved = await this.#handleFor( input.runId, input.providerSessionId, @@ -398,6 +469,20 @@ export class RetainedExecutionPort implements ExecutionPort { return interactionAcknowledgement(input.command.operationId, acknowledgement.status) } + async nativeBoundary(input: Parameters>[0]) { + const resolved = await this.#handleFor( + input.runId, + input.sessionId, + input.controlRef, + input.signal, + input, + ) + if (!resolved) return null + return resolved.handle.contextBoundary({ + ...(input.signal === undefined ? {} : { signal: input.signal }), + }) + } + async #handleFor( runId: string, providerSessionId: string | undefined, diff --git a/src/adapters/runtime/retained-native-continuation.ts b/src/adapters/runtime/retained-native-continuation.ts new file mode 100644 index 00000000..c55f84e9 --- /dev/null +++ b/src/adapters/runtime/retained-native-continuation.ts @@ -0,0 +1,108 @@ +import { + type AgentExactRunControlRef, + AgentExactRunControlRefSchema, + type NativeContextBoundaryProof, + NativeContextBoundaryProofSchema, + nativeContextContinuationRequestDigest, + nativeContextContinuationTurnDigest, +} from '@tangle-network/agent-interface' +import type { RetainedRunHandle } from '@tangle-network/agent-runtime/kernel' +import { canonicalDigest } from '../../domain/canonical.js' +import type { ExecuteTurnInput, RetainedExecutionRecoveryContext } from '../../ports/execution.js' +import type { RetainedExecutionPlan } from './retained-execution-contract.js' + +export function controlRefFromBoundaryProof( + value: NativeContextBoundaryProof, +): AgentExactRunControlRef { + const proof = NativeContextBoundaryProofSchema.parse(value) + return AgentExactRunControlRefSchema.parse({ + runId: proof.runId, + provider: proof.provider, + environmentId: proof.environmentId, + sessionId: proof.sessionId, + executionId: proof.executionId, + requestDigest: proof.requestDigest, + }) +} + +export async function continueRetainedNative( + plan: RetainedExecutionPlan, + input: ExecuteTurnInput, +): Promise { + const proof = input.nativeContextBoundaryProof + if (proof === undefined) throw new Error('Native continuation requires an exact boundary proof') + const sourceControlRef = controlRefFromBoundaryProof(proof) + if (input.sessionId !== sourceControlRef.sessionId) { + throw new Error('Native continuation targets another provider session') + } + const handle = await plan.reconnect(sourceControlRef, input.signal) + if (handle === null) throw new Error('Native continuation source is no longer available') + if (canonicalDigest(handle.controlRef) !== canonicalDigest(sourceControlRef)) { + throw new Error('Native continuation recovered another provider run') + } + + const turn = { prompt: input.text, model: plan.model } + const turnDigest = nativeContextContinuationTurnDigest(turn) + const material = { + operationId: input.operationId, + turnDigest, + run: sourceControlRef, + expectedBoundary: NativeContextBoundaryProofSchema.parse(proof), + } + const request = { + ...material, + requestDigest: nativeContextContinuationRequestDigest(material), + } + const outcome = await handle.continueNative(request, { ...turn, signal: input.signal }) + if ( + outcome.acknowledgement.status !== 'accepted' && + outcome.acknowledgement.status !== 'replayed' + ) { + throw new Error(`Native continuation was ${outcome.acknowledgement.status}`) + } + if (!('controlRef' in outcome) || !('result' in outcome)) { + throw new Error('Native continuation omitted its exact result') + } + const next = AgentExactRunControlRefSchema.parse(outcome.controlRef) + if ( + next.provider !== sourceControlRef.provider || + next.environmentId !== sourceControlRef.environmentId || + next.sessionId !== sourceControlRef.sessionId + ) { + throw new Error('Native continuation moved to another provider session') + } + if (canonicalDigest(handle.controlRef) !== canonicalDigest(next)) { + throw new Error('Native continuation handle did not advance to the admitted run') + } + return handle +} + +export function nativeContinuationInputFromRecovery( + runId: string, + recovery: RetainedExecutionRecoveryContext, + signal: AbortSignal, +): + | (ExecuteTurnInput & { readonly nativeContextBoundaryProof: NativeContextBoundaryProof }) + | undefined { + const receipt = recovery.receipt + const parsed = NativeContextBoundaryProofSchema.safeParse(receipt?.nativeContextBoundaryProof) + if (receipt === undefined || !parsed.success) return undefined + const proof = parsed.data + return { + operationId: receipt.operationId, + runId, + text: receipt.requested.text, + profile: receipt.requested.profile, + ...(receipt.requested.mode === undefined ? {} : { mode: receipt.requested.mode }), + ...(receipt.requested.interactions === undefined + ? {} + : { interactions: receipt.requested.interactions }), + ...(receipt.requested.connectionId === undefined + ? {} + : { connectionId: receipt.requested.connectionId }), + ...(recovery.workspaceRoot === undefined ? {} : { workspaceRoot: recovery.workspaceRoot }), + sessionId: proof.sessionId, + signal, + nativeContextBoundaryProof: proof, + } +} diff --git a/src/adapters/runtime/tangle-retained-execution.ts b/src/adapters/runtime/tangle-retained-execution.ts index 43ceb384..182ea762 100644 --- a/src/adapters/runtime/tangle-retained-execution.ts +++ b/src/adapters/runtime/tangle-retained-execution.ts @@ -21,6 +21,8 @@ export class TangleRetainedExecutionPort extends RetainedExecutionPort { constructor(options: TangleRetainedExecutionOptions) { super({ resolve: async (input) => createTangleRetainedPlan(await options.resolve(input), input.runId), + continue: async (input, controlRef) => + createTangleRetainedPlan(await options.resolve(input), input.runId, controlRef), recover: async ({ runId, providerSessionId, controlRef, signal, ...recovery }) => createTangleRetainedPlan( await options.recover({ @@ -32,6 +34,7 @@ export class TangleRetainedExecutionPort extends RetainedExecutionPort { }), runId, controlRef, + recovery, ), }) } diff --git a/src/adapters/runtime/tangle-retained-run.ts b/src/adapters/runtime/tangle-retained-run.ts index 5fce744a..2056c32e 100644 --- a/src/adapters/runtime/tangle-retained-run.ts +++ b/src/adapters/runtime/tangle-retained-run.ts @@ -3,11 +3,18 @@ import type { AgentEnvironmentProvider } from '@tangle-network/agent-interface/e import { type RetainedRunHandle, reconnectRetainedRun, + recoverRetainedRun, startRetainedRun, } from '@tangle-network/agent-runtime/kernel' +import { canonicalDigest } from '../../domain/canonical.js' import { publicMaterializationReceipt } from '../../domain/materialization-receipt.js' import type { RuntimeEventEnvelope } from '../../domain/runtime-events.js' -import type { ExecuteTurnInput } from '../../ports/execution.js' +import type { + ExecuteTurnInput, + RetainedExecutionRecoveryContext, + RetainedRunAdmissionRecord, + RetainedRunAdmissionRecorder, +} from '../../ports/execution.js' import { safeExecutionId } from './production-backend-common.js' import type { PreparedTangleRetainedConnection } from './production-tangle-sandbox-backend.js' import type { @@ -24,25 +31,61 @@ import { } from './retained-execution-projection.js' export interface TangleRetainedPlan extends RetainedExecutionPlan { + readonly runId: string readonly prepared: PreparedTangleRetainedConnection readonly provider: AgentEnvironmentProvider + readonly environmentIdempotencyKey: string readonly executionId: string } +type HeadlessRetainedAdmission = Extract< + RetainedRunAdmissionRecord, + { readonly phase: 'intent' | 'environment' | 'dispatched' } +> + export function createTangleRetainedPlan( prepared: PreparedTangleRetainedConnection, runId: string, controlRef?: AgentExactRunControlRef, + recovery?: RetainedExecutionRecoveryContext, ): TangleRetainedPlan { - const executionId = controlRef?.executionId ?? safeExecutionId(runId) + const provider = prepared.provider + const admission = headlessRetainedAdmission(recovery?.retainedAdmission) + if (admission !== undefined && admissionProvider(admission) !== provider.name) { + throw new Error('Retained Tangle admission belongs to another provider') + } + const persistedControlRef = admission?.phase === 'dispatched' ? admission.controlRef : undefined + if ( + controlRef !== undefined && + persistedControlRef !== undefined && + canonicalDigest(controlRef) !== canonicalDigest(persistedControlRef) + ) { + throw new Error('Retained Tangle control reference conflicts with the persisted run') + } + const exactControlRef = controlRef ?? persistedControlRef + const environmentId = + exactControlRef?.environmentId ?? + (admission?.phase === 'environment' ? admission.environmentId : undefined) + const executionId = + exactControlRef?.executionId ?? + (admission?.phase === 'intent' || admission?.phase === 'environment' + ? admission.executionId + : safeExecutionId(runId)) + const environmentIdempotencyKey = admission?.idempotencyKey ?? prepared.environmentIdempotencyKey const plan: TangleRetainedPlan = { + runId, prepared, - provider: prepared.provider, + provider, + environmentIdempotencyKey, executionId, - providerName: prepared.provider.name, + providerName: provider.name, exactStatus: false, - ...(controlRef === undefined ? {} : { environmentId: controlRef.environmentId }), - providerSessionId: controlRef?.sessionId ?? prepared.providerSessionId, + ...(environmentId === undefined ? {} : { environmentId }), + providerSessionId: + exactControlRef?.sessionId ?? + (admission?.phase === 'intent' || admission?.phase === 'environment' + ? admission.sessionId + : prepared.providerSessionId), model: prepared.model, capabilities: retainedCapabilities(prepared.capabilities, { sessionContinuation: prepared.capabilities.sessions.continue, @@ -50,13 +93,14 @@ export function createTangleRetainedPlan( }), materializationReceipt: publicMaterializationReceipt({ ...prepared.materializationReceipt, - providerRunId: controlRef?.runId ?? executionId, + providerRunId: exactControlRef?.runId ?? executionId, retainedControl: 'exact-after-dispatch', }), start: (input) => startTangleRetainedRun(plan, input), reconnect: (exact) => reconnectRetainedRun({ provider: plan.provider, controlRef: exact }), + recover: (input) => recoverTangleRetainedRun(plan, input), discover: async (braidRunId, signal) => { - const exact = await prepared.discoverControlRef(braidRunId, signal) + const exact = await prepared.discoverControlRef(braidRunId, signal, executionId) if (exact === null) return null if (exact.executionId !== executionId) { throw new Error('Tangle retained lookup returned another execution') @@ -105,13 +149,89 @@ export async function startTangleRetainedRun( backend: plan.prepared.runner, name: plan.prepared.environmentName, metadata: plan.prepared.environmentMetadata, - idempotencyKey: plan.prepared.environmentIdempotencyKey, + idempotencyKey: plan.environmentIdempotencyKey, }, turn, identity: { - sessionId: plan.prepared.providerSessionId, + sessionId: plan.providerSessionId ?? plan.prepared.providerSessionId, executionId: plan.executionId, }, onAdmission: input.onRetainedAdmission, }) } + +async function recoverTangleRetainedRun( + plan: TangleRetainedPlan, + input: RetainedExecutionRecoveryContext & { + readonly admission: RetainedRunAdmissionRecord + readonly onRetainedAdmission?: RetainedRunAdmissionRecorder + readonly signal?: AbortSignal + }, +): Promise { + const admission = headlessRetainedAdmission(input.admission) + if (admission === undefined) return null + if (admissionProvider(admission) !== plan.provider.name) { + throw new Error('Retained Tangle admission belongs to another provider') + } + if (admission.phase === 'intent') { + if (input.receipt === undefined || input.onRetainedAdmission === undefined) return null + const result = await recoverRetainedRun({ + provider: plan.provider, + admission, + replay: { + environment: { + profile: plan.prepared.profile, + backend: plan.prepared.runner, + name: plan.prepared.environmentName, + metadata: plan.prepared.environmentMetadata, + idempotencyKey: admission.idempotencyKey, + }, + turn: { + prompt: input.receipt.requested.text, + turnId: admission.turnId, + interactions: input.receipt.requested.interactions ?? {}, + ...(input.signal === undefined ? {} : { signal: input.signal }), + }, + identity: { + sessionId: admission.sessionId, + executionId: admission.executionId, + }, + }, + onAdmission: input.onRetainedAdmission, + }) + return result.outcome === 'recovered' ? result.handle : null + } + if (admission.phase !== 'environment') return null + const controlRef = await plan.prepared.discoverControlRef( + plan.runId, + input.signal, + admission.executionId, + ) + if (controlRef === null) return null + if ( + controlRef.provider !== plan.provider.name || + controlRef.environmentId !== admission.environmentId || + controlRef.sessionId !== admission.sessionId || + controlRef.executionId !== admission.executionId + ) { + throw new Error('Tangle retained lookup returned another admitted run') + } + return reconnectRetainedRun({ provider: plan.provider, controlRef }) +} + +function headlessRetainedAdmission( + admission: RetainedRunAdmissionRecord | undefined, +): HeadlessRetainedAdmission | undefined { + if ( + admission?.phase !== 'intent' && + admission?.phase !== 'environment' && + admission?.phase !== 'dispatched' + ) { + return undefined + } + return admission +} + +function admissionProvider(admission: HeadlessRetainedAdmission): string { + return admission.phase === 'dispatched' ? admission.controlRef.provider : admission.provider +} diff --git a/src/adapters/tui/ui-capabilities.ts b/src/adapters/tui/ui-capabilities.ts index 20f3372a..7a5d801e 100644 --- a/src/adapters/tui/ui-capabilities.ts +++ b/src/adapters/tui/ui-capabilities.ts @@ -160,7 +160,10 @@ export function capabilityMap( .reverse() .find( (run) => - (run.status === 'detached' || run.status === 'unknown') && run.controlRef !== undefined, + (run.status === 'detached' || + run.status === 'reconnecting' || + run.status === 'unknown') && + (run.controlRef !== undefined || run.receipt.nativeContextBoundaryProof !== undefined), ) capabilities['run.queue'] = activeRun?.capabilities.controls.queue ? { available: true, source: 'provider' } @@ -199,7 +202,7 @@ export function capabilityMap( ? 'Detach the active run before reconnecting it' : recoverableRun ? 'The detached run cannot be recreated by this provider' - : 'There is no detached run to reconnect', + : 'There is no recoverable run to reconnect', } capabilities['run.reconcile'] = recoverableRun?.capabilities.controls.status ? { available: true, source: 'provider' } @@ -210,7 +213,7 @@ export function capabilityMap( ? 'Detach the active run before reconciling it' : recoverableRun ? 'The detached run does not expose provider status' - : 'There is no detached run to reconcile', + : 'There is no recoverable run to reconcile', } if (fixture === 'interaction') { capabilities['interaction.respond'] = { available: true, source: 'provider' } diff --git a/src/adapters/tui/ui-core-dispatch.ts b/src/adapters/tui/ui-core-dispatch.ts index bb6b733c..7c006b50 100644 --- a/src/adapters/tui/ui-core-dispatch.ts +++ b/src/adapters/tui/ui-core-dispatch.ts @@ -21,12 +21,23 @@ export async function dispatchCoreIntent( ): Promise { switch (intent.type) { case 'send': { - const receipt = context.app.send({ - operationId: intent.operationId, - text: intent.text, + const continuationRunId = context.app.nativeContinuationRunId({ ...(intent.conversationId ? { conversationId: intent.conversationId } : {}), ...(intent.branchId ? { branchId: intent.branchId } : {}), }) + const receipt = + continuationRunId === undefined + ? context.app.send({ + operationId: intent.operationId, + text: intent.text, + ...(intent.conversationId ? { conversationId: intent.conversationId } : {}), + ...(intent.branchId ? { branchId: intent.branchId } : {}), + }) + : await context.app.continueNative({ + operationId: intent.operationId, + text: intent.text, + runId: continuationRunId, + }) if (receipt.admissionReady !== undefined) await receipt.admissionReady return { kind: 'accepted', diff --git a/src/app/application.ts b/src/app/application.ts index d7f921c4..a04c5829 100644 --- a/src/app/application.ts +++ b/src/app/application.ts @@ -59,6 +59,7 @@ import { sendRunAsync, validateNativeProof, } from './run-admission.js' +import { resolveNativeContinuationRun } from './run-continuation.js' import { cancelRun, detachRun, queueRunInput, steerRun } from './run-controls.js' import type { RunExecutionSnapshot } from './run-execution-snapshot.js' import { snapshotRunExecution } from './run-execution-snapshot.js' @@ -414,6 +415,25 @@ export class BraidApplication { } } + nativeContinuationRunId( + input: Pick = {}, + ): string | undefined { + const configuration = effectiveRunConfiguration( + this.#state, + this.runtimeSelection.profile(), + input, + ) + return resolveNativeContinuationRun({ + state: this.#state, + conversationId: input.conversationId ?? this.#state.conversationId, + branchId: input.branchId ?? this.#state.branchId, + profile: configuration.profile, + ...(configuration.connectionId === undefined + ? {} + : { connectionId: configuration.connectionId }), + })?.id + } + queueInput(input: { readonly operationId: string readonly text: string @@ -542,9 +562,17 @@ export class BraidApplication { readonly text: string readonly runId?: string }): Promise { + const configuration = effectiveRunConfiguration( + this.#state, + this.runtimeSelection.profile(), + {}, + ) return continueNative(this.#portViews.nativeContinuation, { ...input, operationId: operationId(input.operationId, 'continue'), + ...(configuration.connectionId === undefined + ? {} + : { connectionId: configuration.connectionId }), }) } diff --git a/src/app/run-admission-continuation.ts b/src/app/run-admission-continuation.ts index d2f3c8f0..f32aba88 100644 --- a/src/app/run-admission-continuation.ts +++ b/src/app/run-admission-continuation.ts @@ -1,37 +1,53 @@ -import type { NativeContextBoundaryProof } from '../domain/receipts.js' import type { NativeContinuationPort } from './application-ports.js' import type { SendReceipt } from './application-types.js' import { AppError } from './errors.js' +import { resolveNativeContinuationRun } from './run-continuation.js' +import { retainedExecutionRecoveryContext } from './run-recovery-context.js' export async function continueNative( context: NativeContinuationPort, - input: { readonly operationId: string; readonly text: string; readonly runId?: string }, + input: { + readonly operationId: string + readonly text: string + readonly runId?: string + readonly connectionId?: string + }, ): Promise { - const source = context.findRun(input.runId ?? context.currentState().runs.at(-1)?.id ?? '') - const sessionId = source.providerSessionId - if (!sessionId || !source.capabilities.sessions.continue || !context.execution.nativeBoundary) + const state = context.currentState() + const profile = context.profile?.() + const source = + profile === undefined + ? undefined + : resolveNativeContinuationRun({ + state, + conversationId: state.conversationId, + branchId: state.branchId, + profile, + ...(input.connectionId === undefined ? {} : { connectionId: input.connectionId }), + }) + const sessionId = source?.providerSessionId + if ( + !source || + (input.runId !== undefined && source.id !== input.runId) || + !sessionId || + !source.controlRef || + !context.execution.nativeBoundary + ) throw new AppError( 'NATIVE_CONTINUATION_UNVERIFIED', 'The provider cannot prove a native session boundary for this run', ) - const boundary = await context.execution.nativeBoundary({ runId: source.id, sessionId }) - if (!boundary) + const proof = await context.execution.nativeBoundary({ + runId: source.id, + sessionId, + controlRef: source.controlRef, + ...retainedExecutionRecoveryContext(source, state.workspace), + }) + if (!proof) throw new AppError( 'NATIVE_CONTINUATION_UNVERIFIED', 'The provider did not return a native session boundary proof', ) - const proof: NativeContextBoundaryProof = { - runId: source.id, - providerSessionId: sessionId, - boundary: boundary.boundary, - digest: boundary.digest, - ...(boundary.revision === undefined ? {} : { revision: boundary.revision }), - } - if (source.lastCursor !== undefined && proof.boundary !== source.lastCursor) - throw new AppError( - 'NATIVE_BOUNDARY_MISMATCH', - 'The provider session no longer ends at the recorded Braid boundary', - ) return context.send({ operationId: input.operationId, text: input.text, diff --git a/src/app/run-admission-request.ts b/src/app/run-admission-request.ts index a7e53d7f..75e3ee60 100644 --- a/src/app/run-admission-request.ts +++ b/src/app/run-admission-request.ts @@ -42,6 +42,9 @@ export function exactAdmissionRequestDigest( ...(input.interactions === undefined ? {} : { interactions: input.interactions }), ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }), ...(contextPlan === undefined ? {} : { contextPlan }), + ...(input.nativeContextBoundaryProof === undefined + ? {} + : { nativeContextBoundaryProof: input.nativeContextBoundaryProof }), }, }) } diff --git a/src/app/run-admission-validation.ts b/src/app/run-admission-validation.ts index 53ac29e0..d1431f34 100644 --- a/src/app/run-admission-validation.ts +++ b/src/app/run-admission-validation.ts @@ -1,4 +1,7 @@ -import type { AgentProfile } from '@tangle-network/agent-interface' +import { + type AgentProfile, + NativeContextBoundaryProofSchema, +} from '@tangle-network/agent-interface' import { canonicalAgentProfileDigestHex, snapshotAgentProfile, @@ -14,7 +17,7 @@ import { DEFAULT_RUN_CAPABILITIES, UNKNOWN_RUN_CAPABILITIES } from '../ports/exe import type { AdmissionPort, ExecutionAccess, StateReader } from './application-ports.js' import type { SendInput } from './application-types.js' import { AppError } from './errors.js' -import { branchHasVisibleHistory } from './run-continuation.js' +import { branchHasVisibleHistory, resolveNativeContinuationRun } from './run-continuation.js' export function validateNativeProof( context: StateReader & ExecutionAccess, @@ -31,35 +34,40 @@ export function validateNativeProof( ) return } - const proof = input.nativeContextBoundaryProof - const source = context.currentState().runs.find((candidate) => candidate.id === proof.runId) - if ( - !source || - !input.sessionId || - source.providerSessionId !== proof.providerSessionId || - input.sessionId !== proof.providerSessionId || - !source.capabilities.sessions.continue - ) + const parsed = NativeContextBoundaryProofSchema.safeParse(input.nativeContextBoundaryProof) + if (!parsed.success) throw new AppError( 'NATIVE_CONTINUATION_UNVERIFIED', - 'The native continuation proof is not bound to a recorded provider session', + 'The native continuation proof is malformed', ) + const proof = parsed.data const state = context.currentState() - const sourceConnection = source.connectionId ?? source.receipt.requested.connectionId + const source = resolveNativeContinuationRun({ + state, + conversationId: input.conversationId ?? state.conversationId, + branchId: input.branchId ?? state.branchId, + profile: input.profile, + ...(input.connectionId === undefined ? {} : { connectionId: input.connectionId }), + }) + const control = source?.controlRef + const proofMatchesControl = + control !== undefined && + control.runId === proof.runId && + control.provider === proof.provider && + control.environmentId === proof.environmentId && + control.sessionId === proof.sessionId && + control.executionId === proof.executionId && + control.requestDigest === proof.requestDigest if ( - source.conversationId !== state.conversationId || - source.branchId !== state.branchId || - sourceConnection !== input.connectionId || - source.receipt.profileDigest !== admissionProfileDigest(input.profile) + !source || + !proofMatchesControl || + !input.sessionId || + source.providerSessionId !== proof.sessionId || + input.sessionId !== proof.sessionId ) throw new AppError( 'NATIVE_CONTINUATION_UNVERIFIED', - 'The native continuation proof is bound to a different profile, connection, or branch', - ) - if (source.lastCursor !== undefined && proof.boundary !== source.lastCursor) - throw new AppError( - 'NATIVE_BOUNDARY_MISMATCH', - 'The native continuation proof does not end at the recorded Braid boundary', + 'The native continuation proof is not bound to the completed run at this branch tip', ) } diff --git a/src/app/run-continuation.ts b/src/app/run-continuation.ts index d4e24d90..b35e10c4 100644 --- a/src/app/run-continuation.ts +++ b/src/app/run-continuation.ts @@ -1,19 +1,18 @@ import type { AgentProfile } from '@tangle-network/agent-interface' import { canonicalAgentProfileDigestHex } from '../adapters/agent-interface/profile-runtime.js' import type { BraidState } from '../domain/state.js' +import { runSupportsNativeContinuation } from '../ports/execution.js' -/** - * Return the only provider session that is safe for an ordinary follow-up. - * A session is reusable only at the current branch tip and with the exact - * recorded profile/connection identity from the completed predecessor. - */ -export function continuationSessionFor(input: { +export interface ContinuationInput { readonly state: BraidState readonly conversationId: string readonly branchId: string readonly profile: Readonly readonly connectionId?: string -}): string | undefined { +} + +/** Return the completed run at the requested branch tip with matching identity. */ +function continuationRunFor(input: ContinuationInput): BraidState['runs'][number] | undefined { if ( input.conversationId !== input.state.conversationId || input.branchId !== input.state.branchId @@ -23,24 +22,16 @@ export function continuationSessionFor(input: { const previous = input.state.runs .filter((run) => run.conversationId === input.conversationId && run.branchId === input.branchId) .at(-1) - if ( - previous === undefined || - previous.status !== 'completed' || - !previous.complete || - previous.providerSessionId === undefined || - !previous.capabilities.sessions.continue - ) + if (previous === undefined || previous.status !== 'completed' || !previous.complete) return undefined - const tip = input.state.messages.at(-1) - if ( - tip === undefined || - tip.conversationId !== input.conversationId || - tip.branchId !== input.branchId || - tip.runId !== previous.id || - !tip.complete - ) - return undefined + const tip = input.state.messages + .filter( + (message) => + message.conversationId === input.conversationId && message.branchId === input.branchId, + ) + .at(-1) + if (tip === undefined || tip.runId !== previous.id || !tip.complete) return undefined const previousConnection = previous.connectionId ?? previous.receipt.requested.connectionId ?? undefined @@ -48,9 +39,40 @@ export function continuationSessionFor(input: { const currentProfileDigest = canonicalAgentProfileDigestHex(input.profile) if (previous.receipt.profileDigest !== currentProfileDigest) return undefined + return previous +} + +/** + * Return the only provider session that is safe for an ordinary follow-up. + * A session is reusable only at the current branch tip and with the exact + * recorded profile/connection identity from the completed predecessor. + */ +export function continuationSessionFor(input: ContinuationInput): string | undefined { + const previous = continuationRunFor(input) + if ( + previous === undefined || + previous.providerSessionId === undefined || + !previous.capabilities.sessions.continue + ) + return undefined return previous.providerSessionId } +/** Return the only run eligible for an exact native continuation. */ +export function resolveNativeContinuationRun( + input: ContinuationInput, +): BraidState['runs'][number] | undefined { + const previous = continuationRunFor(input) + if ( + previous === undefined || + previous.providerSessionId === undefined || + previous.controlRef === undefined || + !runSupportsNativeContinuation(previous.capabilities) + ) + return undefined + return previous +} + export function branchHasVisibleHistory(input: { readonly state: BraidState readonly conversationId: string diff --git a/src/app/run-replay.ts b/src/app/run-replay.ts index 759689f5..2d0343a7 100644 --- a/src/app/run-replay.ts +++ b/src/app/run-replay.ts @@ -27,11 +27,13 @@ export async function reconnectRun( 'CAPABILITY_UNAVAILABLE', 'The selected execution path does not report replay with a stable cursor', ) - await context.commitAndWait({ - kind: 'run.reconnecting', - runId: run.id, - ...(run.lastCursor === undefined ? {} : { after: run.lastCursor }), - }) + if (run.status !== 'reconnecting') { + await context.commitAndWait({ + kind: 'run.reconnecting', + runId: run.id, + ...(run.lastCursor === undefined ? {} : { after: run.lastCursor }), + }) + } const abort = context.ledger.getAbort(run.id) ?? new AbortController() context.ledger.setAbort(run.id, abort) context.ledger.clearDetached(run.id) diff --git a/src/domain/run-contracts.ts b/src/domain/run-contracts.ts index 488600ec..2529b92e 100644 --- a/src/domain/run-contracts.ts +++ b/src/domain/run-contracts.ts @@ -1,6 +1,7 @@ import type { AgentEnvironmentCapabilities, AgentProfile, + NativeContextBoundaryProof, RequestedInteractions, } from '@tangle-network/agent-interface' import type { @@ -8,7 +9,10 @@ import type { RetainedRunAdmission, } from '@tangle-network/agent-runtime/kernel' -export type { RequestedInteractions } from '@tangle-network/agent-interface' +export type { + NativeContextBoundaryProof, + RequestedInteractions, +} from '@tangle-network/agent-interface' /** Canonical Runtime recovery data that Braid persists before Runtime may proceed. */ export type RetainedRunAdmissionRecord = RetainedRunAdmission | RetainedInteractiveAdmission @@ -118,14 +122,6 @@ export interface ContextTransferReceipt { readonly acceptedAt: string } -export interface NativeContextBoundaryProof { - readonly runId: string - readonly providerSessionId: string - readonly boundary: string - readonly revision?: string - readonly digest: string -} - export interface RunAdmissionReceipt { readonly version: 1 readonly runId: string diff --git a/src/ports/execution.ts b/src/ports/execution.ts index 686a84ea..145d5033 100644 --- a/src/ports/execution.ts +++ b/src/ports/execution.ts @@ -3,6 +3,7 @@ import type { AgentExactRunControlRef, AgentProfile, InteractionResponseCommand, + NativeContextBoundaryProof, } from '@tangle-network/agent-interface' import type { TurnUsage } from '../domain/entities.js' import type { RunAdmissionReceipt } from '../domain/receipts.js' @@ -33,6 +34,8 @@ export interface ExecuteTurnInput { readonly after?: string readonly afterSequence?: number readonly contextBoundary?: string + /** Exact provider proof required for one retry-safe same-session turn. */ + readonly nativeContextBoundaryProof?: NativeContextBoundaryProof readonly onRetainedAdmission?: RetainedRunAdmissionRecorder } @@ -143,15 +146,14 @@ export interface ExecutionPort { readonly onRetainedAdmission?: RetainedRunAdmissionRecorder } & RetainedExecutionRecoveryContext, ): AsyncIterable - nativeBoundary?(input: { - readonly runId: string - readonly sessionId: string - readonly signal?: AbortSignal - }): Promise<{ - readonly boundary: string - readonly digest: string - readonly revision?: string - } | null> + nativeBoundary?( + input: { + readonly runId: string + readonly sessionId: string + readonly controlRef?: AgentExactRunControlRef + readonly signal?: AbortSignal + } & RetainedExecutionRecoveryContext, + ): Promise environmentCapabilities?(): AgentEnvironmentCapabilities | Promise } @@ -186,6 +188,21 @@ export function supportsInteractionResponse(capabilities: RunCapabilities): bool return environmentSupportsInteractionResponse(capabilities.environment) } +export function supportsNativeContinuation(capabilities: AgentEnvironmentCapabilities): boolean { + return ( + capabilities.sessions.continue && + capabilities.nativeContinuation?.atomicBoundary === true && + capabilities.nativeContinuation.requestIdempotency === true + ) +} + +/** A run can continue natively only when its environment proves both safety guarantees. */ +export function runSupportsNativeContinuation(capabilities: RunCapabilities): boolean { + return ( + capabilities.environment !== undefined && supportsNativeContinuation(capabilities.environment) + ) +} + export function capabilitiesFromEnvironment( capabilities: AgentEnvironmentCapabilities, cancellationSupported: boolean, diff --git a/test/retained-native-continuation.test.ts b/test/retained-native-continuation.test.ts new file mode 100644 index 00000000..744eba46 --- /dev/null +++ b/test/retained-native-continuation.test.ts @@ -0,0 +1,307 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import { + type AgentExactRunControlRef, + type AgentNativeContextContinuationResult, + defineAgentProfile, + type NativeContextBoundaryProof, +} from '@tangle-network/agent-interface' +import type { RetainedRunHandle } from '@tangle-network/agent-runtime/kernel' +import { + type RetainedExecutionPlan, + RetainedExecutionPort, +} from '../src/adapters/runtime/retained-execution.js' +import { createAdmissionReceipt } from '../src/domain/receipts.js' +import type { RuntimeEventEnvelope } from '../src/domain/runtime-events.js' +import { DEFAULT_RUN_CAPABILITIES, type ExecuteTurnInput } from '../src/ports/execution.js' +import { RETAINED_RUN_HANDLE_CAPABILITIES } from './support/retained-run-capabilities.js' + +const at = '2026-08-19T12:00:00.000Z' +const profile = defineAgentProfile({ + name: 'Native continuation test', + harness: 'pi', + model: { default: 'openai/gpt-5.6-luna' }, +}) + +function exact(suffix: string): AgentExactRunControlRef { + return { + runId: `provider-run-${suffix}`, + provider: 'retained-test', + environmentId: 'environment-native', + sessionId: 'session-native', + executionId: `execution-${suffix}`, + requestDigest: `sha256:${(suffix === 'source' ? 'a' : 'b').repeat(64)}`, + } +} + +function fixture() { + const source = exact('source') + const next = exact('next') + const proof: NativeContextBoundaryProof = { + ...source, + boundary: { kind: 'revision', revision: 'pi-message-count:2' }, + observedAt: at, + } + const outcomes = new Map() + const continuationRequests: Array<{ + readonly operationId: string + readonly requestDigest: string + readonly run: AgentExactRunControlRef + readonly expectedBoundary: NativeContextBoundaryProof + }> = [] + const continuationStatuses: string[] = [] + let continuationCalls = 0 + let reconnectCalls = 0 + + const createHandle = (): RetainedRunHandle => { + let current = source + const result = { text: 'continued exactly once', success: true, sessionId: source.sessionId } + return { + get controlRef() { + return current + }, + capabilities: { + ...RETAINED_RUN_HANDLE_CAPABILITIES, + sessions: { continue: true, list: false, messages: false }, + nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + }, + async status() { + return { + runId: current.runId, + controlRef: current, + status: 'completed', + effect: 'not_live', + observedAt: at, + } + }, + async *events() {}, + async result() { + return result + }, + async respondToInteraction() { + throw new Error('interaction response is not part of this test') + }, + async contextBoundary() { + return proof + }, + async continueNative(request, turn) { + continuationCalls += 1 + continuationRequests.push(structuredClone(request)) + assert.deepEqual(request.run, source) + assert.deepEqual(request.expectedBoundary, proof) + assert.equal(turn.prompt, 'Continue this exact Pi chat.') + assert.equal(turn.model, 'openai/gpt-5.6-luna') + const prior = outcomes.get(request.requestDigest) + if (prior !== undefined) { + continuationStatuses.push('replayed') + current = next + return { + ...prior, + acknowledgement: { ...prior.acknowledgement, status: 'replayed' }, + } as AgentNativeContextContinuationResult + } + current = next + const accepted: AgentNativeContextContinuationResult = { + acknowledgement: { + operationId: request.operationId, + requestDigest: request.requestDigest, + status: 'accepted', + historyMessagesSent: 0, + }, + result, + controlRef: next, + } + continuationStatuses.push('accepted') + outcomes.set(request.requestDigest, accepted) + return accepted + }, + async cancel(request) { + return { + operationId: request.operationId, + requestDigest: current.requestDigest, + status: 'accepted', + effect: 'not_live', + snapshot: { + runId: current.runId, + controlRef: current, + status: 'completed', + effect: 'not_live', + observedAt: at, + }, + } + }, + } + } + + const capabilities = { + ...DEFAULT_RUN_CAPABILITIES, + streaming: { live: true, replay: true, detach: true, turnIdempotency: true }, + sessions: { continue: true, messages: false }, + controls: { cancel: true, steer: false, queue: true, status: true, recreate: true }, + events: { stableIdentity: true, sequence: true, cursor: true }, + environment: { + ...RETAINED_RUN_HANDLE_CAPABILITIES, + sessions: { continue: true, list: false, messages: false }, + nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + }, + } as const + const plan: RetainedExecutionPlan = { + providerName: source.provider, + environmentId: source.environmentId, + providerSessionId: source.sessionId, + model: 'openai/gpt-5.6-luna', + capabilities, + materializationReceipt: { backend: 'environment-provider' }, + start: async () => { + throw new Error('native continuation must not start another environment') + }, + reconnect: async (controlRef) => { + reconnectCalls += 1 + assert.deepEqual(controlRef, source) + return createHandle() + }, + discover: async () => null, + observe: async () => ({ + kind: 'local-process', + provider: source.provider, + lifecycle: 'ready', + lifecycleMode: 'retained', + cleanup: 'explicit', + continuity: 'session', + location: 'local', + createdAt: at, + observedAt: at, + unavailable: [], + }), + projectStatus: ({ status }) => (status === 'completed' ? 'completed' : 'unknown'), + isTerminalStatus: (status) => status === 'completed', + projectResult: (value) => ({ + text: value.text, + usage: { input: 0, output: 0, tokensKnown: false, usdKnown: false }, + }), + projectFinal: ({ runId, sequence, result }) => ({ + runId, + eventId: `${runId}:final`, + sequence, + receivedAt: at, + event: { + type: 'final', + task: { id: runId, intent: 'Continue the native chat' }, + status: result.success ? 'completed' : 'failed', + reason: result.success ? 'completed' : (result.error ?? 'failed'), + text: result.text, + timestamp: at, + }, + }), + } + const input: ExecuteTurnInput = { + operationId: 'operation-native-next', + runId: 'braid-run-next', + text: 'Continue this exact Pi chat.', + profile, + connectionId: 'connection-native', + workspaceRoot: '/workspace', + sessionId: source.sessionId, + signal: new AbortController().signal, + nativeContextBoundaryProof: proof, + } + return { + source, + next, + proof, + plan, + input, + continuationCalls: () => continuationCalls, + continuationRequests, + continuationStatuses, + reconnectCalls: () => reconnectCalls, + } +} + +async function collect(stream: AsyncIterable) { + const events: RuntimeEventEnvelope[] = [] + for await (const event of stream) events.push(event) + return events +} + +test('retained execution continues through Runtime without creating another environment', async () => { + const f = fixture() + let continuedControl: AgentExactRunControlRef | undefined + const execution = new RetainedExecutionPort({ + resolve: async () => { + throw new Error('native continuation must not resolve a fresh plan') + }, + continue: async (_input, controlRef) => { + continuedControl = controlRef + return f.plan + }, + recover: async () => { + throw new Error('same-process continuation must not enter restart recovery') + }, + }) + + const admission = await execution.admit(f.input) + assert.deepEqual(continuedControl, f.source) + assert.equal(admission.environmentId, f.source.environmentId) + const events = await collect(execution.streamTurn(f.input)) + + assert.equal(f.continuationCalls(), 1) + assert.equal(f.reconnectCalls(), 1) + assert.deepEqual(events[0]?.event.type, 'braid.execution.observed') + assert.deepEqual( + events[0]?.event.type === 'braid.execution.observed' ? events[0].event.controlRef : undefined, + f.next, + ) + assert.equal(events.at(-1)?.event.type, 'final') +}) + +test('restart reconnect retries the same continuation request and receives a replay', async () => { + const f = fixture() + const receipt = createAdmissionReceipt({ + runId: f.input.runId, + turnId: 'turn-native-next', + operationId: f.input.operationId, + conversationId: 'conversation-native', + branchId: 'branch-native', + admittedAt: at, + profile, + connectionId: 'connection-native', + text: f.input.text, + sessionId: f.source.sessionId, + capabilities: f.plan.capabilities, + provider: f.source.provider, + environmentId: f.source.environmentId, + providerSessionId: f.source.sessionId, + nativeContextBoundaryProof: f.proof, + }) + const recover = async ({ controlRef }: { readonly controlRef?: AgentExactRunControlRef }) => { + assert.deepEqual(controlRef, f.source) + return f.plan + } + const first = new RetainedExecutionPort({ + resolve: async () => f.plan, + continue: async () => f.plan, + recover, + }) + const recovery = { + runId: f.input.runId, + providerSessionId: f.source.sessionId, + receipt, + workspaceRoot: '/workspace', + signal: new AbortController().signal, + } + assert.equal((await first.status(recovery))?.status, 'reconnecting') + const accepted = await collect(first.reconnect(recovery)) + assert.equal(accepted.at(-1)?.event.type, 'final') + + const restarted = new RetainedExecutionPort({ + resolve: async () => f.plan, + continue: async () => f.plan, + recover, + }) + const replayed = await collect(restarted.reconnect(recovery)) + assert.equal(replayed.at(-1)?.event.type, 'final') + assert.equal(f.continuationCalls(), 2) + assert.deepEqual(f.continuationStatuses, ['accepted', 'replayed']) + assert.deepEqual(f.continuationRequests[0], f.continuationRequests[1]) +}) diff --git a/test/tangle-retained-control-lookup.test.ts b/test/tangle-retained-control-lookup.test.ts new file mode 100644 index 00000000..32405b26 --- /dev/null +++ b/test/tangle-retained-control-lookup.test.ts @@ -0,0 +1,155 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import { + type AgentExactRunControlRef, + AgentExactRunControlRefSchema, + defineAgentProfile, +} from '@tangle-network/agent-interface' +import type { SandboxClientLike, SandboxInstanceLike } from '@tangle-network/agent-provider-tangle' +import type { SessionInfo } from '@tangle-network/sandbox' +import { createTangleRetainedControlLookup } from '../src/adapters/connections/tangle-retained-control-lookup.js' +import { + createTangleRetainedPlan, + startTangleRetainedRun, +} from '../src/adapters/runtime/tangle-retained-run.js' +import { retainedSandboxIdentity } from '../src/adapters/runtime/tangle-sandbox-retention.js' +import { createConnectionId } from '../src/domain/ids.js' +import type { RetainedRunAdmissionRecord } from '../src/ports/execution.js' +import { + FakeTangleRetainedSandbox, + prepareFakeTangleRetainedConnection, +} from './support/tangle-retained-sandbox.js' + +const profile = defineAgentProfile({ + name: 'Tangle reconstruction test', + harness: 'opencode', + model: { provider: 'openai', default: 'openai/gpt-5' }, +}) + +test('two process instances recover one exact retained Tangle control reference', async () => { + const providerSessionId = 'session-braid-reconstruction' + const executionId = 'run-reconstruction' + const identity = retainedSandboxIdentity(providerSessionId) + const controlRef: AgentExactRunControlRef = AgentExactRunControlRefSchema.parse({ + runId: 'provider-run-reconstruction', + provider: 'tangle-sandbox', + environmentId: 'sandbox-reconstruction', + sessionId: providerSessionId, + executionId, + requestDigest: `sha256:${'b'.repeat(64)}`, + }) + const metadata = { + ...identity.metadata, + retainedIdempotencyKey: identity.environmentIdempotencyKey, + } + const sessionStatus: SessionInfo = { + id: providerSessionId, + status: 'completed', + latestExecutionId: executionId, + runControlRef: controlRef, + } + let listCalls = 0 + let getCalls = 0 + let statusCalls = 0 + + const createProcessClient = (): SandboxClientLike => { + const box: SandboxInstanceLike = { + id: controlRef.environmentId, + name: identity.name, + metadata, + async *streamPrompt() {}, + session(sessionId) { + assert.equal(sessionId, providerSessionId) + return { + id: sessionId, + async status() { + statusCalls += 1 + return sessionStatus + }, + } as never + }, + } + return { + create: async () => box, + list: async () => { + listCalls += 1 + return [box] + }, + get: async (id) => { + getCalls += 1 + assert.equal(id, controlRef.environmentId) + return box + }, + } + } + + const input = { + connectionId: createConnectionId('connection-tangle-reconstruction'), + braidRunId: 'run/reconstruction', + providerSessionId, + executionId, + environmentIdempotencyKey: identity.environmentIdempotencyKey, + } + const processOneLookup = createTangleRetainedControlLookup(createProcessClient()) + const processTwoLookup = createTangleRetainedControlLookup(createProcessClient()) + + const [processOneControl, processTwoControl] = await Promise.all([ + processOneLookup(input), + processTwoLookup(input), + ]) + + assert.deepEqual(processOneControl, controlRef) + assert.deepEqual(processTwoControl, controlRef) + assert.equal(listCalls, 2) + assert.equal(getCalls, 2) + assert.equal(statusCalls, 2) + assert.deepEqual(metadata, { + owner: 'braid', + lifecycle: 'retained', + providerSessionId, + retainedIdempotencyKey: identity.environmentIdempotencyKey, + }) + assert.equal('sessionId' in metadata, false) + assert.equal('executionId' in metadata, false) +}) + +test('two Tangle provider instances recover Runtime environment admissions', async () => { + const sandbox = new FakeTangleRetainedSandbox() + const firstPrepared = await prepareFakeTangleRetainedConnection({ + sandbox, + profile, + runId: 'run/provider-reconstruction', + }) + const admissions: RetainedRunAdmissionRecord[] = [] + const input = { + operationId: 'operation/provider-reconstruction', + runId: 'run/provider-reconstruction', + text: 'Recover this retained run.', + profile, + signal: new AbortController().signal, + onRetainedAdmission: async (admission: RetainedRunAdmissionRecord) => { + admissions.push(structuredClone(admission)) + }, + } + const firstHandle = await startTangleRetainedRun( + createTangleRetainedPlan(firstPrepared, input.runId), + input, + ) + const environmentAdmission = admissions.find((admission) => admission.phase === 'environment') + assert.ok(environmentAdmission) + + const secondPrepared = await prepareFakeTangleRetainedConnection({ + sandbox, + profile, + runId: input.runId, + providerSessionId: firstPrepared.providerSessionId, + }) + assert.notStrictEqual(secondPrepared.provider, firstPrepared.provider) + const secondPlan = createTangleRetainedPlan(secondPrepared, input.runId, undefined, { + retainedAdmission: environmentAdmission, + }) + const recovered = await secondPlan.recover?.({ admission: environmentAdmission }) + + assert.ok(recovered) + assert.deepEqual(recovered.controlRef, firstHandle.controlRef) +}) diff --git a/test/tui-native-continuation.test.ts b/test/tui-native-continuation.test.ts new file mode 100644 index 00000000..1d7e602f --- /dev/null +++ b/test/tui-native-continuation.test.ts @@ -0,0 +1,332 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import type { RuntimeStreamEvent } from '@tangle-network/agent-runtime' +import { createApplicationUiController } from '../src/adapters/tui/application-ui-controller.js' +import { AppError, BraidApplication } from '../src/app/application.js' +import { DETERMINISTIC_PROFILE } from '../src/app/composition.js' +import type { RuntimeEventEnvelope } from '../src/domain/runtime-events.js' +import { FixedClock } from '../src/ports/clock.js' +import { + DEFAULT_RUN_CAPABILITIES, + type ExecuteTurnInput, + type ExecutionPort, +} from '../src/ports/execution.js' +import { SequenceIds } from '../src/ports/ids.js' +import { RETAINED_RUN_HANDLE_CAPABILITIES } from './support/retained-run-capabilities.js' + +const GENERIC_CAPABILITIES = { + ...DEFAULT_RUN_CAPABILITIES, + streaming: { live: true, replay: true, detach: true, turnIdempotency: true }, + sessions: { continue: true, messages: true }, + controls: { cancel: true, steer: true, queue: true, status: true, recreate: true }, + events: { stableIdentity: true, sequence: true, cursor: true }, +} as const + +const NATIVE_CAPABILITIES = { + ...GENERIC_CAPABILITIES, + environment: { + ...RETAINED_RUN_HANDLE_CAPABILITIES, + sessions: { continue: true, list: false, messages: false }, + nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + }, +} as const + +const CONTROL_REF = { + runId: 'pi-provider-run', + provider: 'pi', + environmentId: 'environment-pi', + sessionId: 'session-pi', + executionId: 'pi-execution', + requestDigest: `sha256:${'b'.repeat(64)}` as const, +} + +const NATIVE_PROOF = { + ...CONTROL_REF, + boundary: { kind: 'revision' as const, revision: 'pi-boundary:1' }, + observedAt: '2026-08-01T00:00:01.000Z', +} + +function finalEvent( + text: string, + status: 'completed' | 'failed' = 'completed', +): RuntimeStreamEvent { + return { + type: 'final', + status, + reason: status === 'completed' ? 'complete' : 'failed', + text, + task: { id: 'task-tui-continuation', intent: 'test' }, + timestamp: '2026-08-01T00:00:00.000Z', + } +} + +function observedEvent( + input: ExecuteTurnInput, + controlRef: typeof CONTROL_REF = CONTROL_REF, +): RuntimeEventEnvelope { + return { + runId: input.runId, + eventId: `${input.runId}:observed`, + sequence: 1, + receivedAt: '2026-08-01T00:00:00.000Z', + event: { + type: 'braid.execution.observed', + observation: { + kind: 'local-process', + provider: CONTROL_REF.provider, + providerEnvironmentId: CONTROL_REF.environmentId, + lifecycle: 'ready', + lifecycleMode: 'retained', + cleanup: 'explicit', + continuity: 'session', + location: 'local', + createdAt: '2026-08-01T00:00:00.000Z', + observedAt: '2026-08-01T00:00:00.000Z', + unavailable: [], + }, + controlRef, + timestamp: '2026-08-01T00:00:00.000Z', + }, + } +} + +function finalEnvelope(input: ExecuteTurnInput, text: string): RuntimeEventEnvelope { + return { + runId: input.runId, + eventId: `${input.runId}:final`, + sequence: 2, + receivedAt: '2026-08-01T00:00:00.000Z', + event: finalEvent(text), + } +} + +function continuationExecution( + kind: 'native' | 'generic', + failBoundary = false, + terminal: 'completed' | 'failed' | 'none' = 'completed', + distinctControlRefs = false, +): { + readonly execution: ExecutionPort + readonly admissions: ExecuteTurnInput[] + readonly nativeBoundaryCalls: number +} { + const capabilities = kind === 'native' ? NATIVE_CAPABILITIES : GENERIC_CAPABILITIES + const admissions: ExecuteTurnInput[] = [] + let nativeBoundaryCalls = 0 + const execution: ExecutionPort = { + capabilities: () => capabilities, + admit: (input) => { + admissions.push(input) + return { + capabilities, + provider: CONTROL_REF.provider, + environmentId: CONTROL_REF.environmentId, + providerSessionId: CONTROL_REF.sessionId, + } + }, + async *streamTurn(input): AsyncIterable { + const controlRef = distinctControlRefs + ? { + ...CONTROL_REF, + runId: `provider-${input.runId}`, + executionId: `execution-${input.runId}`, + } + : CONTROL_REF + const observed = kind === 'native' && input.nativeContextBoundaryProof === undefined + if (observed) yield observedEvent(input, controlRef) + if (terminal !== 'none') + yield observed + ? finalEnvelope( + input, + input.nativeContextBoundaryProof ? 'native follow-up' : 'source turn', + ) + : finalEvent( + input.nativeContextBoundaryProof ? 'native follow-up' : 'source turn', + terminal, + ) + }, + ...(kind === 'native' + ? { + nativeBoundary: async ({ controlRef }) => { + nativeBoundaryCalls += 1 + if (failBoundary) throw new Error('native boundary unavailable') + if (!distinctControlRefs) return NATIVE_PROOF + const exactControlRef = controlRef ?? CONTROL_REF + return { + ...exactControlRef, + boundary: { kind: 'revision' as const, revision: 'native-boundary:1' }, + observedAt: '2026-08-01T00:00:01.000Z', + } + }, + } + : {}), + } + return { + execution, + admissions, + get nativeBoundaryCalls() { + return nativeBoundaryCalls + }, + } +} + +function appFor(execution: ExecutionPort): BraidApplication { + const app = new BraidApplication({ + profile: DETERMINISTIC_PROFILE, + execution, + clock: new FixedClock(), + ids: new SequenceIds(), + }) + app.initialize('/workspace') + return app +} + +async function completeSource(app: BraidApplication): Promise { + await app.send({ operationId: 'operation-source', text: 'start the branch' }).completion +} + +test('typed dispatch routes an exact-capable branch tip through native continuation', async () => { + const fixture = continuationExecution('native') + const app = appFor(fixture.execution) + await completeSource(app) + + const result = await createApplicationUiController(app).dispatch({ + type: 'send', + operationId: 'operation-native-follow-up', + text: 'continue the native branch', + }) + assert.equal(result.kind, 'accepted') + if (result.kind !== 'accepted') return + await result.completion + + assert.equal(fixture.nativeBoundaryCalls, 1) + assert.equal(fixture.admissions.length, 2) + assert.equal(fixture.admissions[1]?.sessionId, CONTROL_REF.sessionId) + assert.deepEqual(app.state().runs.at(-1)?.receipt.nativeContextBoundaryProof, NATIVE_PROOF) + assert.equal(app.state().runs.at(-1)?.status, 'completed') +}) + +test('headless send keeps a generic Tangle continuation on app.send', async () => { + const fixture = continuationExecution('generic') + const app = appFor(fixture.execution) + await completeSource(app) + + const result = await createApplicationUiController(app).dispatch({ + type: 'headless-command', + command: 'send', + operationId: 'operation-generic-follow-up', + params: { text: 'continue the generic branch' }, + }) + assert.equal(result.kind, 'accepted') + if (result.kind !== 'accepted') return + await result.completion + + assert.equal(fixture.nativeBoundaryCalls, 0) + assert.equal(fixture.admissions.length, 2) + assert.equal(fixture.admissions[1]?.sessionId, CONTROL_REF.sessionId) + assert.equal(fixture.admissions[1]?.nativeContextBoundaryProof, undefined) + assert.equal(app.state().runs.at(-1)?.status, 'completed') +}) + +test('an exact boundary failure is returned without a generic fallback', async () => { + const fixture = continuationExecution('native', true) + const app = appFor(fixture.execution) + await completeSource(app) + + const result = await createApplicationUiController(app).dispatch({ + type: 'send', + operationId: 'operation-native-boundary-failure', + text: 'do not fork this branch', + }) + assert.equal(result.kind, 'error') + if (result.kind !== 'error') return + assert.match(result.message, /native boundary unavailable/u) + assert.equal(fixture.nativeBoundaryCalls, 1) + assert.equal(fixture.admissions.length, 1) + assert.equal(app.state().runs.length, 1) +}) + +test('a stale native run is rejected before the provider boundary or proof admission', async () => { + const fixture = continuationExecution('native', false, 'completed', true) + const app = appFor(fixture.execution) + const first = await app.send({ operationId: 'operation-stale-source', text: 'first branch turn' }) + .completion + const firstRun = first.runs[0] + assert.ok(firstRun) + const second = await app.send({ operationId: 'operation-stale-tip', text: 'new branch tip' }) + .completion + assert.notEqual(second.runs.at(-1)?.id, firstRun.id) + const firstControlRef = firstRun.controlRef + const firstSessionId = firstRun.providerSessionId + assert.ok(firstControlRef) + assert.ok(firstSessionId) + + await assert.rejects( + () => + app.continueNative({ + operationId: 'operation-stale-native', + runId: firstRun.id, + text: 'must not continue the stale run', + }), + (error: unknown) => + error instanceof AppError && error.code === 'NATIVE_CONTINUATION_UNVERIFIED', + ) + assert.equal(fixture.nativeBoundaryCalls, 0) + + assert.throws( + () => + app.send({ + operationId: 'operation-stale-proof', + text: 'must not admit the stale proof', + sessionId: firstSessionId, + nativeContextBoundaryProof: { + ...firstControlRef, + boundary: { kind: 'revision' as const, revision: 'stale-boundary:1' }, + observedAt: '2026-08-01T00:00:01.000Z', + }, + }), + (error: unknown) => + error instanceof AppError && error.code === 'NATIVE_CONTINUATION_UNVERIFIED', + ) + assert.equal(fixture.nativeBoundaryCalls, 0) +}) + +test('an incomplete native run is rejected before the provider boundary or proof admission', async () => { + const fixture = continuationExecution('native', false, 'none') + const app = appFor(fixture.execution) + const source = await app.send({ + operationId: 'operation-incomplete-source', + text: 'incomplete turn', + }).completion + const sourceRun = source.runs[0] + assert.ok(sourceRun) + assert.equal(sourceRun.status, 'unknown') + assert.equal(sourceRun.complete, false) + const sourceSessionId = sourceRun.providerSessionId + assert.ok(sourceSessionId) + + await assert.rejects( + () => + app.continueNative({ + operationId: 'operation-incomplete-native', + runId: sourceRun.id, + text: 'must not continue the incomplete run', + }), + (error: unknown) => + error instanceof AppError && error.code === 'NATIVE_CONTINUATION_UNVERIFIED', + ) + assert.equal(fixture.nativeBoundaryCalls, 0) + + assert.throws( + () => + app.send({ + operationId: 'operation-incomplete-proof', + text: 'must not admit the incomplete proof', + sessionId: sourceSessionId, + nativeContextBoundaryProof: NATIVE_PROOF, + }), + (error: unknown) => + error instanceof AppError && error.code === 'NATIVE_CONTINUATION_UNVERIFIED', + ) + assert.equal(fixture.nativeBoundaryCalls, 0) +}) diff --git a/test/w8-runs.test.ts b/test/w8-runs.test.ts index e0cfbc74..bdbe40ef 100644 --- a/test/w8-runs.test.ts +++ b/test/w8-runs.test.ts @@ -13,6 +13,7 @@ import { FixedClock } from '../src/ports/clock.js' import { DEFAULT_RUN_CAPABILITIES, type ExecutionPort } from '../src/ports/execution.js' import { SequenceIds } from '../src/ports/ids.js' import { runtimeContractEnvelopes } from '../src/testing/runtime-contract-fixtures.js' +import { RETAINED_RUN_HANDLE_CAPABILITIES } from './support/retained-run-capabilities.js' const REPLAY_CAPABILITIES = { ...DEFAULT_RUN_CAPABILITIES, @@ -22,6 +23,15 @@ const REPLAY_CAPABILITIES = { events: { stableIdentity: true, sequence: true, cursor: true }, } as const +const NATIVE_REPLAY_CAPABILITIES = { + ...REPLAY_CAPABILITIES, + environment: { + ...RETAINED_RUN_HANDLE_CAPABILITIES, + sessions: { continue: true, list: false, messages: false }, + nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + }, +} as const + function finalEvent(text: string): RuntimeStreamEvent { return { type: 'final', @@ -387,15 +397,56 @@ test('status reconciliation never regresses a committed terminal run from a stal }) test('native continuation requires and records a matching provider boundary proof', async () => { + const controlRef = { + runId: 'provider-run-native', + provider: 'native-test', + environmentId: 'environment-native', + sessionId: 'session-native', + executionId: 'execution-native', + requestDigest: `sha256:${'a'.repeat(64)}` as const, + } const execution: ExecutionPort = { - capabilities: () => REPLAY_CAPABILITIES, - admit: () => ({ capabilities: REPLAY_CAPABILITIES, providerSessionId: 'session-native' }), - async *streamTurn(): AsyncIterable { - yield finalEvent('native') + capabilities: () => NATIVE_REPLAY_CAPABILITIES, + admit: () => ({ + capabilities: NATIVE_REPLAY_CAPABILITIES, + providerSessionId: 'session-native', + }), + async *streamTurn(input): AsyncIterable { + yield { + runId: input.runId, + eventId: `${input.runId}:observed`, + sequence: 1, + receivedAt: '2026-08-01T00:00:00.000Z', + event: { + type: 'braid.execution.observed', + observation: { + kind: 'local-process', + provider: 'native-test', + lifecycle: 'ready', + lifecycleMode: 'retained', + cleanup: 'explicit', + continuity: 'session', + location: 'local', + createdAt: '2026-08-01T00:00:00.000Z', + observedAt: '2026-08-01T00:00:00.000Z', + unavailable: [], + }, + controlRef, + timestamp: '2026-08-01T00:00:00.000Z', + }, + } + yield { + runId: input.runId, + eventId: `${input.runId}:final`, + sequence: 2, + receivedAt: '2026-08-01T00:00:00.000Z', + event: finalEvent('native'), + } }, - nativeBoundary: async (input) => ({ - boundary: 'boundary-native', - digest: `${input.sessionId}:proof`, + nativeBoundary: async () => ({ + ...controlRef, + boundary: { kind: 'revision', revision: 'boundary-native' }, + observedAt: '2026-08-01T00:00:01.000Z', }), } const app = appFor(execution) @@ -408,10 +459,10 @@ test('native continuation requires and records a matching provider boundary proo text: 'forged', sessionId: 'session-other', nativeContextBoundaryProof: { - runId: first.runs[0]?.id ?? '', - providerSessionId: 'session-other', - boundary: 'boundary-native', - digest: 'forged-proof', + ...controlRef, + sessionId: 'session-other', + boundary: { kind: 'revision', revision: 'boundary-native' }, + observedAt: '2026-08-01T00:00:01.000Z', }, }), (error: unknown) => @@ -423,7 +474,10 @@ test('native continuation requires and records a matching provider boundary proo text: 'continue', }) const state = await continued.completion - assert.equal(continued.admission.nativeContextBoundaryProof?.boundary, 'boundary-native') + assert.deepEqual(continued.admission.nativeContextBoundaryProof?.boundary, { + kind: 'revision', + revision: 'boundary-native', + }) assert.equal(state.runs.length, 2) assert.equal(state.runs[1]?.status, 'completed') }) From 4176679ca1a8d27c42dffff48914834340eb16a7 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 04:40:11 -0600 Subject: [PATCH 004/136] feat(runs): support concurrent branch runs --- artifacts/verification/w6/120x40-plain.txt | 4 +- artifacts/verification/w6/120x40.png | Bin 21886 -> 22570 bytes artifacts/verification/w6/120x40.txt | 2 +- artifacts/verification/w6/200x60-plain.txt | 4 +- artifacts/verification/w6/200x60.png | Bin 10015 -> 10412 bytes artifacts/verification/w6/200x60.txt | 2 +- artifacts/verification/w6/40x12-plain.txt | 4 +- artifacts/verification/w6/40x12.png | Bin 14600 -> 14275 bytes artifacts/verification/w6/40x12.txt | 2 +- .../verification/w6/80x24-automation.gif | Bin 23332 -> 14866 bytes artifacts/verification/w6/80x24-plain.txt | 4 +- .../w6/80x24-transcript-keyboard.gif | Bin 377491 -> 370867 bytes artifacts/verification/w6/80x24.png | Bin 18888 -> 18510 bytes artifacts/verification/w6/80x24.txt | 2 +- .../verification/w6/capture-manifest.json | 174 ++++---- .../w6/raw/transcript-keyboard.cast | 144 ++++--- .../w6/states/active-streaming.json | 110 ++--- .../w6/states/active-streaming.png | Bin 15662 -> 15309 bytes .../w6/states/active-streaming.txt | 2 +- .../verification/w6/states/analysis.json | 26 +- artifacts/verification/w6/states/analysis.png | Bin 62918 -> 60446 bytes artifacts/verification/w6/states/analysis.txt | 2 +- .../verification/w6/states/automation.json | 24 +- .../verification/w6/states/automation.png | Bin 4156 -> 4156 bytes .../w6/states/command-palette-120.json | 26 +- .../w6/states/command-palette-120.png | Bin 36717 -> 36518 bytes .../w6/states/command-palette-120.txt | 2 +- .../w6/states/command-palette-40.json | 26 +- .../w6/states/command-palette-40.png | Bin 9718 -> 9482 bytes .../w6/states/command-palette-40.txt | 2 +- .../w6/states/command-palette-80.json | 26 +- .../w6/states/command-palette-80.png | Bin 35536 -> 35226 bytes .../w6/states/command-palette-80.txt | 2 +- .../verification/w6/states/comparison.json | 26 +- .../verification/w6/states/comparison.png | Bin 68314 -> 65619 bytes .../verification/w6/states/comparison.txt | 2 +- artifacts/verification/w6/states/empty.json | 26 +- artifacts/verification/w6/states/empty.png | Bin 13523 -> 5782 bytes artifacts/verification/w6/states/empty.txt | 2 +- .../w6/states/failure-or-reconnect.json | 71 ++-- .../w6/states/failure-or-reconnect.png | Bin 19112 -> 18786 bytes .../w6/states/failure-or-reconnect.txt | 2 +- .../verification/w6/states/fork-preview.json | 24 +- .../verification/w6/states/fork-preview.png | Bin 11548 -> 11548 bytes .../w6/states/graph-or-analysis.json | 24 +- .../w6/states/graph-or-analysis.png | Bin 20641 -> 20641 bytes .../verification/w6/states/interaction.json | 24 +- .../verification/w6/states/interaction.png | Bin 28820 -> 28820 bytes artifacts/verification/w6/states/narrow.json | 26 +- artifacts/verification/w6/states/narrow.png | Bin 9973 -> 9639 bytes artifacts/verification/w6/states/narrow.txt | 2 +- artifacts/verification/w6/states/profile.json | 26 +- artifacts/verification/w6/states/profile.png | Bin 5536 -> 6355 bytes artifacts/verification/w6/states/profile.txt | 21 +- docs/components/multi-run-orchestration.md | 153 +++++++ docs/components/work-strip.md | 129 ++++++ scripts/packed-binary.mjs | 1 + src/adapters/tui/ui-capabilities.ts | 28 +- src/adapters/tui/ui-command-dispatch.ts | 11 +- src/adapters/tui/ui-core-dispatch.ts | 14 + src/adapters/tui/ui-projection.ts | 86 +++- src/adapters/tui/ui-view-model.ts | 9 +- src/app/application-lifecycle.ts | 6 +- src/app/application-support.ts | 24 +- src/app/application.ts | 37 +- src/app/conversation-branches.ts | 4 - src/app/conversation-import-builder.ts | 8 +- src/app/conversation-lifecycle.ts | 3 - src/app/durable-send.ts | 42 +- src/app/legacy-cancel.ts | 2 +- src/app/run-admission-dispatch.ts | 39 +- src/app/run-admission-receipt.ts | 4 +- src/app/run-admission-validation.ts | 6 +- src/app/run-controls.ts | 2 + src/app/run-execution.ts | 21 +- src/app/run-ledger.ts | 10 +- src/app/run-status.ts | 34 +- src/app/shutdown-controller.ts | 46 +- src/bin/native-interactive-actions.ts | 10 +- src/domain/connection-removal.ts | 11 +- src/domain/events-legacy.ts | 2 + src/domain/events.ts | 4 + src/domain/invariants-state.ts | 30 +- src/domain/materialized-state-snapshot.ts | 38 +- src/domain/materialized-state.ts | 5 + src/domain/reducer-conversation-events.ts | 17 +- src/domain/reducer-domain-events.ts | 6 +- src/domain/reducer-helpers.ts | 16 +- src/domain/reducer-interactions.ts | 8 - src/domain/reducer-legacy.ts | 10 +- src/domain/reducer-lifecycle.ts | 41 +- src/domain/reducer-replay.ts | 8 +- src/domain/reducer-run-graph.ts | 4 +- src/domain/reducer-support.ts | 2 +- src/domain/runtime-projection.ts | 3 + src/domain/state.ts | 79 ++++ src/views/headless/rpc.ts | 2 + src/views/shared/intents.ts | 19 +- src/views/shared/models.ts | 34 ++ src/views/tui/activity-browser.ts | 3 + src/views/tui/entity-browser.ts | 6 + src/views/tui/terminal-chrome.ts | 51 ++- src/views/tui/terminal-command-controller.ts | 21 +- src/views/tui/terminal-input-controller.ts | 25 +- src/views/tui/terminal-overlays.ts | 7 + src/views/tui/terminal-surface-overlays.ts | 8 + test/application.test.ts | 402 ++++++++++++++++++ test/conversations.test.ts | 17 +- test/native-interactive-actions.test.ts | 37 ++ test/storage-snapshots.test.ts | 65 ++- test/terminal-responsive.test.ts | 60 ++- 111 files changed, 2069 insertions(+), 567 deletions(-) create mode 100644 docs/components/multi-run-orchestration.md create mode 100644 docs/components/work-strip.md diff --git a/artifacts/verification/w6/120x40-plain.txt b/artifacts/verification/w6/120x40-plain.txt index 894047a6..5d1e7c3c 100644 --- a/artifacts/verification/w6/120x40-plain.txt +++ b/artifacts/verification/w6/120x40-plain.txt @@ -1,4 +1,4 @@ -Braid ready — /home/drew/code/.worktrees/braid-exact-interactive-20260816 +Braid ready — /home/drew/code/.worktrees/braid-10-multirun status: ready for a message conversation: New conversation; branch: branch-1 profile: Braid starter; runner: pi; connection: deterministic fixture @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-f464b334-bc5f-406b-aed7-ac801fbd20e3","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:f75eb08b6c6a3120e5297421baed1e5e2553899395ec5981e0fda4c9ce725300"}}},"session":{"id":"05bb45e5-a6c1-40e3-b260-359bc2bd56c2","backend":"executor","status":"active","createdAt":"2026-08-16T11:04:57.315Z","updatedAt":"2026-08-16T11:04:57.315Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-65b7ec82-3f0c-4571-a6d7-23e45d0c536c","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"c458bedd-8754-443c-a63d-c265d6734ab9","backend":"executor","status":"active","createdAt":"2026-08-28T10:35:21.598Z","updatedAt":"2026-08-28T10:35:21.598Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/120x40.png b/artifacts/verification/w6/120x40.png index e418aa0aa459e40c8f27c65b5c3bbdd047d05608..dcc89b7193221675fdb89293140d296a327014c1 100644 GIT binary patch literal 22570 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 X_ta)+q3@!d!==r literal 21886 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 bc)6=`|`PBGRPSsDKH*B=k@Q2T>p(pn#zS5{d)} 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 Uvk|#y=+_3?AU(}u^*>(x8^*=LumAu6 diff --git a/artifacts/verification/w6/200x60.txt b/artifacts/verification/w6/200x60.txt index 17a093c3..5982f5f5 100644 --- a/artifacts/verification/w6/200x60.txt +++ b/artifacts/verification/w6/200x60.txt @@ -57,4 +57,4 @@ ─────────────────────────────────────────────────────────────────────────── type / for commands · Alt+Enter newline · paste ──────────────────────────────────────────────────────────────────────────── -profile Braid starter · pi · local Ctrl+E details +profile Braid starter · harness pi · backend local Ctrl+E details diff --git a/artifacts/verification/w6/40x12-plain.txt b/artifacts/verification/w6/40x12-plain.txt index 894047a6..5d1e7c3c 100644 --- a/artifacts/verification/w6/40x12-plain.txt +++ b/artifacts/verification/w6/40x12-plain.txt @@ -1,4 +1,4 @@ -Braid ready — /home/drew/code/.worktrees/braid-exact-interactive-20260816 +Braid ready — /home/drew/code/.worktrees/braid-10-multirun status: ready for a message conversation: New conversation; branch: branch-1 profile: Braid starter; runner: pi; connection: deterministic fixture @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-f464b334-bc5f-406b-aed7-ac801fbd20e3","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:f75eb08b6c6a3120e5297421baed1e5e2553899395ec5981e0fda4c9ce725300"}}},"session":{"id":"05bb45e5-a6c1-40e3-b260-359bc2bd56c2","backend":"executor","status":"active","createdAt":"2026-08-16T11:04:57.315Z","updatedAt":"2026-08-16T11:04:57.315Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-65b7ec82-3f0c-4571-a6d7-23e45d0c536c","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"c458bedd-8754-443c-a63d-c265d6734ab9","backend":"executor","status":"active","createdAt":"2026-08-28T10:35:21.598Z","updatedAt":"2026-08-28T10:35:21.598Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/40x12.png b/artifacts/verification/w6/40x12.png index 641f5807e7d78c3c4fd5bdc9f9449d553884c771..2e82424ddee1e35520e59ce26996427eb18d061f 100644 GIT binary patch literal 14275 zcmcJ01yEewmTpJ!K!OFAAi+X{6EwIJ+yaE)?rs4Z2oNB6@Zj#!Km(oN?$AKv4vo7u z@BH^p&AU_eM((_s>Y|$3XZP9rth4m{)(-oqB#nbfiU|UNaAaj9R6(Ez3Bcbg^oPKR zYcbYi;EUQ=MpY36@?rpizJfuZYhdW>7I5_~2(C&zq6W^sUd1p@I>%1V4t_n6(AcmIUHNriUEC`v6#{Z$mb zkM$u9tK>%l!aR;o4UoDwr6ps<7S{8+gh;D-M6ouD6-7e~8=207$0k9nA2g{S$1YNt zkKcZLgYn>K_TXj`Uef5jpRw5(gX^C3GgRWhIuO|C*EKKbBM@jr@`oV^lpT2c5QIm# zMhyB|NDTvlB%WM70Z}veu!BGx5qh7Vp5eAXM*{w6_>_W1UHjwK@-`tpeo%1I+Qj5! zoFT(tDzCE3#^7(!Q9a4!vN`DkDm3hu4$HS!Tf{0^G&E56y|FChmy;w`gZTKL)J-o1 zga*5&o~EjQ{E_+IwXg2$SMcQ}AlmlOXQZU0eXS9#`Yp`Yk`v91H5q7Vj0|*X0`6VY zmzh?B0|V3BmanA0AD*4zU}0fkVI3XmFtfUna;)i!ihdCjQ#a{Y5E8Mrv<#b?)7g&g zi~y!9X9`QAQwX>bAXFUg(S^K@J_tDALcY5~VB@$YnB(jO8g(_qU zrz>a*`tP$QDFcmW%6aDq`aRUwEY9eN>Inya`U zlj?+7IaGF>C)Ot+Fwh5#C$2mkZhFVcr!6bnJ2LX4yg*A;Hykf})B>MT>DTxfgTiSB zpJQON;MHl7S}a{#P$=%+?%pZML1w9^mlu~KUshIDtV?e*EV-%ay2blq2Z^+{LIwr~ zMy2zy^@cx>Q4w(49~d08wYFyWR`c5!uzVV1)LR?x+Z`*Ddxt`Gc6MqICP3W|c(&lf z#sf*&SX^8@l)^p@#o5)x*~h;Ff&?jXX-+4#uohZM5Xb{VEv=-~R3ywF#vQTFWrALh z>Bj`>7{j?DbTzkkQym#_g}lrUqWhHhtMVmH$4CxmvL?n6hEB2$D@%T>a1LPYG<1xN z(hMwi^YtzH`T4twR~f$EB-kNI1<+|LaWS!!RK2BTmCIb_;ZSAfwYFLhr|}C})spqknjKFR zq0{j5d(K=~IXg#eiJvxIdr{chjy_>#5jp<$F`-yj%kV;(p6wH5bU}VTgX~{&7P{j0 zD6NQ@{B~omCD$saVic2}o?eW}eWIacrJIsK7^ehhdHq@xoiK^OwUH4wXdf{@&Ehf7OI%C*{Qdt9b@o}{Iv`M`ZjEt4QxARbUDj~nI ziRo{6V{l`a{x_27Oe|^y1gPE*DNSA)u60`vn|T&Ot+}~*Mkg%q)x}h3<9c!Y@8A7q zfAUqki3S$pXLmu!IIO`=8(-kvc)(N->hsb4o^>AE)Knp*BpskACJtn`JM}MQB#W=8fHq+ z(txe37MPisFm8;E>}Z;r!>gU}3uO7W&+`zWu2b+yTClo$Zfj93q^8~AB`IlfNr^eE z?*&xO%Br}mtn5(sUK9-t{83l8m@W^5C(pa4Wi8)+W|%*vxglGpY4jl=Bt%Nri&U(z zw6-)aL7pKFOI{97EFgeauVD}Yv7H^sH;e^gW)%qgAO=Kx#HO zQ52N>l+Tx!OEk*_nT}l_gGboWo=HebrVBeWta(;OMD#1C^7v2Z0bZI-k7xKNKPMY~ za(aeT&ghTFfUWJ%L;bf`I=gWxUo$gbv+DKP+v7tu->0_tbYkl1A%1NBN%DuqCnq=B z%VSgiwmZT!shF4oYKO6wl8^JF4wtX#)CKhH0%{W(o@~{ zygn-`Mpoi3thQiZZ$s+p@~Uh0=l!*{E>K<%U=Th(f!b&V2IC54N}+Epmv-~GgKTpd zh|QrOidh6=brm1%%tx*ywZS5L9R#}&{!7#u#!}XnR`K!idAa6pulIH>R_ycBn%h1z zhCUY$-9mB#zpFM_pKBtc^HOI1M9)vJc#2YCO;ba6(K#^mk31ufOHPM+FVcWVUc;X| z9j`#?*x5y_PPcNpmFwz{w60loFDK{91kQWLXkjgideR8{JuA13l0E1J zcUM~rak<-jdVb%+qmbpzoRGJMZ{0V}ek0z!b0i`n!h)r|(hYa!I^rE4yT!s659)sa z?`J9Dp3pE?NIkyWSr@Tgd^IPvJ2U0JSpK6JBIJS@VAsRGJM3hn;s{>=N2YB+F9Iv! z{_~BDz06KdP5}@*BV~mQL0rRnkJdy6#bdPBRJNnu&06wU7h~(7-4+Umz2O!pMBo|e zOX8$o6%`fP*)J$kdzKyW#4y5Ss}HzlTx}ua7CRb~_NJB)tZwbJp%(_ z6tl4ubYqh^1T01US72X_EB%y~4$k9~#)r**AJCefd@WX(U%x*(z7&b{!NEDDZ~lES zu<40;hjofN({i$Esx3LZy5%*suY|k09^i?ob2A+ybJ(hX63H@cw_(L?5ZRe(Bvcu} z8XCaG#mtn^ytc>SZsnkp6D+S&)cy%Pc$Hq0IAf8FWQ&oG9*fa%b3I~%cxaSB@8mUn zSv-_)duQu46Vn%G_4owSIZ?h~FBu?|0O_iZ@Y{0#3#C~NKvAAN4A>&)w`}b`H;SNp zAuB1_**PP7D)bevxVTsfeR6U#UD(^Qbn~Z1e-bSi6DxxK-Z7`NR^eQqF`|6$JfusC zkT7{6Qk8<8OfNM-7%MnVt+`wAh%yv!#YqodI{#Xpw@}^6SS`Y#I(eMcC(@tm$kVIA zyD_@eW8F*BOv)Kc3s!+jq?+m-Q~tlQ5rD1My!5-dAI!SFGq2p#B|v{n{)|zOxxR)h zo6Aj#R3J!!p{DdFXTBG^UbEPWNd;uMke;6K5YCu-V487`tW|+yRBQwV_Kdl z1qR%gpBd9~fWX;VyOoGqvN40Ou)g7Z$MHhR&&Y~am-*bntv;E6o<6E)Fg?A+_F_LE z`tNJs_6-iMo?KB>H;=%p zHqseP<{t#Y?S~Hr(MnXiYd;e1bT1cveGae{N(i}J;${hn@RSc_omjc zFDWTzH@GsMo32u0h)jx$yIDA3+;x5p{;2L!8WZz}SDxr&kvczrV+IOEEVgwWiLmc0 z>GF)!xjmZ;3F&I+SObIog`dUciSVU{;k7mD?;Ktko4Cv+l=v?}67HC9ZVw);c15MH z2({+s?k>k|#xZ!vIROsmWXjNeoq#}--LN!QqIYNz>T@;>L@9K53a@+O7AN;E^mBAZ z2)ezx0OHYQ0p1qJia)Q{D!u$^Q&OxEJJ=h^+@Rjq1C)wZr`9T7A1SdF@Yc8-2(sFEgMR}*Fn7)C$v2{}_ z&kJ6sI|xIeV5e>s&@ao`lIU5UCmVN_j^gf^^@Fv#2tIStS7 zMNQ5q=801Cd2dYY>G1}`;<ZbbzrRGiOGgx?4H(Q;4^5~Xt$B77pdFyK7%}c z^c4GZLBY)Q?B}>?w!NO`uY7!c+uOw2+QfW(5;2K+xVf*+dSZaO1>@+bJBo7hpoD!n zq(^n{>w`yc(nP54Xqma_OfJgx-@EABpdck$lCW>UYn(b+TIv9Uoi~SGl97d%Z*iIQ z0AKe04`|oMVfsPYXblZYa;nrBGVa+OSC8BI!T8Y2Ii?u=i16? zZ}&%YLV>LVWfQAT^SAU2v(KNYW&It#3BBeUmTk&!C=`uWl1ASi-3A^GSdSWf%>e)_ zZGmFA$`wCr0-dk8$eDhKr-XQLu4KcOFCnjDr5)P9%MjQrdQkA({!+~0&Xd=^p0iS>XjD!7d z#0al{c4MK%d)tOb^HKk7eo>Xmv0KvBB{evI@F%}*mjYm}tn`2@sW514vtIR7PTAdG z9__Gv?|ofM*G|!^S_V|=N5;}MH8nzlE%^$`r?l_Ay5eQqFefJ_7!=ZKmyi`g-I0Wc zSB%OTw0C#%)0zqqJxu{B;erUs;#Z{IHZ=@4FTL2Us@=(kxmtl{R~HkXV2;O zc&|z4$>z}c)`5@4joZ4_*3NFG;VAStJUk^OWlz9uXJ?Et>SAZqYVantsH9{O z>RtiVC;9b&L*AMW8*jsur5p3}zXwW<;_yCws5{vya`WAWeCbw61yQrN76iTsD=&Y; z%M16v_p>JIx9s_G5vr&(bf5Id)V|N!%BtL;#mdAacX%W&S8~Q(%-o>~Tyt^Ai{ITA z95GEovdR9*#>N622h02N0-<{RH^H8Q|7mdN1;f99J7B%N?d{QyWpGGHxc>8dg0|<+ zN$QL@hvw$y>g&&|dDqQ{(#+nzOjOwRd!)(?Kxhca0UqjunGQn6&!6%+iR)G0x_Icb z#%Pk7g<<7W$i4{y`E3l94%N;s`5CR;CGF?_8R!{k!MpdZA2&~~fFLoA4DVwG|47uN zlGTm(WpsI3AkXKG>(A+^ji`(@WWZt!hH0~V`a8I|ee3|DuPLyQEIl>$&-F&Ut^RM4Djvh@avoSD>Pp__A#m)Pve?y^?TFfc6b>>SI|yq|n$_nlB)cV@m@s*FUahM$qKe>{&$IsAEMzNmh>5;j)+Ydh^M6SdA$5sxH zbas%?^MT~?94Tm3sV#$YdN^KeT--rp3p^D@rN|I>v5VrT=kJ_rYwI@O-X1rn(}}ph zXQU54jydx4u%$qQKSzIjc6J88Z+5&qTz=!;U_BWU92y!N%Ayt@g5$by*&ZE=OGz$Z zC#acQs-W`m2XU*O#SW0EA9P<@S=nS4je`?jtHt-2IJKi4s21t&CZ>->dModmt&k%j z-1d`}_k!C6mR4DIfzBVjWc~rCijvixjc1D6a%l++6hO~fiKS&D;n_19xqAgeQv@{H`~@FkWaP{sBrdba6oQ zhF*w20Iwzk2_QE2b^sKH}ns`Llb(t7cZjDQ|DVFT(N@cY{0 zFgDfIMCLs?^I@CjNpNs^`70pnc9NTk(sF=pm@ zXSEsYEABqm%Vtk!i2b6bzQ)~VB-!%va}?^Ph?e&mKR>^elvEJ;Q@59W^lxaYT3URQ zhgAs)3B3gnIyL6<(<>FQyYt`~Vu5;lAevVws8pL()!QuW3U?{CO+q!xkUcSaJofcp zbU(%u0Jhf^Nk&CM@#;J7{}XZwA=Gbl(vX*T&dH>TlmZ_4L=PqmJURn|l8yi2zY)|~ zFxF<7PN^goOfyeaI_l-}{{AT2-5-(HUtE_@q`@EmX`~Izee!RSwy`<~C7N4zLl2J* z@DYCLPoiS=on4(8sYs{0%HyQoA^=O^a&dBUaVCpwIX^p- zMBg59b>F+bn%YCOjVkck&t(7lRcYPrw!9O-Yrg>XzyJN`k!2B6wjnn&3mc-_&B&G|7Qi;bQ2?nY@^zAQO0Q=yqNu6Agd;5%=9uf%()c*MI4Xqwc}Lj%yXkG`9xM>*Bt_}Z*XSR za;-KW+LO)rL`fAD8nM^h>vtOFUZl{*#=Pq0hcxPHYBd%|FH)LjbEI((7NCf+fwLnW zhRNx6TuR|z?um-3itMlENA@R^NH)#}(*>Fmo-`)Gr4^bS#R9}O{ zSPyUTzy1J{sYhsjRaJFaubFgfw6R(Z4&jFGpCzX6Q-&RHbwM3~cky}Y;*UryV_@i7 zUth-!3{=WY+!9D!T70}u^#C9X{|@5)Clq4%@4uN0fMo-*sA_z?m3(g&G5-MMVde;e329x?itADUM(`S3k5 zclG?+lyHT6KlG=m4?(B2*{B;DfRFu~^i=%)0e*Su`adRH|7U>B{|~nJKiELRL%*tn z(dLDH8qg99dC07mrV5mfvi28vAW+l8zpKkX$t^QKnJEEfz7PxC4Wj;!W~WTW(@M_>2-XbflI~mt zn|_s|*6aBFg$Ea$g|ozM(+7z;rnI83e5cY!;5kpv`rnkcp!jZXt{x#~pI||RmHhRC z#MPcwT|wt}so3 z`9Yg`t!LO2lM`t>-RzjWY!rfPB_fqi4sRZTelu>L!JDogaTkVaxwCaZ!v4>)SGq9}8TwsB}VrtWv^N_h34cX5#FwHxl~ z?gO+XLy7ELfF0&49$Phzi#(gmE74c7L-uY}TPZ2p&WHV;V8`Y_g~WKCE7p8n3MTPg)3GxOq~9?K{Du+Fzxu4cYJBw5;eGTifV* z`ai}H zu>(30*4|Fxe>CP)><`U2F0VSXv{6|aCtnV~yaW0g=vDk;WO4@?v+psz@0NJ&rCIcQ zt$}QM_tt$H*#{v9|A^YSxh3T;G_?4F5#8O+04zxqKZQs^cI0UlswF5~kIB%fb`4$$ zBni9%?+(-%62rXV)6DgfN?5ow6Frve4xZ>)iBmip;Sc>HrcEqOjjgQ_M45k#pOU#X zjCC-zv8E4r`2pnFUGVy_&;H$e41hZIgiVX)+kNs1cIf4bL73m7K%kD;l`DA02}aj- zt-OFxX}&?CLqa`IE5N3t=g1_AqsPe5xfYMvDEH4~BxdJb<+&DBSo5(7O6QkHJ zw5^T%vw=T)PW0aK#U~%%__XGqL{-G5lWCoZ%(7%-f6D?ObTZXAtyaWL2XUs+f=2)? z)EcPOYhkC`F`a>SX(HKcGtyHSN)5#oi^^kI(n>8Y{uq4Q!v%@5G96pb-v+d!ZLv?^ zYM*O9dHBKi)kT~BxpZbXY@oE38~%=S?DEc_i&YuR*!L_zVP0r+#k*W`V0=2eph}W} zUXqvbPM;+t1HoZ-7>N85!4S=Z<&%O>pz>9bqqZp9wbgoQtWd5^mW?}n4R~owai>>z zL+eB1uw4 zjYN`l4thbfm_zrSW?O}^GIUjv%mh#Dtf3CcRqc_ITC#nmF4d^b)o%f`?u#$Z(Lf_4 zvL_|wG03W8H(tLc*oByn|Es~f)^7SNw>PnzTlGtp)x;o2YJd(0ium`rs7Bz>ts;r+J!tunEjl;X5-&Uc- zSdCMBh+T}@r_HL{sjlEC zT)&h2*Gy{!QwA7)UgY}U|FRyI*F8dEOk(KtCYszlC$StX0-rEl?IX~$esrj|2s5Kv z-`quVAxRs6rTv778SBw$YR}XKlUXkc?)k!F+alJgxlu+*?%tU4_|?T)2cG+o5y!iS zp@6%(OM2l}PChj|%TO-@0#yM7-(kRAL5&NC^~u;Dsns_wSM|^R?y*2Lmlxtfzyo>g zF!BNxwfoGmmkudHY2MDs4r+RGi?SN_f=_$#?w+-Bw+~`l*cYduFui>N*umZ%^Q%8b zPX#40feQ7l+Y`_)GN4c6U&+Eu0C@a{S^nQ?Q2Gx-*8ff*{NKDQ0nobDVcbFf&U3x< ztM5WWr)6w~X`2%nPp`5XT*AO$c_=LJYIkX2A!;}Vqkqu*Dj5qQHK{>-?!}w3Q!;eR z_n0QY0Tn-~h0PZ7r2@BtW3PPUX_NuSm%eBUGpU6mWe=}vV)utMKCM^lN0T&cLgUt` zg_il4DDu|RUh_~{LIb)Nz1E`@+c6Iwcy}Km5MJI`Utcmz-b-9q_^KHppoceD`E@3n$%Ut3CWIi za&*H66VtrZi5&O_ot(QInwTwv+&nz=iGmxJJTqnbK?rc&(kGR~-BUA1x}(*yA2p4|wcj^4@6);T6yBRQnwP?BoC z8k)C;j?qzdkh;&3RJQT?wzUp=GHzqyujG>;gcY2|_U}DQmrkzSm2aBa20Pd#(R+JY zD$~q4(3B^qAQqdB5j8nE2UNe$Z-2d8#3n(Kxwx%Y%KDMcO4SioWZqTDo@R&edlbiY z%W*5-^~HX_J&gi7X2w4Zt@>;~<*~J8yV@Pux(Q9$>4RSQAb%+vGL$JVW)H}4D~1%E zS&VYxpbg2g$eSNtWK2srDtYJ(l@E7sdfd653iP*^C~&Uss}tl=7?_6Ng;K zu=%^4GnLHxW&Wco+FL1>i1CNFj63Hw)s*j7FXl5QO?85VG%-p#nYiCl6^|#8kXIh% zX6pZLJvuh&WGZ3Df-)C~Qoi+CPG7}hw{c!SYRE98AgG@n_9^VXy<=KVQodXIN#N5p z>KnWj@==|O(bsu@FEtGd@rnK5nAPvB&1<^UP8cEl*-EIXrKN1m^^>epsgg)Ov!Ze= zP!{W|VATs!acz(lT?YYhC0W86_@Hg(Oy`RH1dB?5=c8iW=G>0h0QKnlmU5~Jei?Y(}a zDxamMHJ_T#SJOO_VzaU=#(_2F1gqVgE4p=*&AW(`ExTbj^1F^+;C}XvYO2xNr6^3v zZ*5PKU!}ZDB=N2ZRzrN$OCpa*0i-bl`M_S zE>DmmExvJs_V(6=Y!Ti*3W{-A#-G^)UmHQ(cqbCMCleT-WR6a7YmS?ImV9O>-+vqz zC(eGTOX?IyWyUy9JWsUer$A3wH!!WomNrYIv{wQasKR|F-x_-JcEC4!WAGgMYSQst zm0QW1!L>Rr0y8iTSix3!lx=M#JqB+|qWdj>kL{$s;F4|WEO@bLVMD*crjPV}tVzUKUEX5&O_-L=UKJ7QPVEv5Ova@-m?X=isQ zi|co2CLv~Z>73s5y8v;hl6g7um=H?Pqkxi}1uHbzE{*=lNN zTyl}}uiHMvAaixlo4qWj6*#hUw+*J1tP56SOtZ1KwzRib(;VHZ)HVjn0q=MX?&o5I zk#$sT36&}|{GJ?2dTpxG(S%X^EE%5+w0;uyT3c?7C-L8hQZIkG<;i&a?j4<{=k9%< z)ok|NvLkH&UqK%Sm;^Df$>WsJVwfMbVuik^|gymZ>vbyq-ink!33r) zTOz;Z4FYHt0^a;?jigC)IXZ8r46Aoajjk{a({DLx36*ZcHz=+_aw4)<;I`4FeKEgSn6P>{3LWI zgAPfe7g=w~*Ju1{%+jqDF`-X*Ccjn_bTaej7?S`Wsq(4-#pQQYB`+Y=Kdnd3P&$g9 z)yu*jKEze~lA-_N?0Du++e`h*b$)^CVdcZlHyFwumc!-4gPW;_f_8C&$;YGFL`t>> zx^KrVt5fp*yiRdO?O)P@x1`R2hCVzoAfy5BZ_@w1@y$T^uJr~T9(t3*qpi1I?;wqD zUP)yOC}JcK=f2c^Mjs=i&2Wx90OJ+2#;#bKQfb6e3=*R&*mgJj#@+RjYGi*z=%xn8 z8BRmx8@`x2KArDT;+ugFZ0AG(5p0b?L>;~(Fn~~=zOs{!jpM9#k&SLW+TD3-^X%Lc z5_a}_^mc^@{tDbfP=|Y9?x-}IF|LzSopva3bR`U{U>=;9;5PdC?0RcKIkMTx;$3{c zas2bUf-Rp`(WUpcoQepUgnZsFI~z@qycyYx%IvKhwAwSaIkUZdOR`>;k1jYiQp0nm zW(V~3j3(hJb^U2cG{h#2VV5KQKTZfV2A``z0Iv*qk5J_qb(MI{ctRTEI-EMw-r-?^ zri#zcGUQZ7)$_Jz8V2^vg=?kB29>}$vmy}QOgp=aS!FW5?JQA{!WnU?n)5aI3R8z>z zzX-{>R8_+<_V#Rf#LfLY%vLgMg>q}8pgwK*J)7Qlol&hyywwyye`|G0J$cx~atT*w zMK+L@EwuJ-A5zD`=YEo0z-zf5OkcoI@9RZ>ZyHP1C3wR9lLe=(2Z4aP-YYk0TESs# zzmX?Ih`_&zF~pcfsM0oF(b$D1jVq|mHIN4l>Q=9(-EJM#~w&KdR$gL8b}m7pBDo6gmKWa#%Z*Q14x zIkjRC{O<2wY3SDbpT+yoLaA z28$a6tgN(TW##X>_T^;Qm9&(tpGt);EPMg|md0a;NhvIthg=SmCX3#4+8<)jb?0+r<8OT=a!u1H&Rf3s-W}8Y zfjMLpxP09u)zVS{0%a11mBWe`;-Tl9u6yP?oNiw@Lr?na`e(7j{M0WvYq#M+1ypVb zdyg|0pp}ArY+ghY#sqU(d#$L}?zncizw^g^-2A@QL&yFA4Fo!pxjP6Y=rIA~T^*<> zE3gi*KNh(*`tu?&r+qqk{J9u}9p!h`qXNcDRzNxJ>-jxe;}<8=5t#s4)z>O5w<^*)AyB9@{&5`Wb%7I)MvCb7Kt3R)t=i(oc>Yie1oeF z^SsB3i+19CO&}MV-_5xPG+1|>6Pa@!m2^(&??T*uzcu%K5}eyZEDhO<&jnCX?J<3S zOU_fG@|*JVbN$n}`y0ZjtJad|V#3CZ*Wc3%i}R%z;+~70x2Gk$x!u5RfBvr3+vm?H zE%dk?29=@*&BwKVkJ=jv&q02}f$c&)_g731AK+1$X;81=%M2RuU!C_i6$S(S11X#y zmoIpS!QW&mNXEf=8D^U0cM6#c*DL~T6xOqKnMH3+JI?EC20JP=7pJ$j(na4SK|jae z2yQ+fBp*VRBmqcYrzRHAUYw0&rwGY7?91L!yxQ*+1^{ND$$n}weI82X?dt@m+?DjP z@bIzVJ8vqj-R-mQj$XvrwYQFo`3YW}JEf1{Fvy>K@Bf^J;ONlt(9pemFoi}|gzcw- z2J_iyW`L`!D|*%vLKR!^m8`u;Q}QLzP1!mZ*Z#eoJ{E+K#>JvN|94WAalWGGWjBsa zF>uTV-Gh)Z`CI*o0}!tQ#1J<4yveRem^rQRW+r<>|Zh3iEam*?`s;cd0+l$Rx{ zMbioz+{M!y1KOH27bucD8X+2$w%a}y)}5-4|an@$0^u~Y&P6TgWNJI85itV)z=ONiAC4CD%4TsJ4TGzK*?t7O- z$x-c}Zj#@erBTb`1FdrM(l_%6NE?5o>shS3eShq_96?`(y!nB7J~_-?@3_M2@5?RJ z_wSA)C<{SyxY~pJ?>}^s*>(5$kc_SQ~8+JIY?WxIP-k`)b|ffRWb@ zqawF<+XVwzQB*v&H7?B;DyNpz>^=HtI439*pg^BSI_bCg_SdU*Z#;8OFp-q?LNKgv zWjqvy6;&ObclNg-+M{FZbwQwfmPHtRY}C%mf&lunIvlg02xvoJq2K<=)wqkj0rFnX zJ)4V4t9+ zqM9;cVF)DDZaA-|ZR`xTOX$lSJ?X!`6;|VY(cRgxs|PV!*h%Q;z5fxH;dlmFjeyH@ z9oma|fTM(s?@&S^cY{0DR>pziL%t5H=ZDcEY`Zo*8Sl&Uav~*K3xgN+s@|9I+-saO zA6ObzoC!G|)W>qrv!6`nh&(dR5IRWC!T9Zub?e6kz%)x2jQ@?pWB)a5=1inns)Y7s ucUc5*cn;S^QrpGY-qzOC&IM#{Y4*n1+ERU^bPBixl9g1FC>Q%2_!QI_D2~8lly99T4CpbYGr*U_u@rLeO z-`^keX1#fH=gzGA$6FMOrt0)Lb#|Sz<+FGF`lup{jY)phxk*FCE5X z;EY=_)>GimYZEzjWe~`l5d``M0fFv-Q{Q%ht8YP|{VyPpP!b44?3mW9CIVb|W~?YH z1w#Gv^SiAe7C3|MDz7Y!zK?;6h4vVtauEXp37W`DiEDb!A1!$pyxO5gKV|yxy7a9n znpwyfn94^rJXXm+x_QUV4eAYbmQGVz7G*xO?Dlwsb3V*IL(7U7kf)C~ulp~FHR2TI zKD1sT{Lf^MIj%*Zq8`4DEfijIDSp_vAP{bpl!E{;ywuZMG|+370ZtG|P2B$xC>Zk` z3-m!V$_NC?{&D{pgiE+d4Ek31x&vs6_MbQ1Prt{+!MZ%ZyM*65RaGt2+lynUz2T;! zqH_4$;ZIC`JsW<|$Jn=|gP3O3R!JARb*sPFk7q4n9)v+>i`0ByzTC(V^+`EJ8d@t< z2Xr?s+rI>*$Lz=JVPRtOP4Nj0YpScq#ODzZZMrlqPJ+|ab6LDROQC=Nk_wKQR;MnU zB+L4=R7h1>o*6^NTD{=zwktCWc6gZb66>pf0Z1nXV1kgbuZLvmyfoQHm zZQV-B?8=aj{$I0VH#`EKVLN5)s%z;6;ws21E6OV$^vzc(Ju;G-oQg_}4Gj$sIDNd* zzTD)`#xguRF(rjzHCd~!5yNTJ9*ny`+rTLS2&r>$j)8>*6N__At!N5zeX>20+AjuQ zdvX%XqR(I6y9-P`8gEVf`*+0Ek=E?T{%uaf>Kj8}3e*D7BRd;=r989z z;E9D&i_4C?fvv5l&hD>`epgr5o|Ej$gBcka2sBk#xN}A9J;(9+R_NVbb8DWAj0_-6 zlm4)?(^HI>FJHWTY0&OV>QEFOev~fUu(7e;)h&TTb)&2$9oVrsn!sULEy%|(2ZiF$ zTGAPfn}^(fcNYT#g}OZX&uiHE>-k+ZcvPW=_4V~U7NhjBc@>|V z*rXGPI!p)&36~gEb#FEzM_(B>9v$tBrZdUkn}Ex7svgtu+9V)Kb&o?rG)vVrng?%P zEMo9uDf%LfZZ>Fz(*3U%b(dKL6*&#tjm_=X4!QAYYP~PXN-G{ee%!l)3-Xo|*i5Vq zyT?hTW-jqq^SOY-;kXjK?CdT)H4R84H#c{4bMrn~?RpG8Bq}CmVsp@*EF~qjKq*;d zPFX$1ckSLQgje@V6{nwHSt(ncl^!fNG?b^Ni2046P7)(2&f9GDB50q71WiL)t26`_hRvqg{uhQb(qN0PegYIg@%L_vy@yNtyD}_ zWKKd(ZdS&|#vIpseuaem1&$oq$a-fzTnQ{9w$hRkG0z)EKR-VemC-di+2N64TU*;I zt<%KEAJ~?njMktp&HBV#RxYB<1vLk>Fhdl8>7@{*+mjKKCq_qGnJdiB-cxJ~^Adm0GA=2p*%4&KFE4Ua zktRM54`N2W6BFEA%+U+W5z2l2{dADhQZ|S#CaB64`cN@I+?RMY_}%6!3k!>Y?P*kW^gH-Y=6Ez-gToU3c~XE6p|11M(#njPvmh!XIXy1T)>`PJhDOP2F=84`O@lYiioU+S zZ0u~cR(i1pX{0Y?baawV51s`WRwqn+a&>SrwyW?&AU!G_Bp-uu)5F8QK2rEgDAF z?k))>rQx#tpKp(3@bU4fo#7B>ep}Sf3B5p`Wu%5~*p&x35n+C`S|n~vV(gK%NoiSGC9#l@kR}Ts zE05$Vi@d!2r-Vr!TU(hgKlphY#(%u+ip@+cC@oD(ii6;? zurr%A@Wu{q{>Y|HLsPmijog=Z$=#2U@d18GexE#F#Y+nAaXtUKdLaGjmm+1U*xu*W9G*40<1Z5@wx z7|Y2O9?)xRH2-S-(Pev`e060a#wmjIdmPm56kLoHaYHKgf35Ou>(v{?u^{cG&^5V_Dd_x%tlou2fQ~*jD z%lNzEqt`?+<|`Z`*P!+kz-WyE_Pu97t!)Vx)NXkC@ao_E3j?vofY&klUpN^54PWH{ zdQW&vz0oCvwY7DJ1Uj; zm&`(J{sCcSrVBD^Rj1E`7`8av9eQUr%cpQuM5dAWstJl=fFqz+!?|X8msGwlBwYl7OGSWiA z#mk$tzMnm*+EQ1?$IJ)64NbhfyoAx-&#d2U+|Y0*hqb-;xFfmhGJ(J3Z)w`OTQt8J z1B^c`NpP9M{1q#^s7BJ&>hTkp&TX~PH{GI9iK!VA-$~K?$0|lTUJ_ZZ)fwW zNz~|2^lR~Qjg731sglQ5deyJ9uBPMbR%%(9-WR-Fy0u?kqSVvcesv`G^~u}`2?;o? zl$4eNUPDcL=H29cd`qkUh8>-|!$HAiNz2qcl@R2Ez$WpPMbqy}xmqI$^H&FRF4TvY zu@=xkU1nSx2SlW~w$W2|)<1f}B#wuYyP_t8V>}8iBJ=WkqPus0^M2;OVrV!&lnpaxztnXjD&y z;dWFKsK;$!B%n$rrnTl578DhSDrdv)gdkC^KYpCvUiOmhF+N#l$UjF8SI>=X5fU~F z32|{bX=!Ouyxc)p*;hQ=yTH$VF7A#On7WYoauCF|x6nM-*{{~Y#a3VBeb-#-V?`=p z1KH=6>1Dp>=AM92ywla?62N_#MFl8aExk`1qv(Cq2m8&<3i|rw>&~}3atbj$#nDnR zv9UGeTrXP6x-|?nLUD^LD#XBhcTzjgZM4}XF}8>amRb?NYjZX4%U=aqE-jD23V*-m zRB1DuHzG~=PQXsB51o90h8CF5NaPUHdrby*Sa)%Ec6D-X z^oDzZXEBJlZmUBd{8A- zRcb27lUC7eD>mPKUiDYfd{W~&g9X)K&}f-$*;}!9i9)^&wD<0ukcKO9Co4tgeTkjt zEvxuw2Ce%Nl-Q6pq9gmFiYa~cm*&|(@EbQ#2 z+eA-$fo*xHKU{%B?YywCz$EleJ$DcYV@wWZ`~wv-+fI*4lvCl|rSJVT^9CjWU!i8n zLQh|p7BW1dWYGeh8Xu32iJO|5BH?#+l$k+aMk{?=*1K$CA#e_ttZ!_DbqJ~z|(py<8s!A!lwJr-X^72J76V(HSu(&u)$VVBO{E+JN*0~iElw)jK z%Gu#~O&HR5_h^DfU|7jGEIz961t&e32w%czy?0qW8_!+%@G$H*m~k z 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 diff --git a/artifacts/verification/w6/40x12.txt b/artifacts/verification/w6/40x12.txt index 405a5933..95698d8b 100644 --- a/artifacts/verification/w6/40x12.txt +++ b/artifacts/verification/w6/40x12.txt @@ -8,5 +8,5 @@ › new message - type / for commands · Alt+Enter newlin… +─── type / for commands · Alt+Enter ──── Braid starter diff --git a/artifacts/verification/w6/80x24-automation.gif b/artifacts/verification/w6/80x24-automation.gif index f8ab8b113d0ed3ea4c93c198975522a153cd3d11..1a46cadf11a3c808d4a39e4e0f9525e4de32d5d9 100644 GIT binary patch delta 12651 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 bov!k^UE^7*;*9OL@AFB&|KunU0QCPCw()|4 delta 20942 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 Yfe(z}1S@#K3~sQ49}EWJ83h6WJ7QHx0RR91 diff --git a/artifacts/verification/w6/80x24-plain.txt b/artifacts/verification/w6/80x24-plain.txt index 894047a6..5d1e7c3c 100644 --- a/artifacts/verification/w6/80x24-plain.txt +++ b/artifacts/verification/w6/80x24-plain.txt @@ -1,4 +1,4 @@ -Braid ready — /home/drew/code/.worktrees/braid-exact-interactive-20260816 +Braid ready — /home/drew/code/.worktrees/braid-10-multirun status: ready for a message conversation: New conversation; branch: branch-1 profile: Braid starter; runner: pi; connection: deterministic fixture @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-f464b334-bc5f-406b-aed7-ac801fbd20e3","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:f75eb08b6c6a3120e5297421baed1e5e2553899395ec5981e0fda4c9ce725300"}}},"session":{"id":"05bb45e5-a6c1-40e3-b260-359bc2bd56c2","backend":"executor","status":"active","createdAt":"2026-08-16T11:04:57.315Z","updatedAt":"2026-08-16T11:04:57.315Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-65b7ec82-3f0c-4571-a6d7-23e45d0c536c","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"c458bedd-8754-443c-a63d-c265d6734ab9","backend":"executor","status":"active","createdAt":"2026-08-28T10:35:21.598Z","updatedAt":"2026-08-28T10:35:21.598Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/80x24-transcript-keyboard.gif b/artifacts/verification/w6/80x24-transcript-keyboard.gif index 3c3300da2a35711fefd84196f06b9f5d70222728..9d56e81438f0400326d52fe2978c7802531c2727 100644 GIT binary patch delta 323488 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

    FME{bLXt}C3m9Hp6AMSO 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Ņ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%0DmGZgpahau%@*5}Ra zGiDR@LhT=)&hCEq-ub2)#y{!d#m)ZnawiEhCp+hlgOSB|o|~2?+g+k=GV$*;>dmKq zz5LTDF#|!nv%d3hG>kM2^WW!f=D4`pc3#4Fe;&5`-6Wjy`@zu;!_7;Zar4u!PQ1`Q zia=bUWGWS)tx=*37`TUN`vhhxOy0wE4y@b5u+IOfI@2+Z>Yg+;)g z4h-UCU&)V)XKIr7!D3Fywd*jTV}HyI#&lpe=jrot*x!Mv9T?Dog&kPiu{c77!5vu7 zfyEqH?r}Ko`r_3x?CHRKJ*>sUR1Qqyz|;<`*26|mCgai-Sj;IdE`jMB7}J5#9N7PX zWgL447y8+AFq8xHI{zo#!$i*iV4lsNu*c)$ck0IoyZuQwEat$l3t7+5V6XOALj>&U z!19jHUPIWxad2{XaC8|OnS{X{Sk>V#y@fFy7|dyGz7JD7u&`4IV=YG+$HUHqmtDOI zTRSkL(^z;yQAGo`cFrWH!OZ>8fB(TePyOf^%;ms_&e^CKn9+e98`!ajMS5;!4Q$ab zK8}MWoPxrl(y}sL9nH(Rg<09TsylajIUcsNF!&!w|B(0aS|Cj4R90TMw6TXJoVT6v zw6ifVNKZYL%P4NW4@30Tz5TFm)6QS4z1swPI;Pa)FqETXM1g7gvTM~RZb}Dbwx!N5)_~Jo~>7hN{)uDeTk~6DoU@-?K zdFt*qA2@6ZBRjCR1KT<76!7?{BM4D*$7No%57?>J#qPLDUgbg}Vs4SM&>_7~gj7KGjOt zePU@qw7}R7CBc|76<6bOkHvxVST9Vl-VQ6FgV#s1v-IZL#zdo`Bv8->hv%t8TSZt4 zp6!qx)`!5(#F5a9<9of9I_~*ii-tt%9q{J?@TQzQIk^cwckj+nd+f zs6W*I&7#%F!37UnR3ai)Yog>9T4c`vV`pFo7WfR2294_;Ja}z5azXXz>W9=zdPc0I?wO1GV*)LhgDSzQ}0gn$U^z21;uCNu6HH62aYo zoU%xUt?!CJq_JGQU_^&!%-XkU&m)Z1`Z%MEx+)Vt$)>AjS8--$!ofA8rgeZ={Jsel zB)!qNg0!`${uHV8CB^vk#7-&#-WtC0<`lqcM$F`g=CzCQ$g zezJVw<2ZJ|@7mWXq1_M>tLB}JSAdjFmaTObuPq;amH5rr8=z#>p=E+d^-XrP^aT4z?%1?$JIC83E4-PXredFovOG?)`B;aMZEVepxGRMw~vdu1E|fQS=ae zkQ$&^;-_ef<4cuuzY?4!zk8!EqL#glSuRn&+5I=VZQqhKR5B-q+f#-g@;vvol0*#R+4Ir6I0ahi zpbca4&eSLQiF^4N!WULUBD}9gq#PT|fLcJ(ZMstkRg}(5?smFk$f`A7J(vBk;+x`$ zs9Jj^5)(Tkeis}KF_xjDJ1G=k%dcN3838^`pq-hDk# zPgHTR%Ii0u$aFW0IeZKeIRbTTX#_Mg;%|ree0KMk(?zu)7e9oa|B%fCf7D|X>wI6> z%rAq?hKnh6rokf_&p{drjI|LmSqG((S%MMde&=Dcxi2!^P1YS+S*5?7mo${`JdDzg z7q0MT<622<^rwUzkL=&yrydD4Xff~=p7{on50c_S14dPuYI3NDM?1PP-`Na2M89F5 zt9Um~Ur-ZK`kges=L1DX2P4UC7PVr|B04pIvmo~{c*G37{tKm#>JU&MCs9@jELoJV zfEI~!rCjp_TX}Y?k3l)vpV9T+Pq##RC>*sfJOt6;nzQa6_b?B6s|=Vy4d5)6UlJ30y=3n9qyRY6mEVq{v9Zg)p_ z$*`X5Td&XYNYbm{pME?+gGh8PfKlV4?pTpPJjV}zp|Fcm3a~}Fe0hD^T4oL(iJf6e zr!nAzt82SLxTn15t3Tgcqu%X`U@J3MR4wDKqAB$FyUEK6*tnrrcB{Z~6O;|pSS*;g zT2k<5MZMswvD)eItdIi@fqU<`j}n~ma?|&(R-loWpObi zp-Ji04?#DrFv*4UK*IK%PDx+`?{|K8jnj^~Ghcm{y-;^+#YOG<&If)=M7(t#cEN*+ z=O?DU0dCaVWK;_}It7g-tpg0F#MS%+pdKhHcc#;U*)f2N04}|apGrIb(*-JY2<$oq zUEqO8Mbw1?=n@u@bBY1&RD(A4K>`(WAOW*%h``6GL0~ojC{aPML33y+?7GW2g?&D^ z^dUqx&IJHdB;sM{-~k%gnDX6j0TD>3J7}~`Kl6B7RJFMWfhur3Fm(z676XXgs?ac& z4sZcgG;pjQgA5135l#I*^cfX@Gbrt>YZ|DN%D9Y4d$;vA>Te1P>B~7Iei}8J#z1p+ zDhGN8#=rUQ5;YQe*&q<4bHI~nAWi)oCyH2u=ty(@_1YtO5(iRJ89f}vYYsrh^l_bI z$!Me^d*`}~H#hnGW*W=N%%2xIB`Qe^gx>6f*iAIOnm9DV7ag8O6z7Bz;eEd!?mqNQ-1B!}{Knf$ zDBqkrc{%>k!0%J>N{n?R>Du*$OHEFUPd}xxqmiPE>J6+3hj+eLYL5-%yBXgc1#;*pMqFBic=23dFstT@P75o@sufXF< z&E=vXsIbPl*s90~4-{DY2k;1ty%%(5y*J)miLok)-*hp>(*mt%3K-xt9oJQuruy2G zOlJU2>qtuq)VVd|&F@c3Y`d^iS#VJWI$Trq&rvcji?wFl*pjmjker)dy|d}kqRvWn0$eDm08}w<4V~a4&+;Rl z?`5mt0Nsr9!?7q&bx3#h>UMYNIK?E=FbU^y4c$=wd!>5Mx$Aog0PM93iqZf-_|LY* zvnMF}inSmlEg<`TZn|695~dtjmzKZ*GVADNmb0G={`*cB`FeyO9q&4VQMgrf+8LQV zg4jtxW!8I|xuyH7yHbGKMw{BF;^+uIY9|j#rJ|x;!zC@z8q51+p-6rDr3?A4KDfG0 zo4VfO9qop-jOID0a?VG6fPMeHv)M?U8UQ>ugl-hystu0cFx~@k0Xr9$iV^Vx{ zOPh`cGaJ4QnQ)OxBYx>8P(BdqP<=W7Rs+%((B`AJ@xWY~dSXhgAkE|0k!I)L+jrN4 zqGW_+J?@Cj2?7~ZqyxneBGw6~Ne2j2LThxTf^>_&M~g8>)zPEbq zs}bEAailf2s>$|46DWf8p##rGg!l!eDKDBklO;y;Rhin?Ln;TNoYa>Aitnyn%K=htZo} z4<2bb(kfVx3@)Ol-L*^1oiUS9(7yP4^Sg|kqQwqvNt3r5h`p+ng-@8LlaJm%d~EOV zSRoJTSP$&vqs~(987@9<4F^xub3eX#^3OwTv*ZY;9*u>t%CLeh!fVRGS&=a{Kb{n9 z#2_UKs8>KK#-C1$@Y+W`cL5JETt2Ng9=hV>77*b!b=j?C(k;KSeBxf(33sW3#V%vg zH0x*G$s&)tUb{C=iWPtNA%{9r6S~nY9>U>W>~h+8-lJ)?I9ri>FVWt}hVuP<54(?I zVR9Zv<{>x1zN7QKH#U21o&{}*_qmiFI~xjl9Psd(XSj}vHy#?N(Pzc7w=^K}Xy4#x zy$K(CbF#W)|9D>!d~EmeN}jD~QGP|qe4m2&W5@ZRy>h8m7QwdB!Q=U^wckBm)`J_q z3wgdd(XtQPogMOUDuk#L+8q*_vo~PC;$Ve1Fq0SbJUV17+GWz235JIu!?^%IKBUgI z$b)H8&FHJ294K`jN~`KCaTc39kbO)pbE$M_rY>mm+0e%8p^rTtJAwy-3?5t)9BfN= ze#qpx3)cI+RX=%yzEvKL9F0CR4TS5*L}BTT-}06fdXG2%;o+)9S0+oL4BdY)~)9;)N`ocWWX zW*G3MeS94~e&Fxed(UyttntHk9&YpF8-Mz~Y90$j3;#zF2BSR(%~@px;B~=6nSNF= z0@!Y#ptOkzo~#D=H~?OJFJ=e7$-!^1BUF;MBKi=_(Pcs3P$!0AVC-}iQ2#Bd+;Er? zyf@iAHhD|{5GI3qG|UbFv{Wm0(wN>z7(aGn;?hFp;(;!UztF1S%*FGwcco^#Ue6SI zRSA?2WVcUPEmWQBnYCS*AmuqfqzG+LCy+Xs%^Vkh*VI!|K)V|Bq{g{Z&80^TTH$0F zVK7e(4h|PW8+hQqf#I`SV`{?JPzO?g`Hq1!*P^@@jx!k#c;oW{QhrAWv@hK`M$Ao)p$3IBE6%u0 z4}Euu_~|U~T@a&=MsN$#^HO%*ab~%V1)sZ;&wBY;@YP2mpBwh-+1|OA@?s?mE4vSN zeSI`nD*vh?Y`j{le_e~eWV>?Z;A`~DWA$1u2=;@!c-YgBBG(D{n>A4PW;0NG}2lMc;WSEs+~W*s}~pnJK%!|OA=fo4}UoH-{5f$rb^FBMuyM+niGyov5rRK07+-Cp9>1$q`cIHjcJx!TF~9Ke zFT3(5f1dul2zVczQv{!%MY&pC*`re^q!e#e>(W6&yw{IO? zSxfTCJ$v^*!|mf2?*6`f_*M3SO#ngR^8f@!K{=30Gfoi{xgxSkVhmnH?=g(TF&Ceu z5>7n0F1_c*P}$zIFaNmdsG1aDV|F*C>%Hr$pyUaikal{1{Fc*g@1A0(56*YI^i8Uy zCf>Q08D!?$wH<%wUU8tr9+lY?HdhihDO2Vq8R&iY{NI0QIoEYsXA03YOEyQD8%gX|CF`)pYK?e-L?O92E5OYG5>Etz-V>rMgN8W@|{B5 z^k=$@f`03jIO}_j)Lqza`Ts+n6tpERYhAz79|fq~3p=pyW8kZ4|HCnL@^?SHc|CN^ z@|yQ~oAv11T`6++RW}x9_P!{X`K|xAa{c^cZ*2+!t6Wd{YVq{whhVI9$xPQ;r9iXZLbag551s*hUJQyBc&j6D3^OYXh#{(D5L-eA zCo(uv5HFpjKr6?HSFci3Of^SL@(exKt*9p2e*RPkd_QG}5{_%EB0YjTew^Zy617(d z#|*>>kahLaG6I4ENEov~)ij~+fy=1e_qZwW>V;6pmUaq_)4Xt<87S#1?Lp2 zIoBuXR`MBZcz{^cD@o;OBeP~E2WJi zRuzevAA3E{*ca3%Nr};@opfM#gX!fX5uBBr0>w`rCu@SvThTHERglU1rC5PDM6^La zu#F*gKL9$JK)H!^Ru%Okb^rJBIH?tFgAQO-_XgrX1A`6;E#TyQc)!YawI5=IbROFH zki+XhR$G|t*Ce%8xwAv>RJSaXzdgb&Zikj+fhW6ExyOK8id^@M2?nRo`r;vDfkQwn z7GZ|S`Tpqh*=7?Ta|JReQ|OB#F}qC%8T6#I_6~uxU(BaMmdq`by_vW!&kGx6$@~^| zRH?(rswNbZobiW?MIz9=uYHHNUS}$akSHjj&V$KjTJVN~4>Z)*kwwZ9`nX*B`vA7B zP@L(HGEg%42&5*tQbYj?0v(Xeu5!{$$9ygO5!#<4%HauPMS3u|nAs-qoCkhCl%jf? zo=(glD{U84G|QUN(osUCAQfMlH`2{nQXtK-PDv4c*$AMM@a2$`RCIrf!grBO_mv80 zuXNQ#MV*t3-xY6F$E=fQLaA3FoX9yYX75)@B8iP^LqbNlHz+E?=ARhu|wm{mD*@>@ag;=fQU9KSU2}a{5^k$I4GCUuy8e1>I8N22**}CD6kbJhv{#Iq+fs5mdA?p;i`06e8Ou z7xIu;5th!8PE@7*_{FuAWqb;D=vPocHc}_x)|Vp7lao@;+=dXbQGSm!@D-mjcRhRDfL@ws*Ch>8rTd~o8f zQN=q-DC7U19ghUP#mMCFgiy$>|F7`aq&|7CrXSV@4v&`<{}&$b{=$|oL|}FqFy$~{ zl8iE-WC8JHv5QFa(wx9(9$Nr2T9?FiZpH@o8Gl3#GE&my`pPwRBB zNN2JpXNiG=YEryhGF)C4eJRS)(b?k^1Rt;*vZEdB8zH>nl^J zGy)+{t|F+8gp)SP?rI`q@BQ)sg}t` zdM-#x-8X*9PWBItg^J~&PoK$eZqL~kYwX}ru#F3Qfr;dz7jj}q1P2*P zKNdRARruLw{YNLq0?v}9_sZx67kv$p3lK5)kWmzYcu3Iz$!0x1!I{Mbn65eUI3x;( z=3$|p%eYM%XlRi1UGT)Jws5gkig$;ZSeb~h6>0Ch;?eMy|CBPtek&GD=^f8fE<5Gu zKFg4O_qFNsS%{ihJXaXUx#@8GedYvLTuY)KhpN9Um&`|#aY*TaT~OIiLu=md^m`6T zp;=9Db>|c~kGF)uupgy3eu;Ejv%t&ZfHU!=h26*6j(X)Czk4nhOb)M+SLtBFr? z{NL?iDY8QLk&^DUxFKO~bjw38RhzB25hN+PvBXPppEhndN{FfPY!P6@TLJeG+25O6 z}oHg*O;d)%W>UyN8vphGS#%a~Msr&C0Tlo=zKynfh8S3q3& zfZc8;?MT23wgDk+!+@A_3FTsY!lP}W?LZH9yD*CfV7g(VRgFfFs%PnPlJdv10kx*z zPoMlnGXMR40`JkVmB@jLia618(D1{Z%hVU;r0IVah^@x)O z$+MR!geKmtFNXm!N@OOECCfok*s%U2@dy53P#Axg#UL?bQN4}U#Lqi)pxnHUP_#jKf^-z@mUHD+92Af`Fu0)7w~D zYD^U_8@XP;}+fCy7mNq*c|eq-BZlal?G`#Jv^;V={sqlOeV%h=pSD3Rrq3LMgi z<*4&aQwo_-6}*}{z=3NdZS90J5V0O2gD2pm|(CRpT43CU{S&+5ayGNITAoV8ITkIy|EJiJqBh!EF0?B$ft3s30 zUoGgKPzt@*2Eqkh?|rb^S+Z#oT{ zNOy0787I=M-8X?_L1VEXwq-8IDw%1WfV(1wOOQjLDV!w67?(o@EGaCALlRL#uw1#A zb6lLRISH{3!% zMo>81lRB8aK>_GZU3J$amH`6MrXerKDOY5-Bs^`aJE8~>T5K)JX1FI}xKaVzdkMJq zNJjc2LBnn&^Oxh{f|?|CGj<8xc0&qxYC_>*Zf5GdaN0H;H3WqKjudPTK7flyq>}u} zxC4c37H(i09j|R*(>`%z>+$tko$OB2aEUvbPm-ulSUj!F5^H-i&IME4s{^`^l|cku zN!tnq1Y*>=IJ5y~PrV@kF&oS{x?dQ#tLJmBWO8aeag(!PJI|(R+{SZdFw2xvWRxpu zl~bYCq$Wl9BL@5x!{K;HWr%e!`+8jovm!7_6~f7rpRoYe9!lqviGCJ|iZmbb=st?5 z!pY@6f70C(+w?q%IZ{zb{W)*xDaP7P$Hz)@fx;)hjtIh*S5n}}*aVX?OwM@@G?QWx zutih=P=)1Ly9`)Xny7hOlhkasE&$*Ta>USpMIrORNFEsiFu2E}@*IitJ72%(H%&(- zbFE9va9iqmR6-fklE>EO+iP&B7tC^X#W~uW-A5p%s0q%~LMHd2 zjejOyh1#~8`B~KV@x&#;?%nU#yak~`W@pmX-ux_NcoqBy{!d{+Z zeXxyb)G1ebv@EmF>L6}F4|fdyT~T<;$^E)Cbb;$IWY;btPaO4})IN(Jx81jW%|_n< zwNQ7&{HLIl0aIg>wZnij-;V!?0vvjrd<*pfgBmMF%0!x#JqtILVKAP?9Cjai`mX(! zuvPL&D?lCA~{BOYU0E{tuZ z#UdoQ6CAba>YAA?D*+V%@hrY~j~H`fgBkM78bOy}%gWS7;x5T^E`&L;Xfwgv9Ne^A z9x>G1;!%Kw`f%D_4rlUyVgQbbs<4%HcGH?Vg{sb(937ErJ}S_RZU^g8%nX&MEH&iz zLgXPdGuyKuM+~58x`k>E@8D8d9P5ZO*JLhu%fzE7ixXvzGi}fTq+VQ!%BRpUcru`) zhCmoJq_4JJdI98^;;IdwGau!!>=;c)1&gVBaKufpKpm%Bhl)SW5t;#X+EAK-$n>g7 z&P{~LDsvl&ZNA=uFPba|*rQqtDh?Q;m`YOJPk${O6!QjLQR28HIcAc; zu@@ua9DN8N)66UbhTEd-^+1FQh4WsVk2nYjw*!r}oap%0SOJ%*2(1}{OOMz5odg`S zbia8ApdDzZc?`yQh=3#n%0q~C58RGTHfbGU>Ne19jzh*Gv3k0=mSV~eZ@5CGS82~Fu9-M5C+F?BiXJ{yhs(C&FLIpYn>{Z#o0jkO z=xUZQLhOxQt zGK}Q1OviJjJXyg0oOmY56$WgB^G1Si;zGE02tuQm@^}|^iG7&d)UV%UyjvCo9wa^R za5~5ie01j#d*=V4>fPg+{^P&@_s&PW=X^@roaTH!pSBq}hfvNVB&nQFscpgd|%dtKM>@b7N7{jtM)@7EsB=i`1qc|9F{t!v~uCxP?g z{q>iZ(64NOps>q4roChGAmD9rs(kQy+h84k@Dqsspj3DW!PcVWJQ-Vlc3RvexMJg^ zhFRgn`!%%lNqf)EInxFGk1p4G6lqtUb-q6#{_&d1$_S+}l;}}{1PWD0)@Uq8l&zw< za-l`(2(o6xdcYCd!%+1@BUc@%(hMa=AtOZKTsiQMg07u8{6HVO1rjDT!Km$oxYmJN zdyd=5ptUF*26e%iS^t*{s@&askGFr(>tji%WxXLzSO~s|`S|L}hcnGfADDz|VWl5; z1bixAT{1tM!!F1yN6qcPvWgmA@+i0b?u{M(6Lcg+;i4J(XuC5Y%sJ+CyZ7wYq6F8x zLRaFuxZh=^hm#AlCR`bC_NjR6nI7?6^mx7Qc-L3x#w7@9oxO44^PRRM?-HJF7@|C* zlh^iKN>I%FXnqU)MClW0bHTUoS00-V&6VG>Oq4$Uaap4vqxnlom?x`Mrtl*EP8Xj2 zL>m3fwD7qfdQNvWm+vnkzRxo%7b**r5$u%fUw$E1Yne&MS7$q}>%L!v?t9^td+D>t zptPp@6*C!mNQP}jPDarBmNJt6)g;Fpt9Y3YmNb>S$%UeS!lk;X7idPWKHOu zY;Pb|AVejhzrL3Rh%6aj@l#ex_S0%IY!$lJND#QCqHs0Yb{<1xjyo)7au|4gg?9V=fvFK~V*S&tW zdnd|nTq($X4y|DYaoB+qV^1%nVm6_IQziljWYCxLT*+mHnQ*r1+dW$g*xkI~g1%>` z5bTAS;K6Uf{0qN&k?b<5ek40JxBP?A@nj2wpIr`LEVmqZ>;1b;-7JcAaHGf~`D%D_ z`*dugZaSA26DWXgxEKa(J%pSTYzgN7IsYdnNRt$C8z_6J{5mn}7IFHy| zec@TYA)^w_A9b&&-mJP_Lv5;hl;@Zo((lV^q&k);o~TX<{9@)hTf4Qa^xzK7y%mN& z0W0$Ii~DBH5?>-ap8kkCZkgU2@a~V**QM$6+b-_=`zskQ;zL>l4cM%oeR;4<;>N(h z&#&(uUE2TYpWUDJ>8+JN$!FI8u8-t3>^HD+U_-E$L=Hl+FqG_4Ixpa0%wkoN|7e|m z$%056ue}JRv9$Zuj(J-DRIBuHvr@0}56V=pHvQH+v%#J9w>;_j&`Ca`I=VKqsVF=N zGhc0VVdk9g?}{RgQ>jmX@@j1_{|q@jJaob@spUharpWMA8^*h_7w)^Kl!KKuH`f0S6i0rPi6hu?UTDtnv!(oHvHMy%ZR3Db@D%1Pfogy`)Abgj^$+Obo9Mx zS!yUM)0Xe#_hWUNhChDQ-oJ0oylva%r?omgQ*-_A8w)o5m~N__R@Ca+ujn3f{7&sJ zo%5CNt}J&U<1$teiv&Ek;>HaRg)EOtf>(Ydi(%#0#a{G4Ei>tq$n2cjAHm!6$q#rb$4Rkos zF&lc|?`3w#f2#ZF-1K8lcDG$Of42A9U-RdQckC=)q&_=nF~`b$f8FBc!QX!^gdCi` z<$Ru!{v|w|QZ|DL$c~r=wT*~CF4~Sy7t{8b8cNCE!OPQ589nFSJONL%bOv zbtJ`@x8}VJS3Y#DUitB%DZK2TnL>C(-y~f}`}Xu09bY)LzCDA;HZ|KZQw? z6aOY&`O&_frSIa?F*5kzJN0&%&yT*g@Lj(os_s94(RNfxZOB3gy1b=|b$fFEP8K!f zlVp>Mq+{==JM4bxH7GauXl?P}7Mk!EIb$;lWTXAZ=(0PGL$JDVG`tz0o4as>y@?p& za|}YSkTy$#!(!2Svi1?Vd8<@p+89)x*;y`@w#v#C=MWKo=lhmkM`2G)71^u`LHd#e z>CZJFMUBRpvQjIgtC0cUj3K-}Jjcq1=#8&HV!sk4@NhORf-;h~!zY!ILL+7I@`5rV z4*@POR`eH~fSJ{Nt4bnq$Z<%;PZSw|n{H7AH!K`0KR-UN(AaVBeD_S zKYuF#>s{Gs8clqKk;V=lWgUgD4>?L=*iQN7Kpl)~h6e0Ud4p#pNH^8!$)a^02=Ivr zF!dX@9_p4<6$*;vqzw^DmO|JT9vK)<$So12&rpz$N{PLn^+psv8)~={e7(PReIeaX zLBHe1x}Oq-&o~GIMrifUm-W{CFML*RxL1&|R!^wX^gGC+-#_DBF8gI!O($O)Vge0FT3KOb58ZDztE*4uf(?faF#ToTQN+FTw z>=Ly+jC}oT7Z#gv6){`8nE_n+98RSA`>5B7+x{ngb_tcQtliRdQ|3Zk^d7%$Co82z zPTqpjl=s@n!%qv)K8dHP|0jMHo&joNTKF zb>lZEmBA;G`5nnMhNCO{zTYVIFWPxl%bVwtMykqtkt6lHJlHUT)B!UDR)T%1Eaiv) z+I{v8Spn@qc3~lzE3+t3MVUm5YR#&CJ6IF0e}fz=*1-ERsALAr&voff_<^01+z1n1|wb2&HP@^qi-K zMkqEz2y*qgitVf^DU*zdvxg=bN_5zNLA0tf2r&N(qSr~*M>}D%A%^IU6)X7T;X^Jh z4$t?e(1M{;q1eIrc_zG?}C0L8jB zA$NP#4)4BN3_4TDDD9#lS>s-$ibsLCE04O=+?-UsHK++4j=t?#mQ=Oqm&y}jZr_f* zxn{*&kh#(4m_L`qtpo6v(W9D&JeHmsXWUkIu%a6eu9YbbeDJd7$h8Z<_dmG)G3|!U z+!t2IkLzEqe>${bBZL{O4@nKK<~!IfNL^eXH4#05WxJ?qkhwmv@v5;}j*V3L%$Ydv z8js19YMDe$Z^- zm?a_JFaG(fC_?}3{mq|s#%{l1EkH0KODr4H+@~3zP5+iOANrmey860?Q;}hK%8ebr!t3;r4kx!79S6x z{&_qFNb(?I+}DY7bkkw^J~q`4D!KR&5;EudL>VX#qlIj+0bPLZrviuPh%W(kT1SzT zVYoC6RWt5tST9A7a0Z5?1LkG);j-Bx1rAkeLIOhpv%U#{ zKc|B6G@PYCzItB4n#Gm#t(W=80I?*((J+;d5t}8sqPv7NlB#?!Vv{+SfQ3tHlK{UV zWo5pK8ugKtWm$~u#P8JgyICl+M^PQlje>%p;M45L{Rpgfdh z$F+O|mx-4LDi!GRQ~0dHFSO0#ZtRO_2^tO;8uK*Ymx0C_*%yVLL)Uz!=M=0UMgOgr$C)Jd!snJ+w+cGO*slY zb8eoxzLUT^N2lfloZgkyvFofUBP{?*PkEbe?GmUV2t4$XD^O8p^I>>KHjTnUuflGn$$i#`qiCkQ~NP?c~$ZkeCH-Owt=C{!+&H5}LBXcYK`Z zHdUp{qoS!$z#B=AnsH9`+j;X%uI0;&=S^GGhGp1n4GqEmpvYws*TH_Lm_8SZhB#4a z7(bp1bJ>wX)uX~sUIEduP&i1UN3nJ}LfO!=7Qz*Rhk=a}b15!Q(?xShV>($JYB zwHkj@n;g}29w}%O(A4djG_pvW=ECu!@QrFX3Q#uC({iS4BhVU44G&!A45)g=YB7Y< zvOGr3-26H5w(Z$rG$RMSLKF3iFdl$Y4^4{56-RR% z*?fhz6o>o~n#;M<-c**;>=+lG8yQ~WOB^Lf5C6u$5`Dfg4VkDW6mBk#AtI?6k&@Bp5c}^C{HNJ_%>RUtE zNmF}rAGf&)_dMM@q~gIg#WHR{*^&eCa==FX>v^ZTAlhyI?Kh_dXJVK@9Y9v52|w?4 zEZxTwkLy)=cZWW89Lrs9=x9q4^ZuoC;^xYmq<4xL@4AEb&1y5=Xp3HbsrdWhR%C`p6Ypiy)gh8}+nMpuL_QzlHzc79`Hi7|MRWVEbaXq{8?JArKSsR$ z{?XAxhfewAHTJI0p0 z|FMQPbpg4w(pkU;nkyw^KR&S+;5u3Sx2=p%K@4=ShX)0MUTH}iJ_pnsM-^%U9^yTc z+=hD}sm-hOy3Xbh!ylvipAH#12{sbg_c{S;8*+qAPwA9YiKS6u87(Sb4!x!`np3W? zPI-OmZ$9JL7!C>H)IzD~WTwkczOwvGSa)*?l#0Ja=~00^h5|fj*1Tlax+I)kHZIfPjS zq?HLS#cIq$G*&D)gfx6Dw(@?Pmk|J5GL-s4_#kC)KS}S4fD%pwpDl%E!%ajGRNF7~ zx+Lw3pA&*KnY0ZyG&XwK)2J;!+PJ`(M%>BVp; zm0Jl9QXPiYQ03-e>z_xk<%I77Ti7F_u|1k2u8Slf*@SEwxXwoA znm8N417Z=|OTFBL#_oRK0#clwUSPvL_ypY?$>4TqDK#*b4lft%>=`ve>hZ4vJ6I)V zfuDQ>Qp~(|3Vbv#18NHv8$0#SFoL%rFI$`W!Q%0@;wC-0xy36V&G&mYl7cp~gA5p3 z!#C#I-ds96uuy=7`|Hwxgm3;1T+R%g7u@9 zwPC?V^|2)^IdXlR&6YWueK`i}EUCMDGk88+9{M}QYbET{Ue(o8m8+>N=e5IS;$VBB zQ*Uyi<)I8zk&Q4_9^X<}^sr7P*AaEe7S7%3vDL*gt(3TRY_r#^{VDvf|GvExL~ZP1 zoU-%<`>P8JDn7ZVH(M5eaXr_!UUI~8{qB1E8}8w7RGE|?2D+SLX-w}C;v(OKmt_3CaMMENtYtpK${YpMosISG_I!Td!Lp=rsq|imM@#2i z>*VR8-idR}iOI(CYZF&npOr$*-H$m;+!ACKqxkxk+J{Hx9D2{OGDk&bN#{^~c-TAj z@L%dovL=unv&~#|18<5njtR5jM)@{H=ab`O-z553I~f+5Tx*PVX6)YA)XLjv0%Y`E zOljcK?)DKzJ4&pT`ZK=N@aOIRJC)ehAGizWt@*ufGp3mVcd%LIrLAAAeb8{*iCo(W zLGBi(f;3}5pveMCDYv^R#qTDI2RZb1BfwI0MrkG7Uvivj_F9Z}TH^-2XBP(v*Q>pc`$p(-L|RG>VkpYeH}X)_v;;J z!cU?O46507I8a7L`lu^VE5XPL=Guk)wX@i7wf%bl*19$w-bM%aI4bMVYxevyZo8z? z+=F9-OUv%R&tR!= z5X~e4IZ&L6X@((th>Ml`|5>A0|6gsCGT|dx?#O~8K!CRk7v4-_aunu)BTgrc&aJ3okUOlhRih016=hyO~oi?nR8OAW3A= z0fKVjz7l9PWdSXRCr9Q=dS|@N*Xw~XSp=EkF^IUq*tI1w2!9Mxf$5{;1)Vpuwn~GQ z!Ul?7|5wS0Jn1`5M`!+(74|D(`MCxR0L2Hqp35A1*fFjm-VBvh6% zBxxWs9Vf(E(k-d7FtRpRWKN=tmNq2C4wonv^TxGHBV%6yvhqcjX1_f>;KI{>3W}^$ z=;`X<{UtdYG_E96I9x*Zh}MN})*zmh*>y>pcgo)}yJ|Mwgey-M(Wfl8RR&D#pjz47 z>GQ*c_Iw+`?LM4pw@H)rz3`Xc?OOJ|SR z*OwX;e^gjL<|}i1SvmL6(|2uM_k!ME&~bwo8P&!9+STEj^yF;Ie$x{xm!Ir=_Mvya zEcj#pa>uie*VgU@f4ctjybt`{y!S^$SflK)KWn#9w^IVm zWIG+bf;TJpzc320|5i0}Oa2e*_nrIUtiL74?H87(9@$O*y?+1(FB6c}$bZgt7$Kj( zgptMu{#{=2tIF~mvrXx0ez9-orMSCmE@mJ>|6+icX&Bt6hW_};$E?R^Um|oU=P`Py zY$==hTZ*wQgjTm*n#!lK9C^Vl&jhZ*AAi)HX`1BJB5o;P$qcxa&34^Owg=-A$i;9A9_T?Wj0>z$W~wvxejHGMKAM^L|1kHG4CV-3M>_SK4tPZ&WziVSb9F+X>99RH)>+)Tv%vf@mt~%cb}|c@gy4j? zh=0Ep+FRv#(MkoURt1GlcI2(aOzAV~Vw+smq0>jQISSH4IVrN!a3|d;l;Nqvlo@7W zUI-aM@L6{DuH7IUPWpOE@u!w+PMq(#xp4@bNSEm@N2JBDp*RQ>qRj+bCFfh?&?3PM$y*}n`7g=cP%|m5Uw1IoIvzM*YF2b43IP4TmZ)RBP zrm>6lTPwmHDE~r2)qCH>Jtv#K^RN^u$MSt#d0UPd3l5jFuLY!?(famwOD)J%aTOTY6c$1}_=WEH90mJkPl+9g z6=ydT8~X=k&eLM{l>1daB-Xqh1JQhr)MGl%>F~#twgWHnRxA)632YpE4dY+Bt+8A0 zlNamqozPEjss*yU-(^}%&un&4>tiVHN22+n3?&y(8Z9i=q?fu{zJ~`1VZa=X{k79_ zKp&~Yb{HuC8?y*EqoABbDR|KU#1p#C4>{ouNbeM-;FF)K<#KjP1V`}+w6|fL@`}x0 znIs;iwJdXG=b4<$|5?E%Pe&B(FlUW9>aU&AOj;;2trBNk(Mf#Bd<5lI0eRJhoA@9B zCxUiRcx=4yHY)jGAvDj6y;+ObW#GD_(nVYuvaK-h{5- z@@qM-GLwXybCIR&1s$bjrjLr7H*cxsdN-QjGs`}lcG$byV~^tG!+(W4SYmo%3rSf6 zazj@bZtlR=s1{V5x1&T9o-LbRJ0Kls?3~Sm73=2gmP{OBiix6cmt=F;uT6<->nN#)^BOJhn=n{^yGuQr6&)hN%a2vr}phRVtYq198E4( z&X-I6J*IJQow4FwP}0X|$sQ{=9G7eOTz&uh3t0j_LXDmaTeTr;tWp__)%{NlIbDE6 z>Nd~0wc^#Qe6#Q9PC4Uv*y!_F$$o^C?83d~?Cog>d_d z8{4?=(7jn(>=V<0z9-bQ8)L84jf<|y!|^99&`-YoODkCn{cu^L=e^kf&AW4-U-nEd zViKi2IypEjAFd0q(H>wP&XCF3s>}E>@Z(@Fgeuy*jwJuLcWq5>DdO{x7~WXG4!i%D z9W05<{|DOPVM?Au-C*#%2p^Kqe1U%-I4q$%B-=iO=dPDZ{H(nAZ*VKQhKOU#!-+iE z1c~q6`+uu7{5);&tLgrCOT&qT`$Q~FM*r@IjVpUU?puNVydxDy!)39>I|Ya(;YmLZ zCUP%{o&fK<_+gqVhUOt5d<2z*V`UhwY2=`lW61I}!t5S$Boo)YTMQ~NUm{{C#JZap zbe{KjfVe@)kx1)A87)lAV5CilaaMOO32#IE$`PT4&IAcY1ervFLKk7v8i8aash%jQ)g`INT9Y&~k}^w_vg(qu zTa%(0NjoJ((MVQNjOWP75_d{gB;Tsn1MzX2&5L%s*K_|L3?@YR6w z){T@7$0$X^HXUhF4xg%MLaQqK(qTMrY&n0!PTDrID=G{@7ML!1( zY%=t-IU0W25CVVfM&98@x|mPWg372j5N`4j@CKG-Iq*=pnLZ z(oiYFH8vF{9RV%o!KAfFwV$=lPLrCtwJ#bQbP7chA4DzxvI`Z$C&F{6Qrbj=(|j@P zC~ShQDk0MD?IWVE@DSuk-8-LkRTp$F_%3QkQZ7zWJ{cSQm?mA3)P6w*MB1nuqb&Uj zUoEi)>>DBQok^R{m0j~S_}P7AI!W(Y_iJyXVsh>_t|Ku3fCITM%}Iu@ya~{HVh+dP z=>oP@h;DzqNtSGUovkl7j3{LzH2AnM=2T6RZr|rM5$5K}Yk93mT1S_HScAGc)H3f2 z8X7_F`$GQSVDK+;91e8Gf8NbX=q3*sk>dd!C=oTtlOBX_Qg}r{khP9W0v-ejCzabKyY5J+hroCzQ-BSrx>oI!;$A~1>(;v2HV z7%Fe;KB6*&2r1{Il=;Y-c~CZot|#qiCJn$VsbbPJvj#Ftj_wpV;}lUzl%H{cNCPf2 z3?EY`37)YW5zwZ=MO2Um9`gCNn z@>5nWxigvJKC^YCOL?Wl&h;+&DO;w?9f&h+nt5+Kb&S%sn>1@emIpBMJp9$K#HCBb zvLur3HU|XXRxJ|yy@#T~w~q92*`G>Ic^H_)+b%|yg!3_KFy4l?2z*KfKJ!IyLC_UP z;55-mfkFIC1)fR(<^F-{J9i)&b{u3?k#G5t(f5g0F8`G^-Ju>C^bHR5y$Y&IA+AaR z#Y_(+sAQ{YFpL@cV3#9;Cy8GOJnK&y{7Mv<9)9QHA_U<1XGwx@c86sES*o=nR9qam z!(9-=H&_GApbsNKp{)U)gzc&ggdJ4d#!FO3Q8G~Tmr*5j0PxRJ0V7@Z2A{+BRw=2|AzU7jN7ONv+_9Z%EX|XZ z-nr*47H$fGR(mt0q=5voRyA4t6xpdlNIZHJy)phh{z3KLBcdbhcjf#3v^TTFce8sm z=~~DJt>?q`5MkJhODxhmp4;2+_6YvIU^q{{X)hrFCf&S89jc*71G>|QodKj@vcOHD zydqShiAmz-P!xx8-I032?`wP}zWM8kRaHAVs7_BqG%0nPdZh1*YOT6qwA=>@z*A@h zRHcRT6MS8W$jX#Paz3nE`aL!!om@Ff`V)!sQVl3+P-V5uN^kci7y1HW%(CK~Y@1iv z4;~STfJ8YJ{+;*4JOzqv5Ub@AQ-qeXQ24N;ocfR5uhI{_KORu@`QTl%O>zri&n{=H zHn4C|w$>%mM}Ii)EGe#42gagZym<5I=SDT*r^toefHMsg}J=2@T;I9GWdg$LM$CJj^}GP|ccH zvPT8P8kXF$1PABQgO8I+pvlp40LbbML+vnupD353AMq^M@}ZkU>pOx=7ZbM-nPAFL z!)3>h;&((4uQZtK>8jA#4(R^?P12JseAW6ZGzxR}O8ETe`YHo97c3CVEh^*`fQCrz zV)-NK=~?c9s;4bQQ?u=Qa{(2vWc3$w^j8{e6QqDY3ua;qZ|}(;c<`8fg(U~p! zLC(V?QuGTI4A+esHIaWEtM~6!6AU|+ju=V=!3b|fZzz4;P-)b)w30&S> zyvgzyFk6r03H`&+Oir>@3np21Y-@9j$Z- z7M+MwS4DRFs5p^X0)y6)nAR7S6bS-sfS97=iI}qhLa68ze%P!IP%6ab@KFn@4v9hJ za;LzWya?ZOq4U;8pAQ7qjuJzd2sI|Oj7ebfNYhF1RwpSk(ctU3;CIuVEm!ywwnM4k zcN}%%Zz$badHn3UPGJ3qYufSA!#|yL7EccDF+&at0ai`@roL2x#Iv5WO+%ZN@8fgA zFIH5A+8m}vnIUp^R1*Pc_6>D9BAad0nD?K)ikc8i$tDd)hm4==(;|n?o(ol}>c5aq zUK$NsRUiLxZuoEB9+b0cgHOcG+vsOQ*HBt|^~mxx=bc;V_jccm*{5{xXB~NUAR&o~ zl@-G4SWI!eq}o5*n98QPUjtJTpJPPr$}2)(fekM#SC#x5J%Ef?zW%`O?*p3MjMKpx z*XuK$e`kE`9{L}A7pHYf zUTG=VNZ{Vf?TWA5^dy>F*bti<)LapDDkD6a|# zef4uMv4&ZlmPbsi%oePAZFxa?)?25nVM1L)M;o0wo4`ezm!rht2gHsiL@bW-yH{ zx65$58ngP6qDS&naZz|hlSM)GW}C*+b>`AdRg)4yd*Is5Cp~+f4IZ}X{rKXV(ihbq zwT*0|0kwx%W12ZFXS5~6igOvf2lGEysnC2jdJDJbiDDZ<QEi)t2Lxj%R?Hw3yyJQ zm!tLQ$jCCeo6)KuGDullRTD( z8?MIfZm~U7*cxeJ9N*b;xy&Q!w#J!1iY#h5RM#bFo$h0;?#AfM zY40vJINjIU6sF(bRTehCd zi5CljY(b;OBB`{z&IC5}Tur^NxMzlsBVkwVEpPl@Wj<7uc_1XMzZ&K3q(nxuhXZbD z-WU)S9lhzm9vPqhD8jlSgr#s{#oikqJOl6*Z4pa-gQxK@mq~?p))e{+o_A7{R46taJt9AzkZ&qF z%a5-jBsx0t)v`h)eBRJiu!)5X-3EfiQM6j=5XO2&NZ95~D_UW#`k&5fkhxemsvDPB z60*`DcLRNM!>~B9G)niZ!u`UVrmcyGfvU`?P&tvjPhR0{=eHQPytW39V^BX5t5Gq1e8+fF^^t7#SAM4B=yyj`&SoE$*b>cGOC66yHJ&p%vU@`73f56F zp18zlu^QJZ=L{8v3uKoJV*(^kJYR{?*w%jsZ(bUiue8ZLV!1C)rQPXGJJE*l)@A>A z@@e*0HT4_Y63@yPAWH5tksfbJSxORm{S(IF*p{-JgIRE-sM zeCfasZXC7uur@N}f!_rCqA~(7ww7=coWOdldg~)J!Bjj9j34 zlmtC|a}$)E%+Y?wzEMG+ZdRFG@6pU#SLodpp#v_|J1E_|Oe7 zf{m`N$Q56y7u#xFsH-^D@jfQ~+KY3Zo9I4baw#I+oZ?uDIyAI!Jphy=btEc$4l5$c zk=9Z>SYl7Ya~B_xJiXzxw9fWiCTR$!wJOTSm3*3qK%5(mhWt|wSVRqe)9YY48kQ2o zHqr%MNdTnKJ5M)?)+Z``(%4is7T-9^=tCfm5?|%l$d78vexw?*^Sxu|r8X4N5>d-@R6{GXx}T1NzSD8PL%YLJn~qib_POU~^uhlKah%@~HbT#?jj8>9@4PjA)Dj zP~2Sr?&eV?J_{oNfE75#a5kyJtg6XLH=u%=^E6{D%3o^y5YY`c_!Y+nq9omeEHpmS zWW3qX=hm4-!+VLynMpitktg!NxtudNwR~1@NL)aL;48i3fRJJFqkRl<@>-$BwVDUs zhmune9xn>y`S8*{0kLL2H&;Fmg-}TAI`Sbm!>bWh=8I+(qLSh~UZoKatGH-q+k#e( zQKAookBP5GNL;-7@M4)6t>Y9_!;+84S?6jeT?=>K$fEUJG3(G2OUSRWd@Nzqm5c4( zed3!n48B7TXr%$auyp{+0BxkvbxkUkBk>;vL~!oC=G&TQzct1#%YDvo!w6v><}M2R z63QzzS$VG!n!u1k16DzIaS{1;|83mo4>{}A<5bJ75*uhJRwCT?mC}vXy97xHl))qZ zG)LFjiGODA`AdWyDJ)uMmUGjyZpLLKK~g+`P9=djlTwIKg8H4da6bTyGh8 z_ksIk!D9dgCb~{KbM0L6T$;gcmfXWNV4@{x&O@dqKv{%xr2E*O(I18R8K69f^Xk$P|zF4 zsHaVT!bBinWmRtT7bD4**qoTIFf~I%}xANgd z7GPfa5#!DyNj1ngDu7>x^2!m?x3f_74$ZF};6v!*PGjYM2kq60J{roE3hAv1mOD{V zjL!T)sgS;1jxkE%Be3E_sMNGwnfh-4h*dcv5Y%s}NQELVgV-~?+ym>o@H;>o*JH56 za!mh5`M21r)D&nK6S4ic@^Od(>*#m!@d|0IuZRFqBSv5xaN2@N06KGOu8?XJ)~prR zY-mu(vj?CJ5ig2lCh|3JcPV`_fmkOX`w_t{A{sP?ey|^ko2ohb3L&?=7l~T4Qow> zkj{x!;{i-iRKDV2Mt{KfQ7u%MNEoLEOn}ik5w~cd($jiRc5GdKJ@^#-yL=qT0`#$G zjh`l>YI(S<2Cb_Ny0tYhBOU?@_#2{7ohVGFo!+koqo*KIyFo1|`^$2Tp$Vu1KnsU? z;;m=R8_^tZaEMBYNksT3z(>A_!xJ0Bcn$D*7Sx#!l@cNh64GEs^)gp^so=RMjwdj* zbB9_)=R6T*^L%<1JT4Bbc&E1)3*^(AB5t1E`R4Q|g){XJ2sxSZ=9AKpa#*h4^?u|@Lh(QzDE(Nvq*0x=H+I9^F!+Jvv*(_*X zLV_9*DoMn;Pok5lpcep*Plk1101O*$F9gi__yQ_;`)d2$pv1n`wt;tT;y$O~^B08L z9gEmzD6y?4t_@&ccshRJ#nnb&wY7=}bpv2NZ0Qxk#d+(FK*b9Wf-ayEPr|2;|9uKx zbi@#;hu+1tf4~Ce32-1LgwBkqTY&>OdIj1e$kNcj(d3Jo!GP%=uS_^Vwsx`@x*QpJ>Br9y=b;BxPQmeZ7spBsrL00@VoBc|?6-1!JA5|K{q4>y)gC2PzDU4^m_h_U|g33&A(sG(OE_-VYsrE_RgDPLAuBi;Ap#i!D6AC!Ob zu*dii-e?FjP<8qDIZe_qDFnph0TUmoZB#Ir4vI!ra`BGLSZSAf>2I~QNWus!xfxq= z9np0?Wm+J{mfiJMeg6=c5+RpSFDLdyt^k#>cGCJwuutkb|>Yr~VlV+D0%C3SNDT*uVw zu2rox9@ILGB;AJ9Z*2Z|bqGO*$`mlszb{_A3aU+x!Pmx+gf1B$NkN42*wAhGyz(Ro z$V(7x{E~X)!x{$?#$OUtUQOvWWP@$W?8;>oR{{!IF*^811(7)MYiRR7h%}TAKF|do z+JcyFqS$9*cufB0v71e=ZfZy0$hi6+i5aJTrLrDg^n?&ve(T_F71+SYnH2C}HYhUy zYO>K=sQ0V}ByA=}=`?9xJczz9Y3)JKC>=Lf9%t=v1SLETe|ms_LWofb2lvpgDjptz zQimXRV6O*3y`t9hvl{X+=%1v%`GCN>La=v!DxIzoGd-bf2m1e!-d+bjnrMFVe98kq zmC>M?y|AH~+YILVQVNbzRCt_6kM2>v+^Zwp7lD?$Rh!PCWlIu7r2u`yNrKzt{aCUB zYvi*JUwdZQ_qtd;oM;Gk?#W-grC)eWTJj*6?g=K?5n}XCUc_IA?*$Kjxc=zqENo~N zk#rSaakZmvTx-)cDf%J!{It}X^$kf~?kVtQjxHi`;IT`Tx+9_x`=_Z)9SYY-07w+rR!X!f4Js*Th=t|8kQ72g&E1l;4PJmp07x+;1s} zbx!`CTeExlP0z%1WbVxiaQ4HELXi~YRIb~|OL+Z@=O13|YU@43fzQ*CgRMeG!s*&WYga-%C#DGcM7Xt~ zz16CM^D2TSgf029cyLdJ%gHwV$)=h)b0U*kLYd7~)hZn#L@EJZGMPlQh7O;_Y}*39 zJ!|WVeXP%adq{lgZj4Rlzcw`KP1L_Lntxx4m4StWwg}FfxO;DYenFu48~6{C{r|-7 zTxJw9u9 zc~eI3L2%y0{`G_Mp}A$C)Bb<4bQW$={BO9PEm$^SX#~WjyBidj?gnXHx&h9g1P3J>zet@`#$&mXsyAZEsqX8FZaF5 z6N!#58lA|Eh`SIiJBL6O)tsDb&IT$h&Y#~QKZp?geRY4UR|Lt3m zeGSi_+Xnw%dQ8p3Xzz99>zP9Lm}U1_E%({kL-sjy_s_NN^UUm@-`&5!biglrP|~&o z<{|JY0jjy*)my)7&V0YL`~5Q0p|gY>>CB<|?&+Z=(~-68k*(#C zeaMkR?vYdLk&En+^6t?!rXTLIKRhjec!&J(&Hdru`Xg}WNAT{C5T>7DvOmKue@5mO zmk0)vmY*5B|BOEsjJ9NsoB4U$^0)=Mi{?Kjn7AEhUgjZQW=@|u&fB$^|8mR%`j!9W z81u<0>6|Sl>{qGfu?D+c;F$fHZif=GUrnKJ4P}f4;4@UNemP`4g}!5t9z;aeS_$-B z7AFuPXY0_9G<0t$VgrY1xBT6G4MQa}))SFyR0MSB&otBD=m|8DLjM%cK#*f!A%r4g zv5eJ3$TAZ!e(m>qE9QRg35(^~my@v(3;!6(D6vmpk7t+*Ic2D$!HUU@Rs3)@0MiOU z;Q$Rg1Q0^WClBb!jZVd=f7;&uMUtj%35JRburG%u8?|%Mo@dmK5jhN5w*@6O@`#I?IjC z?kTS439X^M+>U!#?c^D7#Wp*UjnWean*7fP!@)Qde_q$1_fWnmp#$L0s$m6|vokjp zl%1W4P74q1TYXmE9tFN>^PZ`7;{n7Y#pN$6rb)O?0L0i!--DVs0o$+t!1NVorU+Yr z(0zC7uVzi?X=39-&GuJBYt*;*$=4x;tn`fGkZi%7FH1MAc1+DLbh&-_7yswi(eBp| zA5I-?4lxKtU|JEAIs?p(@HkqiixQohMjBg_fLY<*yzZef3Its^PH`Burl${^H5MOT zHZc>&g&gb9pE*dl(y@=Dw)O^?ipp9E^{26i`-a#=wi`wQ+ej-_0Inz8{{&%D$7yS% z{*}p-yP(N9d4Xi1v1Q_6BbEeK8{%=b*f*6?cm!RoaI{F0Cmw-Us~+DiE(|cN%2)`u z)cSq+-4Yk5Io~Gq;cb)g`Y1?`(>69NM@Q=JyBiw1MGcd3phN*bDKiX8u`t=(~a6RXdZji39}A~IqoCXIqn7Ia)A zKNm>@SJOY=VT}NJabW72f4nX97=oR5=#~F6^(<)kd525*N|(d@Ue=LY^rxbmS7STM ziYU&u^J6TYydP7Lfa_4DoJPa~ znhwj;6*(Q6ILj?^~6ra^hF* z@@Z)XkRy37+Ipyew;kVE@Po|~(Sn`<@FgCFB<&`+0;BH^jX#a+r zL2=hl`?tG)f2)80?QKxs{*T`wG)Ry0ZhIxSa|xyo`kqkjjt-92<^5uHnyR_(&J=&F zi>0$p(-rby&W_d-60uG<_3~i7d#opBV4Y!G?ZMt0tuN(co$0df!TI=DUoOQu%Tvhn z+*GuIQmu7%pzA$Z%$`AeFLTZ%N!O_xZCRQCgj=*XgO?doWHw+;hL7vTvlO$%VJTeZ z3@`1#s|4iLy~$krAp@19sw|73;d4ulLN*2oM2>1`LD{-cs1=pLU#^XbP&o0vqJ82| zFN;KI#~m$|$}HAu{JB0jLRv$f-BCxFe4d;wTX3M#0>b9q4a$)J{$t!IO1jj>AEY+O zTxd;%aI1@@s1Sz?D~|;)h(G_L^61wT<&Vd?27=dT#e^k`-{S}3ou^F>NDR$1k%nh` z{HMmQcC*l(qvO7-?wbXp_Q^W6@O!NJA{Q(3(XntCPq~rtB@B6jg8Eb?e#cK=wT$I5 zmd0l+G%m53&PF<$ki@P(K;Ed#*0f6GoK#9PE{QTiD7QO?j%-@|tx~?rj8^`D&(7tM)IJJNI+JYsD%$A4v=6XjIILP@SS)Qynx#$(Yx1mBAA-szK z&ZcO>&Zts}lh&K4a=X$fF)6ai`zX_ep24AH*sk_2iinNLD{P?ak`?RKl@aO8F~^Qp zjo_!%I>SW9O*lY>upHT^+VjAh&Kx5`o41VBYN}TC4YrqDq*J7ZT#i?g54P&BxJBOP zOVZo!ItP!O>o;8#gY^={5$5T(T_E)3W9-Tud zg&;B-Kb}Q5ji(3jWR&wBYt4fqI`9bq@fM2Ad-vbBnXXEQg7KZSWWft0K>H;H&UA z+LgZ~Pqx*mgxDb^=UCTn>^6b6oo{J{5!GG7{`%~ketH_`SZ()e1ekqx{v$WwZ}lmA z5T~t;$w#jRNKA*fbkw3QCZSWiM-I%MD`WPuhmYLPm1EYmev>{fA4H8kuGzowdZ4GJ zO>JJ~>AubQj-8iSO&?v%b*pMgv(Re22iI2URY>hw2er@(uPxhzAMj);;Le6~SAfuIYVZi5GwBoID)ltLySM_Fp}-I?B^pkTSD5 zkf>0)1%;}eymPSd$p|#v1YOIREgfur6wa~CD>(M>C%nf>O2aGT-if%Ay)xMBq8F6X z_Ym$_XEiQm2~F$8(h;r-4YM;6|In>+eooN_W*=Lg<^yU|jF-f<{qnMU19W-B#p%F0 z=45}0tC)nL(F(5gbpf>?!)`F`pQLJ8=l!ygN>MI(wP9$b5qb{1$0c#{;?t7*(HnDcO6FfKcT` zT!NRCnzoQ0lspt|n%>vY_-ISWs8BDMGD_JP)qxU~gGN-9G-PZg{4fZ;>Jh7IOqu{S z&{4^E6-N1;Y`)Q3xutIoe)@195=y0iao$tV7fKB1udP)B1=No<5K~g(41&EfOawA* z=hb@@Y0zpdf;|*1r45!lue%&Vw}Im`%4R*e#v`_g5KAbyqGx@fOJ|^6A9`fP(=3(P zru|8uMd`nn2GXfb5vETf%;LJNU7(z2;CMuW3LDArWthAJ)X4>E{!Yna`_RC)O7U9B zxxFDeF9`I)&RWBs@z;A7;_@MXPPO^ZZW2l|Xu@F$W?~mY6NW)F4^+?6>MIraFlZ~8+bV-Jwa{^@@wRH&1(f5{lWJM0CPPjJB=usS z8g)qhVfo2rC%wVkGuJk;xNyZrBa2H(9@~>UJ5RPqw$Wjf6uihCi z7JWFGQb9Kzzn)-0D(|2N` z=axRXm!S5?E(>9t7dDgl$8;_UN0==%U$L`@AF==u=R2M+qU^2D+uNMKWE*x7(0gS! z7T3Y+8l0@R3}FXu73rrHy-e1lte87H>Ae^%qP1qGgrG$tP7RH)I5sTq{OFJ${ofHq zRG?Fmr*^T|+*m;J=mt{H%e?r3-Jrf7JupcG-X!3N95)KDT+Aln-Xs77BQ(%CXjH8Q zG~ITK9t?&PzjcJ|B26|%lFxP<*O@gd03bq4PuU7_u>0@eS_W{Kw)67#;&-)rq1PTO zIL}MPTP0fFPQ^J*py^o`Uj|~|n}3OgSBxke8$GWBK|lg(*XR#74oJfSIPJ6W7}psr zV+e)OA-|nDoILc;gcRdy?Q%#OJtM{ij+q_uFfI_auC?pS_ckq&b$?o@Uf^S1uIkT% zu>uJv(+krxv}rebq%v@@a>i`)@N)t31obC6OW0>~kP zVV~!vZ{;^Fk^Cf2IvKP9F_7{PoBuTLu-_#G(YS)JK<^bdW(+gm`oG}98uss0Yj548>3zhB98zcRLJ9#-IIIqaX)w0o|O>3 zQ;p|12nBGe2Xp9Hb;Ml-GvawE#54_KH=j<+K%p3iNL+Zq45o;4HCR>)q7ix#@B=9) zUf*~i51=zbhY{!it7>}NEvBkdKIEyDcIL$-F}+D%2vNLFD|(2+B{h<#S17kY)=m8O zAieW~4%J(a(R>1j`=-2%g zp`oLBEe3)sHAm%-+xtjroVHNbuQYsDCt<>iRS|TRA_=_r)WA7~gL1=^KWgIsvH-g1`Nl_XBN^GrQV`!@ z0DTjyPfS8M`}GDnU3&GE6qVxdU43Jr+x{P!4!22iO*seLxvMj52lxziZ`GO$NcsUO zGTZ`ro&x`YyOWRQ0t&Wf`56t7WmCzd((h2>19p}cioBkbQ9;G8WP(_s5~^Wssu0>e z&IK>e^Km^0jp{!3mzc`^KJkoU)HguBpzC4xiO{++~8oMRK8@@7G3Mt5(fws%SOdtyy3v{KB7gdg90PvN2@!L_j9t zObt#8(*0=mYq~^h=GF@VjdSHD>sQDKIR56+rwcz(!w}Fd9K*Ny8CDW8NxpQ9xSM%j zn?;*sNx>nd@XJT2k6;i51oP+}UbnJQ*H~I*fd$=1BR@X_Afwubm+=WEC2)G!c|t+^ z`6atT4hbqw8K40Sj-4d#&Q%C_774svO}?-}^Hu;?X`gm8gE=YyC_C~N1a&WC;41dSAD`}xJ}!if12KwWtfDi@&f9;g(Y>s z=k2ONIy*-2DJ)d zrJ0JD#jjwiXoyQnB_VK_Iia|n@1>9VM7lWLfH-g$O*HnvX7RwWbg)WXsKiI7SGQja z+*2M8a60SN*jR;1Z;S{c+mZ9_&~8QRU{n0NrIOwsmxhzaLnO;xKS%AfD?Q(-QE99o zarFqeJL>4|>d6&gRJ+>H-+a9(`rNmMGdY-Hs!@&kt9+{61HmCCgkGM4<9kW{wD{eK z-AAr}Pro^6P2GJSF3s-tqgamt!p&u}_1k$%#<90n_dLMnp7`pV9)qcsUM%zED(I2W z(7EZ>_{+;~M-in@gjM7%)?Y6b*h>NW(KtQ}ViM|BH!_ARA%I~B0Te1CJ>_tcaDbVw zdME=Rg99CA=`a-pB8DoqEOz^%( z|L%+?iO5&IySRL0;4;L)uhg6V_^YmB*-8$(q1rgeALNRg{|8BgttOKsF_qX(4DAE4 zMB)jEU;+H019XP>mXh~?Cr!#wFEFJ*))C64Dw(!EA512YoF2injmkJ>$f;B(fx9Rr z1Et}-BrpII+Ry_!(bukjy}9z?TlfgO^!HF!)j^ez;}k`ijVPwO?V#~w#iv6o^QBKs zImJf<|9X6WJwS)LA72tY-ode^B?zQRrPYT;{=z#v7p9!ILZWx1K^?-G#%Ov{~w-KJfN1uMgRNb_=-ucOOf+OF)G0^Obp}pRYY`ygt16r1j^CmF@3l`XEi|zL< zS1|_eTupK_+jkXu%;Oz7y@augb;Ed9kM5cf!5#HT$JJ- zbZxekcS_g>1sK#P{qT)zsOzvxOTNCB>;Yc{C@E*o!-%xhTjOx=6QFuJ+@Z(g$}e7R@v;8}c(PgJtz zN<-r?(}lnL7mg(BB{10kZ7gjbP)!;cZ}6XM=RbeI LT+)t)@e^*eIfwmzGsU+y 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 literal 18888 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 Vo%B}A#(_&96-CXL7u\u001b[?u\u001b[c\u001b[?1049h"] -[0.779711,"o","\u001b[2J\u001b[H\u001b[?25l"] -[0.805016,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[3A\u001b[2G\u001b[?25l"] -[0.841268,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-exact-interactive-20260816\u0007"] -[0.846892,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.846976,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.853664,"i","keyboard-flow-01"] -[0.853764,"i","\r"] -[0.864663,"o","\u001b[15G\u001b[?25l"] -[0.912563,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G"] -[0.913158,"o","\u001b[?25l"] -[0.990246,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.074997,"i","keyboard-flow-02"] -[1.075095,"i","\r"] -[1.08568,"o","\u001b[15G\u001b[?25l"] -[1.116653,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.186529,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.278784,"i","keyboard-flow-03"] -[1.279088,"i","\r"] -[1.283155,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.284806,"o","\u001b[31G\u001b[?25l"] -[1.290344,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.326542,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G"] -[1.326745,"o","\u001b[?25l"] -[1.395938,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.39603,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[1.481215,"i","keyboard-flow-04"] -[1.481325,"i","\r"] -[1.484212,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.489147,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.51367,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.59326,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.683457,"i","keyboard-flow-05"] -[1.683559,"i","\r"] -[1.69227,"o","\u001b[15G"] -[1.694221,"o","\u001b[?25l"] -[1.723277,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.800552,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.887207,"i","keyboard-flow-06"] -[1.887289,"i","\r"] -[1.89272,"o","\u001b[15G"] -[1.892877,"o","\u001b[?25l"] -[1.924811,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.924903,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[2.001345,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] -[2.001482,"o","\u001b[?25l"] -[2.0916,"i","keyboard-flow-07"] -[2.091707,"i","\r"] -[2.100213,"o","\u001b[15G\u001b[?25l"] -[2.154593,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[2.154683,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[2.234007,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] -[2.234226,"o","\u001b[?25l"] -[2.313262,"i","keyboard-flow-08"] -[2.31335,"i","\r"] -[2.31697,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[2.327532,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[2.365431,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[2.447763,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[2.537801,"i","\u001b[5~"] -[2.537897,"i","\u001b[1;3H"] -[2.541028,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] -[2.541104,"o","\u001b[?25l"] -[2.617302,"i","\u001b[6~"] -[2.617398,"i","\u001b[1;3F"] -[2.621937,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter newline · paste \u001b[39m\u001b[38;5;145m────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[2.631937,"o","\u001b[0m"] +{"version":2,"width":80,"height":24,"timestamp":1787913360,"duration":1.829088,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} +[0.359161,"o","\u001b[?2004h"] +[0.359366,"o","\u001b[>7u\u001b[?u\u001b[c\u001b[?1049h\u001b[2J\u001b[H"] +[0.359684,"o","\u001b[?25l"] +[0.369026,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.369067,"o","\u001b[3A\u001b[2G\u001b[?25l"] +[0.401374,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-multirun\u0007"] +[0.404864,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.404895,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.423356,"i","keyboard-flow-01"] +[0.423433,"i","\r"] +[0.432413,"o","\u001b[15G\u001b[?25l"] +[0.458198,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.526708,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.52675,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.604678,"i","keyboard-flow-02"] +[0.604762,"i","\r"] +[0.60934,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.611076,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.627079,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.62712,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[0.679498,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.766543,"i","keyboard-flow-03"] +[0.766612,"i","\r"] +[0.768636,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] +[0.768666,"o","\u001b[?25l"] +[0.771017,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.786747,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G"] +[0.786856,"o","\u001b[?25l"] +[0.84247,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.92843,"i","keyboard-flow-04"] +[0.928505,"i","\r"] +[0.930457,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.933637,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.933679,"o","\u001b[15G\u001b[?25l"] +[0.949722,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.949761,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[1.006608,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.089576,"i","keyboard-flow-05"] +[1.089652,"i","\r"] +[1.092091,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-05\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.094497,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.094527,"o","\u001b[15G\u001b[?25l"] +[1.110336,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.110375,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[1.170994,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] +[1.171037,"o","\u001b[?25l"] +[1.250963,"i","keyboard-flow-06"] +[1.251039,"i","\r"] +[1.252832,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.254982,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.254994,"o","\u001b[15G\u001b[?25l"] +[1.27436,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.335318,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] +[1.33536,"o","\u001b[?25l"] +[1.41122,"i","keyboard-flow-07"] +[1.41129,"i","\r"] +[1.41532,"o","\u001b[15G\u001b[?25l"] +[1.43168,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.494447,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.494487,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[1.573282,"i","keyboard-flow-08"] +[1.573364,"i","\r"] +[1.577303,"o","\u001b[15G\u001b[?25l"] +[1.593586,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G"] +[1.593672,"o","\u001b[?25l"] +[1.659887,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.735706,"i","\u001b[5~"] +[1.73578,"i","\u001b[1;3H"] +[1.739117,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.816108,"i","\u001b[6~"] +[1.816184,"i","\u001b[1;3F"] +[1.819043,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n"] +[1.819088,"o","\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.829088,"o","\u001b[0m"] diff --git a/artifacts/verification/w6/states/active-streaming.json b/artifacts/verification/w6/states/active-streaming.json index ee618f46..f0f53152 100644 --- a/artifacts/verification/w6/states/active-streaming.json +++ b/artifacts/verification/w6/states/active-streaming.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 80, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 5, - "frame": " › W6 active streaming\n\n working…\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n────────────────────────────────────────────────────────────────────────────────\n› queue #1\n\n\n─────────────── type / for commands · Alt+Enter newline · paste ────────────────\nprofile Braid starter · pi · via not connected Ctrl+C cancel\n", + "frame": " › W6 active streaming\n\n working…\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n────────────────────────────────────────────────────────────────────────────────\n› queue #1\n\n\n─────────────────── type / for commands · Alt+Enter · paste ────────────────────\nprofile Braid starter · pi · via not connected Ctrl+C cancel\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 5, "sequence": 5, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -159,11 +159,19 @@ "interactions": [], "queue": [], "activeRunId": "run-000001", + "focusedRunId": "run-000001", + "activeRuns": [ + { + "runId": "run-000001", + "conversationId": "conv-1", + "branchId": "branch-1" + } + ], "lastError": null }, "view": { "revision": 5, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -281,6 +289,7 @@ }, "environments": [], "activeRunId": "run-000001", + "focusedRunId": "run-000001", "interactions": [], "activity": [ { @@ -311,7 +320,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-16T11:05:23.005Z", + "occurredAt": "2026-08-28T10:35:41.123Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -391,44 +400,36 @@ }, "capabilities": { "conversation.create": { - "available": false, - "source": "application", - "reason": "Finish or cancel the active run first" + "available": true, + "source": "application" }, "conversation.open": { - "available": false, - "source": "application", - "reason": "Finish or cancel the active run first" + "available": true, + "source": "application" }, "run.runner": { - "available": false, - "source": "application", - "reason": "Finish or cancel the active run first" + "available": true, + "source": "application" }, "run.model": { - "available": false, - "source": "application", - "reason": "Finish or cancel the active run first" + "available": true, + "source": "application" }, "run.effort": { - "available": false, - "source": "application", - "reason": "Finish or cancel the active run first" + "available": true, + "source": "application" }, "conversation.branch": { - "available": false, - "source": "application", - "reason": "Finish or cancel the active run first" + "available": true, + "source": "application" }, "conversation.clone": { - "available": false, - "source": "application", - "reason": "Finish or cancel the active run first" + "available": true, + "source": "application" }, "conversation.fork": { - "available": false, - "source": "application", - "reason": "Finish or cancel the active run first" + "available": true, + "source": "application" }, "analysis.ask": { "available": false, @@ -455,10 +456,19 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, - "export.create": { + "run.interactive": { "available": false, "source": "application", - "reason": "Finish or cancel the active run first" + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "export.create": { + "available": true, + "source": "application" }, "application.quit": { "available": true, @@ -546,7 +556,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } }, @@ -658,10 +668,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-221214e8dc3317bcb681a929", + "id": "effect-op-terminal-000002-f42480eb9f3f2a5b76208330", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "221214e8dc3317bcb681a929a14c7405e4e06d08e9bbba09c7a20cf138d54c87", + "requestDigest": "f42480eb9f3f2a5b762083305eb8bb56efed4b6ab20ceeeed6492a4f63f304a8", "kind": "send", "status": "pending", "attempt": 1, @@ -680,40 +690,40 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-16T11:05:23.005Z", + "occurredAt": "2026-08-28T10:35:41.123Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-00c1be56-e524-49c2-9635-c92d7fae52aa", + "id": "turn-b161f084-e508-413f-b58d-99baa80dcf40", "intent": "W6 active streaming", "metadata": { "identity": { "profileDigest": "sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983", - "taskDigest": "sha256:3ce61a40a3cd4e7f777080a96e3df6dac9a740154c2d4ea7c6893f65eab607d5" + "taskDigest": "sha256:dd6b9e9d100729342b1c39bd909692e03d7cc5f24ba7bb0de942a5add8aeb64f" } } }, "session": { - "id": "2e852f40-2813-4ba4-9e23-78f2991e7c5a", + "id": "1da25da7-5cbb-47b4-9627-3d60db3295a1", "backend": "executor", "status": "active", - "createdAt": "2026-08-16T11:05:23.005Z", - "updatedAt": "2026-08-16T11:05:23.005Z", + "createdAt": "2026-08-28T10:35:41.123Z", + "updatedAt": "2026-08-28T10:35:41.123Z", "metadata": "[unavailable]" }, "backend": "router", "metadata": { "identity": { "profileDigest": "sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983", - "taskDigest": "sha256:3ce61a40a3cd4e7f777080a96e3df6dac9a740154c2d4ea7c6893f65eab607d5" + "taskDigest": "sha256:dd6b9e9d100729342b1c39bd909692e03d7cc5f24ba7bb0de942a5add8aeb64f" }, "materialization": { "status": "known", "authoredProfileDigest": "sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983", "effectiveProfileDigest": "sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983", - "materializationPlanDigest": "sha256:00acc9b6378f74a84629ea6c26f6e800d054bc04588a1daba8d1924b79792478", + "materializationPlanDigest": "sha256:a5b3379719400534a3c394e89e6822ba88632b2583f080635b5a0a119d959f5f", "runtime": "router", "backend": "router", "model": { @@ -722,16 +732,16 @@ }, "execution": { "kind": "request", - "id": "turn-00c1be56-e524-49c2-9635-c92d7fae52aa" + "id": "turn-b161f084-e508-413f-b58d-99baa80dcf40" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-00c1be56-e524-49c2-9635-c92d7fae52aa:attempt:c94a79bb-1272-44ba-ace0-f6fa63c8ad8a", - "materializationReceiptDigest": "sha256:bdae6c111d17379adb467471e373ca52efbafa678fa43bc4cd3bcb66d79cb91b", - "bindingDigest": "sha256:dbfb11afb6d471167ed41e0d48a5a4399546209487e8f350b2f38870c0455b37", + "attemptId": "turn-b161f084-e508-413f-b58d-99baa80dcf40:attempt:c1ead8eb-8ad4-42e4-aaa2-559a02eee1f4", + "materializationReceiptDigest": "sha256:7292070a64fb6aeb7726ce1020c30453a846ee0db9322d1b4c436900e1aa556a", + "bindingDigest": "sha256:bc2cfc07b970a1f007a96c7f8099a9b84f0dab440550b39cd8e61b8f54af8654", "descriptor": { "kind": "router-request", "transport": "http", @@ -743,10 +753,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-16T11:05:23.001Z" + "startedAt": "2026-08-28T10:35:41.121Z" } }, - "timestamp": "2026-08-16T11:05:23.005Z" + "timestamp": "2026-08-28T10:35:41.123Z" } } } diff --git a/artifacts/verification/w6/states/active-streaming.png b/artifacts/verification/w6/states/active-streaming.png index cfc8177dd7618800f4be1ad4280c161f23849bdf..f7c7b867806875c60ff3a697091694f6bec5548a 100644 GIT binary patch literal 15309 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 literal 15662 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 against another\n frozen run\n ── run receipt\n source complete: yes\n findings: 2\n analysis cost: $0.0048\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ previous/next · PgUp/PgDn page · ←/esc back · page 1/2 · tab: analyses\n", + "frame": " analyses › /ask · frozen question\n────────────────────────────────────────────────────────────────────────────────\n source: da8ae2345b2c17a…7c9190eb · frozen\n analyst: profile-trace-reviewer · completed\n ── question\n Where did this run waste time, and what should change?\n ── findings\n 1. [1] Profile inspection and route resolution ran serially although their\n inputs were independent. · medium · confidence 0.94\n ↳ [1] profile.inspect completed before runtime.route started · event\n event-runtime-r…te-start\n 2. [2] The answer claimed success before the packaged terminal check completed.\n · high · confidence 0.88\n ↳ [2] package check started; no terminal result was recorded · event\n event-package-c…ck-start\n ── next\n next: ask a narrower question, or use /compare against another\n frozen run\n ── run receipt\n source complete: yes\n findings: 2\n analysis cost: $0.0048\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ previous/next · PgUp/PgDn page · ←/esc back · page 1/2 · tab: analyses\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -319,6 +321,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -411,7 +423,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/analysis.png b/artifacts/verification/w6/states/analysis.png index b8fad3a9df1df26157fe465146ce3efe50e4e343..15b075f21628b43323b7b074ba6d9e22203e7b05 100644 GIT binary patch literal 60446 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 literal 62918 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 diff --git a/artifacts/verification/w6/states/analysis.txt b/artifacts/verification/w6/states/analysis.txt index 12e8df97..5f7445b7 100644 --- a/artifacts/verification/w6/states/analysis.txt +++ b/artifacts/verification/w6/states/analysis.txt @@ -1,4 +1,4 @@ - analyses › /ask · frozen question Braid starter · pi · fixture/deterministic + analyses › /ask · frozen question ──────────────────────────────────────────────────────────────────────────────── source: da8ae2345b2c17a…7c9190eb · frozen analyst: profile-trace-reviewer · completed diff --git a/artifacts/verification/w6/states/automation.json b/artifacts/verification/w6/states/automation.json index c2872364..4f652a4f 100644 --- a/artifacts/verification/w6/states/automation.json +++ b/artifacts/verification/w6/states/automation.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 80, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -276,6 +278,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -368,7 +380,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/automation.png b/artifacts/verification/w6/states/automation.png index f708fb97b819579dfd9fb8b7565927f8cf797589..5c000375a2a5a34c1f4f711851d8dcffc4d4ba01 100644 GIT binary patch delta 21 dcmdm^ut#CTRz?mPE@j>2q4N_q?`5p#0{~Th2bKT; delta 21 dcmdm^ut#CTRz?m1ZdO@Nx1Z^o_cGS=0RT^(2N3`O diff --git a/artifacts/verification/w6/states/command-palette-120.json b/artifacts/verification/w6/states/command-palette-120.json index 4fd6c954..7580acde 100644 --- a/artifacts/verification/w6/states/command-palette-120.json +++ b/artifacts/verification/w6/states/command-palette-120.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 120, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 1, - "frame": " Commands\n────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n>\n→ /new Create an empty conversation\n /open Search and open conversations\n /profile Inspect, select, import, or edit a profile\n /connection Inspect and manage connections\n /runner Set the runner for this branch\n /model Set the model for this branch\n /effort Set reasoning effort for this branch\n /branch Create a branch at a message boundary\n (1/29)\n────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n type to filter · enter to choose · ←/esc close\n", + "frame": " Commands\n────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n>\n→ /new Create an empty conversation\n /open Search and open conversations\n /profile Inspect, select, import, or edit a profile\n /connection Inspect and manage connections\n /runner Set the runner for this branch\n /model Set the model for this branch\n /effort Set reasoning effort for this branch\n /branch Create a branch at a message boundary\n (1/31)\n────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n type to filter · enter to choose · ←/esc close\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -276,6 +278,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -367,7 +379,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/command-palette-120.png b/artifacts/verification/w6/states/command-palette-120.png index 85b3885ead4fd23f3113319f9305af832d0687d4..8d25f574d65e4318940684ab890deed51588928b 100644 GIT binary patch literal 36518 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 literal 36717 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 diff --git a/artifacts/verification/w6/states/command-palette-120.txt b/artifacts/verification/w6/states/command-palette-120.txt index 558cc1d6..91ece18b 100644 --- a/artifacts/verification/w6/states/command-palette-120.txt +++ b/artifacts/verification/w6/states/command-palette-120.txt @@ -9,6 +9,6 @@ /model Set the model for this branch /effort Set reasoning effort for this branch /branch Create a branch at a message boundary - (1/29) + (1/31) ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── type to filter · enter to choose · ←/esc close diff --git a/artifacts/verification/w6/states/command-palette-40.json b/artifacts/verification/w6/states/command-palette-40.json index c15be1ba..a9b929f4 100644 --- a/artifacts/verification/w6/states/command-palette-40.json +++ b/artifacts/verification/w6/states/command-palette-40.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 40, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 1, - "frame": " Commands\n────────────────────────────────────────\n>\n→ /new\n /open\n /profile\n /connection\n /runner\n /model\n (1/29)\n────────────────────────────────────────\n enter choose · ←/esc close\n", + "frame": " Commands\n────────────────────────────────────────\n>\n→ /new\n /open\n /profile\n /connection\n /runner\n /model\n (1/31)\n────────────────────────────────────────\n enter choose · ←/esc close\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -276,6 +278,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -367,7 +379,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/command-palette-40.png b/artifacts/verification/w6/states/command-palette-40.png index f1eebab74141ac391f7f937c695f0146270f369b..b728c7729ad4dbd070e0984ff284b944b23dbab6 100644 GIT binary patch literal 9482 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 U{fqUo39t%KQP7mHfWCV7Ulu6~4*&oF diff --git a/artifacts/verification/w6/states/command-palette-40.txt b/artifacts/verification/w6/states/command-palette-40.txt index 6781fac7..4fce1e00 100644 --- a/artifacts/verification/w6/states/command-palette-40.txt +++ b/artifacts/verification/w6/states/command-palette-40.txt @@ -7,6 +7,6 @@ /connection /runner /model - (1/29) + (1/31) ──────────────────────────────────────── enter choose · ←/esc close diff --git a/artifacts/verification/w6/states/command-palette-80.json b/artifacts/verification/w6/states/command-palette-80.json index 6889abd6..49356d10 100644 --- a/artifacts/verification/w6/states/command-palette-80.json +++ b/artifacts/verification/w6/states/command-palette-80.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 80, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 1, - "frame": " Commands\n────────────────────────────────────────────────────────────────────────────────\n>\n→ /new Create an empty conversation\n /open Search and open conversations\n /profile Inspect, select, import, or edit a profile\n /connection Inspect and manage connections\n /runner Set the runner for this branch\n /model Set the model for this branch\n /effort Set reasoning effort for this branch\n /branch Create a branch at a message boundary\n (1/29)\n────────────────────────────────────────────────────────────────────────────────\n type to filter · enter to choose · ←/esc close\n", + "frame": " Commands\n────────────────────────────────────────────────────────────────────────────────\n>\n→ /new Create an empty conversation\n /open Search and open conversations\n /profile Inspect, select, import, or edit a profile\n /connection Inspect and manage connections\n /runner Set the runner for this branch\n /model Set the model for this branch\n /effort Set reasoning effort for this branch\n /branch Create a branch at a message boundary\n (1/31)\n────────────────────────────────────────────────────────────────────────────────\n type to filter · enter to choose · ←/esc close\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -276,6 +278,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -367,7 +379,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/command-palette-80.png b/artifacts/verification/w6/states/command-palette-80.png index 680e8f4970034bb383fe847588a1e432c09c6559..1835713f3aa3b501e206e5a6e4c314c4a555a3d3 100644 GIT binary patch literal 35226 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 z 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 L-cA?N{Of-K-4_11 literal 35536 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 LB=|G=9z6XY;PJf% diff --git a/artifacts/verification/w6/states/command-palette-80.txt b/artifacts/verification/w6/states/command-palette-80.txt index a130612e..3c32b96d 100644 --- a/artifacts/verification/w6/states/command-palette-80.txt +++ b/artifacts/verification/w6/states/command-palette-80.txt @@ -9,6 +9,6 @@ /model Set the model for this branch /effort Set reasoning effort for this branch /branch Create a branch at a message boundary - (1/29) + (1/31) ──────────────────────────────────────────────────────────────────────────────── type to filter · enter to choose · ←/esc close diff --git a/artifacts/verification/w6/states/comparison.json b/artifacts/verification/w6/states/comparison.json index b696bb61..c3359a89 100644 --- a/artifacts/verification/w6/states/comparison.json +++ b/artifacts/verification/w6/states/comparison.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 80, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 1, - "frame": " analyses › /compare · frozen runs Braid starter · pi · fixture/deterministic\n────────────────────────────────────────────────────────────────────────────────\n saved result: replayed from the local journal\n baseline run: run-route-serial\n baseline source: 9ee7d219c8b0092…8c519924\n baseline outcome: completed · cost: 0.014 · source: frozen run field\n run.cost_usd\n candidate run: run-route-parallel\n candidate source: 0328e6889082b14…86b0ff3d\n candidate outcome: completed · cost: 0.009 · source: frozen run field\n run.cost_usd\n sample: 1 paired · 0 baseline-only · 0 candidate-only\n ! One pair is descriptive; it cannot support a reliable general conclusion.\n captured fields · baseline | candidate | availability\n run.status: completed | completed | none\n run.cost_usd: 0.014 | 0.009 | none\n run.wall_time_ms: 18200 | 12100 | none\n run.input_tokens: 7420 | 6910 | none\n paired measurements · candidate minus baseline where applicable\n paired.correctness.b01: 0\n paired.correctness.b10: 0\n paired.correctness.mcnemar.b: 0\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ previous/next · PgUp/PgDn page · ←/esc back · page 1/4 · tab: analyses\n", + "frame": " analyses › /compare · frozen runs\n────────────────────────────────────────────────────────────────────────────────\n saved result: replayed from the local journal\n baseline run: run-route-serial\n baseline source: 9ee7d219c8b0092…8c519924\n baseline outcome: completed · cost: 0.014 · source: frozen run field\n run.cost_usd\n candidate run: run-route-parallel\n candidate source: 0328e6889082b14…86b0ff3d\n candidate outcome: completed · cost: 0.009 · source: frozen run field\n run.cost_usd\n sample: 1 paired · 0 baseline-only · 0 candidate-only\n ! One pair is descriptive; it cannot support a reliable general conclusion.\n captured fields · baseline | candidate | availability\n run.status: completed | completed | none\n run.cost_usd: 0.014 | 0.009 | none\n run.wall_time_ms: 18200 | 12100 | none\n run.input_tokens: 7420 | 6910 | none\n paired measurements · candidate minus baseline where applicable\n paired.correctness.b01: 0\n paired.correctness.b10: 0\n paired.correctness.mcnemar.b: 0\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ previous/next · PgUp/PgDn page · ←/esc back · page 1/4 · tab: analyses\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -363,6 +365,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -455,7 +467,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/comparison.png b/artifacts/verification/w6/states/comparison.png index 4fa1535112f1ab0a6f6c486529477a9f060f2167..118ec49f2f7a8ce7bbd278101d96e07989e7130e 100644 GIT binary patch literal 65619 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 JS?83{1OUSLSFr#9 literal 68314 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 E#d_#SUb4TvfSjJ^kDMHagU4yg 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 -;TQkqTK9r?+~gyE$ZLs&f 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 literal 13523 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 gcY65iec=h3b0Q$Jq{{R30 literal 19112 zcmeIacTiLP`Y+1+x)lT|ih_o=5v3QECjA8jM0yD=6ancFq)Q3BDhPsrNbe#ww9rBi z2na~8p%>{82%&{QAjw_seP+(w`JFR!?w#Mv{o`)Pe8a4SwZ3`k=XuuW$wz%%4SHG- zEfp0Nz2@_0hE!BnSg5G}d_?mna3smv)f0I7r~Pw79V)6IUMi};!>Oo=oW#cz<*u?-#Fn+D~aKwT3=dIc3zv=D?Hr-*8BusfrbGX1=(hJRt%v}b&Uu6^~ z^N0|Z8vjzZ{2NkqfAz1wrW{D*MiMl{K$PGk7PYZ^eh?o#wG}c9JQO@fWC&kh`{J2^ zi+{G&N8bUS&j{Qqe^609=lO41%Q9&EE@#Hlxxy~D&!VCZT#SloxJ%PBv~x~QmlT4B zv*IrOHfRwa=nMLBqj{vM3J7rM)5kc>Oy2v+n)XV|>en6b4DIc{FLv}soMR)xc#Yin;W6uO=Dy#|MVd4j>4 z+JDPG#m@7EpRGi8mqI)-Y=J%MAH;6#wfhfY0FkZr#)VR_sZgX_s--2Yp>i^|)!Q^^ z)3+dKbh+I{+t)aeHx_M=2@2|Yrh#On&5+;0c5z2CM6!d#9g~8_JFn8|hDWGB3m3Dl z``L$98%QQzNR#|FqM2>;B2^iN(vRWq-=l)QU``zniZB=~WD@eq*2Nsk<7};;JNGBm z!LrdGH%lF+57ENzg)B{+Y@RMIF19W^8|de7V}kws30)Z z8k*Y%Yw_Pr$xcLt>=<5oe?*8%M&iG4g*N)`c&9=aFYq{477%guI~fBfk4PRL;^*7^ zw0yNcxyFQqkZPWY4|x1zhz?^3p`s!u3jVt7>69?y|)(|JeL(=pJG3yidb1Z+1=jUu3q!m4DnZx zl4}3@=-i~gCO1V!M($j~)%artL$(xt;N!=SFABYnP)XRjqS1R ze7jEL>&EGy-4?^S*~xx{eJfVhY4zCF;cU5Ja!68cZv1-`%+4;0={^sSxB#~SjBckN z?G_Oc!MVR5Wa2%TW{}9MV|_YN!!QzXdWdIx`uZzV=jitJ#poBBngTK<`uxHoA{T_+ z;!q4fuWV_asVZM2XoDpg5bt1TI2FMbW%-9MdX= zT7s`FhR)YKo)f#p#f6)m8CmFD1unlelDn()wY|1>pxy%#!Sqq{x}>`xd10Z<6ej|y z-&?9RmE7LmHeM-XQc255Q}ho}whis;SY2Hm931r9of@L-2Xjn$pZ!ee(uhk-Pe-~e z61#RL+R2-lfZdu}^K6^{wzy!yUm)$5lpXp^yg6m)JEZy+qaEL3;~4kTGZk%Z0|SHg zCZ9INHeKDg!|NYaq7DuY=KK~W8%loLgtPNqRxX5-g2>?Dv3D){eRhj)iiJE6k1CBV z)YicD5*19)*4Cax;*Z8p-;MTF*#r9)78RWejPdsNX5f^q^T)cHva&{~7JsOdoL_xkmCd8U!es#36^Jv=ZVE+GM& z|F+8I`BrX!YwL&;%($!aLrm>N5}|0JHNAD0B9^ti_j4>C6@))@o%!B5?tSo8nd9C2 zLKdZf(-2$Rm8uT06yiOL8Til6&Q9s&yADv>u>#FC+b(ry^Iz}Olz@CdNK6;cwzL9- z8q&%(ba}QWnk|>y^77*AS0H4Z972tUCJQQyo#HuBx;Zz*?m$JYn%7rW###ew4aZ6s z)cM_%v)$;ZzK0oJUHD12T>Ct-@K)lNa3%wT$E6+H+i58k7E5i}rTYBi@piD zftG;%+bYkVWq~AJlZeWW*)aT&bPsQj66LbCy4vg65BSc6(&b8I80S)k!Y(uVy|Q3w z`$kR3xi`L|>_t>X@TV1Uh$&mRpbnk=TuC}%g!V1+Kc%1S+GCry0rSrBIA7632)9}g3$>5vM zq3hdY=gX;W?e(_DynwBGwvn41hcZ;6Qat8Lb3`T3Ru8S!fs9UN z0QTgg1~R+pe^*Zb|KdDgQEKW7E>_qsZn>^h2*6x|w{8Mh>@U#2)(l%eAqXrb;B^(3 zV#rJs_myB@oXPaWT9BnB;5b30fJvJAIQ4e()k7Cu*UJ#T`;%ke|MF6hs$76u)3ddn z&JDb`xjPD1ttu*S4iUB5D`;8ln{5Ne8H5^iJyom-2n4m+VI-)-7*FY%SL^C;Y? zS4}HLC->Z?@(BfRsxI$e|NU=&RqJiafTx>YcC>InM-7PkG51o}BFearB_)Ny-=uol zz7TVTipsahbZ>j2%*n)h4AD-?Nyy1bPH%#eY^J89L?Ctik`RBBsd^7Nz+WcD$E7`H zO^l5T0$qFKI?@?^q}>;?vXhfTgdEm3v3?7dtstq-fRTE`p-=Y+?kEKc5PQ0 z`a(-+Ovp?}TTw-YA3Si5`YJtWhLE~ERdSrTd3C@weAmm16Dr!>-Tja*0AZy? zb2IgG2@D2cYQ>XieZ^ReP3s%(_OJSqX^Dx6U%ptBrD(xthjZe`^?&9YEiPIjdV9-^ zIyc;=!uMJ-kC3k)Ce;GLz-42YIVzBD*C( zYv}x+*tZ|NIkR0IO%#NLloiar4vvh70qIi^>~8+Wv+xrKMYmgGi6SH{Ea+$c^Si!* zca<_Js8~1GbGmf)aIJT3jTvcPRj&TL*^5Wd{MY8DBNUpFn2Ot7JV4NQqI9uk)z{~y ze{VsPKm)e4%t}o3S)ci+1E~kQXM1~dT9}z#8mTec+uP@7Ewq-p<{N&BEoAc`ebC9v z<8xomJ|PP6IEEd9-#)R~Qs);HZR1S+W!*b8*0C~Eo$mo@c>TI60Ab|RRa6091d0}U z)syA~R-Z#x6cPWz>R{9+WOb-{f1kE{nN=4wRmK+{6(5htV7YalXDzR~Iw3th-F0-R zqTc=b?5qr+wsvxT|J@2~Apc=z8^s|uHyvOWEp+Y}K2IP>43s9U!Z z#gvZ3$$Xpr$TBrGwZ&$6&sTPP`}-`T^~unUf}$n!c3UGrKROu_Q^hy!5WUS!vYF}W z50+oZaNS{^snpr*%9?L5Dk}vn>dm#CP#!&+gp8oAGEdgi?In-7U|dGp-R0+Peyh*U zntZnKrDGE;s;3l}&qW&lS48zWBcDbzLri z>kYoJqxp{C<(stl_>ri*_iL-n5+m@un|5of0Q?%(u(_@Bqo-RS`TX$ub<8f9it5*O z{in@A#(o??%qBaWT@eGG$D{QBpRFgvD`LTfJug4Mn<@Y%2XHC_hkWBn@djYLrEo|C zR8t3~;5vC1{gS=~q`}BV4(%Weq=>MpurtUQ*E$YW+xK!R_*+VLrB5WdO_kTw!^hff z+IuUZ>puaoAf6@2b`AG*|t1SVz zddB?&=j%ZAqvXE*8|sYj7XyLxxVLZsz%0M33J^Kq#Vc< zVln~4<3qTA9NKGmxVzKR(E-tEI5(c?&@JXPoP~DubcJ#aU057X^6G%v#RF>^;^Uu) zdE%B}HY2&Y$?5Q+cYwhoPf)aXZh6o2P9xNIr^FaP@f<0JE*SN;q>-8ON}aV_Fi61IG4Isu(5F@VDZ>fqRXo#J|*=}KN5 zQX~UM5FWE(V_La4o8NL8{HzNkiQBCyYDQO*CTbi20E2xm*Lry*Bw|s2wmBe%G-smv zyV$&Y;ir)PCYPf3tDy|^P^L8D5L&Qd2skZvo;tbzeh{r(XaN9IRA_jZ*S`P#Hvnmk zU#`$b+?T`;$7_Yw)z#ggy}>Ud!2ig3Af!7vqADhYY2ug$j23_ZDnj zT+9V$cJz+hL}icw>K}VNcC|kQU2tGj3?P6%=XUgkf$hadf6^Zw9#)B3U(cKqtMTfx z5xWsm{parM&B1#So!_T>TYOT7sTuYV-@imK0g)5Pm(0A{AqT%Y@;<9#4wbR*0ejZV zmhoAAWu}Vw@KB6F61vCA%9fg0EL=9YgKM8I4!{ZEbjOZ9KAbIziH%`a0ZPq|X+H^^ z8{RlVWyPe$|3$wCz91NQTk;F(23gtL04AQux4WNIonU*sIrM>%E%e|QH&(2WhFc1{ zIkTi3X>bHOV!DAiTJvv%deotc3WT0pu z^h}?|*3GTVVK;eRF@xX-hi{_G*gzmhh0Cpv5)mp1si{sL4kF;+Qe;DgCh&#RFhIGO zISPrbmp+}u_oQ^H(M{|ZTQ!FOb?d+Y|M6jmnY1u^$a;}9RqZ6Xlxxkuxo3zcHOkxKLG0jLeaIWS1Tax z)|qx9A|g&BWZ&=K{}5NonQaME!s90E;1wx4ruvq`$U@LmNubT{0`tk93Kf;{$LMo4 zYao)g*&L8YS9mPyow*^M&Fxb4o?Jk6q^{;+_~u#o6EWQATNsfQ9F6fh65AYx9sCov zH{(^BfPMcbP@Q-2bW*G@K8^y`W+E7=_tZ9K_)=gu7@9nIzH079s22Q*h3wsO2KaE$&wO&MmmO}^hcYAwhWoBFFqjNAdCW^OGbipZHkYO%YwDrXl|wu_4QHD}>$9~^nGiE)$aQQ+ zrBi$k5MLr0OxFiEe(+pabWJkz>7EhKKsSK350NGwm|93GC|}9|zD%{8BCe4;FdiW>OJKdGBH+8&K-#x{9vq z&>KjRl}jd%g+g<@r}p$Lt*n;PC~dD_C^ox!!WvufJ2ufCgy^CM7*DZ{_>jE8tvYnBOb7P1aBj z{-cx@JT!ronFHxW$oc#GDVO%e%ZU^Zm8kFE>w&&a9-nSX*7fo8#Ok8#gmsR)Snyp-eCx`5-=Rh2)LtyPQD>VrFTO-+4E&dgz zJj>G>aSQbxk)s)>SR-#6H=x&&BoQ=tS5GeYbe6i}e;p_nB<|n-y~1oN&X>Q2BG>ZkJr|G2C-=Zs%2LdLVCY8v)$CqV=lq{< z{`bH9m$fcBP|P@07Fzq~{A5iz)ZO{1_tp|e_2HaYOSKK+q_uV0A1fqNEASk`uw4LQ!Wn1gIUbQ(b3T-Vz0k%VpXEXbV8Kq z-63cI5mO!9y~C83H8eCB8>_dVJtm?A|C1T$ez!+i-*ol%p%5Sq`Y>`ufHayKA1e>2 zy@MWu!faW!fAD}Rcl50%ndk9oEg5OuQ&Pv0jp3zGYvAh31*YK{VVJ>7Bd3Lm3f)$T^$m{}0`G&A zEYLb;VWxwOC2^aMi)Rg%!tSv*HihA~LLp^sW`#k+F81x#hC+S~^>aj(Wz~<;bBJ>z zn#bZ_hvt?R=PRvkEG^kB=l#gX9b6prq_xhCuXB}jasefn&8t91PAB;+ruB0{=0qHO zd(!DwAh5^?U1Ua0=%Ph3ChI0@XIv^EueMk}DKUM?O3uzoR@nG;Q-ki9n|_y$n^)>s zDL@Wi>@${relBOXCT)WvKghfV_^zDbCTpO>y~Q7dh--Mvbd{vElu2y0l;l|LAOjRx zZxcTt#&1mTxVdG6%AK0&2*nl(S^L*RDtk(|K0VjHw}}PA*=VS!a&(gK=J84sa!1Q| z!eNnd4;BXpM+h~@>-Q9&Q|v0Vbs__Ull#^C7;D3sBnJl#YirRw;z|Ae^Rj?Ih0A`> zNd7GAXpS+R#6@}6)|7s>6F)jK>9)+`0Fk!~E@WgFHa9WKLd-D48{iI%yvajFItRyB zNk*R$oO>qIR<4JUfiJkjHz>=07|Vt7G-a1*0rx!eW3qHLVZ&qA3NxME@S}PL;6Dch zAFFU^YlB9=wza=U6;>Z^^R_L@W1fp}`U^d5uX-I7p!&PzciGB(6Yn-NjGJ6qoa>+Y zIlA0Ij``}Zps*OhG%%te?d5xS@yGP|Ok;6za68ej?5o-zK%w>*;9hx7Hyu!u-^XX( zn7qt{a{86tyBD$aoGe0I1+1NZwua}yP7%}Ue4KK;;x4Icr}iOk6mEUAZfh?RUefNX z=15+it~16(xNfW(5B=Q6km`~RSf{L-ih@j4-~<)aa`V-&Uw}0jHv$bvz>h~VUbH3v zMel))S~$@8`KN#hd^~0VDk7c{!G2f&pnAjm`p*BnA@lFsGXHh8c-S`i za&?p!*EZ=sSxyq~t*^wIk-S6Z>LPmYi!B+9jD8>5Tzgz$L6p4*;_n<@CT>SoHLiaW zcZ;l;4|dp(HY$7}Jog%71;e0TIZFP^kXUZi+9Vv2mult zZOZ93XQW96j3%e3$vo@HP`}9bqfNvn!o9y=#7r6y2{c*W3}RW9;tKn#kx2h~1ZN;O zazQeu-Me@ml6i@lW*_SkdUIl9dTV?MG;Vwh0vlD7WtNk^^+wEGh^Uv-bCRYz4hm9( zqyz)LFx~$Oul2NQIrL!+q(4I)H^vt6eqd|gDHN?wMyy>D-i0mt=N*0pFC%0wPW36? zkgtXWX)3A`ra5)~V76nJ*0nc{W}3;B`uvU}3SQ!pLLwrtoew2JNDoU6VdF%_Hz+j| zUGiBIcPZScT@K^yq*#@|1y8%Z93%-8?pi4mt#6S`_vLvD7bH0qVB(@OJUgddi3S2Y zjL9pH1u(LyNOiQaSOBC9Qxvw}@`bFQPS$V2KF=aXr+&~>iBc_wYLmz_$v>#iuSQ54 z)ovmbvF_V3p`t-F9>gy)Jr24x!z5b?a4`Uu1qxF1s zl_#Lwxm0VQnBd4PB4!0CL1=89z&et57s^clRbReSLBAxbZfu-MxeRBL%eW`eD?#8wmVk=yPFW=LxDauhpZ+UO#n?Kws$N0YJ!YQE!H}mau zf9?8w{ExP!>EaK_*&VHbb<=NHkXHYY5mfG0Lx@pbes+^e9)G|WHOYK=hrFO1&bRvy zS!H04k;%DnBn((!)sC|zx4LED&zr&$D1bpsbE*6b=4B6FK55>pN$Wo*cSChnzBBd1iIZ;@r7=j0`H97odt_ay8LpS zkZ#-`n~(;dt9L!%{?W$#5%o?UG+kR;2|e;gs9ViX3N(#Jgk^awd?!~Z#{!-VoM0+H zJ2C|i#9Tdb56^WGv*1cQ(~yUU%7nwrr|J3%@dE7BIqR{|B;{Up2rY$2D#ZoLoeX3!y_r{`MO z;I6H!`(1zX)VvKRnN$nKzyW#d5syaY#3VC`uE!;10j%W;$75+z{qH)xcY%&Wjw7vx zsc5jgO#a2i;N8W3)D~?vZW-wIx};&&c1_Wlzgcl_l@1J>%F8l^v&Z1(Ji+LS=CLc6 zQ`n}?V?BU%Fb`hkdh?d)J}J-pB4I|1_a73z4Jepc@LGr4a)pcyIvFV6i1$^%%^n)7 zlZf9mNDBSJPvF}Bqo(T-I|7asc>Nz_lK+}p{{M3%!vJhbbru<^*W0$1f=Hj1mK1n# zq4pbI#4ZO{+$jW>x2aa5Q6gJO6Y5n{sU&A7Il`vt6tgd&W>Z z*t6Qw1U8l%cN`vYN@mMpN4T!ODtfr9k1jral<-YwezmC6G(AR*?MbET6 zyHG2gf0~(=vDoPS?()QQWuG}@WxZ!Fl2INeXX0md5Km9{!TUPx=WcL`)4ZeaS z#<_eV(O{UFe4(a+@)FxIa8v)pXXexsEl%J(PV^hHC{x6V0<4_f>>_1EIQEj<6o<%! zOlh}qdc9ukW!(P(cdA@5Znw&XBQZ$hyP$_w3<|Bb{ynG%@Mg&{a_o9ztu!Kg(sgs# z{t8hS4BMB3Hepoz*aD%}Z!3az{Yy3~1_yK-U!NU(m~Aq5!IZYi+mEC?%(ukUA3!Dl zqVeK=6>%yZ5He5iaqDU4RP}xrwLmIQ!v~yo0qtvtim_(L>}f?A-;I+>S?fOtP@DEQ z-uAou%ty&G^C|Hy0mt7q;UCm_V=d@Upd>q;)DKtB1Enj&BcK-+i+e+I@g9rz<8d3F z^}822u_%o>?Cu5SOdsZ=L9?8u|ad7%g2-Z#m}cH=1niGECtvoMo;L-ZG%ot5A(o7miP#2DS9uQ1&QNfP`QWzCv` zkE?}Xu+!?86*ex9zM3AT7pS+>BV7FH-+asB6@#CN57{VZ#NRgXkDT_gS-aQ!TTkEm zte0a6t#{it{Ou+K))c^$BOh@(x}?-jX-QX^zZ9G#=^z2Qr(=0xrM+osV9&`K+=r`O zrXja1jg4n;LjdhUMY6AF$^Jkt><$Zm*hTrS7#B6a4;RB-O3T}~&u}$99>xt`#Zikf zby<|jHm-IyT+?bIgG!W$mO5POS#~bF>jj>JaEv|k8E~pQ-)-qQMYa;#ku}EGMVez- zRm#t6a2aA385!nmpmgWjrSIg4_tyrWG9T?8-SdzVzMFD<@HVlfUCK>cC)z>*k*X@< zxm+(+d3kak+)!DMk!@RmL+P)uyPogakjUc%()94IgY&B=FFSD$%Uqpb?Jch$ft`rv zj`1ofAufcL;e1VjSN-ojChV;&r|7zQ5x?sVwR{q4^0|m5o$n862{~S+kOLcjX!XJ@ z+V%ffER*+x$=zXLS!m=;@O?PgX2L_~#^;eDST>Q8fi1jukrBWt1kSCo&^rbp_pq|Q zkLZJI%aeY zwRAPp@5^?&WCw6pH*#rNFK3E?Gq*JM6|hSTx)z~w^JuzwCxE$T+(?C-VKMu%tX?MMZA!i9h#&jCw&0Zr=3SrK z@h1~sMm}7AYj!u;2QiCrj5MYug^CHB6L&5b2IsGDxpOQGWP@0J4t_P?BN$b(u<(md zeCZ;H)|ajr)}{pXWqZGw*h+Wl1N^g?@$!{D&e3J}TgHiHZ$h7!6L8`$xtW33y-K0t zhO*QeALvV0XyD@zd#H&8@R5>#R;&cq(IZr%K)QG!)Nsi9#q5Q85wLFvo86ZS+Ti>^ zqJj-~3#2w7mou}D--I+WTiYa6QT#RqWfjR#l&9!WAt56*K33rc{PcMn=V44P?DzrSF|S`Q@;TQObl<-7uC)8nAAi0s9O;U#N#UgH;_c+LAt(&8lDR#lI7z)z9p zNWURj`V9O+JMjvhB7k52wVC{OhM^dYc-;#N*VdF>k0}>l zlOWeVA?u)0N5|wuKN|%zv#$X4|B+;app4$s`}vygjEs32?iz6%roPAU#*Nti?75oV zvrVfWED83av(Wy$Dc!#^);gm;f89Oe>Um-1U;H=d!CZsF<>0s4YUZnT3CTG%u-O@w z#U8@Fi$tbXlgp+nVIgmDn`$ESE1~^h4r_&9D-+6j`VXwGgXwv#87gqgi=#iE<>vlb zVx91n^TxIu7$2VXL~JWE0M>71sk)o2cCl2cN-b2T2r>!UQm=a=*4r^OGTGVuS2}iz z|1W?tF?D9L;F1ji=ldZ0H@@7IINYE zYG&^R=x9@#tQ`zj=aQN3i*CNO98^~2VP;&`RlcIQr{LPxZ{86!Wg-q7P>K3uElfma zyu$WxMZ{5bj7*6lbGwB7a(5z|;6=9H9KoMMHVrC-%6`2xHZ(olv~-?d26&OPJ#OXK z)LH*#lb$M%ad}PKyKokbXa(aR10a&|X&s5HhL_sDZ$`TxFiyYYq2* z?N&~FX^*o7V#F4O!j}4aC(Vsy((LecOSUa1H9K_W2a$H+`{WPjV%b=9!&NZjo5BZK zz-=rxQ@z^&1>S8O|FL3h=7+FNdIe|sd|lb;z*1A-*cj?#&}bpFR%1&*Sl?Q%W%qIn zoFZu{h!Mru-@AKv@{l%);lhaYW4}|=y1$h@{uV+?|Do|3B{s;_!EdhLXbObi!OBil zjjzwp0B~x532UFv@FQn=`N6isF-A&&a`Dfk&H9QNqH!tkS?lBt`!NT4=(e7AnwuDN z->uDuklyCuoFOg+H}y#J$|ica*%7ts1J4je4Dal)p?&b0jK&UcykH62@KKIJxt>hM8LCd!A%`m@XT=GEusC1}zY69I0$ zZZo?DeCxW?2usms%Hd;f%;Siw{p-6o_Z2%ZkNc_)vG&DzKJFa5 z8;*tDz2V_dN|9ZFvOrE~c63aPr=@~{_d5RgViEOz&yo$E^Fp&dvnmWvUD2%PKE0(7 zp>nu(G4x{T5qi`G9GZK479w*rLAhQtW*fF|Lu!-q6LpJ~CHTXf&2}oz#6PI_c#TDd zGYNPl^tbLosuK#o{blZPad{B@JRy?uP!|tHVBNW86o+1&~%l8M> z=qI*7pgA#L7GrGu)P)6zNgl#q=hVw>U}GqQa{p|M=}LX=f;-Ox zOQ+7n(1mf3nWzrUHT9xTToV%$R<5(Lq@arJrKZWWq(ggS$_c`(|LpPpl!;!sfW<$k zBNn16X2c-$zKTCeF}thRb6IoNWg5Q8uZSAIxTC=jPzd5vgr5dJDu_(Ac`Y&ma0ioG zey+1dUYkC$JnJjIW1TM7VEE20(7(hgz_&rMNk-;)8d2@zT{?FXJ@cyy66X#r0D9; zv9htpcML6(LzERfmZR@j=N4Z!R?dh%D2ra!-T$@s3JMLCI(hc?31tkPXv1#t5ZRpi zOO6wJ|@$2BA_X;XWE{ z;2Lba$y%I&8LR4uzS2^RdeUF4R?Des4NSctL%K86w2X~N^GFUnIjMQcI#8x*B~m42 zFvEwk1Vb0tuJy*A|58A2iG`9b^jyOvg0e6wNyK+6)e0AmpF&hGut0-#X`6A$ZLSFU zHeqFUl$p+HxGni}iE2w)S_UomCvENiMQwm`DSCxS;Cx)C`<{3n*k5bQ7fM_e^1EC1zJjpMea)GyyM>ZDJ<^ifP9 zC`?Xl#w!QM6bOVq6W(MtB!Xy4G`=>JZL+mg$R^~r+diCSNjz_*A22P^Ah!l=RTMnH z&kd9sHlehfKyf>L|#wg0leY^3((|BadwnIK0f6@3Pz ztQ$~$99RiQlyvu@qt)dt9;8*cmz$GkZ3)YT0_+rkH8T;4vaXlHH9&9b4|I=y|L2MN z(Icg9oc{c-m=y$uEnXho0;3Ya`*=Nv=Z{oSZQY?f?xH z;kzgMO-CQ9J3Q?cDlYLPVNpo8QWT++o|SX@>uia%0WAufm$KGj3p?MxfQ68jx2FbX ze!Leb;8yY|U{m|^jps+_{OHp6Zh@uk8vPX>=D%&l!-8DhZNf>PZPKt*SPM)e8fnD& z?M*-wiU3lfl_%m#W>=o0OX=977;hn1(!-xY6I5aqON>Bw)LN;TRjY?o;XH0VFEEisqUEh{u1z~hwU!l zRqBaEruWqMOU#y+fi}$_Re1J*Lk`s42JZtf4L&t|mC~Nw^Vz zSajvvzONq%u*8$Tec_P|sH$l$@o{%GbJ5iu&a0Sj0qD0-CkSMBQ~3|M zX^J_t)>%=^nOuY(rIF1omY4{6QtBR$Rq5&JxuV{7)DdMGiKP8GG(5Z1=16VlL6i}HHu*u z*}(z=1l%IU5#uYT5xI3i829!HcH%=b`-El5n=JPR_xzN8QMl6!b$s?S!BZ*iX2AK2 zw@;Kd9FIz`#$dCvL1)C2mS$T|l-J>26X51RFyLH77OyLpnOoW9VoXwkrQQ3V>$QjB z$Zv-rVWiVwkyLb1ef**}31S^-M_IDg8v%H~e!JvR@6cp#xr$-mk`dsYupBqcI_4W_ zZ?xFS-`{^`=}7Fs_CgCFJ9pWp<{Kb!Z}hwFVDds5FjE8!#C09rDWz4fo5$aNH#AoM)4=R#5bu~ zLB0fgSxcDGa*We(DUP6#`-w^AOe##bp=Vru;8b}fGQMPF$UHq=+J24g?A)cP5nuxY zQ2_8Fg&Mb!RHPV5JX){`5`zTFv<>+KAP&oajC5Xb(Ue3%1^4z36chSnJ&bP1?}ddI-X9 zqLKj890M=!2J7w8YvRYph$TI@y_X2kNlmQ+>>@5`GisgBm#(KN4x&$}bPGGHo_s?O z6zvU@k;A=3j;y-5O`$7>sjS4ZYb|Y$e$C{-0RHxdXvul&*JGK=FL9PIUG*TrGCF{; zZ`1zT02md)8gqyH4P|W9Tl+qHu&ieE1p84tiWJ(VaRjl-l#JR)K7Uv>V62HdM%r|s=wA;_T) z*A0J*>>d5wtgNh281=hgycuCluT<{pz!t1x=v_0u(%VH*%42UYoXG_qz-d+W1#^Y_ z$NDCjIYTnL3OAZikO?pxfo#d$MZIHFo($i4siojLV0#=8m>tK9l=FIE?KV3jkzZBNP^L_)gzKU8+CB*Rz~IJX^S`O zScvuL7Q3mYMx`Pj5BIZ$4WSOCydT8R+=^dGseO`B5+JA#c%aG*#%5<{=`+vFXXjoy zIUx5ZZC840F&D(1XDL1|s%10|P$=}3UAZE+`TShbBFfbJ!@JIR8maxygI{{Mm2pal zi;F*g9GI5CEvR8&FxK^Hu%c{Q^uoQ8TnMOs85k@-a5dX^^v6s);cVC#J?8U3Cwl3p_lh?@I!ui13PdsH%@j5uhT)j6j9D4QM1geNI2GB+USZ1#Jb*0 zA$i^kN&C>J)>iOiR;S1hO8yv97CW_%5B_WN$2L|}-O8_*%O0b2F^cKO z+n%@nEnhuA?i+K2tsd#3cCN{?79;Fj0JJbm)-tp@V}y>FwI+!Bi9UZ-z({XZBAfw1 zl$2~AHI-ZoZQG~EctDUv1K-I=d3n&ew3UUmky|j29xSs8$gqI%?>=Vjw_0~K_T`}z zVS2e?5G0d|rQo4^t0HGnF&+1yi13TJPxAf??K)+&0yZ=TT^-~O3R!)pTDa77q>s4O z?)ArFi?ca7`FPA)C$oeaw(jY*xxUW6h}=Ttn$F0{B?o<1;**=794!CSt*mJ#+T%R> zn`&`|ye&0@;^0sBM~a;C(%&9#X^>_wBp+;W}wv2I?7q>x_{;Gna+4CjPDDKPuwY{gGE$tRp-r><-4Ru zJodQe-c~X7e?@F`Kk?nTc7uKGLb78)G1q)8Vwdhp3-G-dFl=*;zp?-z$+?gT#d^i$ z6P=@x7Xym-z}M)lo?jXI9i8VI)Q(d+u<^KA)@I5}%CvQTJyL)mm}HV^0Zj6c6YmZC zE$n4wEs^&UA=1zf?#ovDhGC@E@#YU$NN&h0H#aPR_#xs>mWo_=0@uwV>VBOc7+t-3 z6=ef5@%AJgp&R@_lVMK#>|3%>M@L8cOo>pZ{VYRI`Dt}vvJTODTpvsdlAB7Rq`jJX z`+kIggDg+?c8=GK4DkHf>^d(wEn>BQY&ikM_1dbs8+%Jgqjp6L(U~Hn-hjQ0HUz%|}r!9a0ngOtPe()&+NW32viXvs! zk#_#hxzI}TDsWbmGJ^6VY)+3y8+uOfKKTiZV-EMhfh}ClBhfXA@m4(jevclz{Pmtl zW;jjh>B-ML^FJ=(LB5%(NV@FoYqqGISHtu+%L%{ zCU5^Qc)~)#;uYl;!R-=zhz%jmi`Ik>K-(KqnvB0%m=5hNk`h|1cg6Z(=NcQ)OSP4k z%d7C;IO|yF0%%8#OMjH&%cm`FqI3D$ga;th?nRJkL%nWekcj*8+nlaz#l;HG8-sLw z(k&K$4)ljK2CQvf4I|llnDX!*4F;>)hzj$!V^T-5b5AiP)5Y4>tbvB^Of#DOqUXE&NI?C$xJ+}x!2>b60!X{vxtsCA3=V)@A@ zAdaPm84xS($WhFutEzG34ly3sz1y@AL=u078>F%(8eO{~q-vgRlDP!dWPr|2k-Fa! za7zlT{@>Q$(1XW)!ahEUOY)8%dYBs;D$ecoYZswQ3^_$j%C$^WkjL?UDlKHdHBJ2I z$<%}LAl^T_F-wd8W^U)yQL2cG1}agWa@UeWay0RAC0x3>;N`p+0Otj5Z~xdN=U%J7 zqcUmJd|zD2hQ><(s~nHdT=HDB+oFS&-MeRn%B_Eb>8w0!Uw&}=i?7cS`7&V|OPRl*a&WK74;yWEL zyj_v|4>XX5HZxDF@nh%mg`DRzYZjS6xwfwYa)zSPi~x>94<7@&A#8Y{PlRwQiRt&) zM_wQU8bTW!C@s(+{7XQ&_-c*{;F@9KT+8)ASmraXfr;vLZxO~Gd? zd0WhT+o;t`&x2_aw-&>xG883&}fpatZs+sxPdwO^{ fKz*s4TpUGx++2(|%cp>ss5I4dpH-^7eD{9=37kk+ diff --git a/artifacts/verification/w6/states/failure-or-reconnect.txt b/artifacts/verification/w6/states/failure-or-reconnect.txt index 9d1e4e4b..285a1d6b 100644 --- a/artifacts/verification/w6/states/failure-or-reconnect.txt +++ b/artifacts/verification/w6/states/failure-or-reconnect.txt @@ -20,5 +20,5 @@ › new message -─────────────── type / for commands · Alt+Enter newline · paste ──────────────── +─────────────────── type / for commands · Alt+Enter · paste ──────────────────── profile Braid starter · pi · via local failed · /activity details · /new diff --git a/artifacts/verification/w6/states/fork-preview.json b/artifacts/verification/w6/states/fork-preview.json index a34aba9e..17ded562 100644 --- a/artifacts/verification/w6/states/fork-preview.json +++ b/artifacts/verification/w6/states/fork-preview.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 80, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -276,6 +278,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -400,7 +412,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/fork-preview.png b/artifacts/verification/w6/states/fork-preview.png index 732ed694d2e824ddcc1698c52c5fdfdfced34dc7..47a761ad3ea157829a3c6960700abb2dc1ef6e0b 100644 GIT binary patch delta 21 ccmbOeH79C=1v7^Xm$JTR^go}?4$OBn0Z(NIK>z>% delta 21 dcmbOeH79C=1v7^LH>><}j~U*Z9hmQE0sv1D2P^;p diff --git a/artifacts/verification/w6/states/graph-or-analysis.json b/artifacts/verification/w6/states/graph-or-analysis.json index 4cc6a509..86e6844d 100644 --- a/artifacts/verification/w6/states/graph-or-analysis.json +++ b/artifacts/verification/w6/states/graph-or-analysis.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 80, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -276,6 +278,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -367,7 +379,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/graph-or-analysis.png b/artifacts/verification/w6/states/graph-or-analysis.png index d574b8100e025fc7f730a97d2679c7af43feba84..93987867a94babd3f43e5227e09c24cf202081f8 100644 GIT binary patch delta 21 dcmZ3uka6Kc#tB&*GF-}rn?nxkZ!FRe0032{2c7@` delta 21 dcmZ3uka6Kc#tB&*0^F>MYMQMNHWujz002+X2Ot0d diff --git a/artifacts/verification/w6/states/interaction.json b/artifacts/verification/w6/states/interaction.json index 36b2b7c7..4893d8c1 100644 --- a/artifacts/verification/w6/states/interaction.json +++ b/artifacts/verification/w6/states/interaction.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 80, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -311,6 +313,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -402,7 +414,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/interaction.png b/artifacts/verification/w6/states/interaction.png index 4ffd5f35b1316650f877b2ea03af550dfa5df6d4..3c72db45892e402be049a6212091325f81fefa30 100644 GIT binary patch delta 21 dcmbR8ka5aG#tB&*GF-|!7lPJ*+gPMj003bL2;cw! delta 21 dcmbR8ka5aG#tB&*0^F=p)0J|LY%EeL003DM2gd*a diff --git a/artifacts/verification/w6/states/narrow.json b/artifacts/verification/w6/states/narrow.json index 59d9464c..fd112c0f 100644 --- a/artifacts/verification/w6/states/narrow.json +++ b/artifacts/verification/w6/states/narrow.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.0.tgz", - "tarballSha256": "50e56ffd482a1cdd0ecd6c2a9630a4d9171fe8bacee35cfdbc58977695e815b1" + "tarball": "tangle-network-braid-0.2.2.tgz", + "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" }, "dimensions": { "columns": 40, @@ -17,7 +17,7 @@ "package": "@earendil-works/pi-tui@0.84.2", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 1, - "frame": "\n\n\n\n Ask Braid starter anything.\n\n────────────────────────────────────────\n› new message\n\n\n type / for commands · Alt+Enter newlin…\nBraid starter\n", + "frame": "\n\n\n\n Ask Braid starter anything.\n\n────────────────────────────────────────\n› new message\n\n\n─── type / for commands · Alt+Enter ────\nBraid starter\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -116,11 +116,13 @@ "interactions": [], "queue": [], "activeRunId": null, + "focusedRunId": null, + "activeRuns": [], "lastError": null }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816", + "workspace": "/home/drew/code/.worktrees/braid-10-multirun", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -276,6 +278,16 @@ "source": "application", "reason": "Interaction automation requires the shared response contract" }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, "export.create": { "available": true, "source": "application" @@ -367,7 +379,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-exact-interactive-20260816" + "workspace": "/home/drew/code/.worktrees/braid-10-multirun" } } } diff --git a/artifacts/verification/w6/states/narrow.png b/artifacts/verification/w6/states/narrow.png index a7b4c6c4c1316ef050266968e3c3043aa89d13d9..911e13c2efe9671cedaa365e30ccdb9e9a180cac 100644 GIT binary patch delta 8605 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 qzv09@g} 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 SE+6|%`b=I`u2RPI&3^%)*?=to literal 5536 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 CZlTry diff --git a/artifacts/verification/w6/states/profile.txt b/artifacts/verification/w6/states/profile.txt index 30b0cd74..f33778bc 100644 --- a/artifacts/verification/w6/states/profile.txt +++ b/artifacts/verification/w6/states/profile.txt @@ -1,3 +1,10 @@ + profile +──────────────────────────────────────────────────────────────────────────────── + Braid starter + trusted · read-only + runner pi · model fixture/deterministic + thinking none · limits provider default + digest sha256:44ed91c9…8cfa0a14 @@ -7,9 +14,11 @@ - Braid starter - trusted · read-only - runner pi · model fixture/deterministic - thinking none · limits provider default - digest sha256:44ed91c9…8cfa0a14 - ←/esc close + + + + + + +──────────────────────────────────────────────────────────────────────────────── + ←/esc close diff --git a/docs/components/multi-run-orchestration.md b/docs/components/multi-run-orchestration.md new file mode 100644 index 00000000..7b847eba --- /dev/null +++ b/docs/components/multi-run-orchestration.md @@ -0,0 +1,153 @@ +# Multi-run orchestration + +## Job + +Multi-run orchestration admits and observes independent Braid runs without collapsing their branch or conversation identity. + +It keeps one explicit focused run for foreground controls while every non-terminal run remains addressable. + +It preserves continuation ordering on one branch while allowing different branches and conversations to stream concurrently. + +## Ownership + +`BraidState.activeRuns` owns the durable index of active run identifiers and their immutable conversation and branch targets. + +`BraidState.focusedRunId` owns the foreground focus used by navigation, controls, and interaction presentation. + +`BraidState.activeRunId` remains a compatibility alias for the focused run when that run is active. + +The reducer owns index normalization, event identity, lifecycle transitions, and duplicate-event handling. + +Admission owns branch validation, per-branch exclusivity, immutable run receipts, and capability snapshots. + +The durable sender owns admission reservations keyed by conversation and branch. + +The execution controller owns one reader and abort controller per run. + +The lifecycle and shutdown controllers own cancellation and drain decisions for locally live runs. + +The journal remains authoritative for all run events and operation decisions. + +## Inputs + +Admission receives a text input, operation identifier, conversation identifier, branch identifier, profile snapshot, connection reference, and optional continuation proof. + +Runtime readers receive the run receipt and an independent abort signal. + +Reducers receive globally ordered durable events with run-local provider sequence and cursor metadata. + +Navigation and focus receive typed intents that carry stable operation identifiers. + +Queue entries carry their source run plus explicit conversation and branch identifiers when available. + +## Outputs and intents + +The reducer emits immutable state with active run references, one focused run, terminal compatibility data, and branch-scoped queues. + +The execution controller emits typed run lifecycle, provider, interaction, usage, and terminal events through the journal. + +The application accepts `focus-run`, explicit run control, branch navigation, branch creation, conversation navigation, and configuration intents while other runs continue. + +The headless projection exposes the focused run and active run references without exposing provider-private state. + +## State + +An active run is any run with a non-terminal status, including a detached run that still requires explicit recovery. + +A live run is any active run that still owns a local reader or control operation, excluding detached runs. + +Each active reference contains only `runId`, `conversationId`, and `branchId`. + +The normalizer derives active references from canonical run records after every reduction. + +The normalizer keeps an existing focus when possible and selects the newest active run when focus becomes unavailable. + +The normalizer clears the compatibility alias when focus is terminal or detached. + +Snapshot restore accepts old snapshots with only `activeRunId` and reconstructs the active reference list from run records. + +Snapshot restore rejects unknown, duplicate, or identity-mismatched active references before normalization. + +## Algorithms + +Admission rejects a second run only when an active run already targets the requested conversation and branch. + +Admission materializes draft changes only for the selected branch and never mutates the immutable receipt of another run. + +The durable sender holds one pending reservation per conversation and branch so independent branches can await admission together. + +The execution controller starts each admitted run immediately and records provider sequence independently for each run. + +Queue draining selects the oldest eligible entry whose target branch has no active run. + +Queue draining leaves entries behind a live run and starts eligible entries on other branches. + +Conversation and branch selection focus the active run for the selected target without stopping background readers. + +Control requests carry the explicit target run identifier so a background run cannot receive focus-dependent control by accident. + +Restart reconciliation scans every locally live run and performs provider status or replay recovery concurrently. + +Shutdown cancels or detaches every locally live run with a distinct operation identifier. + +## Concurrency + +The journal transition tail serializes durable state changes while runtime readers remain independent. + +Provider event deduplication keys include both run identifier and provider event identifier. + +Run-local provider sequence checks do not treat another run's sequence as a gap. + +The operation ledger serializes duplicate controls and queue drains by their stable operation identifiers. + +Detached runs retain durable state but do not receive a local abort controller or automatic restart reader. + +Focused-run changes never rewrite conversation, branch, turn, provider session, environment, or worker identifiers. + +## Failures + +An invalid target branch fails before admission and does not create an operation or provider call. + +A same-branch admission race fails closed and leaves the existing run and queue intact. + +A duplicate event with the same identity is acknowledged without another transition. + +A duplicate event with a changed payload or position raises a durable conflict. + +A disconnected reader uses the run's replay capability and cursor before declaring an unknown outcome. + +A provider cancellation acknowledgement settles only its target run and leaves other active runs unchanged. + +An unknown cancellation remains unknown until provider evidence supports a correction. + +An invalid persisted active reference quarantines the snapshot and allows journal recovery to proceed. + +## Performance + +Active-run lookup scans the bounded in-memory run projection by immutable branch identity. + +Each runtime reader performs one independent event reduction and does not wait for another reader's provider call. + +Restart reconciliation uses one asynchronous task per locally live run. + +The compatibility alias adds no second source of truth because normalization derives it from focus and active records. + +## Tests + +`test/application.test.ts` proves concurrent branch streaming, same-branch queue ordering, focus switching, background interaction responses, background cancellation, disconnect replay, and duplicate provider events. + +`test/storage-snapshots.test.ts` proves legacy active-run migration, invalid-reference quarantine, restart restoration, and duplicate conflict behavior. + +`test/w8-runs.test.ts` retains single-run replay, cursor, cancellation, and queue coverage against the same ports. + +The unit and storage scopes run the new cases through the production application core and journal interfaces. + +## Non-goals + +This component does not define agent identity, runner identity, provider session identity, environment identity, or worker identity. + +This component does not launch runner processes or parse provider-native output. + +This component does not create a global execution pool or reorder turns on one branch. + +This component does not persist credential values, secret answers, or provider-private state. diff --git a/docs/components/work-strip.md b/docs/components/work-strip.md new file mode 100644 index 00000000..37cd6711 --- /dev/null +++ b/docs/components/work-strip.md @@ -0,0 +1,129 @@ +# Work Strip + +## Job + +The Work Strip makes multiple active, queued, waiting, or detached runs discoverable without taking space from the transcript. + +It appears only when at least two work items require attention. + +It provides a compact route to switch focus and inspect the full activity surface. + +## Ownership + +`workStripFor` in `src/adapters/tui/ui-projection.ts` converts canonical runs and queued entries into immutable work item views. + +`TerminalChrome` in `src/views/tui/terminal-chrome.ts` renders the strip beside stable status chrome. + +`ActivityBrowser` and `EntityBrowser` provide the searchable full-viewport selector at narrow sizes. + +`focus-run` is the typed intent that transfers focus without changing run ownership. + +The application owns control and interaction dispatch after the focused run changes. + +## Inputs + +The projection receives immutable Braid state with runs, queued entries, branch identifiers, receipts, capabilities, interactions, and focus. + +The renderer receives a Braid view model, terminal width, terminal context mode, and theme. + +The activity selector receives keyboard input and a bounded list of run rows. + +## Outputs and intents + +Each item exposes branch, state, runner, model, pending interaction count, focus marker, and switch, ask, steer, and cancel actions. + +Each activity run row carries its run identifier for explicit focus dispatch. + +The narrow strip emits a visible `/activity` route instead of opening a permanent side pane. + +The activity browser emits `focus-run` when the selected run row is opened. + +The focused run remains separate from the selected conversation branch so background controls target the intended run. + +## State + +The strip includes all non-terminal runs and all queued entries with a known source run. + +Detached runs remain visible so the operator can distinguish remote work from local work. + +Queued entries remain separate items even when they share a source run. + +An item marks focus from `focusedRunId` and does not infer focus from row order. + +An item reports runner and model from the admitted run receipt or canonical run record. + +An item reports only pending interactions and never includes response values. + +## Algorithms + +The projection filters terminal runs before constructing items. + +The projection appends queued entries after active runs and preserves journal order. + +The projection returns no strip for fewer than two items. + +The narrow renderer emits one bounded summary line with the item count and activity route. + +The standard renderer emits up to three bounded item rows and a browse hint for additional items. + +The wide renderer emits up to eight bounded item rows and keeps detail in the selected activity view. + +The renderer sanitizes branch, state, runner, model, and action text before terminal output. + +The activity view uses the existing searchable selector and opens detail in the full viewport. + +## Concurrency + +Projection runs against immutable state and never reads provider streams directly. + +Rows update independently as each run commits events through the shared journal. + +Focus changes commit one durable event and do not pause, cancel, or detach another run. + +Interaction and control actions carry an explicit run identifier from the row to the application. + +The strip remains conditional so one active run keeps the original transcript-first layout. + +## Failures + +Malformed provider text is sanitized before it reaches the strip or activity selector. + +Missing runner or model values render as bounded unknown values rather than guessed identities. + +An unavailable control has a `!` marker in the action list and remains disabled by the capability map. + +An unknown run focus request returns a stable application error without changing state. + +Terminal rows remain inspectable but cannot receive live cancellation or steering. + +Rows that exceed the available width are atomically clipped without terminal control sequences. + +## Performance + +The projection performs bounded scans over the existing run and queue arrays. + +The renderer caps visible rows at eight on wide terminals and three on standard terminals. + +The narrow renderer performs one string fit and adds no persistent pane. + +The full activity selector reuses existing bounded filtering and row rendering. + +## Tests + +`test/application.test.ts` proves focus switching and explicit background interaction and cancellation routing. + +The TUI test scopes prove keyboard focus dispatch, selector behavior, and stable narrow layouts. + +The responsive terminal proof captures 40×12, 80×24, 120×40, and 200×60 layouts. + +The visual capture records an eight-turn keyboard walkthrough, while TUI tests cover activity selection and focus dispatch. + +## Non-goals + +The Work Strip does not replace the transcript or duplicate provider output. + +The Work Strip does not create a permanent activity pane at any terminal width. + +The Work Strip does not decide provider capabilities or invent runner and model catalogs. + +The Work Strip does not expose credentials, secret answers, raw provider payloads, or worker internals. diff --git a/scripts/packed-binary.mjs b/scripts/packed-binary.mjs index 403f5fdc..0811ccf7 100644 --- a/scripts/packed-binary.mjs +++ b/scripts/packed-binary.mjs @@ -41,6 +41,7 @@ export async function installPackedBraid(repository, options = {}) { '--no-audit', '--no-fund', '--package-lock=false', + '--legacy-peer-deps', tarball, ]) await run(npm.file, npm.args, { diff --git a/src/adapters/tui/ui-capabilities.ts b/src/adapters/tui/ui-capabilities.ts index 7a5d801e..a9729ab1 100644 --- a/src/adapters/tui/ui-capabilities.ts +++ b/src/adapters/tui/ui-capabilities.ts @@ -1,4 +1,4 @@ -import type { BraidState } from '../../domain/state.js' +import { activeRunForBranch, isLiveRunStatus, type BraidState } from '../../domain/state.js' import type { CapabilityMap } from '../../views/shared/models.js' import type { UiFixture } from './ui-fixtures.js' @@ -27,7 +27,12 @@ export function capabilityMap( fixture?: UiFixture, canRespond = false, ): CapabilityMap { - const active = state.activeRunId !== null + const selectedActive = activeRunForBranch(state, state.conversationId, state.branchId) + const active = selectedActive !== undefined + const focusedRun = state.focusedRunId + ? state.runs.find((run) => run.id === state.focusedRunId) + : undefined + const focusedActive = focusedRun !== undefined && isLiveRunStatus(focusedRun.status) const deterministicFixture = state.profile.model?.default === 'fixture/deterministic' const configuredConnection = state.selectedConnectionId !== null const capabilities: Record< @@ -94,7 +99,7 @@ export function capabilityMap( reason: 'Initialize a workspace before editing a draft', } : { available: true, source: 'application' } - const conversationsAvailable = state.workspace !== null && !active + const conversationsAvailable = state.workspace !== null for (const capability of [ 'conversation.create', 'conversation.open', @@ -111,7 +116,7 @@ export function capabilityMap( reason: state.workspace === null ? 'Initialize a workspace first' - : 'Finish or cancel the active run first', + : 'The workspace is not ready for conversation changes', } } capabilities['run.send'] = @@ -127,33 +132,30 @@ export function capabilityMap( : 'Configure a connection before sending', } const runConfigurationAvailable = - state.workspace !== null && !active && (deterministicFixture || configuredConnection) + state.workspace !== null && (deterministicFixture || configuredConnection) for (const capability of ['run.runner', 'run.model', 'run.effort']) { capabilities[capability] = runConfigurationAvailable ? { available: true, source: 'application' } : { available: false, source: 'application', - reason: active - ? 'Finish or cancel the active run first' - : state.workspace === null + reason: + state.workspace === null ? 'Initialize a workspace first' : 'Configure a connection before changing run settings', } } capabilities['run.cancel'] = - active && canCancel + focusedActive && canCancel ? { available: true, source: 'runtime' } : { available: false, source: 'runtime', - reason: active + reason: focusedActive ? 'The current runtime does not acknowledge provider cancellation' : 'There is no active run to cancel', } - const activeRun = state.activeRunId - ? state.runs.find((run) => run.id === state.activeRunId) - : undefined + const activeRun = focusedActive ? focusedRun : undefined const recoverableRun = activeRun ? undefined : [...state.runs] diff --git a/src/adapters/tui/ui-command-dispatch.ts b/src/adapters/tui/ui-command-dispatch.ts index a94ddf63..3a5508f8 100644 --- a/src/adapters/tui/ui-command-dispatch.ts +++ b/src/adapters/tui/ui-command-dispatch.ts @@ -30,8 +30,17 @@ export async function dispatchCommandIntent( return dispatchCoreIntent({ type: 'shutdown', operationId: intent.operationId ?? '' }, context) } if (intent.command === 'cancel') { + const view = context.view() return dispatchCoreIntent( - { type: 'cancel-run', operationId: intent.operationId ?? '' }, + { + type: 'cancel-run', + operationId: intent.operationId ?? '', + ...(view.activeRunId === undefined + ? view.focusedRunId === undefined + ? {} + : { runId: view.focusedRunId } + : { runId: view.activeRunId }), + }, context, ) } diff --git a/src/adapters/tui/ui-core-dispatch.ts b/src/adapters/tui/ui-core-dispatch.ts index 7c006b50..56996879 100644 --- a/src/adapters/tui/ui-core-dispatch.ts +++ b/src/adapters/tui/ui-core-dispatch.ts @@ -67,6 +67,18 @@ export async function dispatchCoreIntent( completion: receipt.completion.then(() => undefined), } } + case 'focus-run': { + const state = context.app.focusRun({ + operationId: intent.operationId, + runId: intent.runId, + }) + return { + kind: 'accepted', + operationId: intent.operationId, + runId: intent.runId, + revision: state.revision, + } + } case 'open-surface': context.setSelectedSurface( intent.surface === 'settings' ? 'details' : intent.surface, @@ -120,6 +132,7 @@ export async function dispatchCoreIntent( const receipt = context.app.queueInput({ operationId: intent.operationId, text: intent.text, + ...(intent.runId === undefined ? {} : { runId: intent.runId }), }) if (receipt.completion !== undefined) await receipt.completion return { @@ -138,6 +151,7 @@ export async function dispatchCoreIntent( const receipt = await context.app.steer({ operationId: intent.operationId, text: intent.text, + ...(intent.runId === undefined ? {} : { runId: intent.runId }), }) return { kind: 'accepted', diff --git a/src/adapters/tui/ui-projection.ts b/src/adapters/tui/ui-projection.ts index 64c89e8c..2741f36e 100644 --- a/src/adapters/tui/ui-projection.ts +++ b/src/adapters/tui/ui-projection.ts @@ -8,7 +8,7 @@ import { profileModelSettings } from '../../app/profile-model-settings.js' import { isSensitiveFieldName } from '../../domain/bounded-structured.js' import type { BraidEventEnvelope } from '../../domain/events.js' import { interactionRemainingMs } from '../../domain/interaction-timeout.js' -import type { BraidState } from '../../domain/state.js' +import { activeRunForBranch, isActiveRunStatus, type BraidState } from '../../domain/state.js' import { environmentView } from '../../views/shared/environment-presentation.js' import type { UiEvent } from '../../views/shared/intents.js' import type { @@ -19,6 +19,7 @@ import type { InteractionView, MessageView, RunView, + WorkStripItemView, TranscriptPartView, ViewStatus, } from '../../views/shared/models.js' @@ -47,15 +48,11 @@ const ALL_PROTOCOL_INTERACTION_OUTCOMES = [ ] as const satisfies readonly ProtocolInteractionOutcome[] export function statusFor(state: BraidState): ViewStatus { - if (state.activeRunId) { - const active = state.runs.find((run) => run.id === state.activeRunId) - if (active?.status === 'cancelling') return 'cancelling' - if (active?.status === 'reconnecting') return 'reconnecting' - if (active?.status === 'starting') return 'starting' - if (active?.status === 'blocked') return 'waiting' - return 'running' - } - const status = state.runs.at(-1)?.status + const active = activeRunForBranch(state, state.conversationId, state.branchId) + if (active) return viewStatusForRun(active.status) + const status = state.runs + .filter((run) => run.conversationId === state.conversationId && run.branchId === state.branchId) + .at(-1)?.status if (!status) return state.messages.length === 0 ? 'empty' : 'ready' switch (status) { case 'completed': @@ -87,15 +84,12 @@ export function statusFor(state: BraidState): ViewStatus { } } -function statusForRun(state: BraidState, run: BraidState['runs'][number]): ViewStatus { - if (state.activeRunId === run.id) { - if (run.status === 'cancelling') return 'cancelling' - if (run.status === 'reconnecting') return 'reconnecting' - if (run.status === 'starting') return 'starting' - if (run.status === 'blocked') return 'waiting' - return 'running' - } - switch (run.status) { +function statusForRun(_state: BraidState, run: BraidState['runs'][number]): ViewStatus { + return viewStatusForRun(run.status) +} + +function viewStatusForRun(status: BraidState['runs'][number]['status']): ViewStatus { + switch (status) { case 'completed': return 'completed' case 'failed': @@ -244,6 +238,58 @@ export function runViews(state: BraidState): RunView[] { }) } +/** Projects the compact multi-run strip without widening the transcript layout. */ +export function workStripFor(state: BraidState): readonly WorkStripItemView[] | undefined { + const runs = state.runs.filter((run) => isActiveRunStatus(run.status)) + const queued = state.queuedInputs.flatMap((entry) => { + const run = state.runs.find((candidate) => candidate.id === entry.runId) + return run === undefined ? [] : [{ entry, run }] + }) + const focusedRunId = state.focusedRunId ?? state.activeRunId + const items: WorkStripItemView[] = runs.map((run) => ({ + id: run.id, + runId: run.id, + conversationId: String(run.conversationId), + branchId: String(run.branchId), + state: viewStatusForRun(run.status), + ...(run.receipt.requested.runner === undefined + ? {} + : { runner: sanitizeTerminalText(run.receipt.requested.runner) }), + ...(run.model === undefined ? {} : { model: sanitizeTerminalText(run.model) }), + interactionCount: run.interactions.filter((item) => item.status === 'pending').length, + focused: run.id === focusedRunId, + actions: { + switch: true, + ask: run.complete && (run.status === 'completed' || run.status === 'failed'), + steer: run.capabilities.controls.steer, + cancel: run.capabilities.controls.cancel, + }, + })) + for (const { entry, run } of queued) { + items.push({ + id: entry.operationId, + runId: run.id, + conversationId: String(run.conversationId), + branchId: String(run.branchId), + state: 'queued', + ...(run.receipt.requested.runner === undefined + ? {} + : { runner: sanitizeTerminalText(run.receipt.requested.runner) }), + ...(run.model === undefined ? {} : { model: sanitizeTerminalText(run.model) }), + interactionCount: run.interactions.filter((item) => item.status === 'pending').length, + focused: false, + queueOperationId: entry.operationId, + actions: { + switch: true, + ask: run.complete && (run.status === 'completed' || run.status === 'failed'), + steer: false, + cancel: false, + }, + }) + } + return items.length < 2 ? undefined : Object.freeze(items) +} + function completenessFor( state: BraidState, run: BraidState['runs'][number], @@ -667,6 +713,8 @@ export function toHeadlessState( interactions: interactionViews(state), queue: queueViews(state), activeRunId: state.activeRunId, + focusedRunId: state.focusedRunId, + activeRuns: state.activeRuns, lastError: state.lastError ? sanitizeTerminalText(state.lastError) : null, ...(storageFailure === undefined ? {} diff --git a/src/adapters/tui/ui-view-model.ts b/src/adapters/tui/ui-view-model.ts index 1782166e..de23c19c 100644 --- a/src/adapters/tui/ui-view-model.ts +++ b/src/adapters/tui/ui-view-model.ts @@ -1,7 +1,7 @@ import { selectedRunConfiguration } from '../../app/effective-run-configuration.js' import { profileModelSettings } from '../../app/profile-model-settings.js' import { canonicalDigest } from '../../domain/canonical.js' -import type { BraidState } from '../../domain/state.js' +import { activeRunForBranch, type BraidState } from '../../domain/state.js' import { type ColorMode, resolveColorMode } from '../../views/shared/appearance.js' import { environmentView } from '../../views/shared/environment-presentation.js' import { type BraidViewModel, freezeView } from '../../views/shared/models.js' @@ -19,6 +19,7 @@ import { queueViews, runViews, statusFor, + workStripFor, } from './ui-projection.js' import { uiSemanticState } from './ui-semantic-state.js' @@ -100,6 +101,8 @@ export function buildBraidViewModel( const color = appearance.color === undefined ? ('truecolor' as const) : resolveColorMode(appearance.color) const semantic = semanticViewFor(state, graphQuery) + const selectedActiveRun = activeRunForBranch(state, state.conversationId, state.branchId) + const workStrip = workStripFor(state) return freezeView({ revision: state.revision, workspace: state.workspace ? sanitizeTerminalText(state.workspace) : null, @@ -166,7 +169,9 @@ export function buildBraidViewModel( runs: Object.freeze(runViews(state)), sessionUsage: sessionUsageFor(state), environments: Object.freeze(state.environments.map(environmentView)), - ...(state.activeRunId ? { activeRunId: state.activeRunId } : {}), + ...(selectedActiveRun ? { activeRunId: selectedActiveRun.id } : {}), + ...(state.focusedRunId ? { focusedRunId: state.focusedRunId } : {}), + ...(workStrip === undefined ? {} : { workStrip }), interactions: Object.freeze(interactionViews(state)), activity: semantic.activity, graph: semantic.graph, diff --git a/src/app/application-lifecycle.ts b/src/app/application-lifecycle.ts index 154aa838..4dee37c8 100644 --- a/src/app/application-lifecycle.ts +++ b/src/app/application-lifecycle.ts @@ -13,6 +13,7 @@ export const DEFAULT_APPLICATION_DRAIN_TIMEOUT_MS = 5_000 export interface LifecycleCloseOptions { readonly runIds: readonly string[] + readonly shouldSettleRun?: (runId: string) => boolean readonly timeoutMs: number readonly cancel: (runId: string) => Promise readonly markUnknown: (runId: string) => Promise @@ -86,7 +87,10 @@ export class ApplicationLifecycle { async settleActive(options: LifecycleCloseOptions): Promise { this.#abortAdmissions() const deadline = Date.now() + Math.max(0, options.timeoutMs) - const runIds = [...new Set([...options.runIds, ...this.#active.keys()])] + const trackedRunIds = [...this.#active.keys()].filter( + (runId) => options.shouldSettleRun?.(runId) ?? true, + ) + const runIds = [...new Set([...options.runIds, ...trackedRunIds])] await untilDeadline(Promise.allSettled(runIds.map((runId) => options.cancel(runId))), deadline) const operations = this.activeOperations() diff --git a/src/app/application-support.ts b/src/app/application-support.ts index 30b526d8..08574701 100644 --- a/src/app/application-support.ts +++ b/src/app/application-support.ts @@ -6,7 +6,7 @@ import type { RunAdmissionReceipt } from '../domain/receipts.js' import { redactBraidEvent } from '../domain/redaction.js' import { reduceEvent } from '../domain/reducer.js' import { usageSnapshotForRun } from '../domain/run-usage.js' -import type { BraidState } from '../domain/state.js' +import { isLiveRunStatus, type BraidState } from '../domain/state.js' import type { Clock } from '../ports/clock.js' import type { EffectStoragePort } from '../ports/effect-storage.js' import type { ControlAcknowledgement } from '../ports/execution.js' @@ -176,7 +176,7 @@ export function restoreApplicationOperations( admission: event.receipt, completion: Promise.resolve(), }) - if (!isTerminalStatus(run.status)) target.ledger.setAbort(run.id, new AbortController()) + if (isLiveRunStatus(run.status)) target.ledger.setAbort(run.id, new AbortController()) } } else if (event.kind === 'run.cancel.requested') { const restoredRun = target.state().runs.find((run) => run.id === event.runId) @@ -250,10 +250,19 @@ export function restoreApplicationOperations( } export function reconcileRestartRun(context: RestartPort): Promise { - const runId = context.currentState().activeRunId - if (!runId) return Promise.resolve() + const runIds = context + .currentState() + .runs.filter((run) => isLiveRunStatus(run.status)) + .map((run) => run.id) + if (runIds.length === 0) return Promise.resolve() + return Promise.all(runIds.map((runId) => reconcileRestartRunFor(context, runId))).then( + () => undefined, + ) +} + +async function reconcileRestartRunFor(context: RestartPort, runId: string): Promise { const run = context.currentState().runs.find((candidate) => candidate.id === runId) - if (!run || isProvenTerminalStatus(run.status)) return Promise.resolve() + if (!run || isProvenTerminalStatus(run.status)) return if (!context.execution.status) { if (canReplayAfterRestart(context, run)) return markRestartReconnecting(context, runId) const unknown = context.commitAndWait({ @@ -264,9 +273,10 @@ export function reconcileRestartRun(context: RestartPort): Promise { usage: usageSnapshotForRun(run), error: 'The execution path cannot reconcile provider state after restart', }) - return Promise.resolve(unknown) + if (unknown !== undefined) await unknown + return } - return reconcileRestartSnapshot(context, runId) + await reconcileRestartSnapshot(context, runId) } async function reconcileRestartSnapshot(context: RestartPort, runId: string): Promise { diff --git a/src/app/application.ts b/src/app/application.ts index a04c5829..6992f4a5 100644 --- a/src/app/application.ts +++ b/src/app/application.ts @@ -12,7 +12,7 @@ import type { import { redactSensitiveText } from '../domain/redaction.js' import { replayEvents } from '../domain/reducer.js' import type { RuntimeEventEnvelope } from '../domain/runtime-events.js' -import { type BraidState, initialState } from '../domain/state.js' +import { isLiveRunStatus, type BraidState, initialState } from '../domain/state.js' import type { Clock } from '../ports/clock.js' import type { ExecuteTurnInput, ExecutionPort } from '../ports/execution.js' import type { IdSource } from '../ports/ids.js' @@ -352,8 +352,9 @@ export class BraidApplication { markCleanupUncertain(reason: string): void { this.#cleanupUncertain = redactSensitiveText(reason).slice(0, 512) - const runId = this.#state.activeRunId - if (runId) this.#ledger.getAbort(runId)?.abort(new Error('Cleanup deadline exceeded')) + for (const run of this.#state.activeRuns) { + this.#ledger.getAbort(run.runId)?.abort(new Error('Cleanup deadline exceeded')) + } } async whenDurable(): Promise { @@ -493,6 +494,15 @@ export class BraidApplication { } } + focusRun(input: { readonly operationId: string; readonly runId: string }): BraidState { + operationId(input.operationId, 'focus-run') + const run = this.#state.runs.find((candidate) => candidate.id === input.runId) + if (!run) throw new AppError('UNKNOWN_RUN', `Run ${input.runId} is unknown`) + if (this.#state.focusedRunId === run.id) return this.state() + this.#commit({ kind: 'run.focused', runId: run.id }) + return this.state() + } + canCancel(): boolean { const runId = this.#state.activeRunId const run = runId ? this.#state.runs.find((candidate) => candidate.id === runId) : undefined @@ -606,6 +616,10 @@ export class BraidApplication { try { await this.#lifecycle.settleActive({ runIds: this.#activeRunIds(), + shouldSettleRun: (runId) => { + const run = this.#state.runs.find((candidate) => candidate.id === runId) + return run !== undefined && isLiveRunStatus(run.status) + }, timeoutMs: this.#cancelTimeoutMs, cancel: (runId) => this.#cancelForClose(runId), markUnknown: (runId) => this.#markRunUnknownAfterCloseDeadline(runId), @@ -681,9 +695,20 @@ export class BraidApplication { } #activeRunIds(): readonly string[] { - const active = this.#lifecycle.activeOperations().map((operation) => operation.runId) - const current = this.#state.activeRunId - return current === null ? active : [...active, current] + const active = this.#lifecycle + .activeOperations() + .filter((operation) => { + const run = this.#state.runs.find((candidate) => candidate.id === operation.runId) + return run !== undefined && isLiveRunStatus(run.status) + }) + .map((operation) => operation.runId) + const current = this.#state.activeRuns + .filter((run) => { + const record = this.#state.runs.find((candidate) => candidate.id === run.runId) + return record !== undefined && isLiveRunStatus(record.status) + }) + .map((run) => run.runId) + return [...new Set([...active, ...current])] } async #cancelForClose(runId: string): Promise { diff --git a/src/app/conversation-branches.ts b/src/app/conversation-branches.ts index 6179ac94..105a1706 100644 --- a/src/app/conversation-branches.ts +++ b/src/app/conversation-branches.ts @@ -24,7 +24,6 @@ import { operationReplay, parseOperation, requestDigest, - requireIdle, requireWorkspace, stableBranchIds, stableConversationIds, @@ -60,7 +59,6 @@ export class ConversationBranches { async #setRunOverrides(input: SetRunOverridesInput): Promise { const state = this.#host.state() - requireIdle(state, 'Changing run configuration') const source = resolveBranch(state, input) const operationId = parseOperation(input.operationId, 'set_run_override') const hasOverride = [input.runner, input.model, input.effort, input.mode].some( @@ -117,7 +115,6 @@ export class ConversationBranches { async #create(input: CreateBranchInput): Promise { const state = this.#host.state() - requireIdle(state, 'Creating a branch') const source = resolveSource(state, input) const operationId = parseOperation(input.operationId, 'branch') const normalized = branchRequest(source, input) @@ -205,7 +202,6 @@ export class ConversationBranches { async #clone(input: CloneConversationInput): Promise { const state = this.#host.state() const workspaceId = requireWorkspace(state) - requireIdle(state, 'Cloning a conversation') const source = resolveSource(state, input) const operationId = parseOperation(input.operationId, 'clone') const title = normalizedTitle(input.title, `${source.conversation.title} copy`) diff --git a/src/app/conversation-import-builder.ts b/src/app/conversation-import-builder.ts index a9a61839..10b83df3 100644 --- a/src/app/conversation-import-builder.ts +++ b/src/app/conversation-import-builder.ts @@ -30,12 +30,7 @@ import { optionalFiniteNumber, requiredString, } from './conversation-import-values.js' -import { - acknowledgedOperation, - normalizedTitle, - requireIdle, - requireWorkspace, -} from './conversation-support.js' +import { acknowledgedOperation, normalizedTitle, requireWorkspace } from './conversation-support.js' import { AppError } from './errors.js' export type ConversationImportedEvent = Extract< @@ -51,7 +46,6 @@ export function buildConversationImport(input: { readonly at: string readonly title?: string }): ConversationImportedEvent { - requireIdle(input.state, 'Conversation import') const workspaceId = requireWorkspace(input.state) const content = input.prepared.document.content const sourceConversation = importRecord(content.conversation, 'content.conversation') diff --git a/src/app/conversation-lifecycle.ts b/src/app/conversation-lifecycle.ts index 93fa003c..feccd7db 100644 --- a/src/app/conversation-lifecycle.ts +++ b/src/app/conversation-lifecycle.ts @@ -15,7 +15,6 @@ import { operationReplay, parseOperation, requestDigest, - requireIdle, requireWorkspace, selectedConnection, selectedProfile, @@ -70,7 +69,6 @@ export class ConversationLifecycle { async #create(input: CreateConversationInput): Promise { const state = this.#host.state() const workspaceId = requireWorkspace(state) - requireIdle(state, 'Creating a conversation') const title = normalizedTitle(input.title) const profileId = selectedProfile(state, input.profileId) const connectionId = selectedConnection(state, input.connectionId) @@ -113,7 +111,6 @@ export class ConversationLifecycle { async #open(input: OpenConversationInput): Promise { const state = this.#host.state() - requireIdle(state, 'Opening a conversation') const conversationId = parseConversationId(input.conversationId) const conversation = availableConversation(state, conversationId) const branchId = diff --git a/src/app/durable-send.ts b/src/app/durable-send.ts index aac99459..c343074e 100644 --- a/src/app/durable-send.ts +++ b/src/app/durable-send.ts @@ -1,5 +1,5 @@ import type { RunAdmissionReceipt } from '../domain/receipts.js' -import type { BraidState } from '../domain/state.js' +import { activeRunForBranch, type BraidState } from '../domain/state.js' import type { IdSource } from '../ports/ids.js' import type { AdmissionRegistration } from './application-lifecycle.js' import type { SendReceipt } from './application-types.js' @@ -38,31 +38,34 @@ export interface DurableSendRuntime { export function createDurableSender( runtime: DurableSendRuntime, ): (input: RunExecutionSnapshot) => SendReceipt { - let pending: - | { - readonly operationId: string - readonly digest: string - readonly receipt: SendReceipt - } - | undefined + const pending = new Map< + string, + { + readonly operationId: string + readonly digest: string + readonly receipt: SendReceipt + } + >() return (input) => { const state = runtime.currentState() + const scope = runScope(input) const digest = runtime.requestDigest(state, input) const persisted = runtime.admitPersistedSend(input.operationId, digest) if (persisted) return persisted - if (pending) { - if (pending.operationId !== input.operationId) + const inFlight = pending.get(scope) + if (inFlight) { + if (inFlight.operationId !== input.operationId) throw new AppError( 'RUN_ACTIVE', - `Run ${pending.receipt.runId} is awaiting admission; queue the next input explicitly`, + `Run ${inFlight.receipt.runId} is awaiting admission; queue the next input explicitly`, ) - if (pending.digest !== digest) + if (inFlight.digest !== digest) throw new AppError( 'OPERATION_CONFLICT', `Operation ${input.operationId} was already used with different input`, ) - return replayPendingReceipt(pending.receipt) + return replayPendingReceipt(inFlight.receipt) } const receipt = durableSend({ @@ -78,9 +81,9 @@ export function createDurableSender( sendAsync: runtime.sendAsync, }) const reservation = { operationId: input.operationId, digest, receipt } - pending = reservation + pending.set(scope, reservation) const clear = () => { - if (pending === reservation) pending = undefined + if (pending.get(scope) === reservation) pending.delete(scope) } receipt.admissionReady?.then(clear, clear) return receipt @@ -92,10 +95,11 @@ export function durableSend(input: DurableSendInput): SendReceipt { const digest = input.requestDigest(state, input.input) const replay = input.admitPersistedSend(input.input.operationId, digest) if (replay) return replay - if (state.activeRunId) + const active = activeRunForBranch(state, input.input.conversationId, input.input.branchId) + if (active) throw new AppError( 'RUN_ACTIVE', - `Run ${state.activeRunId} is still active; queue the next input explicitly`, + `Run ${active.id} is still active on this branch; queue the next input explicitly`, ) const runId = input.ids.next('run') const turnId = input.ids.next('turn') @@ -154,3 +158,7 @@ function replayPendingReceipt(receipt: SendReceipt): SendReceipt { completion: receipt.completion, } } + +function runScope(input: RunExecutionSnapshot): string { + return `${input.conversationId}\u0000${input.branchId}` +} diff --git a/src/app/legacy-cancel.ts b/src/app/legacy-cancel.ts index 8a702d8c..1ffb4c93 100644 --- a/src/app/legacy-cancel.ts +++ b/src/app/legacy-cancel.ts @@ -48,7 +48,7 @@ export function legacyCancel(host: LegacyCancelHost, input: CancelInput): Cancel } } - if (!run || state.activeRunId !== runId || isTerminal(run.status)) { + if (!run || isTerminal(run.status)) { throw new AppError('UNKNOWN_RUN', `Run ${runId} is not active`) } const completion = host diff --git a/src/app/run-admission-dispatch.ts b/src/app/run-admission-dispatch.ts index 4676cfa5..026340f6 100644 --- a/src/app/run-admission-dispatch.ts +++ b/src/app/run-admission-dispatch.ts @@ -5,6 +5,7 @@ import { admitRun, admitRunAsync } from './run-admission-receipt.js' import { RUN_EFFECT_KIND, runEffectRequest } from './run-admission-request.js' import { validateContextPlan, validateNativeProof } from './run-admission-validation.js' import type { RunExecutionSnapshot } from './run-execution-snapshot.js' +import { activeRunForBranch } from '../domain/state.js' export function sendRun(context: AdmissionPort, input: RunExecutionSnapshot): SendReceipt { const state = context.currentState() @@ -14,18 +15,18 @@ export function sendRun(context: AdmissionPort, input: RunExecutionSnapshot): Se if (!input.text.trim()) throw new AppError('EMPTY_MESSAGE', 'Message must not be empty') const conversationId = input.conversationId const branchId = input.branchId - if (conversationId !== state.conversationId || branchId !== state.branchId) - throw new AppError('UNKNOWN_BRANCH', 'The requested conversation branch is not open') + assertTargetBranch(state, conversationId, branchId) validateNativeProof(context, input) const request = runEffectRequest(input) const digest = context.fingerprint({ effectKind: RUN_EFFECT_KIND, request }) const persisted = context.admitPersistedSend(input.operationId, digest) if (persisted) return persisted - if (state.activeRunId) + const active = activeRunForBranch(state, conversationId, branchId) + if (active) throw new AppError( 'RUN_ACTIVE', - `Run ${state.activeRunId} is still active; queue the next input explicitly`, + `Run ${active.id} is still active on this branch; queue the next input explicitly`, ) validateContextPlan(input) @@ -58,7 +59,8 @@ export function sendRun(context: AdmissionPort, input: RunExecutionSnapshot): Se input.nativeContextBoundaryProof, input.contextPlan, ) - if (state.draft !== input.text) context.commit({ kind: 'draft.changed', text: input.text }) + if (state.branchId === branchId && state.draft !== input.text) + context.commit({ kind: 'draft.changed', text: input.text }) context.commit({ kind: 'run.requested', operationId: input.operationId, @@ -104,18 +106,18 @@ export async function sendRunAsync( throw new AppError('OPERATION_ID_REQUIRED', 'send requires a valid operationId') const conversationId = input.conversationId const branchId = input.branchId - if (conversationId !== state.conversationId || branchId !== state.branchId) - throw new AppError('UNKNOWN_BRANCH', 'The requested conversation branch is not open') + assertTargetBranch(state, conversationId, branchId) validateNativeProof(context, input) validateContextPlan(input) const request = runEffectRequest(input) const digest = context.fingerprint({ effectKind: RUN_EFFECT_KIND, request }) const persisted = context.admitPersistedSend(input.operationId, digest) if (persisted) return persisted - if (state.activeRunId) + const active = activeRunForBranch(state, conversationId, branchId) + if (active) throw new AppError( 'RUN_ACTIVE', - `Run ${state.activeRunId} is still active; queue the next input explicitly`, + `Run ${active.id} is still active on this branch; queue the next input explicitly`, ) if (input.contextTransfer && input.contextTransfer.destinationRunId !== ids.runId) throw new AppError( @@ -145,7 +147,7 @@ export async function sendRunAsync( input.contextPlan, ) assertAdmissionActive(signal) - if (state.draft !== input.text) + if (state.branchId === branchId && state.draft !== input.text) await context.commitAndWait({ kind: 'draft.changed', text: input.text }) assertAdmissionActive(signal) await context.commitAndWait({ @@ -184,3 +186,20 @@ function assertAdmissionActive(signal: AbortSignal): void { if (signal.aborted) throw new AppError('APPLICATION_CLOSING', 'Braid is closing and cannot materialize a run') } + +function assertTargetBranch( + state: ReturnType, + conversationId: string, + branchId: string, +): void { + if (conversationId === state.conversationId && branchId === state.branchId) return + const conversation = state.conversations.find( + (candidate) => candidate.id === conversationId && candidate.deletedAt === undefined, + ) + const branch = state.branches.find( + (candidate) => candidate.id === branchId && candidate.conversationId === conversationId, + ) + if (!conversation || !branch) { + throw new AppError('UNKNOWN_BRANCH', 'The requested conversation branch is unavailable') + } +} diff --git a/src/app/run-admission-receipt.ts b/src/app/run-admission-receipt.ts index 2d6e382d..eb2443b7 100644 --- a/src/app/run-admission-receipt.ts +++ b/src/app/run-admission-receipt.ts @@ -36,7 +36,7 @@ export function admitRun( validateProfile(input.profile) const rawAdmission = resolveSyncAdmission(context, input) const resolved = rawAdmission ?? {} - validateExecutionContext(context.currentState(), input, resolved) + validateExecutionContext(context.currentState(), input, resolved, conversationId, branchId) const capabilities = resolved.capabilities ?? resolveSyncCapabilities(context, input) const interactions = requestedInteractionsForRun(input.mode, capabilities) const receipt = createAdmissionReceipt({ @@ -88,7 +88,7 @@ export async function admitRunAsync( ): Promise { validateProfile(input.profile) const resolved = await resolveAsyncAdmission(context, input) - validateExecutionContext(context.currentState(), input, resolved) + validateExecutionContext(context.currentState(), input, resolved, conversationId, branchId) const capabilities = resolved?.capabilities ?? (await resolveAsyncCapabilities(context, input)) const interactions = requestedInteractionsForRun(input.mode, capabilities) const receipt = createAdmissionReceipt({ diff --git a/src/app/run-admission-validation.ts b/src/app/run-admission-validation.ts index d1431f34..6d2255d6 100644 --- a/src/app/run-admission-validation.ts +++ b/src/app/run-admission-validation.ts @@ -92,14 +92,16 @@ export function validateExecutionContext( state: ReturnType, input: ExecuteTurnInput, admission: ExecutionAdmission | undefined, + conversationId = state.conversationId, + branchId = state.branchId, ): void { const receipt = admission?.materializationReceipt if (receipt?.portableContext !== 'unavailable') return if (input.sessionId !== undefined && input.contextBoundary === undefined) return const hasHistory = branchHasVisibleHistory({ state, - conversationId: state.conversationId, - branchId: state.branchId, + conversationId, + branchId, }) if (!hasHistory) return throw new AppError( diff --git a/src/app/run-controls.ts b/src/app/run-controls.ts index 695f3a27..c87aac0c 100644 --- a/src/app/run-controls.ts +++ b/src/app/run-controls.ts @@ -41,6 +41,8 @@ export function queueRunInput( operationId: input.operationId, text: input.text, position, + conversationId: run.conversationId, + branchId: run.branchId, }) return { operationId: input.operationId, diff --git a/src/app/run-execution.ts b/src/app/run-execution.ts index 4800300d..5897a98a 100644 --- a/src/app/run-execution.ts +++ b/src/app/run-execution.ts @@ -1,5 +1,6 @@ import { UNKNOWN_TURN_USAGE } from '../domain/run-usage.js' import { isRuntimeEventEnvelope } from '../domain/runtime-events.js' +import { activeRunForBranch } from '../domain/state.js' import type { ExecuteTurnInput } from '../ports/execution.js' import type { ExecutionRunPort, SendAccess } from './application-ports.js' import { safeRuntimeDiagnostic } from './provider-values.js' @@ -232,9 +233,16 @@ function finishPendingText(context: ExecutionRunPort, runId: string): string { } export async function drainQueue(context: ExecutionRunPort & SendAccess): Promise { - const next = context.currentState().queuedInputs[0] - if (!next || context.currentState().activeRunId) return - if (context.currentState().missingHistory.some((range) => range.runId === next.runId)) return + const state = context.currentState() + const next = state.queuedInputs.find((candidate) => { + const completed = state.runs.find((run) => run.id === candidate.runId) + if (!completed) return false + const conversationId = candidate.conversationId ?? completed.conversationId + const branchId = candidate.branchId ?? completed.branchId + return activeRunForBranch(state, conversationId, branchId) === undefined + }) + if (!next) return + if (state.missingHistory.some((range) => range.runId === next.runId)) return const completed = context.findRun(next.runId) if ( (completed.status === 'unknown' && @@ -244,7 +252,12 @@ export async function drainQueue(context: ExecutionRunPort & SendAccess): Promis return if (!context.ledger.claimQueueDrain(next.operationId)) return try { - const receipt = context.send({ operationId: next.operationId, text: next.text }) + const receipt = context.send({ + operationId: next.operationId, + text: next.text, + conversationId: next.conversationId ?? completed.conversationId, + branchId: next.branchId ?? completed.branchId, + }) if (receipt.admissionReady !== undefined) await receipt.admissionReady const removed = context.commitAndWait({ kind: 'run.queue.removed', diff --git a/src/app/run-ledger.ts b/src/app/run-ledger.ts index 05919050..6a4a3d97 100644 --- a/src/app/run-ledger.ts +++ b/src/app/run-ledger.ts @@ -1,5 +1,5 @@ import type { BraidControlKind, BraidEventEnvelope } from '../domain/events.js' -import type { BraidState } from '../domain/state.js' +import { isLiveRunStatus, type BraidState } from '../domain/state.js' import type { ControlOperationRecord, OperationRecord, @@ -104,15 +104,9 @@ export function createRunLedger(): RunLedger { const event = envelope.event if (event.kind === 'run.requested' && event.receipt) { const run = state().runs.find((candidate) => candidate.id === event.runId) - if (run && !isTerminal(run.status)) aborts.set(run.id, new AbortController()) + if (run && isLiveRunStatus(run.status)) aborts.set(run.id, new AbortController()) } } }, } } - -function isTerminal(status: BraidState['runs'][number]['status']): boolean { - return ['completed', 'failed', 'aborted', 'cancelled', 'blocked', 'expired', 'unknown'].includes( - status, - ) -} diff --git a/src/app/run-status.ts b/src/app/run-status.ts index 062c003d..0f484529 100644 --- a/src/app/run-status.ts +++ b/src/app/run-status.ts @@ -1,4 +1,4 @@ -import type { BraidRun, BraidState, RunStatus } from '../domain/state.js' +import { isLiveRunStatus, type BraidRun, type BraidState, type RunStatus } from '../domain/state.js' import type { StateReader, StatusPort } from './application-ports.js' import { AppError } from './errors.js' @@ -33,13 +33,29 @@ export async function waitForRun(context: StatusPort, runId: string): Promise
    { await Promise.resolve() - const runId = context.currentState().activeRunId - if (!runId) return structuredClone(context.currentState()) - const control = context.ledger.controlForRun(runId) - if (control) { - await control.acknowledgement - if (!context.currentState().activeRunId) return structuredClone(context.currentState()) + for (;;) { + const state = context.currentState() + const runIds = new Set( + (state.activeRuns ?? []) + .filter((run) => { + const record = state.runs.find((candidate) => candidate.id === run.runId) + return record !== undefined && isLiveRunStatus(record.status) + }) + .map((run) => run.runId), + ) + if (runIds.size === 0 && state.activeRunId !== null) runIds.add(state.activeRunId) + const waits: Promise[] = [] + for (const runId of runIds) { + const control = context.ledger.controlForRun(runId) + if (control) { + await control.acknowledgement + const controlledRun = context.currentState().runs.find((run) => run.id === runId) + if (controlledRun === undefined || isTerminal(controlledRun.status)) continue + } + const operation = context.ledger.operationForRun(runId) + if (operation) waits.push(operation.completion) + } + if (waits.length === 0) return structuredClone(context.currentState()) + await Promise.all(waits) } - await waitForRun(context, runId) - return structuredClone(context.currentState()) } diff --git a/src/app/shutdown-controller.ts b/src/app/shutdown-controller.ts index f1b90b9b..35cb3e70 100644 --- a/src/app/shutdown-controller.ts +++ b/src/app/shutdown-controller.ts @@ -1,5 +1,5 @@ import type { BraidEvent } from '../domain/events.js' -import type { BraidRun, BraidState } from '../domain/state.js' +import { isLiveRunStatus, type BraidRun, type BraidState } from '../domain/state.js' import type { ShutdownReceipt } from './application-types.js' import { AppError } from './errors.js' import { shutdownRequestDigest } from './operation-ledger.js' @@ -43,9 +43,9 @@ export function shutdownApplication(input: ShutdownControllerInput): ShutdownRec } input.commit({ kind: 'application.shutdown.requested', operationId: input.operationId }) const state = input.state() - const runId = state.activeRunId ?? undefined - const run = runId ? state.runs.find((candidate) => candidate.id === runId) : undefined - const completion = completeShutdown(input, runId, run) + const activeRuns = state.runs.filter((candidate) => isLiveRunStatus(candidate.status)) + const runId = state.activeRunId ?? activeRuns[0]?.id + const completion = completeShutdown(input, activeRuns) input.ledger.setShutdown(input.operationId, { digest, completion }) return { operationId: input.operationId, @@ -60,23 +60,35 @@ export function shutdownApplication(input: ShutdownControllerInput): ShutdownRec async function completeShutdown( input: ShutdownControllerInput, - runId: string | undefined, - run: BraidRun | undefined, + runs: readonly BraidRun[], ): Promise { - if (!runId || !run) return input.state() + if (runs.length === 0) return input.state() if (input.mode === 'cancel') { - const receipt = await input.cancelRun({ - operationId: `${input.operationId}:cancel`, - runId, - reason: 'Braid is shutting down', - terminalStatus: 'aborted', - legacy: true, - }) - return receipt.completion + await Promise.all( + runs.map(async (run) => { + const receipt = await input.cancelRun({ + operationId: `${input.operationId}:cancel:${run.id}`, + runId: run.id, + reason: 'Braid is shutting down', + terminalStatus: 'aborted', + legacy: true, + }) + await receipt.completion + }), + ) + return input.state() } if (input.mode === 'detach') { - const receipt = await input.detachRun({ operationId: `${input.operationId}:detach`, runId }) - return receipt.completion + await Promise.all( + runs.map(async (run) => { + const receipt = await input.detachRun({ + operationId: `${input.operationId}:detach:${run.id}`, + runId: run.id, + }) + await receipt.completion + }), + ) + return input.state() } return input.waitForIdle() } diff --git a/src/bin/native-interactive-actions.ts b/src/bin/native-interactive-actions.ts index d8104a34..31cfb8ef 100644 --- a/src/bin/native-interactive-actions.ts +++ b/src/bin/native-interactive-actions.ts @@ -2,7 +2,7 @@ import type { AgentInteractiveTerminalSession } from '@tangle-network/agent-inte import { claimRetainedInteractiveControl } from '@tangle-network/agent-runtime/kernel' import { createNativeTerminalTransport } from '../adapters/tui/native-terminal-transport.js' import type { BraidApplication } from '../app/application.js' -import type { BraidRun } from '../domain/state.js' +import { activeRunForBranch, type BraidRun, type BraidState } from '../domain/state.js' import type { NativeInteractiveExecutionControl } from '../ports/native-interactive-execution.js' import type { NativeTerminalHost, @@ -72,7 +72,7 @@ function availability( } const state = current.app.state() if (action === 'start') { - return state.activeRunId === null + return !selectedBranchHasActiveRun(state) ? { available: true } : { available: false, reason: 'Detach or finish the active run first' } } @@ -81,6 +81,12 @@ function availability( : { available: true } } +function selectedBranchHasActiveRun(state: BraidState): boolean { + if (typeof state.conversationId !== 'string' || typeof state.branchId !== 'string') + return state.activeRunId !== null + return activeRunForBranch(state, state.conversationId, state.branchId) !== undefined +} + async function runCommand( options: NativeInteractiveActionsOptions, command: NativeInteractiveCommand, diff --git a/src/domain/connection-removal.ts b/src/domain/connection-removal.ts index 123b39cb..9e649a33 100644 --- a/src/domain/connection-removal.ts +++ b/src/domain/connection-removal.ts @@ -1,5 +1,5 @@ import type { ConnectionId } from './ids.js' -import type { BraidState } from './state.js' +import { isActiveRunStatus, type BraidState } from './state.js' export type ConnectionRemovalBlockerKind = | 'selected' @@ -43,15 +43,14 @@ export function connectionRemovalBlockers( for (const run of state.runs) { const runConnectionId = run.connectionId ?? run.receipt.requested.connectionId if (runConnectionId !== connectionId) continue - if (isProvenTerminal(run) && state.activeRunId !== run.id) continue + if (isProvenTerminal(run)) continue blockers.push({ kind: 'run', id: run.id, status: run.status, - action: - state.activeRunId === run.id - ? 'Reconcile the active run before removing this connection' - : 'Wait for the run to reach a proven terminal status before removing this connection', + action: isActiveRunStatus(run.status) + ? 'Reconcile the active run before removing this connection' + : 'Wait for the run to reach a proven terminal status before removing this connection', }) } diff --git a/src/domain/events-legacy.ts b/src/domain/events-legacy.ts index 8a94ecf5..f0175348 100644 --- a/src/domain/events-legacy.ts +++ b/src/domain/events-legacy.ts @@ -204,6 +204,8 @@ export type LegacyBraidEvent = readonly operationId: string readonly text: string readonly position: number + readonly conversationId?: string + readonly branchId?: string } | { readonly kind: 'run.queue.removed' diff --git a/src/domain/events.ts b/src/domain/events.ts index 9cc22a22..1aab4e06 100644 --- a/src/domain/events.ts +++ b/src/domain/events.ts @@ -180,6 +180,8 @@ export interface DomainBraidEventMap { readonly detail?: string readonly provider?: ProviderEventMeta } + /** Records the one run whose controls receive unqualified user actions. */ + readonly 'run.focused': { readonly runId: RunId | null } /** * A cancellation correction must carry the durable cancel operation id. * Ordinary provider reconciliation has no operation id. @@ -292,6 +294,8 @@ export function eventRunId(event: BraidEvent): RunId | undefined { case 'run.reconciled': case 'run.environment.observed': return event.runId as RunId + case 'run.focused': + return event.runId ?? undefined case 'history.missing': return event.range.runId case 'replay.cursor.advanced': diff --git a/src/domain/invariants-state.ts b/src/domain/invariants-state.ts index 1eea479a..beae695f 100644 --- a/src/domain/invariants-state.ts +++ b/src/domain/invariants-state.ts @@ -50,7 +50,7 @@ import { assertSupervisorRecord, assertWorkerRecord, } from './invariants-runtime.js' -import type { BraidState } from './state.js' +import { isActiveRunStatus, type BraidState } from './state.js' export function assertBraidState(state: BraidState): void { if (state.schemaVersion < 2) fail('state.schemaVersion is unsupported') @@ -62,6 +62,7 @@ export function assertBraidState(state: BraidState): void { assertEntityId('conversation', state.conversationId, 'state.conversationId') if (state.branchId !== null) assertEntityId('branch', state.branchId, 'state.branchId') if (state.activeRunId !== null) assertEntityId('run', state.activeRunId, 'state.activeRunId') + if (state.focusedRunId !== null) assertEntityId('run', state.focusedRunId, 'state.focusedRunId') try { const snapshot = snapshotAgentProfile(state.profile) assertCanonicalProfile(state.profile, canonicalAgentProfileDigest(snapshot), 'state.profile') @@ -113,6 +114,10 @@ export function assertBraidState(state: BraidState): void { state.runs.map((record) => record.id), 'state.runs', ) + assertUniqueIds( + state.activeRuns.map((record) => record.runId), + 'state.activeRuns', + ) assertUniqueIds( state.analyses.map((record) => record.id), 'state.analyses', @@ -188,6 +193,29 @@ export function assertBraidState(state: BraidState): void { if (state.activeRunId !== null && !state.runs.some((run) => run.id === state.activeRunId)) { fail('state.activeRunId must reference a known run') } + if (state.focusedRunId !== null && !state.runs.some((run) => run.id === state.focusedRunId)) { + fail('state.focusedRunId must reference a known run') + } + const activeRunIds = new Set(state.activeRuns.map((run) => run.runId)) + for (const active of state.activeRuns) { + const run = state.runs.find((candidate) => candidate.id === active.runId) + if (!run) fail(`state.activeRuns references unknown run ${active.runId}`) + if ( + run.conversationId !== active.conversationId || + run.branchId !== active.branchId || + !isActiveRunStatus(run.status) + ) { + fail(`state.activeRuns has stale identity for run ${active.runId}`) + } + } + for (const run of state.runs) { + if (isActiveRunStatus(run.status) && !activeRunIds.has(run.id)) { + fail(`state.activeRuns is missing active run ${run.id}`) + } + } + if (state.activeRunId !== null && state.activeRunId !== state.focusedRunId) { + fail('state.activeRunId must alias state.focusedRunId') + } for (const record of state.workspaces) assertWorkspaceRecord(record) for (const record of state.profiles) assertProfileRecord(record) for (const record of state.profileSnapshots) assertProfileSnapshotRecord(record) diff --git a/src/domain/materialized-state-snapshot.ts b/src/domain/materialized-state-snapshot.ts index ee5fc0ee..f182e7c5 100644 --- a/src/domain/materialized-state-snapshot.ts +++ b/src/domain/materialized-state-snapshot.ts @@ -1,11 +1,11 @@ import { canonicalDigest } from './canonical.js' import type { EventId } from './ids.js' -import { assertBraidState } from './invariants.js' +import { assertBraidState, DomainInvariantError } from './invariants.js' import { migrateLegacyInteractions } from './legacy-interaction-snapshot.js' import type { MaterializedState } from './materialized-state.js' import { canonicalProjectionChecksum } from './projection-checksum.js' import { withHealth } from './reducer-helpers.js' -import { type BraidState, initialState } from './state.js' +import { normalizeActiveRuns, type BraidState, initialState } from './state.js' export const MATERIALIZED_SNAPSHOT_SCHEMA_VERSION = 1 as const @@ -44,6 +44,8 @@ function materializedState(state: BraidState): MaterializedState { messages: state.messages, messageParts: state.messageParts, runs: state.runs, + activeRuns: state.activeRuns, + focusedRunId: state.focusedRunId, activeRunId: state.activeRunId, queuedInputs: state.queuedInputs, lastError: state.lastError, @@ -138,9 +140,12 @@ export function restoreMaterializedState(value: unknown): BraidState { const stateFields = migrateLegacyInteractions({ ...snapshot.state } as MaterializedState & { interactions?: unknown }) - const restored: BraidState = { + validatePersistedActiveRunReferences(stateFields) + const restored: BraidState = normalizeActiveRuns({ ...base, ...stateFields, + activeRuns: stateFields.activeRuns ?? base.activeRuns, + focusedRunId: stateFields.focusedRunId ?? stateFields.activeRunId ?? base.focusedRunId, revision: snapshot.revision, sequence: snapshot.sequence, appliedEvents: [], @@ -152,7 +157,7 @@ export function restoreMaterializedState(value: unknown): BraidState { missingHistoryCount: snapshot.state.missingHistory.length, unknownEventCount: 0, }, - } + }) const healthy = withHealth(restored) const finalized: BraidState = { ...healthy, @@ -161,3 +166,28 @@ export function restoreMaterializedState(value: unknown): BraidState { assertBraidState(finalized) return finalized } + +function validatePersistedActiveRunReferences(state: MaterializedState): void { + const runs = new Map(state.runs.map((run) => [run.id, run])) + for (const [name, runId] of [ + ['activeRunId', state.activeRunId], + ['focusedRunId', state.focusedRunId], + ] as const) { + if (runId !== null && runId !== undefined && !runs.has(runId)) { + throw new DomainInvariantError(`state.${name} references unknown run ${runId}`) + } + } + const seen = new Set() + for (const active of state.activeRuns ?? []) { + if (seen.has(active.runId)) { + throw new DomainInvariantError(`state.activeRuns contains duplicate run ${active.runId}`) + } + seen.add(active.runId) + const run = runs.get(active.runId) + if (!run) + throw new DomainInvariantError(`state.activeRuns references unknown run ${active.runId}`) + if (run.conversationId !== active.conversationId || run.branchId !== active.branchId) { + throw new DomainInvariantError(`state.activeRuns has stale identity for run ${active.runId}`) + } + } +} diff --git a/src/domain/materialized-state.ts b/src/domain/materialized-state.ts index 6296f613..99369b9c 100644 --- a/src/domain/materialized-state.ts +++ b/src/domain/materialized-state.ts @@ -28,6 +28,7 @@ import type { WorkerRecord, WorkspaceRecord, } from './entities.js' +import type { ActiveRunRef } from './state.js' import type { BranchId, ConversationId, RunId, WorkspaceId } from './ids.js' import type { BraidState } from './state.js' @@ -44,6 +45,10 @@ export interface MaterializedState { readonly messages: readonly BraidMessage[] readonly messageParts: readonly MessagePartRecord[] readonly runs: readonly BraidRun[] + /** Optional so snapshots written before concurrent-run support remain readable. */ + readonly activeRuns?: readonly ActiveRunRef[] + /** Optional so snapshots written before concurrent-run support remain readable. */ + readonly focusedRunId?: RunId | null readonly activeRunId: RunId | null readonly queuedInputs: BraidState['queuedInputs'] readonly lastError: string | null diff --git a/src/domain/reducer-conversation-events.ts b/src/domain/reducer-conversation-events.ts index 5b6443c2..f2536d17 100644 --- a/src/domain/reducer-conversation-events.ts +++ b/src/domain/reducer-conversation-events.ts @@ -1,7 +1,7 @@ import type { BraidEvent } from './events.js' import { DomainInvariantError } from './invariants-base.js' import { find, upsert } from './reducer-helpers.js' -import type { BraidState } from './state.js' +import { activeRunForBranch, normalizeActiveRuns, type BraidState } from './state.js' type ConversationEvent = Extract< BraidEvent, @@ -54,8 +54,6 @@ export function applyConversationEvent(state: BraidState, event: ConversationEve graphEdges: upsertMany(state.graphEdges, event.graphEdges), feedbackDecisions: upsertMany(state.feedbackDecisions, event.feedbackDecisions), operations: upsert(state.operations, event.operation), - activeRunId: null, - queuedInputs: [], draft: event.drafts.find((draft) => draft.branchId === event.conversation.activeBranchId) ?.text ?? '', @@ -73,7 +71,7 @@ export function applyConversationEvent(state: BraidState, event: ConversationEve const conversation = event.conversation ?? previous const branchId = event.branchId ?? conversation.activeBranchId find(state.branches, branchId, 'Branch') - return { + return focusSelectedBranch({ ...state, conversationId: event.conversationId, branchId, @@ -82,7 +80,7 @@ export function applyConversationEvent(state: BraidState, event: ConversationEve ...(event.operation === undefined ? {} : { operations: upsert(state.operations, event.operation) }), - } + }) } case 'conversation.deleted': return applyConversationDeletion(state, event) @@ -123,7 +121,7 @@ export function applyConversationEvent(state: BraidState, event: ConversationEve } case 'branch.selected': find(state.branches, event.branchId, 'Branch') - return { + return focusSelectedBranch({ ...state, conversationId: event.conversationId, branchId: event.branchId, @@ -131,10 +129,15 @@ export function applyConversationEvent(state: BraidState, event: ConversationEve ...(event.operation === undefined ? {} : { operations: upsert(state.operations, event.operation) }), - } + }) } } +function focusSelectedBranch(state: BraidState): BraidState { + const active = activeRunForBranch(state, state.conversationId, state.branchId) + return normalizeActiveRuns(state, active?.id) +} + function applyConversationDeletion( state: BraidState, event: Extract, diff --git a/src/domain/reducer-domain-events.ts b/src/domain/reducer-domain-events.ts index caf09643..49cf986f 100644 --- a/src/domain/reducer-domain-events.ts +++ b/src/domain/reducer-domain-events.ts @@ -6,7 +6,7 @@ import { applyExecutionObservation } from './reducer-execution-observation.js' import { find, updateRun, upsert, upsertBy } from './reducer-helpers.js' import { applyRetainedAdmission } from './reducer-retained-admission.js' import { isCancellationConfirmedReconciliation } from './reducer-support.js' -import type { BraidState } from './state.js' +import { normalizeActiveRuns, type BraidState } from './state.js' export function applyDomainEvent( state: BraidState, @@ -95,6 +95,10 @@ export function applyDomainEvent( runs: upsert(state.runs, { ...run, bindingId: event.bindingId, updatedAt: at }), } } + case 'run.focused': { + if (event.runId !== null) find(state.runs, event.runId, 'Run') + return normalizeActiveRuns({ ...state, focusedRunId: event.runId }, event.runId) + } case 'run.retained.admitted': return applyRetainedAdmission(state, event, at) case 'run.status.changed': { diff --git a/src/domain/reducer-helpers.ts b/src/domain/reducer-helpers.ts index fb227043..582835e0 100644 --- a/src/domain/reducer-helpers.ts +++ b/src/domain/reducer-helpers.ts @@ -27,7 +27,7 @@ import { import { DomainInvariantError } from './invariants.js' import { createAdmissionReceipt } from './receipts.js' import { LEGACY_RUN_CAPABILITIES } from './runtime-projection.js' -import type { BraidMessagePart, BraidState } from './state.js' +import { normalizeActiveRuns, type BraidMessagePart, type BraidState } from './state.js' export class SequenceGapError extends Error { readonly code = 'SEQUENCE_GAP' @@ -197,12 +197,16 @@ export function legacyMessage( turnId: import('./ids.js').TurnId, status: BraidMessage['status'], at: string, + identity: { + readonly conversationId?: BraidMessage['conversationId'] + readonly branchId?: BraidMessage['branchId'] + } = {}, ): MessageRecord { const partId = defaultPartId(id) return { id, - conversationId: state.conversationId, - branchId: state.branchId, + conversationId: identity.conversationId ?? state.conversationId, + branchId: identity.branchId ?? state.branchId, role, text, partIds: [partId], @@ -374,12 +378,10 @@ export function updateRun(state: BraidState, run: RunRecord, at: string): BraidS updatedAt: at, ...(terminal && run.terminalAt === undefined ? { terminalAt: at } : {}), } - const activeRunId = terminal && state.activeRunId === run.id ? null : state.activeRunId - return { + return normalizeActiveRuns({ ...state, runs: upsert(state.runs, nextRun), - activeRunId, - } + }) } export function updateMessage(state: BraidState, message: MessageRecord): BraidState { diff --git a/src/domain/reducer-interactions.ts b/src/domain/reducer-interactions.ts index 031cd1ac..0542fa8c 100644 --- a/src/domain/reducer-interactions.ts +++ b/src/domain/reducer-interactions.ts @@ -14,7 +14,6 @@ import { MAX_RUN_INTERACTIONS, type ReducerBase, sourceFromProvider, - TERMINAL_RUN_STATES, terminalMessageStatus, terminalPartStatus, updateMessage, @@ -210,12 +209,6 @@ export function reduceInteractionEvent( return { ...state, ...base, - activeRunId: - event.status === 'detached' || TERMINAL_RUN_STATES.includes(event.status) - ? state.activeRunId === event.runId - ? null - : state.activeRunId - : event.runId, runs: updateRun(state, event.runId, (run) => addActivity( { ...withProviderProgress({ ...run, status: event.status }, event.provider) }, @@ -416,7 +409,6 @@ function reduceFinishedEvent( return { ...state, ...base, - activeRunId: state.activeRunId === event.runId ? null : state.activeRunId, lastError: errorReservation?.value ?? (event.status === 'failed' ? state.lastError : null), messages: updateMessage(state, event.runId, (message) => { const source = sourceFromProvider(event.provider) diff --git a/src/domain/reducer-legacy.ts b/src/domain/reducer-legacy.ts index 99f04f8a..88c6b48c 100644 --- a/src/domain/reducer-legacy.ts +++ b/src/domain/reducer-legacy.ts @@ -20,7 +20,7 @@ import { import { attachRequestedRunToConversation } from './reducer-run-graph.js' import { terminalPartStatus } from './reducer-support.js' import { finalizeRunUsage } from './run-usage.js' -import type { BraidState } from './state.js' +import { activeRunForBranch, isActiveRunStatus, type BraidState } from './state.js' function legacyOperation( state: BraidState, @@ -78,8 +78,8 @@ export function reduceLegacyEvent( const operationId = parseOperationId(event.operationId) const userMessageId = parseMessageId(event.userMessageId) const assistantMessageId = parseMessageId(event.assistantMessageId) - if (state.activeRunId !== null) - throw new DomainInvariantError(`Run ${state.activeRunId} is already active`) + const existing = activeRunForBranch(state, state.conversationId, state.branchId) + if (existing) throw new DomainInvariantError(`Run ${existing.id} is already active`) const userMessage = legacyMessage( state, userMessageId, @@ -136,6 +136,7 @@ export function reduceLegacyEvent( drafts: state.drafts.map((draft) => draft.branchId === state.branchId ? { ...draft, text: '', updatedAt: at } : draft, ), + focusedRunId: runId, activeRunId: runId, lastError: null, messages: upsert(upsert(state.messages, userMessage), assistantMessage), @@ -149,7 +150,8 @@ export function reduceLegacyEvent( } case 'run.text.delta': { const runId = parseRunId(event.runId) - if (state.activeRunId !== runId) + const run = state.runs.find((candidate) => candidate.id === runId) + if (!run || !isActiveRunStatus(run.status)) throw new DomainInvariantError(`Text arrived for inactive run ${runId}`) return updateMessageText(state, runId, event.text, at) } diff --git a/src/domain/reducer-lifecycle.ts b/src/domain/reducer-lifecycle.ts index 5b2661b5..7bed7702 100644 --- a/src/domain/reducer-lifecycle.ts +++ b/src/domain/reducer-lifecycle.ts @@ -1,6 +1,8 @@ import type { RunRecord, TurnRecord } from './entities.js' import type { BraidEvent } from './events.js' import { + parseBranchId, + parseConversationId, parseDigestValue, parseMessageId, parseOperationId, @@ -24,7 +26,7 @@ import { upsertPart, } from './reducer-support.js' import { LEGACY_RUN_CAPABILITIES } from './runtime-projection.js' -import type { BraidState } from './state.js' +import { activeRunForBranch, type BraidState } from './state.js' type LifecycleEvent = Extract< BraidEvent, @@ -131,6 +133,8 @@ export function reduceLifecycleEvent( { operationId: event.operationId, runId: event.runId, + ...(event.conversationId === undefined ? {} : { conversationId: event.conversationId }), + ...(event.branchId === undefined ? {} : { branchId: event.branchId }), text: event.text, position: event.position, }, @@ -151,7 +155,6 @@ export function reduceLifecycleEvent( return { ...state, ...base, - activeRunId: state.activeRunId === event.runId ? null : state.activeRunId, runs: updateRun(state, event.runId, (run) => addActivity( { @@ -167,7 +170,7 @@ export function reduceLifecycleEvent( return { ...state, ...base, - activeRunId: event.runId, + focusedRunId: event.runId, runs: updateRun(state, event.runId, (run) => addActivity( { ...run, status: 'reconnecting' }, @@ -199,7 +202,6 @@ export function reduceLifecycleEvent( return { ...state, ...base, - activeRunId: state.activeRunId === event.runId ? null : state.activeRunId, lastError: null, messages: updateMessage(state, event.runId, (message) => ({ ...message, @@ -226,12 +228,7 @@ export function reduceLifecycleEvent( return { ...state, ...base, - activeRunId: - isTerminalStatus(to) && state.activeRunId === event.runId - ? null - : isTerminalStatus(to) - ? state.activeRunId - : event.runId, + ...(isTerminalStatus(to) ? {} : { focusedRunId: event.runId }), runs: updateRun(state, event.runId, (run) => addActivity( { ...run, status: to }, @@ -244,7 +241,6 @@ export function reduceLifecycleEvent( return { ...state, ...base, - activeRunId: state.activeRunId === event.runId ? null : state.activeRunId, messages: state.messages.map((message) => message.runId === event.runId && message.role === 'assistant' ? { @@ -289,7 +285,6 @@ function reduceRequestedRun( base: ReducerBase, occurredAt: string, ): BraidState { - if (state.activeRunId) throw new Error(`Run ${state.activeRunId} is already active`) const runId = parseRunId(event.runId) const turnId = parseTurnId(event.turnId) const userMessageId = parseMessageId(event.userMessageId) @@ -307,6 +302,10 @@ function reduceRequestedRun( text: event.text, capabilities: LEGACY_RUN_CAPABILITIES, }) + const conversationId = parseConversationId(receipt.conversationId) + const branchId = parseBranchId(receipt.branchId) + const existing = activeRunForBranch(state, conversationId, branchId) + if (existing) throw new Error(`Run ${existing.id} is already active on branch ${branchId}`) const userMessage = legacyMessage( state, userMessageId, @@ -316,6 +315,7 @@ function reduceRequestedRun( turnId, 'complete', occurredAt, + { conversationId, branchId }, ) const assistantMessage = { ...legacyMessage( @@ -327,13 +327,14 @@ function reduceRequestedRun( turnId, 'streaming', occurredAt, + { conversationId, branchId }, ), parts: [], } const turn: TurnRecord = { id: turnId, - conversationId: state.conversationId, - branchId: state.branchId, + conversationId, + branchId, userMessageId, runIds: [runId], status: 'running', @@ -348,8 +349,8 @@ function reduceRequestedRun( )?.id const run: RunRecord = { id: runId, - conversationId: state.conversationId, - branchId: state.branchId, + conversationId, + branchId, turnId, operationId: event.operationId, status: 'streaming' as const, @@ -378,10 +379,11 @@ function reduceRequestedRun( { ...state, ...base, - draft: '', + draft: state.branchId === branchId ? '' : state.draft, drafts: state.drafts.map((draft) => - draft.branchId === state.branchId ? { ...draft, text: '', updatedAt: occurredAt } : draft, + draft.branchId === branchId ? { ...draft, text: '', updatedAt: occurredAt } : draft, ), + focusedRunId: event.runId, activeRunId: event.runId, lastError: null, messages: [...state.messages, userMessage, assistantMessage], @@ -403,6 +405,7 @@ function isTerminalStatus(status: import('./state.js').RunStatus): boolean { status === 'aborted' || status === 'cancelled' || status === 'blocked' || - status === 'expired' + status === 'expired' || + status === 'unknown' ) } diff --git a/src/domain/reducer-replay.ts b/src/domain/reducer-replay.ts index 2297605b..36aedf41 100644 --- a/src/domain/reducer-replay.ts +++ b/src/domain/reducer-replay.ts @@ -18,7 +18,7 @@ import { } from './reducer-helpers.js' import { reduceLegacyEvent } from './reducer-legacy.js' import { isRuntimeEvent, reduceRuntimeEvent } from './reducer-runtime.js' -import { type BraidState, initialState } from './state.js' +import { normalizeActiveRuns, type BraidState, initialState } from './state.js' import { isCanonicalIsoDateTime } from './text.js' export const MAX_APPLIED_EVENT_HISTORY = 256 @@ -39,7 +39,7 @@ function applyEnvelopeMetadata( readonly finalize?: boolean } = {}, ): BraidState { - let next: BraidState = { + let next: BraidState = normalizeActiveRuns({ ...reduced, revision: envelope.revision, sequence: envelope.sequence, @@ -49,7 +49,7 @@ function applyEnvelopeMetadata( ...reduced.appliedEvents, { id: eventId, sequence: envelope.sequence, revision: envelope.revision, digest }, ]), - } + }) const runId = eventRunId(envelope.event) if (envelope.cursor !== undefined && runId !== undefined) { const cursor = parseReplayCursor(envelope.cursor) @@ -81,7 +81,7 @@ function applyEnvelopeMetadata( } function finalizeReducedState(state: BraidState): BraidState { - const healthy = withHealth(state) + const healthy = withHealth(normalizeActiveRuns(state)) const finalized = { ...healthy, projectionChecksum: canonicalProjectionChecksum(healthy), diff --git a/src/domain/reducer-run-graph.ts b/src/domain/reducer-run-graph.ts index 96c42890..cf0722ce 100644 --- a/src/domain/reducer-run-graph.ts +++ b/src/domain/reducer-run-graph.ts @@ -57,6 +57,8 @@ export function attachRequestedRunToConversation( provenance, }), ] + const selectedBranch = + state.conversationId === input.run.conversationId && state.branchId === input.run.branchId return { ...state, branches: upsert(state.branches, { @@ -66,7 +68,7 @@ export function attachRequestedRunToConversation( }), conversations: upsert(state.conversations, { ...conversation, - activeBranchId: branch.id, + ...(selectedBranch ? { activeBranchId: branch.id } : {}), updatedAt: input.at, }), graphNodes: nodes.reduce(upsert, state.graphNodes), diff --git a/src/domain/reducer-support.ts b/src/domain/reducer-support.ts index 4bc9b213..0672303e 100644 --- a/src/domain/reducer-support.ts +++ b/src/domain/reducer-support.ts @@ -59,7 +59,7 @@ export function activity( detail?: string, source?: MessagePartSource, ): BraidActivity { - const runId = 'runId' in event ? event.runId : 'run-unknown' + const runId = 'runId' in event && event.runId ? event.runId : 'run-unknown' return { id: `${runId}:${type}:${source?.eventId ?? 'local'}:${label}`, runId, diff --git a/src/domain/runtime-projection.ts b/src/domain/runtime-projection.ts index 3882daeb..8aa613dd 100644 --- a/src/domain/runtime-projection.ts +++ b/src/domain/runtime-projection.ts @@ -82,6 +82,9 @@ export interface BraidActivity { export interface QueuedInput { readonly operationId: string readonly runId: string + /** The continuation scope remains stable if the user switches branches. */ + readonly conversationId?: string + readonly branchId?: string readonly text: string readonly position: number } diff --git a/src/domain/state.ts b/src/domain/state.ts index 8df67be2..8bb05f00 100644 --- a/src/domain/state.ts +++ b/src/domain/state.ts @@ -26,6 +26,7 @@ import type { QueueEntryRecord, QueueRecord, ReplayCursorRecord, + RunStatus, SupervisorRecord, TurnRecord, UnknownEventRecord, @@ -61,6 +62,13 @@ export interface StateHealth { readonly unknownEventCount: number } +/** Identifies one run that is still able to produce work. */ +export interface ActiveRunRef { + readonly runId: RunId + readonly conversationId: ConversationId + readonly branchId: BranchId +} + export interface BraidState { readonly schemaVersion: 2 readonly revision: number @@ -78,6 +86,10 @@ export interface BraidState { readonly messages: readonly BraidMessage[] readonly messageParts: readonly MessagePartRecord[] readonly runs: readonly BraidRun[] + /** All non-terminal runs, grouped by their immutable conversation and branch identity. */ + readonly activeRuns: readonly ActiveRunRef[] + /** The run that owns foreground controls and the current work focus. */ + readonly focusedRunId: RunId | null readonly activeRunId: RunId | null readonly queuedInputs: readonly QueuedInput[] readonly lastError: string | null @@ -134,6 +146,8 @@ export function initialState( messages: [], messageParts: [], runs: [], + activeRuns: [], + focusedRunId: null, activeRunId: null, queuedInputs: [], lastError: null, @@ -174,3 +188,68 @@ export function initialState( }, } } + +const TERMINAL_RUN_STATUSES: readonly RunStatus[] = [ + 'completed', + 'failed', + 'aborted', + 'cancelled', + 'blocked', + 'expired', + 'unknown', +] + +/** Returns true while a run can still receive provider or user work. */ +export function isActiveRunStatus(status: RunStatus): boolean { + return !TERMINAL_RUN_STATUSES.includes(status) +} + +/** Returns true while Braid still owns a live local execution operation. */ +export function isLiveRunStatus(status: RunStatus): boolean { + return isActiveRunStatus(status) && status !== 'detached' +} + +/** Derives the branch-scoped active run index from canonical run records. */ +export function activeRunRefs(state: BraidState): readonly ActiveRunRef[] { + return state.runs + .filter((run) => isActiveRunStatus(run.status)) + .map((run) => ({ + runId: run.id, + conversationId: run.conversationId, + branchId: run.branchId, + })) +} + +/** Returns the active run for one branch without using the compatibility focus alias. */ +export function activeRunForBranch( + state: BraidState, + conversationId: string, + branchId: string, +): BraidRun | undefined { + return state.runs.find( + (run) => + run.conversationId === conversationId && + run.branchId === branchId && + isActiveRunStatus(run.status), + ) +} + +/** Rebuilds active-run refs and keeps the old activeRunId field as a focused-run alias. */ +export function normalizeActiveRuns(state: BraidState, preferredRunId?: RunId | null): BraidState { + const activeRuns = activeRunRefs(state) + const activeIds = new Set(activeRuns.map((run) => run.runId)) + const existingFocus = state.focusedRunId ?? state.activeRunId + const requestedFocus = preferredRunId === undefined ? existingFocus : preferredRunId + const focusedRun = + requestedFocus !== null && requestedFocus !== undefined + ? state.runs.find((run) => run.id === requestedFocus) + : undefined + const fallback = activeRuns.at(-1)?.runId + const focusedRunId = focusedRun?.id ?? fallback ?? null + return { + ...state, + activeRuns, + focusedRunId, + activeRunId: focusedRunId !== null && activeIds.has(focusedRunId) ? focusedRunId : null, + } +} diff --git a/src/views/headless/rpc.ts b/src/views/headless/rpc.ts index 5adcab27..e2b6339e 100644 --- a/src/views/headless/rpc.ts +++ b/src/views/headless/rpc.ts @@ -102,6 +102,8 @@ function stateResponse( queue: view.queue ?? [], queueCount: view.queueCount, activeRunId: state.activeRunId, + ...(state.focusedRunId === undefined ? {} : { focusedRunId: state.focusedRunId }), + ...(state.activeRuns === undefined ? {} : { activeRuns: state.activeRuns }), lastError: state.lastError, }, } diff --git a/src/views/shared/intents.ts b/src/views/shared/intents.ts index e7573ac8..d481618e 100644 --- a/src/views/shared/intents.ts +++ b/src/views/shared/intents.ts @@ -26,14 +26,29 @@ export type BraidIntent = readonly conversationId?: string readonly branchId?: string } - | { readonly type: 'queue'; readonly operationId: string; readonly text: string } - | { readonly type: 'steer'; readonly operationId: string; readonly text: string } + | { + readonly type: 'queue' + readonly operationId: string + readonly text: string + readonly runId?: string + } + | { + readonly type: 'steer' + readonly operationId: string + readonly text: string + readonly runId?: string + } | { readonly type: 'cancel-run' readonly operationId: string readonly runId?: string readonly reason?: string } + | { + readonly type: 'focus-run' + readonly operationId: string + readonly runId: string + } | { readonly type: 'respond-interaction' readonly operationId: string diff --git a/src/views/shared/models.ts b/src/views/shared/models.ts index 99c053ab..7549fd70 100644 --- a/src/views/shared/models.ts +++ b/src/views/shared/models.ts @@ -230,6 +230,25 @@ export interface RunView { readonly interactionsTruncated?: boolean } +export interface WorkStripItemView { + readonly id: string + readonly runId: string + readonly conversationId: string + readonly branchId: string + readonly state: ViewStatus | 'queued' + readonly runner?: string + readonly model?: string + readonly interactionCount: number + readonly focused: boolean + readonly queueOperationId?: string + readonly actions: Readonly<{ + readonly switch: boolean + readonly ask: boolean + readonly steer: boolean + readonly cancel: boolean + }> +} + export interface SubjectView { readonly type: string readonly title: string @@ -573,6 +592,9 @@ export interface BraidViewModel { readonly sessionUsage: SessionUsageView readonly environments: readonly EnvironmentView[] readonly activeRunId?: string + readonly focusedRunId?: string + /** Present only when multiple runs or queued continuations need attention. */ + readonly workStrip?: readonly WorkStripItemView[] readonly interactions: readonly InteractionView[] readonly activity: readonly ActivityItemView[] readonly graph: readonly GraphNodeView[] @@ -703,6 +725,12 @@ export interface HeadlessState { readonly status: 'queued' | 'blocked' | 'unknown' }[] readonly activeRunId: string | null + readonly focusedRunId?: string | null + readonly activeRuns?: readonly { + readonly runId: string + readonly conversationId: string + readonly branchId: string + }[] readonly lastError: string | null readonly storageFailure?: string readonly cleanupUncertain?: string @@ -729,6 +757,12 @@ export interface HeadlessSummary { }[] readonly queueCount: number readonly activeRunId: string | null + readonly focusedRunId?: string | null + readonly activeRuns?: readonly { + readonly runId: string + readonly conversationId: string + readonly branchId: string + }[] readonly lastError: string | null } diff --git a/src/views/tui/activity-browser.ts b/src/views/tui/activity-browser.ts index 89ca6100..99cd98dc 100644 --- a/src/views/tui/activity-browser.ts +++ b/src/views/tui/activity-browser.ts @@ -19,6 +19,7 @@ export interface ActivityBrowserOptions { readonly view: () => BraidViewModel readonly rows: () => number readonly onClose: () => void + readonly onOpenSelected?: (row: EntityBrowserRow) => void readonly scope?: ActivityBrowserScope readonly selectedId?: string readonly openSelected?: boolean @@ -43,6 +44,7 @@ export class ActivityBrowserPanel extends EntityBrowser { ), rows: options.rows, onClose: options.onClose, + ...(options.onOpenSelected === undefined ? {} : { onOpenSelected: options.onOpenSelected }), ...(options.selectedId === undefined ? {} : { selectedId: options.selectedId }), ...(options.openSelected === undefined ? {} : { openSelected: options.openSelected }), }) @@ -117,6 +119,7 @@ function rowFor( return { id: item.id, kind: item.kind, + ...(item.runId === undefined ? {} : { runId: item.runId }), title: entity?.title ?? item.title, status: item.status, ...(meta === undefined ? {} : { meta }), diff --git a/src/views/tui/entity-browser.ts b/src/views/tui/entity-browser.ts index 9c0b00ab..13af5c93 100644 --- a/src/views/tui/entity-browser.ts +++ b/src/views/tui/entity-browser.ts @@ -15,6 +15,7 @@ import type { BraidTheme } from './theme.js' export interface EntityBrowserRow { readonly id: string readonly kind: string + readonly runId?: string readonly title: string readonly status: string readonly meta?: string @@ -37,6 +38,7 @@ export interface EntityBrowserOptions { readonly document: (selectedId?: string) => EntityBrowserDocument readonly rows: () => number readonly onClose: () => void + readonly onOpenSelected?: (row: EntityBrowserRow) => void readonly selectedId?: string readonly openSelected?: boolean } @@ -49,6 +51,7 @@ export class EntityBrowser extends Container implements Focusable, ModalBackTarg readonly #document: (selectedId?: string) => EntityBrowserDocument readonly #terminalRows: () => number readonly #onClose: () => void + readonly #onOpenSelected: ((row: EntityBrowserRow) => void) | undefined #selectedId: string | undefined #selectedIndex = 0 #page = 0 @@ -62,6 +65,7 @@ export class EntityBrowser extends Container implements Focusable, ModalBackTarg this.#document = options.document this.#terminalRows = options.rows this.#onClose = options.onClose + this.#onOpenSelected = options.onOpenSelected this.#selectedId = options.selectedId this.#mode = options.openSelected === true ? 'detail' : 'list' } @@ -110,6 +114,8 @@ export class EntityBrowser extends Container implements Focusable, ModalBackTarg } if (document.rows.length === 0) return if (matchesKey(data, 'enter') || matchesKey(data, 'return') || matchesKey(data, 'right')) { + const selected = document.rows[this.#selectedIndex] + if (selected !== undefined) this.#onOpenSelected?.(selected) if (!wide && this.#mode === 'list') { this.#mode = 'detail' this.#page = 0 diff --git a/src/views/tui/terminal-chrome.ts b/src/views/tui/terminal-chrome.ts index 0e37d3ff..4f3aae89 100644 --- a/src/views/tui/terminal-chrome.ts +++ b/src/views/tui/terminal-chrome.ts @@ -1,5 +1,5 @@ import type { Component } from '@earendil-works/pi-tui' -import type { BraidViewModel, EnvironmentView } from '../shared/models.js' +import type { BraidViewModel, EnvironmentView, WorkStripItemView } from '../shared/models.js' import { sanitizeNotification } from '../shared/sanitize.js' import type { ComposerMode } from './composer-view.js' import { type ExecutionTargetView, executionTargetFor } from './execution-target.js' @@ -53,8 +53,12 @@ export class TerminalChrome implements Component { const mode = terminalContextModeForColumns(safeWidth) const target = executionTargetFor(view) const transientNotice = state.quitArmed ? undefined : transientNoticeFor(view) + const workStrip = renderWorkStrip(this.#theme, view, mode, safeWidth) if (mode === 'narrow' && transientNotice !== undefined) { - return boundedTerminalRows([statusText(this.#theme, view, transientNotice)], safeWidth) + return boundedTerminalRows( + [statusText(this.#theme, view, transientNotice), ...workStrip], + safeWidth, + ) } const statusValue = transientNotice ?? conciseStatus(view, state.quitArmed, mode) const status = statusText(this.#theme, view, statusValue) @@ -106,16 +110,53 @@ export class TerminalChrome implements Component { mode === 'narrow' || state.quitArmed ? 'right' : 'left', ) const identityRows = noticeRow === undefined ? [identityRow] : [identityRow, noticeRow] - if (mode !== 'wide') return boundedTerminalRows(identityRows, safeWidth) + if (mode !== 'wide') return boundedTerminalRows([...identityRows, ...workStrip], safeWidth) const detailFacts = executionFacts.map((fact) => terminalValuePart(this.#theme, fact)) if (detailFacts.length === 0 && measured.length === 0) { - return boundedTerminalRows(identityRows, safeWidth) + return boundedTerminalRows([...identityRows, ...workStrip], safeWidth) } const detailRow = fitTerminalColumns(detailFacts, measured, safeWidth, 'right') - return boundedTerminalRows([...identityRows, ...(detailRow ? [detailRow] : [])], safeWidth) + return boundedTerminalRows( + [...identityRows, ...workStrip, ...(detailRow ? [detailRow] : [])], + safeWidth, + ) } } +function renderWorkStrip( + theme: BraidTheme, + view: BraidViewModel, + mode: ReturnType, + width: number, +): readonly string[] { + const items = view.workStrip + if (items === undefined || items.length < 2) return [] + if (mode === 'narrow') { + return [fitTerminalAtomic(theme.muted(`work ${items.length} · /activity to switch`), width)] + } + const limit = mode === 'wide' ? Math.min(items.length, 8) : Math.min(items.length, 3) + const rows = items.slice(0, limit).map((item) => workStripItem(theme, item, width)) + if (items.length > limit) { + rows.push(theme.muted(`work +${items.length - limit} more · /activity to browse`)) + } + return rows +} + +function workStripItem(theme: BraidTheme, item: WorkStripItemView, width: number): string { + const marker = item.focused ? theme.accent('›') : theme.muted('·') + const state = sanitizeNotification(item.state) + const runner = sanitizeNotification(item.runner ?? '?') + const model = sanitizeNotification(item.model ?? '?') + const actions = Object.entries(item.actions) + .map(([name, available]) => `${available ? '' : '!'}${name}`) + .join('/') + const actionText = ` · actions ${actions}` + return fitTerminalAtomic( + `${marker} ${item.branchId} · ${state} · ${runner}/${model} · ${item.interactionCount} interaction${item.interactionCount === 1 ? '' : 's'}${actionText}`, + width, + ) +} + function boundedTerminalRows(rows: readonly string[], width: number): string[] { return rows.map((row) => fitTerminalAtomic(row, width)) } diff --git a/src/views/tui/terminal-command-controller.ts b/src/views/tui/terminal-command-controller.ts index 06cf055a..13ae8705 100644 --- a/src/views/tui/terminal-command-controller.ts +++ b/src/views/tui/terminal-command-controller.ts @@ -115,8 +115,13 @@ export class TerminalCommandController { const intent: BraidIntent = !active ? { type: 'send', operationId, text: parsed.text } : steerSelected - ? steerIntent(operationId, parsed.text) - : { type: 'queue', operationId, text: parsed.text } + ? steerIntent(operationId, parsed.text, view.activeRunId) + : { + type: 'queue', + operationId, + text: parsed.text, + ...(view.activeRunId === undefined ? {} : { runId: view.activeRunId }), + } void this.#dispatch(intent, rawText) } @@ -184,7 +189,9 @@ export class TerminalCommandController { this.#overlays.openUnavailable('/steer', 'Steering requires an operation identifier') return } - void this.#dispatch(steerIntent(operationId, args.join(' '))) + void this.#dispatch( + steerIntent(operationId, args.join(' '), this.#controller.view().activeRunId), + ) return } const intent = commandIntent(command, args, operationId) @@ -262,8 +269,12 @@ export class TerminalCommandController { } } -function steerIntent(operationId: string, text: string): Extract { - return { type: 'steer', operationId, text } +function steerIntent( + operationId: string, + text: string, + runId: string | undefined, +): Extract { + return { type: 'steer', operationId, text, ...(runId === undefined ? {} : { runId }) } } function isExplicitAnalysisSource(value: string | undefined): boolean { diff --git a/src/views/tui/terminal-input-controller.ts b/src/views/tui/terminal-input-controller.ts index 56b098df..66f38f3c 100644 --- a/src/views/tui/terminal-input-controller.ts +++ b/src/views/tui/terminal-input-controller.ts @@ -152,7 +152,7 @@ export class TerminalInputController { matchesKeyAction(data, this.#keymap, 'exit') && !this.#tui.hasOverlay() && !this.#shell.editor.getText() && - !this.#controller.view().activeRunId + liveRunId(this.#controller.view()) === undefined ) { this.#requestShutdown() return { consume: true } @@ -162,8 +162,14 @@ export class TerminalInputController { this.#shell.editor.setText('') return { consume: true } } - if (this.#controller.view().activeRunId) { - void this.#dispatch({ type: 'cancel-run', operationId: this.#nextOperationId() }) + const view = this.#controller.view() + const runId = liveRunId(view) + if (runId) { + void this.#dispatch({ + type: 'cancel-run', + operationId: this.#nextOperationId(), + runId, + }) return { consume: true } } if (this.#quitArmed) this.#requestShutdown() @@ -218,3 +224,16 @@ export class TerminalInputController { this.#stateChanged() } } + +function liveRunId(view: ReturnType): string | undefined { + for (const runId of [view.focusedRunId, view.activeRunId]) { + if (runId === undefined) continue + const run = view.runs.find((candidate) => candidate.id === runId) + if ( + run !== undefined && + !['completed', 'cancelled', 'failed', 'expired', 'unknown', 'detached'].includes(run.status) + ) + return runId + } + return undefined +} diff --git a/src/views/tui/terminal-overlays.ts b/src/views/tui/terminal-overlays.ts index f75081e1..3d002f3d 100644 --- a/src/views/tui/terminal-overlays.ts +++ b/src/views/tui/terminal-overlays.ts @@ -100,6 +100,13 @@ export class TerminalOverlayController { : { keymapDiagnostic: options.keymapDiagnostic }), openProfile: () => this.openProfile(), openConnection: () => this.openConnection(), + focusRun: (runId) => { + void this.#controller.dispatch({ + type: 'focus-run', + operationId: this.#nextOperationId(), + runId, + }) + }, }) this.#automation = new AutomationOverlayWorkflow({ theme: this.#theme, diff --git a/src/views/tui/terminal-surface-overlays.ts b/src/views/tui/terminal-surface-overlays.ts index 81597e65..86ccd05a 100644 --- a/src/views/tui/terminal-surface-overlays.ts +++ b/src/views/tui/terminal-surface-overlays.ts @@ -11,6 +11,7 @@ import type { ModalCoordinator } from './modal-coordinator.js' import { SearchableSelector } from './selector.js' import { UnavailablePanel } from './terminal-shell.js' import type { BraidTheme } from './theme.js' +import type { EntityBrowserRow } from './entity-browser.js' export interface TerminalSurfaceOverlayOptions { readonly theme: BraidTheme @@ -22,6 +23,7 @@ export interface TerminalSurfaceOverlayOptions { readonly keymapDiagnostic?: () => string | undefined readonly openProfile: () => void readonly openConnection: () => void + readonly focusRun?: (runId: string) => void } export interface IntelligenceProgressHandle { @@ -179,10 +181,16 @@ export class TerminalSurfaceOverlays { ...(selectedId === undefined ? {} : { selectedId }), ...(emptyMessage === undefined ? {} : { emptyMessage }), ...(pinned === undefined ? {} : { pinned }), + onOpenSelected: (row) => this.#focusSelectedRun(row), openSelected, }) } + #focusSelectedRun(row: EntityBrowserRow): void { + if (row.kind !== 'run' || row.runId === undefined) return + this.#options.focusRun?.(row.runId) + } + #hasActivity(id: string): boolean { return this.#options.controller.view().activity.some((item) => item.id === id) } diff --git a/test/application.test.ts b/test/application.test.ts index 31e17687..862dae2d 100644 --- a/test/application.test.ts +++ b/test/application.test.ts @@ -11,12 +11,17 @@ import { createBraidApplication, DETERMINISTIC_PROFILE } from '../src/app/compos import { effectRequestDigest } from '../src/app/effect-coordinator.js' import { MemoryJournal } from '../src/app/journal.js' import { createProfileRecord } from '../src/app/profiles.js' +import { + createInteractionRequest, + rebindInteractionRequest, +} from '../src/app/interaction-request.js' import { safeRuntimeDiagnostic } from '../src/app/provider-values.js' import { runEffectRequest } from '../src/app/run-admission.js' import type { ConnectionRecord } from '../src/domain/entities.js' import type { BraidEventEnvelope } from '../src/domain/events.js' import { createConnectionId } from '../src/domain/ids.js' import { assertBraidState } from '../src/domain/invariants.js' +import type { RuntimeEventEnvelope } from '../src/domain/runtime-events.js' import { FixedClock } from '../src/ports/clock.js' import type { JournalPort } from '../src/ports/effect-storage.js' import type { @@ -24,9 +29,11 @@ import type { ExecutionAdmission, ExecutionPort, } from '../src/ports/execution.js' +import { DEFAULT_RUN_CAPABILITIES } from '../src/ports/execution.js' import { SequenceIds } from '../src/ports/ids.js' import { deterministicBackend } from '../src/testing/deterministic-backend.js' import { MAX_RENDERED_TEXT_CHARS } from '../src/views/shared/sanitize.js' +import { interactionResponseRunCapabilities } from './support/run-capabilities.js' function deferred(): { readonly promise: Promise @@ -76,6 +83,401 @@ test('one send streams through runtime and reaches one terminal result', async ( ) }) +test('independent branches stream concurrently while same-branch input waits its turn', async () => { + const dispatches: Array<{ + readonly input: Parameters>[0] + readonly release: () => void + }> = [] + const execution: ExecutionPort = { + capabilities: () => DEFAULT_RUN_CAPABILITIES, + async *streamTurn(input): AsyncIterable { + const gate = deferred() + const aborted = new Promise((resolve) => { + input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + dispatches.push({ input, release: () => gate.resolve() }) + await Promise.race([gate.promise, aborted]) + if (input.signal.aborted) return + yield { + type: 'final', + status: 'completed', + reason: 'concurrent branch test completed', + text: `completed ${input.runId}`, + metadata: { tokenUsage: { input: 1, output: 1 } }, + task: { id: input.runId, intent: 'concurrent branch test' }, + timestamp: '2026-08-03T00:00:00.000Z', + } + }, + } + const journal = new MemoryJournal(new FixedClock()) + const app = new BraidApplication({ + profile: DETERMINISTIC_PROFILE, + execution, + clock: new FixedClock(), + ids: new SequenceIds(), + journal, + effectStorage: journal, + }) + app.initialize('/workspace') + const sourceBranchId = app.state().branchId + const conversationId = app.state().conversationId + + const first = app.send({ operationId: 'op-multirun-first', text: 'first branch turn' }) + await waitUntil(() => dispatches.length === 1, 'first branch did not start') + + const child = await app.conversations.branches.create({ operationId: 'op-multirun-branch' }) + const second = app.send({ operationId: 'op-multirun-second', text: 'second branch turn' }) + await waitUntil(() => dispatches.length === 2, 'independent branch did not start concurrently') + + const queued = app.queueInput({ + operationId: 'op-multirun-queued', + runId: first.runId, + text: 'queued source continuation', + }) + await queued.completion + const active = app.state().activeRuns + assert.equal(active.length, 2) + assert.deepEqual(new Set(active.map((run) => run.branchId)), new Set([sourceBranchId, child.id])) + assert.equal(app.state().queuedInputs.length, 1) + + await app.conversations.lifecycle.open({ + operationId: 'op-multirun-focus-source', + conversationId, + branchId: sourceBranchId, + }) + assert.equal(app.state().focusedRunId, first.runId) + + const changed = await app.conversations.branches.setRunOverrides({ + operationId: 'op-multirun-background-config', + conversationId, + branchId: child.id, + runner: 'codex', + }) + assert.equal(changed.overrides.runner, 'codex') + + dispatches[1]?.release() + await second.completion + assert.deepEqual( + app.state().activeRuns.map((run) => run.runId), + [first.runId], + ) + + dispatches[0]?.release() + await first.completion + await waitUntil(() => dispatches.length === 3, 'same-branch queue did not drain') + assert.equal(app.state().queuedInputs.length, 0) + assert.equal(app.state().activeRuns.length, 1) + assert.equal(dispatches[2]?.input.runId === first.runId, false) + + dispatches[2]?.release() + await app.waitForIdle() + assert.deepEqual(app.state().activeRuns, []) + assert.deepEqual( + app.state().runs.map((run) => run.status), + ['completed', 'completed', 'completed'], + ) + await app.close() +}) + +test('a background branch keeps its interaction response independent after focus switches', async () => { + const interaction = createInteractionRequest({ + id: 'interaction-multirun-background', + kind: 'question', + title: 'Continue the background run?', + body: 'The background run needs a response.', + answerSpec: { + fields: [{ type: 'boolean', name: 'continue', label: 'Continue', required: true }], + }, + responseScopes: ['interaction'], + binding: { + runId: 'run-placeholder', + provider: 'fixture', + environmentId: 'environment-multirun', + sessionId: 'session-multirun', + executionId: 'execution-multirun', + interactionId: 'interaction-multirun-background', + }, + }) + const releases = new Map>>() + const execution: ExecutionPort = { + capabilities: () => interactionResponseRunCapabilities(), + async *streamTurn(input): AsyncIterable { + const release = deferred() + releases.set(input.runId, release) + const aborted = new Promise((resolve) => { + input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + if (input.text === 'background interaction') { + yield { + type: 'interaction', + request: rebindInteractionRequest(interaction, { + ...interaction.binding, + runId: input.runId, + executionId: input.runId, + }), + } + } + await Promise.race([release.promise, aborted]) + if (input.signal.aborted) return + yield { + type: 'final', + status: 'completed', + reason: 'background interaction test completed', + text: `completed ${input.runId}`, + metadata: { tokenUsage: { input: 1, output: 1 } }, + task: { id: input.runId, intent: 'background interaction test' }, + timestamp: '2026-08-03T00:00:00.000Z', + } + }, + respondInteraction: async (input) => { + releases.get(input.command.binding.runId)?.resolve() + return { operationId: input.command.operationId, outcome: 'accepted' as const } + }, + } + const journal = new MemoryJournal(new FixedClock()) + const app = new BraidApplication({ + profile: DETERMINISTIC_PROFILE, + execution, + clock: new FixedClock(), + ids: new SequenceIds(), + journal, + effectStorage: journal, + }) + app.initialize('/workspace') + const conversationId = app.state().conversationId + const first = app.send({ operationId: 'op-multirun-background', text: 'background interaction' }) + await waitUntil( + () => app.state().runs[0]?.interactions[0]?.status === 'pending', + 'background interaction did not arrive', + ) + + const child = await app.conversations.branches.create({ + operationId: 'op-multirun-interaction-branch', + }) + const second = app.send({ operationId: 'op-multirun-foreground', text: 'foreground turn' }) + await waitUntil(() => releases.size === 2, 'foreground branch did not start') + await app.conversations.lifecycle.open({ + operationId: 'op-multirun-focus-foreground', + conversationId, + branchId: child.id, + }) + assert.equal(app.state().focusedRunId, second.runId) + + const backgroundRun = app.state().runs.find((run) => run.id === first.runId) + const pending = backgroundRun?.interactions[0] + assert(backgroundRun && pending) + const response = await app.respondInteraction({ + operationId: 'op-multirun-background-response', + runId: first.runId, + interactionId: pending.request.id, + response: { id: pending.request.id, outcome: 'accepted', data: { continue: true } }, + }) + await response.completion + await first.completion + assert.equal(app.state().runs.find((run) => run.id === first.runId)?.status, 'completed') + assert.equal(app.state().runs.find((run) => run.id === second.runId)?.status, 'streaming') + assert.equal(app.state().focusedRunId, second.runId) + + releases.get(second.runId)?.resolve() + await second.completion + await app.waitForIdle() + assert.deepEqual(app.state().activeRuns, []) + await app.close() +}) + +test('concurrent streams isolate disconnect replay and duplicate provider events', async () => { + const replayCapabilities = { + ...DEFAULT_RUN_CAPABILITIES, + streaming: { ...DEFAULT_RUN_CAPABILITIES.streaming, replay: true }, + events: { ...DEFAULT_RUN_CAPABILITIES.events, cursor: true, stableIdentity: true }, + } as const + const firstStarted = deferred() + const releaseFirstDisconnect = deferred() + const secondStarted = deferred() + const releaseSecondFinal = deferred() + const reconnects: string[] = [] + const execution: ExecutionPort = { + capabilities: () => replayCapabilities, + async *streamTurn(input): AsyncIterable { + const before = { + runId: input.runId, + eventId: `${input.runId}-before`, + sequence: 1, + receivedAt: '2026-08-03T00:00:00.000Z', + event: { type: 'text_delta' as const, text: `before ${input.runId}` }, + } + if (input.text === 'disconnect and replay') { + firstStarted.resolve() + yield before + await releaseFirstDisconnect.promise + throw new Error('concurrent stream disconnected') + } + secondStarted.resolve() + yield before + yield before + await releaseSecondFinal.promise + yield { + runId: input.runId, + eventId: `${input.runId}-final`, + sequence: 2, + receivedAt: '2026-08-03T00:00:00.000Z', + event: { + type: 'final' as const, + status: 'completed' as const, + reason: 'duplicate stream completed', + text: `after ${input.runId}`, + task: { id: input.runId, intent: 'duplicate stream test' }, + timestamp: '2026-08-03T00:00:00.000Z', + }, + } + }, + reconnect: async function* (input): AsyncIterable { + reconnects.push(input.runId) + yield { + runId: input.runId, + eventId: `${input.runId}-replayed-final`, + sequence: 2, + cursor: `${input.runId}-cursor-2`, + receivedAt: '2026-08-03T00:00:00.000Z', + event: { + type: 'final' as const, + status: 'completed' as const, + reason: 'replayed after disconnect', + text: `replayed ${input.runId}`, + task: { id: input.runId, intent: 'replay test' }, + timestamp: '2026-08-03T00:00:00.000Z', + }, + } + }, + } + const journal = new MemoryJournal(new FixedClock()) + const app = new BraidApplication({ + profile: DETERMINISTIC_PROFILE, + execution, + clock: new FixedClock(), + ids: new SequenceIds(), + journal, + effectStorage: journal, + }) + app.initialize('/workspace') + const conversationId = app.state().conversationId + const sourceBranchId = app.state().branchId + const first = app.send({ operationId: 'op-multirun-disconnect', text: 'disconnect and replay' }) + await firstStarted.promise + const child = await app.conversations.branches.create({ + operationId: 'op-multirun-replay-branch', + }) + const second = app.send({ operationId: 'op-multirun-duplicate', text: 'duplicate events' }) + await secondStarted.promise + assert.equal(app.state().activeRuns.length, 2) + + releaseFirstDisconnect.resolve() + await first.completion + assert.deepEqual(reconnects, [first.runId]) + assert.equal(app.state().runs.find((run) => run.id === first.runId)?.status, 'completed') + assert.deepEqual( + app.state().activeRuns.map((run) => run.runId), + [second.runId], + ) + assert.equal( + app + .events() + .filter( + (entry) => entry.event.kind === 'run.text.delta' && entry.event.runId === second.runId, + ).length, + 1, + ) + + releaseSecondFinal.resolve() + await second.completion + await app.waitForIdle() + assert.equal(app.state().runs.find((run) => run.id === second.runId)?.status, 'completed') + assert.deepEqual(app.state().activeRuns, []) + assert.equal(app.state().conversationId, conversationId) + assert.equal(app.state().branchId, child.id) + assert.notEqual(sourceBranchId, child.id) + await app.close() +}) + +test('cancelling a background branch leaves the focused branch running', async () => { + const releases = new Map>>() + const cancelledRuns = new Set() + const execution: ExecutionPort = { + capabilities: () => DEFAULT_RUN_CAPABILITIES, + async *streamTurn(input): AsyncIterable { + const release = deferred() + releases.set(input.runId, release) + const aborted = new Promise((resolve) => { + input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + await Promise.race([release.promise, aborted]) + if (input.signal.aborted || cancelledRuns.has(input.runId)) return + yield { + type: 'final', + status: 'completed', + reason: 'background cancellation test completed', + text: `completed ${input.runId}`, + metadata: { tokenUsage: { input: 1, output: 1 } }, + task: { id: input.runId, intent: 'background cancellation test' }, + timestamp: '2026-08-03T00:00:00.000Z', + } + }, + cancelRun: async (input) => { + cancelledRuns.add(input.runId) + releases.get(input.runId)?.resolve() + return { operationId: input.operationId, outcome: 'accepted' as const } + }, + } + const journal = new MemoryJournal(new FixedClock()) + const app = new BraidApplication({ + profile: DETERMINISTIC_PROFILE, + execution, + clock: new FixedClock(), + ids: new SequenceIds(), + journal, + effectStorage: journal, + }) + app.initialize('/workspace') + const conversationId = app.state().conversationId + const sourceBranchId = app.state().branchId + const first = app.send({ operationId: 'op-multirun-cancel-background', text: 'background work' }) + await waitUntil(() => releases.size === 1, 'background run did not start') + const child = await app.conversations.branches.create({ + operationId: 'op-multirun-cancel-branch', + }) + const second = app.send({ operationId: 'op-multirun-cancel-foreground', text: 'foreground work' }) + await waitUntil(() => releases.size === 2, 'focused run did not start') + await app.conversations.lifecycle.open({ + operationId: 'op-multirun-cancel-focus', + conversationId, + branchId: child.id, + }) + assert.equal(app.state().focusedRunId, second.runId) + + const cancelled = await app.cancelRun({ + operationId: 'op-multirun-cancel-control', + runId: first.runId, + }) + const cancelledState = await cancelled.completion + assert.equal(cancelled.acknowledgement.outcome, 'accepted') + assert.equal(cancelledState.runs.find((run) => run.id === first.runId)?.status, 'cancelled') + assert.equal(app.state().runs.find((run) => run.id === second.runId)?.status, 'streaming') + assert.equal(app.state().focusedRunId, second.runId) + assert.deepEqual( + app.state().activeRuns.map((run) => run.runId), + [second.runId], + ) + + releases.get(second.runId)?.resolve() + await second.completion + await first.completion + await app.waitForIdle() + assert.deepEqual(app.state().activeRuns, []) + assert.equal(app.state().branchId, child.id) + assert.notEqual(sourceBranchId, child.id) + await app.close() +}) + test('admission snapshots profile and connection before a blocked dispatch', async () => { const profileA = defineAgentProfile({ name: 'old profile', diff --git a/test/conversations.test.ts b/test/conversations.test.ts index 9512bb56..d758750a 100644 --- a/test/conversations.test.ts +++ b/test/conversations.test.ts @@ -401,7 +401,7 @@ test('branch run configuration merges, replays, rejects conflicts, and clears at assertBraidState(app.state()) }) -test('branch run configuration survives journal replay and cannot change during a run', async () => { +test('branch run configuration survives journal replay and can change future runs during a run', async () => { const journal = new MemoryJournal(new FixedClock()) const first = createBraidApplication({ fixture: 'deterministic', journal, chunkDelayMs: 100 }) first.initialize('/workspace') @@ -426,19 +426,16 @@ test('branch run configuration survives journal replay and cannot change during text: 'keep configuration stable while this runs', }) await active.admissionReady - await assert.rejects( - () => - restarted.conversations.branches.setRunOverrides({ - operationId: 'op-run-override-active-change', - runner: 'pi', - }), - (error: unknown) => error instanceof AppError && error.code === 'RUN_ACTIVE', - ) + const changed = await restarted.conversations.branches.setRunOverrides({ + operationId: 'op-run-override-active-change', + runner: 'pi', + }) + assert.equal(changed.overrides.runner, 'pi') await active.completion assert.equal( restarted.state().branches.find((branch) => branch.id === restarted.state().branchId)?.overrides .runner, - 'codex', + 'pi', ) assertBraidState(restarted.state()) }) diff --git a/test/native-interactive-actions.test.ts b/test/native-interactive-actions.test.ts index 30665655..979ac6b8 100644 --- a/test/native-interactive-actions.test.ts +++ b/test/native-interactive-actions.test.ts @@ -276,3 +276,40 @@ test('requires a prompt and explains unavailable native providers', async () => message: 'Usage: /interactive ', }) }) + +test('native terminal start only blocks an active run on the selected branch', () => { + const app = { + state: () => ({ + activeRunId: 'run-other-branch', + conversationId: 'conversation-selected', + branchId: 'branch-selected', + runs: [ + { + id: 'run-other-branch', + conversationId: 'conversation-other', + branchId: 'branch-other', + status: 'running', + }, + ], + }), + } as unknown as Pick + const actions = createNativeInteractiveUiActions({ + current: () => ({ + app, + nativeInteractive: { + waitForHandle: async () => { + throw new Error('not used') + }, + settle: () => {}, + }, + }), + terminal: new TestTerminal(), + signals: () => signals, + suspend: () => {}, + resume: () => {}, + nextOperationId: () => 'operation-unused', + holderId: 'braid-native-actions', + }) + + assert.deepEqual(actions.availability('start'), { available: true }) +}) diff --git a/test/storage-snapshots.test.ts b/test/storage-snapshots.test.ts index 44e00bb2..fa0b538c 100644 --- a/test/storage-snapshots.test.ts +++ b/test/storage-snapshots.test.ts @@ -37,7 +37,7 @@ import { restoreMaterializedState, } from '../src/domain/materialized-state-snapshot.js' import { canonicalProjectionChecksum } from '../src/domain/projection-checksum.js' -import { reduceEvent, replayEvents } from '../src/domain/reducer.js' +import { DuplicateEventConflictError, reduceEvent, replayEvents } from '../src/domain/reducer.js' import { initialState } from '../src/domain/state.js' import { type CredentialRef, credentialRef } from '../src/ports/credentials.js' import type { JournalEvent } from '../src/ports/storage.js' @@ -352,6 +352,69 @@ test('migrates legacy interactions, rejects snapshot conflicts, and recomputes t } }) +test('migrates the legacy active run alias and rejects conflicting duplicate events', () => { + const at = '2026-08-03T00:00:00.000Z' + const legacyRunId = createRunId('run-snapshot-active-alias') + const requestedEventId = createEventId('event-snapshot-active-alias-requested') + const requestedEvent = { + kind: 'run.requested' as const, + operationId: createOperationId('operation-snapshot-active-alias'), + runId: legacyRunId, + turnId: createTurnId('turn-snapshot-active-alias'), + userMessageId: createMessageId('message-snapshot-active-alias-user'), + assistantMessageId: createMessageId('message-snapshot-active-alias-assistant'), + text: 'resume the active run', + } + const requested: BraidEventEnvelope = { + eventId: requestedEventId, + sequence: 2, + revision: 2, + occurredAt: at, + event: requestedEvent, + } + const state = replayEvents(initialState(STARTER_PROFILE, { conversationId }), [ + { + eventId: createEventId('event-snapshot-active-alias-workspace'), + sequence: 1, + revision: 1, + occurredAt: at, + event: { kind: 'workspace.opened', workspace: '/workspace' }, + }, + requested, + ]) + const snapshot = createMaterializedStateSnapshot({ + scopeId: 'snapshot-active-alias', + generation: state.sequence, + eventId: requestedEventId, + state, + }) + const { activeRuns: _activeRuns, focusedRunId: _focusedRunId, ...legacyState } = snapshot.state + const restored = restoreMaterializedState({ + ...snapshot, + state: legacyState, + stateChecksum: canonicalDigest(legacyState), + }) + assert.deepEqual(restored.activeRuns, [ + { + runId: legacyRunId, + conversationId, + branchId: state.branchId, + }, + ]) + assert.equal(restored.focusedRunId, legacyRunId) + assert.equal(restored.activeRunId, legacyRunId) + + assert.equal(reduceEvent(state, requested), state) + assert.throws( + () => + reduceEvent(state, { + ...requested, + event: { ...requestedEvent, text: 'conflicting replay' }, + }), + DuplicateEventConflictError, + ) +}) + async function withRawDatabase( root: string, credentials: MemoryCredentialStore, diff --git a/test/terminal-responsive.test.ts b/test/terminal-responsive.test.ts index c3dacfe7..51177895 100644 --- a/test/terminal-responsive.test.ts +++ b/test/terminal-responsive.test.ts @@ -10,7 +10,11 @@ import { } from '@earendil-works/pi-tui' import { createApplicationUiController } from '../src/adapters/tui/application-ui-controller.js' import { createBraidApplication } from '../src/app/composition.js' -import type { BraidViewModel, EnvironmentView } from '../src/views/shared/models.js' +import type { + BraidViewModel, + EnvironmentView, + WorkStripItemView, +} from '../src/views/shared/models.js' import { composerBorderLine, composerProjectionFor, @@ -146,6 +150,60 @@ test('chrome uses complete responsive groups at every reference width', () => { } }) +test('work strip is conditional and exposes branch work controls', () => { + const base = viewForChrome() + const item = (overrides: Partial): WorkStripItemView => ({ + id: 'run-background', + runId: 'run-background', + conversationId: 'conversation-1', + branchId: 'branch-background', + state: 'running', + runner: 'pi', + model: 'fixture/model', + interactionCount: 1, + focused: false, + actions: { switch: true, ask: true, steer: true, cancel: true }, + ...overrides, + }) + const chrome = new TerminalChrome(theme) + const state = { + quitArmed: false, + activityVisible: false, + navigationHint: '/ commands · Ctrl+P', + composerMode: 'queue' as const, + } + chrome.setState({ view: base, ...state }) + assert.doesNotMatch(chrome.render(120).join('\n'), /work 2|\/activity to switch/u) + + chrome.setState({ + view: { + ...base, + focusedRunId: 'run-metrics', + workStrip: Object.freeze([ + item({ + id: 'run-metrics', + runId: 'run-metrics', + branchId: 'branch-focused', + focused: true, + }), + item({}), + ]), + }, + ...state, + }) + const wide = chrome.render(120).join('\n') + assert.match( + wide, + /branch-focused · running · pi\/fixture\/model · 1 interaction · actions switch\/ask\/steer\/cancel/u, + ) + assert.match(wide, /branch-background · running · pi\/fixture\/model/u) + const narrow = chrome.render(40) + assert.equal(narrow.length, 2) + assert.match(narrow[1] ?? '', /work 2 · \/activity to switch/u) + for (const line of narrow) assert.ok(visibleWidth(line) <= 40) + for (const line of chrome.render(120)) assert.ok(visibleWidth(line) <= 120) +}) + test('composer hint chooses a complete slash affordance before narrow truncation', () => { const label = 'type / for commands · Alt+Enter newline · paste' const narrow = composerBorderLine(40, label, theme) From cf210590a5bd1a203b6d01fb1020a56e38fb3219 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 04:58:07 -0600 Subject: [PATCH 005/136] docs(components): define the complete terminal design map --- docs/components/README.md | 139 ++++++++++++++++++ docs/components/activity.md | 75 ++++++++++ docs/components/analysis.md | 90 ++++++++++++ docs/components/automation.md | 76 ++++++++++ docs/components/comparison.md | 80 ++++++++++ docs/components/conversation-navigation.md | 95 ++++++++++++ docs/components/entity-browser.md | 83 +++++++++++ docs/components/fork-preview.md | 94 ++++++++++++ docs/components/headless-and-accessibility.md | 85 +++++++++++ docs/components/help-and-capability-states.md | 77 ++++++++++ docs/components/interactions.md | 97 ++++++++++++ docs/components/modal-coordination.md | 85 +++++++++++ docs/components/profiles-and-connections.md | 100 +++++++++++++ docs/components/safe-rendering.md | 90 ++++++++++++ docs/components/selectors-and-commands.md | 91 ++++++++++++ docs/components/supervision.md | 90 ++++++++++++ docs/components/terminal-shell.md | 102 +++++++++++++ docs/components/transcript-composer.md | 104 +++++++++++++ test/component-docs.test.ts | 68 +++++++++ 19 files changed, 1721 insertions(+) create mode 100644 docs/components/README.md create mode 100644 docs/components/activity.md create mode 100644 docs/components/analysis.md create mode 100644 docs/components/automation.md create mode 100644 docs/components/comparison.md create mode 100644 docs/components/conversation-navigation.md create mode 100644 docs/components/entity-browser.md create mode 100644 docs/components/fork-preview.md create mode 100644 docs/components/headless-and-accessibility.md create mode 100644 docs/components/help-and-capability-states.md create mode 100644 docs/components/interactions.md create mode 100644 docs/components/modal-coordination.md create mode 100644 docs/components/profiles-and-connections.md create mode 100644 docs/components/safe-rendering.md create mode 100644 docs/components/selectors-and-commands.md create mode 100644 docs/components/supervision.md create mode 100644 docs/components/terminal-shell.md create mode 100644 docs/components/transcript-composer.md create mode 100644 test/component-docs.test.ts diff --git a/docs/components/README.md b/docs/components/README.md new file mode 100644 index 00000000..7106fea5 --- /dev/null +++ b/docs/components/README.md @@ -0,0 +1,139 @@ +# Braid component system + +## Design vision + +Braid is a transcript-first terminal for operating one or many agent runs without hiding identity, capability, or uncertainty. + +The main screen keeps the current conversation readable and keeps the composer immediately available. + +Secondary work opens in a full-viewport surface or a modal only when the user asks for it. + +Concurrent work stays visible through a small Work Strip and a searchable activity view. + +Every rendered value comes from one immutable `BraidViewModel` projection. + +Every user action emits a typed intent with a stable operation identifier. + +Components do not call providers, mutate durable state, or infer unavailable capabilities. + +Controllers coordinate focus and presentation, while application services own workflows and side effects. + +The selected profile and connection determine the real runner, model, environment, and available actions. + +A missing capability stays visible and disabled with one plain reason. + +Narrow terminals remove secondary detail before they shorten primary meaning. + +Wide terminals add measured context, not permanent side panels. + +All untrusted text is sanitized before rendering, and secret values never enter a view model. + +## What “best and simple” means + +Each component has one user-visible job and one owner for its state transition. + +The implementation uses the smallest general contract that works for every provider and runner. + +It does not add a provider-specific branch when a capability, view model, or typed intent can express the behavior. + +It does not duplicate canonical runtime, replay, interaction, fork, analysis, or supervisor contracts. + +It bounds lists, text, and refresh work so the terminal stays responsive as stored history grows. + +It fails closed when identity, capability, or response validity is unknown. + +It proves keyboard behavior and terminal output at 40×12, 80×24, 120×40, and 200×60. + +## Product components + +| Product component | Document | Primary user outcome | +| --- | --- | --- | +| Terminal shell and chrome | [terminal-shell.md](terminal-shell.md) | Keep identity, status, input, and cleanup stable around every surface. | +| Transcript and composer | [transcript-composer.md](transcript-composer.md) | Read one branch and submit, queue, or steer without losing a draft. | +| Work Strip | [work-strip.md](work-strip.md) | See and focus concurrent work without a permanent side panel. | +| Multi-run orchestration | [multi-run-orchestration.md](multi-run-orchestration.md) | Run independent branches concurrently while preserving branch order. | +| Selectors and commands | [selectors-and-commands.md](selectors-and-commands.md) | Find an action or entity through one keyboard contract. | +| Modal coordination | [modal-coordination.md](modal-coordination.md) | Present one bounded decision surface with reliable focus restoration. | +| Conversation navigation | [conversation-navigation.md](conversation-navigation.md) | Create, rename, archive, switch, branch, and clone through explicit identities. | +| Fork preview | [fork-preview.md](fork-preview.md) | Explain exactly what a fork copies before any external mutation. | +| Interactions and secrets | [interactions.md](interactions.md) | Answer, decline, cancel, or automate a typed request safely. | +| Profiles and connections | [profiles-and-connections.md](profiles-and-connections.md) | Select a portable agent and a credential-bearing execution connection. | +| Activity | [activity.md](activity.md) | Find live, queued, waiting, detached, and completed work. | +| Entity browser and details | [entity-browser.md](entity-browser.md) | Reuse one list-and-details interaction across complex records. | +| Supervisor graph | [supervision.md](supervision.md) | Inspect worker hierarchy and route supported controls to one worker. | +| Analysis | [analysis.md](analysis.md) | Inspect a cited review of a frozen run without mutating the source. | +| Comparison | [comparison.md](comparison.md) | Compare complete measured fields and asymmetries before a verdict. | +| Automation rules | [automation.md](automation.md) | Reuse safe interaction responses with explicit scope and confirmation. | +| Help and unavailable states | [help-and-capability-states.md](help-and-capability-states.md) | Explain real commands and disabled actions without fake readiness. | +| Safe rendering and responsive layout | [safe-rendering.md](safe-rendering.md) | Preserve terminal integrity and primary meaning at every supported size. | +| Headless and accessible presentation | [headless-and-accessibility.md](headless-and-accessibility.md) | Expose the same application through bounded JSONL and plain text. | + +The stream sanitizer, native continuation, workspace fork, and retained run documents extend this map at their owning boundaries. + +## Concrete component inventory + +Every exported terminal component class maps to exactly one product document below. + +Helpers remain in the same document as the component whose behavior they serve. + +| Code component | Source | Product document | +| --- | --- | --- | +| `AlternateScreenTerminal` | `src/adapters/tui/alternate-screen-terminal.ts` | [terminal-shell.md](terminal-shell.md) | +| `ApplicationUiController` | `src/adapters/tui/application-ui-controller.ts` | [terminal-shell.md](terminal-shell.md) | +| `ActivityBrowserPanel` | `src/views/tui/activity-browser.ts` | [activity.md](activity.md) | +| `ActivityView` | `src/views/tui/activity.ts` | [activity.md](activity.md) | +| `AnalysisViewPanel` | `src/views/tui/analysis.ts` | [analysis.md](analysis.md) | +| `GuardedAutocompleteProvider` | `src/views/tui/autocomplete-guard.ts` | [selectors-and-commands.md](selectors-and-commands.md) | +| `AutomationOverlayWorkflow` | `src/views/tui/automation-overlay-workflow.ts` | [automation.md](automation.md) | +| `AutomationRulePanel` | `src/views/tui/automation-rule-panel.ts` | [automation.md](automation.md) | +| `RuleResponseEditor` | `src/views/tui/automation-rule-response-editor.ts` | [automation.md](automation.md) | +| `CommandPalette` | `src/views/tui/command-palette.ts` | [selectors-and-commands.md](selectors-and-commands.md) | +| `ComparisonViewPanel` | `src/views/tui/comparison.ts` | [comparison.md](comparison.md) | +| `ComposerView` | `src/views/tui/composer-view.ts` | [transcript-composer.md](transcript-composer.md) | +| `ConfigurationCredential` | `src/views/tui/configuration-credential.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `PreparedCredential` | `src/views/tui/configuration-credential.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `ResponsiveText` | `src/views/tui/configuration-responsive-text.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `ConfigurationReview` | `src/views/tui/configuration-review.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `ConfigurationWizard` | `src/views/tui/configuration-wizard.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `ConnectionMetadataEditor` | `src/views/tui/connection-metadata-editor.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `ConnectionOverlayWorkflow` | `src/views/tui/connection-overlay-workflow.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `ConnectionSetupViewPanel` | `src/views/tui/connection-setup.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `ConversationConfirmation` | `src/views/tui/conversation-dialogs.ts` | [conversation-navigation.md](conversation-navigation.md) | +| `ConversationRename` | `src/views/tui/conversation-dialogs.ts` | [conversation-navigation.md](conversation-navigation.md) | +| `ConversationOverlayActions` | `src/views/tui/conversation-overlay-actions.ts` | [conversation-navigation.md](conversation-navigation.md) | +| `ConversationOverlayController` | `src/views/tui/conversation-overlays.ts` | [conversation-navigation.md](conversation-navigation.md) | +| `DetailsViewPanel` | `src/views/tui/details.ts` | [entity-browser.md](entity-browser.md) | +| `DynamicAutocompleteProvider` | `src/views/tui/dynamic-autocomplete.ts` | [selectors-and-commands.md](selectors-and-commands.md) | +| `EntityBrowser` | `src/views/tui/entity-browser.ts` | [entity-browser.md](entity-browser.md) | +| `ForkPreviewPanel` | `src/views/tui/fork-preview.ts` | [fork-preview.md](fork-preview.md) | +| `GraphView` | `src/views/tui/graph.ts` | [supervision.md](supervision.md) | +| `HelpViewPanel` | `src/views/tui/help.ts` | [help-and-capability-states.md](help-and-capability-states.md) | +| `InteractionDecisionList` | `src/views/tui/interaction-decisions.ts` | [interactions.md](interactions.md) | +| `OutcomeKeys` | `src/views/tui/interaction-presentation.ts` | [interactions.md](interactions.md) | +| `SecretInput` | `src/views/tui/interaction-presentation.ts` | [interactions.md](interactions.md) | +| `InteractionShell` | `src/views/tui/interaction.ts` | [interactions.md](interactions.md) | +| `ModalCoordinator` | `src/views/tui/modal-coordinator.ts` | [modal-coordination.md](modal-coordination.md) | +| `ProfileCompatibilityPanel` | `src/views/tui/profile-compatibility.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `ProfileEditorViewPanel` | `src/views/tui/profile-editor.ts` | [profiles-and-connections.md](profiles-and-connections.md) | +| `SafeMarkdown` | `src/views/tui/safe-markdown.ts` | [safe-rendering.md](safe-rendering.md) | +| `MaskedSecretInput` | `src/views/tui/secret-input.ts` | [interactions.md](interactions.md) | +| `SearchableSelector` | `src/views/tui/selector.ts` | [selectors-and-commands.md](selectors-and-commands.md) | +| `BraidTerminalApp` | `src/views/tui/terminal-app.ts` | [terminal-shell.md](terminal-shell.md) | +| `TerminalChrome` | `src/views/tui/terminal-chrome.ts` | [terminal-shell.md](terminal-shell.md) | +| `TerminalCommandController` | `src/views/tui/terminal-command-controller.ts` | [terminal-shell.md](terminal-shell.md) | +| `TerminalDraftController` | `src/views/tui/terminal-drafts.ts` | [transcript-composer.md](transcript-composer.md) | +| `TerminalInputController` | `src/views/tui/terminal-input-controller.ts` | [terminal-shell.md](terminal-shell.md) | +| `TerminalInteractionController` | `src/views/tui/terminal-interaction-controller.ts` | [interactions.md](interactions.md) | +| `TerminalOverlayController` | `src/views/tui/terminal-overlays.ts` | [modal-coordination.md](modal-coordination.md) | +| `BraidShell` | `src/views/tui/terminal-shell.ts` | [terminal-shell.md](terminal-shell.md) | +| `UnavailablePanel` | `src/views/tui/terminal-shell.ts` | [help-and-capability-states.md](help-and-capability-states.md) | +| `TerminalSurfaceOverlays` | `src/views/tui/terminal-surface-overlays.ts` | [modal-coordination.md](modal-coordination.md) | +| `TranscriptView` | `src/views/tui/transcript.ts` | [transcript-composer.md](transcript-composer.md) | + +## Change rule + +Add a new product component only when it introduces a distinct user job, state owner, or interaction contract. + +Add a helper to an existing component when it only renders or coordinates that component's established contract. + +Update this inventory and the owning document in the same change as a new exported terminal component class. diff --git a/docs/components/activity.md b/docs/components/activity.md new file mode 100644 index 00000000..c639c2a4 --- /dev/null +++ b/docs/components/activity.md @@ -0,0 +1,75 @@ +# Activity + +## Job + +Activity provides one searchable place to find live, queued, waiting, detached, reconnecting, completed, cancelled, and failed work. + +## Best simple implementation + +Project activity from canonical runs, interactions, queue entries, analyses, supervisors, and workers. + +Render the compact summary with `ActivityView` and the searchable full surface with `ActivityBrowserPanel`. + +Use stable entity identifiers for focus and detail actions. + +Do not create another polling state store inside the terminal. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `ActivityView` | Render the bounded activity document and indicate whether live work exists. | +| `ActivityBrowserPanel` | Search activity rows, open detail, and focus an explicit run. | + +## Inputs and outputs + +Each activity row carries a kind, stable identifier, status, title, summary, timestamp, and available actions. + +Run rows also carry conversation and branch identity. + +Selecting a run emits `focus-run` for that exact run. + +Selecting another entity opens its details without changing run focus. + +## Ordering and state + +Live and attention-required rows appear before terminal history. + +Rows within a group use canonical event or update order. + +The browser preserves selection by entity identifier across refreshes. + +Filters operate over the projected bounded row set. + +Detached work remains visible because local silence is not completion. + +## Failure and safety + +Unknown status values render as unknown and never as success. + +Missing cost, duration, or usage stays unknown and never becomes zero. + +Untrusted titles and summaries are sanitized. + +Unavailable row actions remain visible with their reason. + +## Performance + +Projection uses bounded recent worker and supervisor sets with required ancestors. + +The browser renders only visible rows and one selected detail document. + +Closing the surface stops runtime-backed refresh. + +## Proof + +Tests cover ordering, filtering, focus switching, background interactions, detached runs, two supervisors, unchanged snapshots, and refresh cleanup. + +Captures show activity with concurrent work at all required terminal sizes. + +## Non-goals + +Activity does not duplicate transcript content or replace the Work Strip. + +It does not assign a worker to a different run. + diff --git a/docs/components/analysis.md b/docs/components/analysis.md new file mode 100644 index 00000000..f3cd8cd2 --- /dev/null +++ b/docs/components/analysis.md @@ -0,0 +1,90 @@ +# Analysis + +## Job + +Analysis runs a separate cited review over a frozen source run and makes progress, findings, evidence, cost, and completion inspectable. + +## Best simple implementation + +Freeze the source run through the shared analysis boundary. + +Execute selected analyst profiles through Runtime. + +Persist analysis lifecycle, model-call, usage, citation, finding, and terminal events in the Braid journal. + +Project one immutable `AnalysisView` and render it through `AnalysisViewPanel`. + +Do not mutate the source run or ask the analyzed run to grade itself. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `AnalysisViewPanel` | Navigate analysis summary, findings, citations, model calls, usage, and terminal state. | + +Shared presentation functions build the same document for terminal, plain, and headless output. + +## Inputs and outputs + +An analysis request names the frozen source run, selected analyst profiles, connection, question, budget, and operation identifier. + +Progress events name their analysis and analyst execution. + +Findings contain severity, claim, cited evidence references, confidence, and disposition state. + +Promotion emits one explicit finding identifier and provenance record. + +## Multi-analyst behavior + +Each analyst execution keeps its own profile, model calls, usage, status, and failure. + +The UI can filter or select analysts without dropping another analyst's fields. + +Aggregate status reports the complete set of successful, failed, cancelled, and incomplete analysts. + +A partial result remains partial and never appears as a clean comparison. + +## Lifecycle and restart + +Admission records the frozen source digest before model execution. + +Live progress appends idempotent events by analysis and event identifiers. + +Restart reconstructs progress and resumes or reconciles the runtime-owned execution. + +Cancellation targets one analysis or analyst execution explicitly. + +Promotion remains separate from analysis completion. + +## Failure and safety + +An invalid or missing citation blocks a finding from promotion. + +Missing usage, cost, or model-call data stays unknown. + +Late source events cannot change the frozen analysis input. + +Cancelled analysis keeps bounded partial diagnostics and an honest cancelled state. + +Trace artifacts exclude secrets and credential-bearing fields. + +## Performance + +Analysis pages render bounded findings and model calls. + +Progress projection updates only the affected analysis record. + +Parallel analysts use independent runtime executions within the declared budget. + +## Proof + +Tests cover freeze, progress, multiple analysts, citation resolution, budget termination, cancellation, restart, promotion, and source immutability. + +Live proof requires real analyst model calls, settled usage and cost, resolved citations, and unchanged source data. + +## Non-goals + +Analysis does not become another conversation turn or provider session. + +The UI does not invent a verdict when analyst evidence is incomplete. + diff --git a/docs/components/automation.md b/docs/components/automation.md new file mode 100644 index 00000000..0b766a19 --- /dev/null +++ b/docs/components/automation.md @@ -0,0 +1,76 @@ +# Interaction automation + +## Job + +Interaction automation reuses a non-secret response for matching future requests under an explicit scope and audit record. + +## Best simple implementation + +Create rules only from a current interaction and a response that passed its `answerSpec`. + +Use `AutomationOverlayWorkflow` for asynchronous list and mutation coordination. + +Use `AutomationRulePanel` for list, create, scope, confirmation, disable, and delete steps. + +Use `RuleResponseEditor` for the supported reusable answer shapes. + +Keep matching and execution in the application domain, not the panel. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `AutomationOverlayWorkflow` | Load rules and dispatch idempotent create, disable, and delete operations. | +| `AutomationRulePanel` | Coordinate the visible rule workflow. | +| `RuleResponseEditor` | Validate one reusable response against the current request. | + +## Scope + +`once` applies to the next matching request. + +`session` applies within the declared provider or runtime session boundary. + +`persistent` survives restart and requires explicit confirmation. + +The interaction declares which scopes are allowed. + +The UI does not offer a broader scope. + +## Inputs and outputs + +A rule contains a stable identifier, matcher, safe response, scope, enabled state, usage count, and optional maximum uses. + +Creation emits the source run and interaction identifiers plus a stable operation identifier. + +Disable and delete target one exact rule identifier. + +The list response contains no secret response values. + +## Failure and safety + +Secret, unknown, and unsupported form responses remain manual. + +Persistent creation names the future effect and requires confirmation. + +Rule parsing fails closed on malformed data. + +Duplicate operations return the recorded result. + +Automation never bypasses a provider capability or user policy check. + +## Performance + +The workflow loads bounded rule summaries only while open. + +Filtering and editing remain local until the user confirms an operation. + +## Proof + +Tests cover create, once, session, persistent confirmation, maximum uses, disable, delete, restart, malformed data, secret refusal, and duplicate operations. + +## Non-goals + +The panel does not predict an answer or create a rule from text similarity alone. + +It does not store secret-designated answers. + diff --git a/docs/components/comparison.md b/docs/components/comparison.md new file mode 100644 index 00000000..afbf73e6 --- /dev/null +++ b/docs/components/comparison.md @@ -0,0 +1,80 @@ +# Comparison + +## Job + +Comparison shows every captured field and asymmetry across analysis or run arms before it presents a verdict. + +## Best simple implementation + +Build one canonical comparison result outside the renderer. + +Project complete arm, field, missing-data, termination, usage, cost, timing, and provenance values into `ComparisonView`. + +Render the same ordered fields through `ComparisonViewPanel`, plain output, and headless output. + +Do not drop zero, null, failure, or unequal sample counts to make a table cleaner. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `ComparisonViewPanel` | Navigate arms, measured fields, asymmetries, threats, and verdict evidence. | + +## Inputs and outputs + +Each arm names its source, profile, runner, model, environment, sample count, status, and measured values. + +Each field records a value for every arm or an explicit missing reason. + +Asymmetries appear before the verdict. + +Selection changes presentation only and emits no mutation. + +## Ordering + +The header shows provenance and arm counts first. + +Blocking asymmetries follow. + +Measured fields follow in canonical order. + +Distribution summaries include count, minimum, median, p90, and maximum when the input supports them. + +The verdict appears only after the evidence it depends on. + +## Failure and safety + +Unequal counts, different termination, missing telemetry, and different model or environment inputs remain visible. + +Unknown values never become zero. + +An invalid comparison result fails closed before rendering a verdict. + +All labels and evidence excerpts are sanitized and bounded. + +## Responsive behavior + +Narrow mode shows one field with all arm values and explicit next or previous navigation. + +Standard mode shows a compact field table. + +Wide mode adds provenance and distribution detail. + +No mode hides an asymmetry. + +## Performance + +The comparison result is immutable and precomputed. + +The panel renders a bounded viewport and selected detail only. + +## Proof + +Tests cover zero and null values, unequal arms, missing telemetry, different termination, field ordering, narrow navigation, and honest verdict suppression. + +## Non-goals + +The component does not run an evaluation or choose a winner from incomplete evidence. + +It does not summarize away fields captured by the source result. + diff --git a/docs/components/conversation-navigation.md b/docs/components/conversation-navigation.md new file mode 100644 index 00000000..0354864a --- /dev/null +++ b/docs/components/conversation-navigation.md @@ -0,0 +1,95 @@ +# Conversation navigation + +## Job + +Conversation navigation lets the user create, import, rename, archive, delete, switch, branch, and clone without confusing history identity. + +## Best simple implementation + +Use one searchable conversation surface and one searchable branch surface. + +Carry conversation and branch identifiers in every action. + +Use small confirmation or rename panels for destructive or textual mutations. + +Keep branching inside the conversation journal and keep workspace forking in its separate preview workflow. + +Do not infer a branch from the focused run when an explicit branch target is available. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `ConversationOverlayController` | Open and refresh conversation and branch selectors. | +| `ConversationOverlayActions` | Dispatch typed create, import, rename, archive, delete, branch, clone, and switch actions. | +| `ConversationConfirmation` | Confirm one named destructive or durable mutation. | +| `ConversationRename` | Validate and submit one bounded title edit. | + +## Identity and state + +A conversation owns a branch graph. + +A branch identifies one path through that graph. + +A turn identifies one user input and its resulting activity. + +A run identifies one admitted execution of a turn. + +Navigation changes selection and focus but never rewrites those identities. + +An active run can continue on a background branch after the user selects another branch. + +## Inputs and outputs + +Selectors receive immutable conversation and branch summaries with stable identifiers. + +Actions emit typed intents with the selected identifiers and a stable operation identifier. + +The application returns accepted, unavailable, conflict, or error outcomes. + +An accepted action refreshes from canonical state instead of editing selector rows locally. + +## Algorithms + +The selector preserves its row by stable identifier across refreshes. + +Branch creation records an explicit source point and creates a new branch in the same conversation. + +Clone copies the selected branch history into a new conversation without claiming provider continuity. + +Deletion remains unavailable while canonical constraints require the entity. + +Same-operation replay returns the recorded result. + +Changed input under the same operation identifier returns a conflict. + +## Failure and safety + +Unknown conversation or branch identifiers fail before mutation. + +Destructive actions require a confirmation that names the target. + +Imported content passes size, schema, path, and terminal-sanitization checks. + +Conversation titles cannot carry terminal control sequences. + +Deleting history never deletes an environment, provider session, or credential by implication. + +## Performance + +Selectors consume bounded summaries rather than full transcripts. + +Filtering and refresh remain independent of stored message volume. + +## Proof + +Reducer and storage tests cover idempotency, restart, migration, graph invariants, import, and delete constraints. + +Keyboard tests cover open, filter, switch, branch, rename, cancel, and focus restoration. + +## Non-goals + +Conversation navigation does not perform workspace fork or native provider continuation. + +It does not stop a background run merely because selection changed. + diff --git a/docs/components/entity-browser.md b/docs/components/entity-browser.md new file mode 100644 index 00000000..8653b3d1 --- /dev/null +++ b/docs/components/entity-browser.md @@ -0,0 +1,83 @@ +# Entity browser and details + +## Job + +The entity browser supplies one list-and-details interaction for complex collections without adding permanent panes to the main screen. + +## Best simple implementation + +Use `EntityBrowser` as the shared full-viewport list, filter, selection, and detail layout. + +Use `DetailsViewPanel` for a standalone immutable detail document. + +Adapt activity, graph, analysis, and comparison records into the same row and detail contracts. + +Do not specialize keyboard behavior for each entity kind. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `EntityBrowser` | Own query, selected row, viewport, details visibility, and common keys. | +| `DetailsViewPanel` | Render one bounded detail document. | + +## Inputs and outputs + +Rows contain stable values, safe labels, summaries, status, and optional action metadata. + +Details contain a title and bounded lines. + +Selection emits the stable row value. + +Back closes details before it closes the browser. + +## Responsive behavior + +At narrow widths, the browser shows either the list or details. + +At standard widths, it prioritizes the list and opens details as the next surface. + +At wide widths, it may show list and details together when both remain readable. + +The keyboard contract stays identical across layouts. + +## State + +Query, selection, offset, and detail visibility are local state. + +Entity facts and actions remain immutable inputs. + +Refresh keeps selection by stable value and clamps the viewport. + +An entity removed by refresh selects the nearest valid row. + +## Failure and safety + +An empty collection renders one explicit empty state. + +Invalid details render no guessed fields. + +Every label and detail line is sanitized and width-bounded. + +Actions target identifiers and never row indexes. + +## Performance + +Filtering uses the bounded projected rows. + +Only the active viewport and selected detail render. + +The component performs no I/O or provider polling. + +## Proof + +Shared tests run the same keyboard cases through activity, graph, analysis, and comparison adapters. + +Resize tests prove selection and detail continuity across all layout modes. + +## Non-goals + +The browser does not own entity state, refresh intervals, or mutations. + +It does not introduce a dashboard beside the transcript. + diff --git a/docs/components/fork-preview.md b/docs/components/fork-preview.md new file mode 100644 index 00000000..cf0b9bab --- /dev/null +++ b/docs/components/fork-preview.md @@ -0,0 +1,94 @@ +# Fork preview + +## Job + +The fork preview explains the exact source boundary, destination, copied state, omitted state, capabilities, and cleanup plan before a fork mutates an external environment. + +## Best simple implementation + +Project the canonical fork plan into one immutable `ForkPreviewView`. + +Render that view in `ForkPreviewPanel` without re-deriving capability or identity decisions. + +Execute only the plan digest the user reviewed. + +Use the shared runtime and provider fork ports for external work. + +Do not copy provider sessions, checkpoints, or workspaces inside the terminal client. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `ForkPreviewPanel` | Present source, destination, boundaries, warnings, and confirm or cancel actions. | + +The application fork planner owns plan creation and execution. + +The provider owns the environment and checkpoint operations. + +## Inputs and outputs + +The panel receives a frozen plan with source conversation, branch, turn, run, provider session, environment, checkpoint, destination profile, destination connection, and destination workspace. + +Unknown values remain explicit. + +Confirmation emits the plan digest and a stable operation identifier. + +Cancellation emits no external mutation. + +## Fork kinds + +A conversation branch creates another history path in the same conversation. + +A clone creates another Braid conversation from visible history. + +A workspace fork creates a destination environment from a checkpoint. + +A cross-runner fork starts a new run from portable history and workspace state without claiming native provider continuity. + +The preview names the selected kind and its omitted state. + +## Algorithms + +Planning asks the selected provider for current capabilities. + +Planning freezes source identity and the latest eligible checkpoint. + +Execution recomputes the plan digest and refuses any changed source or destination. + +Execution uses one stable idempotency key for destination creation. + +Restart first looks up that key before another external mutation. + +Successful execution records destination identity and independent cleanup ownership. + +## Failure and safety + +Unsupported checkpoint or fork capability disables confirmation with one reason. + +A source change after preview returns a conflict and requires a new preview. + +An unknown external result remains unknown until lookup resolves it. + +Cleanup targets only the destination identifiers returned by the provider. + +Credentials and checkpoint contents never appear in the view or capture. + +## Performance + +The preview renders a bounded list of facts and warnings. + +Workspace data moves through the provider or Sandbox implementation, not through terminal memory. + +## Proof + +Tests cover branch, clone, workspace fork, cross-runner fork, changed-plan conflict, restart lookup, independent mutation, source preservation, cancellation, and cleanup. + +The terminal recording reviews and executes a real plan through the same panel. + +## Non-goals + +The preview does not promise provider-session continuity across runners. + +It does not display raw checkpoint data or provider-private fields. + diff --git a/docs/components/headless-and-accessibility.md b/docs/components/headless-and-accessibility.md new file mode 100644 index 00000000..8fe78c8b --- /dev/null +++ b/docs/components/headless-and-accessibility.md @@ -0,0 +1,85 @@ +# Headless and accessible presentation + +## Job + +Headless and plain presentation expose the same Braid application state and commands without depending on an interactive terminal. + +## Best simple implementation + +Use the same controller, immutable view model, typed intents, and application core as the TUI. + +Use bounded JSONL envelopes for automation. + +Use semantic plain text for screen readers, logs, and non-TTY output. + +Do not create a second reducer or test-only product path. + +## Surfaces + +The JSONL interface accepts versioned command envelopes with request and operation identifiers. + +It emits direct responses, state snapshots, and events as bounded versioned envelopes. + +Plain mode emits safe human-readable status and event lines. + +Accessibility projection emits the selected transcript, status, pending decisions, and navigation meaning without ANSI styling. + +## Inputs and outputs + +Every mutating command requires a stable operation identifier. + +Every direct response echoes the request identifier. + +Errors include a stable code, safe message, and retryability. + +Events include their canonical revision and entity identifiers. + +Output fields preserve zero, null, unknown, and unavailable as distinct values. + +## Bounds and backpressure + +Input line size, JSON depth, command arguments, output envelope size, and cached request count are bounded. + +Malformed input returns one error and does not desynchronize later lines. + +Slow subscribers cannot grow an unbounded output queue. + +State snapshots use the same bounded semantic projections as the terminal. + +## Idempotency and restart + +Duplicate request identifiers on one connection return the cached direct response. + +Duplicate operation identifiers across connections reconcile through the journal. + +Changed input under one operation identifier returns a conflict. + +Restart restores durable application state before accepting new mutations. + +## Failure and safety + +JSONL stdout contains protocol envelopes only. + +Diagnostics use stderr. + +Secret values and credential references marked private never enter either output. + +Untrusted text is sanitized and bounded before serialization or plain output. + +## Performance + +Projection reuses cached semantic state for one application revision. + +Subscriber delivery coalesces high-frequency deltas while preserving durable terminal events. + +## Proof + +Contract tests run commands through headless, plain, virtual-terminal, and packed-binary surfaces against one application core. + +Tests cover malformed input, bounds, duplicate request, duplicate operation, restart, backpressure, stdout purity, and accessibility text. + +## Non-goals + +The headless interface is not another agent runner or provider adapter. + +Plain output does not expose terminal-only control sequences. diff --git a/docs/components/help-and-capability-states.md b/docs/components/help-and-capability-states.md new file mode 100644 index 00000000..e1077675 --- /dev/null +++ b/docs/components/help-and-capability-states.md @@ -0,0 +1,77 @@ +# Help and capability states + +## Job + +Help explains the controls that exist now, while unavailable states explain why one requested action cannot run now. + +## Best simple implementation + +Build help from the canonical command registry and current keymap. + +Build action availability from provider and runtime capability reports. + +Render unsupported actions as visible and disabled when discovery matters. + +Use one `UnavailablePanel` for a requested action and one `HelpViewPanel` for discoverable guidance. + +Do not advertise a command that no typed intent can dispatch. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `HelpViewPanel` | Render current commands, keys, and concise usage guidance. | +| `UnavailablePanel` | Show the requested action and one exact capability or configuration reason. | + +## Inputs and outputs + +Help receives immutable command and key descriptions. + +Unavailable state receives a safe title and reason. + +Both surfaces emit only close or navigation events. + +They do not mutate product state. + +## Copy rules + +Name the user action first. + +State the exact missing capability, configuration, or connection condition. + +Offer a valid route only when one exists. + +Do not show fake progress, fake readiness, or procedural cards. + +Do not repeat a control label as explanatory copy. + +## Responsive behavior + +Narrow help keeps command, key, and one-line meaning. + +Wider help adds aliases and capability notes. + +Unavailable state always keeps its title, reason, and close route visible. + +## Failure and safety + +Capability reports are authoritative for availability. + +An unknown report disables the action instead of guessing support. + +Reasons are sanitized and cannot carry terminal controls. + +Credential or provider-private details never appear in the reason. + +## Proof + +Tests compare the command registry, palette, autocomplete, help, and dispatcher for drift. + +Fixtures cover unavailable runner actions, workspace fork, attach, interaction, analysis, and connection states. + +## Non-goals + +Help does not become product documentation inside the main transcript. + +An unavailable panel does not silently change the selected profile or connection. + diff --git a/docs/components/interactions.md b/docs/components/interactions.md new file mode 100644 index 00000000..fa27745b --- /dev/null +++ b/docs/components/interactions.md @@ -0,0 +1,97 @@ +# Interactions and secrets + +## Job + +Interactions let a user answer, approve, decline, cancel, or automate a runtime request with the shape the provider declared. + +## Best simple implementation + +Render every request through the canonical `answerSpec` contract. + +Use one `InteractionShell` that delegates value entry to the matching input component. + +Use `TerminalInteractionController` as the only modal queue and dispatch coordinator. + +Keep secret entry in `MaskedSecretInput` and send the value only through its bounded response path. + +Fail closed for an unknown answer shape that Braid cannot validate. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `TerminalInteractionController` | Select the next pending request, open its panel, and reconcile response outcomes. | +| `InteractionShell` | Render the request context, answer control, outcomes, timeout, and footer. | +| `InteractionDecisionList` | Select one declared decision or option. | +| `OutcomeKeys` | Route explicit approve, decline, and cancel keys. | +| `SecretInput` | Adapt a secret answer specification to masked entry. | +| `MaskedSecretInput` | Accept a secret without exposing its value through render or inspection. | + +## Inputs and outputs + +An `InteractionView` includes run, interaction, provider session, kind, prompt, answer specification, outcomes, deadline, and capability data. + +The component emits a typed response or cancellation with both run and interaction identifiers. + +The operation identifier remains stable across retry and restart. + +The component never emits a value that violates the declared answer specification. + +## Answer shapes + +Text supports required and maximum-length constraints. + +Number supports required, minimum, and maximum constraints. + +Boolean and select use declared options. + +Forms validate every field and emit one complete response object. + +Secret answers use masked entry and a secret-designated response path. + +Unknown shapes render the generic explanation and disable invalid submission. + +## Queue and concurrency + +Interactions stay attached to their source run. + +The controller shows one interaction at a time and retains the remaining order. + +Focusing another run changes priority but does not reassign a request. + +Answering a background request carries its explicit run identifier. + +Duplicate provider events do not create a second modal. + +## Failure and safety + +Timeout, provider cancellation, user cancellation, stale response, declined response, and accepted response remain distinct outcomes. + +A secret value never enters profiles, SQLite, logs, view models, snapshots, screenshots, or trace artifacts. + +An acknowledged response replays as the same result. + +A changed response with the same operation identifier returns a conflict. + +Terminal text is sanitized before the prompt or option label renders. + +## Performance + +Only the active interaction panel renders. + +The pending queue uses immutable summaries and bounded prompt text. + +Deadline updates do not rebuild the transcript. + +## Proof + +Tests cover every answer shape, keyboard acceptance, decline, timeout, cancel, duplicate event, response retry, restart, secret canaries, and unknown shapes. + +Live proof must keep a retained cloud interaction answerable after Braid reconnect and continue exactly once. + +## Non-goals + +The component does not invent an approval policy or default answer. + +It does not store credential values for later reuse. + diff --git a/docs/components/modal-coordination.md b/docs/components/modal-coordination.md new file mode 100644 index 00000000..59ef3277 --- /dev/null +++ b/docs/components/modal-coordination.md @@ -0,0 +1,85 @@ +# Modal coordination + +## Job + +Modal coordination shows temporary decision and detail surfaces without corrupting focus, drafts, or the underlying transcript. + +## Best simple implementation + +Use one `ModalCoordinator` as the stack owner for every overlay. + +Use `TerminalOverlayController` to translate product actions into modal workflows. + +Use `TerminalSurfaceOverlays` to construct full-viewport activity, graph, analysis, comparison, fork, profile, and help surfaces. + +Do not let a component add itself directly to the TUI root. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `ModalCoordinator` | Open, replace, close, focus, and size the modal stack. | +| `TerminalOverlayController` | Coordinate conversation, connection, automation, configuration, and surface workflows. | +| `TerminalSurfaceOverlays` | Build product surfaces from the current immutable view. | + +## Inputs and outputs + +The coordinator receives a focusable component and bounded width, height, and anchor options. + +The overlay controllers receive the current view, operation-id source, typed dispatch function, and render request. + +An overlay emits typed intents or local navigation events. + +Closing an overlay emits no product mutation unless the user accepted an explicit action. + +## Focus and lifecycle + +The coordinator keeps an ordered stack and focuses only its top entry. + +Opening the first modal hides the composer from rendering and input. + +Closing the top modal restores the next modal or the composer. + +Replacing a workflow step keeps one stack position and prevents hidden focusable children. + +Closing the application invalidates outstanding overlay generations so late asynchronous results cannot reopen a surface. + +## Responsive behavior + +Full-viewport browsers use the available terminal size. + +Decision panels use bounded percentages with a minimum usable width. + +At 40×12, the panel keeps its title, current decision, and cancel route. + +At larger sizes, the same component reveals descriptions and details. + +## Failure and safety + +An asynchronous load failure replaces the pending view with one safe unavailable panel. + +Late results from a closed generation are ignored. + +Focus restoration does not submit the editor or replay the closing key. + +Every modal body receives sanitized view-model text. + +## Performance + +Only the top modal handles input. + +Hidden surfaces do not poll or render. + +Runtime-backed surfaces subscribe through one controller and stop refresh when closed. + +## Proof + +Tests cover nested confirmation, replacement, escape, left navigation, focus restoration, resize, late results, and close cleanup. + +Virtual-terminal fixtures cover every full-viewport surface at the four required sizes. + +## Non-goals + +The coordinator does not own workflow state, provider calls, or durable decisions. + +An overlay does not become a permanent navigation region. diff --git a/docs/components/profiles-and-connections.md b/docs/components/profiles-and-connections.md new file mode 100644 index 00000000..bd190d60 --- /dev/null +++ b/docs/components/profiles-and-connections.md @@ -0,0 +1,100 @@ +# Profiles and connections + +## Job + +Profiles and connections select what agent runs and where it runs without mixing portable configuration with credentials. + +## Best simple implementation + +Use `AgentProfile` as the only agent configuration object. + +Treat a runner as one run preference inside that profile. + +Store connection metadata separately from credential bytes. + +Ask the provider for current capabilities and show exact incompatibilities before save or run. + +Use one staged configuration workflow with explicit review and commit. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `ConfigurationWizard` | Select profile, connection, and model through one staged workflow. | +| `ConfigurationCredential` | Collect a required credential through a bounded secret path. | +| `PreparedCredential` | Hold the commit or rollback capability for a staged secret write. | +| `ConfigurationReview` | Show the effective selection before durable activation. | +| `ResponsiveText` | Present configuration detail without breaking narrow layouts. | +| `ProfileEditorViewPanel` | Create or edit canonical profile fields. | +| `ProfileCompatibilityPanel` | Explain supported, ignored, or blocking fields from real capability data. | +| `ConnectionSetupViewPanel` | Select, test, and activate an execution connection. | +| `ConnectionMetadataEditor` | Edit secret-free connection name, kind, endpoint, account, and region. | +| `ConnectionOverlayWorkflow` | Coordinate create, edit, test, select, remove, and credential recovery. | + +## Data boundaries + +A profile contains portable agent intent, runner preference, model, limits, and policy. + +A connection contains secret-free transport and account metadata plus a credential reference. + +Credential bytes live only in the operating-system credential facility or their bounded setup path. + +The active selection records stable profile and connection identifiers. + +Each run receipt freezes the exact effective profile and connection identity used for admission. + +## Workflow + +Discovery loads available profiles, connections, models, and provider capabilities. + +Selection validates the exact profile against the selected connection. + +Credential preparation writes through a recoverable staged operation. + +Review shows effective runner, model, endpoint label, limits, and compatibility findings without secret values. + +Commit saves metadata and activates the selection only after validation succeeds. + +Rollback removes an uncommitted credential if later persistence fails. + +## Failure and safety + +Unsupported required fields block activation with the exact field and reason. + +Optional unsupported actions remain disabled without weakening the saved profile. + +Connection testing has bounded time and response size. + +Endpoints are normalized for transport and redacted for display. + +Credential removal is serialized, journaled, and recoverable after process interruption. + +Removing a shared credential remains unavailable until no saved connection references it. + +## Responsive behavior + +Narrow configuration shows the active stage, selected value, blocking reason, and navigation keys. + +Standard and wide layouts add descriptions and the effective review summary. + +No stage shows a giant default selection or repeats labels already visible in the control. + +## Performance + +Discovery and validation are asynchronous and cancellable. + +Late results carry a generation and cannot replace a newer selection. + +Lists use bounded summaries rather than full profile documents. + +## Proof + +Tests cover create, edit, validate, test, activate, restart, staged credential recovery, shared credential removal, unsupported fields, and secret canaries. + +Keyboard proof walks from profile selection through connection review and back without losing state. + +## Non-goals + +The terminal does not materialize provider-private profile files. + +It does not maintain a local runner or model compatibility table. diff --git a/docs/components/safe-rendering.md b/docs/components/safe-rendering.md new file mode 100644 index 00000000..c91e005a --- /dev/null +++ b/docs/components/safe-rendering.md @@ -0,0 +1,90 @@ +# Safe rendering and responsive layout + +## Job + +Safe rendering preserves terminal integrity, Unicode correctness, and primary meaning across trusted and untrusted content. + +## Best simple implementation + +Sanitize untrusted text before any Pi component receives it. + +Suppress OSC control sequences by default. + +Render Markdown through `SafeMarkdown` after stream-boundary sanitization. + +Compute one layout mode from current terminal dimensions. + +Use progressive disclosure instead of separate product behavior at each width. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `SafeMarkdown` | Render bounded semantic Markdown after terminal sanitization. | + +Layout, theme, terminal identity, usage, and focused-surface helpers serve every visible component. + +## Sanitization boundary + +Provider chunks first pass through the stateful stream sanitizer. + +Semantic projection then removes or replaces unsafe terminal text. + +The renderer handles only sanitized strings and structured view values. + +Terminal titles use the stricter title sanitizer. + +Secret values never enter this boundary. + +## Layout modes + +Narrow mode supports terminals below 80 columns. + +Standard mode supports the primary 80-column workflow. + +Wide mode starts at 120 columns and adds secondary evidence. + +Row count also bounds composer growth, modal height, selector rows, and transcript viewport. + +Components recompute layout after every resize without changing product state. + +## Unicode and width + +All clipping uses terminal cell width rather than JavaScript string length. + +Wide glyphs, combining marks, emoji, and zero-width characters remain atomic. + +The renderer never splits an ANSI sequence or a terminal cell. + +Truncation markers consume their own measured width. + +## Failure and safety + +An incomplete escape candidate stays buffered until it becomes safe text or a suppressed control. + +Oversized content is bounded before layout work. + +Malformed Markdown renders as safe text. + +Unknown color support falls back to semantic text without changing content. + +## Performance + +Sanitization processes each incoming character once with bounded carry state. + +Layout helpers avoid scanning durable history. + +Renderers cap visible rows and details before width fitting. + +## Proof + +Tests cover split control sequences, OSC, CSI, C1 controls, Unicode width, resize, paste, Markdown, long lines, and hostile provider output. + +Captures compare semantic cells and raster output at the four required dimensions. + +## Non-goals + +Sanitization does not interpret provider-native protocol output. + +Responsive layout does not hide a blocking status, missing value, or capability reason. + diff --git a/docs/components/selectors-and-commands.md b/docs/components/selectors-and-commands.md new file mode 100644 index 00000000..8bd42dc0 --- /dev/null +++ b/docs/components/selectors-and-commands.md @@ -0,0 +1,91 @@ +# Selectors and commands + +## Job + +Selectors provide one searchable keyboard contract for commands, profiles, conversations, branches, runs, workers, analyses, and rules. + +## Best simple implementation + +Use `SearchableSelector` as the only generic list interaction. + +Supply immutable items with stable values, safe labels, optional descriptions, and declared actions. + +Build the command palette as a selector over the canonical command registry. + +Build autocomplete from the same registry and current capability map. + +Do not maintain a second command list inside the terminal. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `SearchableSelector` | Filter, navigate, select, cancel, and route declared row actions. | +| `CommandPalette` | Present supported commands from the canonical registry. | +| `DynamicAutocompleteProvider` | Combine command completion with bounded workspace path completion. | +| `GuardedAutocompleteProvider` | Ignore stale completion results after the input context changes. | + +## Inputs and outputs + +A selector receives a title, immutable items, theme, visible-row limit, footer, and callbacks. + +Selection emits the item's stable value rather than its display label. + +Command selection emits the same command path that typed slash input uses. + +Disabled commands remain visible with the exact capability reason. + +## Interaction contract + +Typing filters safe label and description text. + +Arrow keys move one row. + +Page keys move one viewport. + +Enter selects the current row. + +Escape or left closes the surface without changing application state. + +Declared action keys operate on the current row and never infer an entity from display order. + +## State + +Query text, selected index, and scroll offset are local presentation state. + +The source collection and capability decisions remain in the view model. + +Each update keeps selection by stable item value when possible. + +An empty or no-match state is explicit and still accepts cancel input. + +## Failure and safety + +Autocomplete is disabled during bracketed paste and other unsafe editor states. + +Late filesystem completion cannot replace results for a newer query. + +Paths stay under the configured workspace root. + +Labels, descriptions, paths, and capability reasons are sanitized before display. + +## Performance + +Filtering operates over bounded projected collections. + +Only visible rows render. + +Dynamic filesystem completion debounces input and discards stale work. + +## Proof + +Tests cover Unicode filtering, narrow widths, empty lists, no matches, paging, declared actions, late autocomplete, paste, and disabled commands. + +The keyboard recording opens the palette, filters an action, selects it, and returns focus. + +## Non-goals + +Selectors do not fetch provider capabilities or mutate entities. + +Autocomplete does not search outside the workspace or execute a command. + diff --git a/docs/components/supervision.md b/docs/components/supervision.md new file mode 100644 index 00000000..310e1ee5 --- /dev/null +++ b/docs/components/supervision.md @@ -0,0 +1,90 @@ +# Supervisor graph + +## Job + +The supervisor graph shows the runtime-owned tree of active supervisors and workers and routes supported controls to one exact worker. + +## Best simple implementation + +Read the canonical runtime supervisor snapshot through the shared Runtime API. + +Project it into bounded `GraphNodeView` rows with stable supervisor, worker, run, and parent identifiers. + +Render it through `GraphView` and the shared entity browser. + +Dispatch steer or cancel through the runtime control API with a stable operation identifier. + +Do not read `.agent/supervisor` files or infer control support from worker status text. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `GraphView` | Filter and navigate the projected hierarchy and open node details. | + +The runtime owns graph reads, control reconciliation, and live worker state. + +## Inputs and outputs + +Each node includes kind, stable identifier, parent, depth, status, label, spend, timing, and declared actions. + +Graph edges contain explicit source and destination identifiers. + +Steer and cancel intents include the source Braid run, supervisor, worker, payload, and operation identifier. + +The component renders the recorded control outcome after runtime reconciliation. + +## Hierarchy and refresh + +Projection keeps required ancestors for every retained recent worker. + +Sibling order follows the runtime snapshot order and stable recency rules. + +Two Braid runs keep separate supervisor bindings even when snapshot order changes. + +Refresh ignores an unchanged snapshot and stops when the graph closes. + +Selection remains on the same node identifier across refreshes. + +## Capability behavior + +Steer appears only when the runtime reports steer support for that worker. + +Cancel appears only when the runtime reports cancellation support. + +Attach remains disabled until Runtime exposes an external-client attach contract. + +The disabled action includes that exact reason. + +## Failure and safety + +An unavailable runtime read preserves the last confirmed snapshot and shows stale status. + +An unknown control result remains unknown until the runtime reports a terminal outcome. + +Duplicate controls reconcile by operation identifier. + +A control can never target a row by display position. + +Worker output and labels are sanitized before display. + +## Performance + +Projection retains a bounded recent set plus required ancestors. + +Graph filtering and layout remain linear in the bounded set. + +Refresh uses one subscription or bounded poll per open surface. + +## Proof + +Tests cover hierarchy, cycles, missing parents, two supervisors, status updates, spend, steer, cancel, unavailable actions, restart, and unchanged refresh. + +Live proof requires a real root and worker stream plus observed steering and cancellation effects. + +## Non-goals + +Braid does not implement a supervisor, agent loop, worker process, or attach transport. + +The graph does not equate a branch, run, worker, and provider session. + diff --git a/docs/components/terminal-shell.md b/docs/components/terminal-shell.md new file mode 100644 index 00000000..af20ad6f --- /dev/null +++ b/docs/components/terminal-shell.md @@ -0,0 +1,102 @@ +# Terminal shell and chrome + +## Job + +The terminal shell keeps the transcript, composer, identity, status, focus, and terminal lifecycle coherent. + +It is the stable frame around every Braid workflow. + +## Best simple implementation + +Use one `BraidTerminalApp` coordinator and one `BraidShell` layout root. + +Feed both from the immutable `BraidViewModel` through `ApplicationUiController`. + +Keep terminal mode ownership in `AlternateScreenTerminal` and the application start, suspend, resume, and stop paths. + +Keep status and identity rendering in the fixed-height `TerminalChrome`. + +Route keyboard input through `TerminalInputController` and commands through `TerminalCommandController`. + +Do not let a panel call an application port directly. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `BraidTerminalApp` | Compose the shell, controllers, overlays, subscriptions, terminal policy, and lifecycle. | +| `BraidShell` | Allocate rows between transcript, composer, and fixed chrome. | +| `TerminalChrome` | Render bounded identity, status, navigation, work, and measured usage rows. | +| `TerminalInputController` | Interpret global keys before forwarding text to the focused component. | +| `TerminalCommandController` | Resolve a command to one typed intent or a local presentation action. | +| `ApplicationUiController` | Project application state and dispatch typed intents. | +| `AlternateScreenTerminal` | Enter and restore the real terminal mode without leaking control state. | + +## Inputs and outputs + +The shell receives a controller, TUI instance, theme, workspace, operation-id source, keymap, and optional native actions. + +The controller supplies immutable view models and accepts typed intents. + +The shell outputs terminal rows and never returns provider-native data. + +User actions become typed intents with explicit run, conversation, branch, interaction, or worker identifiers. + +## State and focus + +The application owns only presentation state such as the open modal, quit arming, composer mode, and saved draft. + +Durable conversations, runs, interactions, and operations remain in the application core. + +The modal coordinator owns focus while a modal is visible. + +Closing the top modal restores the previous valid focus target. + +Suspension releases the local terminal while preserving the controller subscription and application state. + +## Responsive behavior + +The shell computes one layout from the current columns and rows on every render. + +The transcript receives all rows left after chrome and composer allocation. + +Narrow chrome keeps status and the route to activity. + +Standard chrome adds navigation and a small Work Strip. + +Wide chrome adds execution limits and measured usage only when those values are real. + +No layout creates a permanent side pane. + +## Failure and safety + +Terminal cleanup must run after normal exit, signal exit, startup failure, stream failure, and test interruption. + +Unknown capabilities render through `UnavailablePanel` with the provider reason. + +All title, status, identity, and notification text is sanitized before terminal output. + +The shell never renders credential values or secret-designated interaction answers. + +## Performance + +One frame subscription coalesces stream deltas at the configured frame interval. + +Rendering remains proportional to the bounded visible transcript and visible Work Strip. + +The shell does not scan the journal or provider state during render. + +## Proof + +PTY tests prove startup, keyboard routing, suspend, resume, shutdown, and terminal restoration. + +Virtual-terminal tests prove exact rows and focus behavior. + +Captures prove the shell at 40×12, 80×24, 120×40, and 200×60. + +## Non-goals + +The shell does not own agent execution, replay, persistence, profiles, or provider sessions. + +The shell does not infer a runner or model from display text. + diff --git a/docs/components/transcript-composer.md b/docs/components/transcript-composer.md new file mode 100644 index 00000000..f94833b0 --- /dev/null +++ b/docs/components/transcript-composer.md @@ -0,0 +1,104 @@ +# Transcript and composer + +## Job + +The transcript shows one selected conversation branch while the composer accepts the next user action. + +The component preserves reading position, draft text, and action mode across streaming and focus changes. + +## Best simple implementation + +Render the transcript from semantic message parts instead of raw provider chunks. + +Use one Pi editor inside `ComposerView` for text entry, history, paste, selection, and autocomplete. + +Use `TerminalDraftController` as the only owner of durable draft synchronization. + +Represent submit, queue, and steer as composer modes that change the emitted intent. + +Do not create separate transcript implementations for streaming, completed, replayed, or imported messages. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `TranscriptView` | Render and navigate the bounded semantic document for the selected branch. | +| `ComposerView` | Present the editor and the active submit, queue, or steer mode. | +| `TerminalDraftController` | Save, restore, and clear branch-scoped drafts through typed intents. | + +`SafeMarkdown` supplies the sanitized block renderer described in [safe-rendering.md](safe-rendering.md). + +## Inputs and outputs + +The transcript receives ordered `MessageView` values and semantic parts from `BraidViewModel`. + +The composer receives the selected branch, run focus, capabilities, queue state, and current mode. + +Submission emits a typed send, queue, or steer intent with a stable operation identifier. + +Draft changes emit no provider call. + +## State + +Scroll position and expanded detail are local presentation state. + +Messages, tool parts, usage, and terminal outcomes are durable application state. + +Draft text is keyed by conversation and branch so navigation cannot move text into another history. + +A submitted draft clears only after the application accepts its operation. + +An unavailable action preserves the draft and shows the reason. + +## Streaming + +Semantic parts update by stable message and part identifiers. + +Replacement events replace one part instead of appending duplicate text. + +Auto-follow remains active only when the user is already at the end. + +Manual scroll remains stable while new background content arrives. + +Switching focus changes the visible branch without stopping other run readers. + +## Responsive behavior + +The composer keeps at least one editable row. + +It grows only within a bounded share of terminal height. + +The transcript receives the remaining rows and clips whole terminal cells. + +Narrow layouts remove secondary part metadata before message content. + +## Failure and safety + +Provider text passes through the stream sanitizer and terminal sanitizer before rendering. + +Incomplete control-sequence candidates never reach the Markdown renderer. + +Unknown message parts use the generic semantic presentation and remain bounded. + +Secret answers never enter transcript parts or saved drafts. + +## Performance + +The transcript projects a bounded activity document and renders only its viewport. + +Frame delivery coalesces rapid deltas without dropping durable events. + +Draft persistence uses operation identity so restart replay cannot duplicate a mutation. + +## Proof + +Tests cover multiline editing, paste, history, queue, steer, streaming replacement, branch drafts, scroll retention, and restart. + +PTY recordings prove prompt entry, editing, streaming, queueing, and cancellation through the real terminal. + +## Non-goals + +The transcript does not parse provider-native output. + +The composer does not decide admission, continuation, queue order, or steering support. + diff --git a/test/component-docs.test.ts b/test/component-docs.test.ts new file mode 100644 index 00000000..73e06f2a --- /dev/null +++ b/test/component-docs.test.ts @@ -0,0 +1,68 @@ +import assert from 'node:assert/strict' +import { existsSync, readFileSync, readdirSync } from 'node:fs' +import { dirname, join, relative, resolve } from 'node:path' +import test from 'node:test' +import { fileURLToPath } from 'node:url' + +const repositoryRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..') +const componentIndex = join(repositoryRoot, 'docs/components/README.md') +const sourceDirectories = ['src/adapters/tui', 'src/views/tui'] as const + +interface DocumentedComponent { + readonly name: string + readonly source: string + readonly document: string +} + +function exportedTerminalComponents(): readonly Omit[] { + const components: Omit[] = [] + for (const sourceDirectory of sourceDirectories) { + const absoluteDirectory = join(repositoryRoot, sourceDirectory) + for (const filename of readdirSync(absoluteDirectory).filter((name) => name.endsWith('.ts'))) { + const absolutePath = join(absoluteDirectory, filename) + const source = relative(repositoryRoot, absolutePath).split('\\').join('/') + const text = readFileSync(absolutePath, 'utf8') + for (const match of text.matchAll(/^export class ([A-Za-z][A-Za-z0-9_]*)/gmu)) { + const name = match[1] + if (name !== undefined) components.push({ name, source }) + } + } + } + return components.sort((left, right) => + `${left.source}:${left.name}`.localeCompare(`${right.source}:${right.name}`), + ) +} + +function documentedTerminalComponents(): readonly DocumentedComponent[] { + const text = readFileSync(componentIndex, 'utf8') + const components: DocumentedComponent[] = [] + const row = /^\| `([^`]+)` \| `([^`]+)` \| \[[^\]]+\]\(([^)]+)\) \|$/gmu + for (const match of text.matchAll(row)) { + const [, name, source, document] = match + if (name !== undefined && source !== undefined && document !== undefined) { + components.push({ name, source, document }) + } + } + return components.sort((left, right) => + `${left.source}:${left.name}`.localeCompare(`${right.source}:${right.name}`), + ) +} + +test('every exported terminal component maps to one existing design document', () => { + const exported = exportedTerminalComponents() + const documented = documentedTerminalComponents() + const documentedKeys = documented.map(({ name, source }) => `${source}:${name}`) + + assert.equal(new Set(documentedKeys).size, documentedKeys.length) + assert.deepEqual( + documented.map(({ name, source }) => ({ name, source })), + exported, + ) + + for (const component of documented) { + assert.ok( + existsSync(join(dirname(componentIndex), component.document)), + `${component.name} references missing ${component.document}`, + ) + } +}) From 9b2144eb3bff27856417b01c0a8b7f967e893f9c Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 05:38:31 -0600 Subject: [PATCH 006/136] feat(conversations): add portable handoff and workspace forks --- .../components/conversation-branch-effects.md | 49 + scripts/run-tests.mjs | 3 + .../runtime/agent-runtime-execution.ts | 8 +- .../runtime/mode-routing-execution.ts | 13 + src/adapters/tui/ui-conversation-dispatch.ts | 45 +- src/app/application-types.ts | 10 + src/app/application.ts | 2 + src/app/conversation-branch-effects.ts | 998 ++++++++++++++++++ src/app/conversation-branches.ts | 178 +++- src/app/conversation-composition.ts | 5 + src/app/conversation-context.ts | 359 +++++++ src/app/conversation-types.ts | 39 +- src/app/conversations.ts | 2 + src/app/run-admission-dispatch.ts | 50 +- src/app/run-admission-request.ts | 10 + src/app/run-admission-validation.ts | 34 +- src/app/run-execution-snapshot.ts | 19 +- src/app/run-execution.ts | 9 +- src/domain/bounded-structured.ts | 24 + src/index.ts | 15 + src/ports/execution.ts | 27 + src/views/headless/rpc-parser.ts | 20 +- src/views/tui/conversation-overlay-actions.ts | 7 + test/conversation-branch-effects.test.ts | 521 +++++++++ test/scripts.test.ts | 3 + 25 files changed, 2412 insertions(+), 38 deletions(-) create mode 100644 docs/components/conversation-branch-effects.md create mode 100644 src/app/conversation-branch-effects.ts create mode 100644 test/conversation-branch-effects.test.ts diff --git a/docs/components/conversation-branch-effects.md b/docs/components/conversation-branch-effects.md new file mode 100644 index 00000000..ee6a9635 --- /dev/null +++ b/docs/components/conversation-branch-effects.md @@ -0,0 +1,49 @@ +# Conversation branch effects + +`ConversationBranches` owns planning and `conversation-branch-effects.ts` owns provider effects. + +The implementation uses the published `@tangle-network/agent-interface` contracts as the single cross-runner and workspace-fork boundary. + +## Inputs and outputs + +The planner reads immutable Braid state, the selected branch boundary, and the execution port capabilities. + +It returns a digest-bound preview that names the source run, destination, context plan, placement, and allowed action. + +Execution accepts only the matching preview digest and returns the durable destination branch. + +Cleanup accepts stable checkpoint and destination-environment identifiers and returns an exact per-resource outcome. + +## State and invariants + +Cross-runner transfer requires a recorded source environment, an exact canonical history plan, and a provider transfer method. + +Workspace fork requires checkpoint, fork, lookup, retry-safe, and cleanup capabilities from both the selected run and execution port. + +Every provider request uses a stable operation or idempotency identifier and validates the exact response matcher before persistence. + +Destination environments receive deterministic Braid identifiers and must differ from the provider source environment. + +The journal records only compact redacted transfer receipts, provider references, operation digests, graph edges, and immutable view-model data. + +The provider remains authoritative for live sessions, checkpoints, forks, and cleanup status. + +## Performance and tests + +Canonical conversion caps 1,024 messages and the agent-interface one-megabyte digest material limit. + +Legacy view context remains bounded by the existing twenty-thousand-message and two-megabyte limits. + +Provider lookups run before creation calls, so restart recovery does not repeat successful checkpoint, fork, or transfer effects. + +`test/conversation-branch-effects.test.ts` proves canonical handoff, restart replay, exact provider requests, destination isolation, cleanup, and unavailable capability behavior. + +The unit, contract, and security suites cover reducer replay, durable operations, redaction, and public-surface boundaries. + +## Non-goals + +This component does not parse provider-native output, launch runners, invent provider capabilities, or copy provider-private state. + +It does not promise cross-runner continuation when the provider cannot create a fresh session from the canonical plan. + +It does not expose credential values or place secrets in profiles, journal records, snapshots, logs, or terminal output. diff --git a/scripts/run-tests.mjs b/scripts/run-tests.mjs index d6ed12e3..c991e447 100644 --- a/scripts/run-tests.mjs +++ b/scripts/run-tests.mjs @@ -40,6 +40,7 @@ const scopeFiles = { 'analysis-model-call-observability.test.js', 'analysis-model-call-roundtrip.test.js', 'application.test.js', + 'conversation-branch-effects.test.js', 'cli-startup.test.js', 'conversations.test.js', 'coordination.test.js', @@ -66,6 +67,7 @@ const scopeFiles = { 'analysis-model-call-observability.test.js', 'analysis-model-call-roundtrip.test.js', 'application.test.js', + 'conversation-branch-effects.test.js', 'cli-bridge-interactions.test.js', 'cli-bridge-profile-contract.test.js', 'cli-bridge-retained-restart.test.js', @@ -126,6 +128,7 @@ const scopeFiles = { 'analysis-model-call-roundtrip.test.js', 'cli-startup.test.js', 'configuration-product-flow.test.js', + 'conversation-branch-effects.test.js', 'conversations.test.js', 'coordination.test.js', 'observability.test.js', diff --git a/src/adapters/runtime/agent-runtime-execution.ts b/src/adapters/runtime/agent-runtime-execution.ts index 0dbea01c..61f4c985 100644 --- a/src/adapters/runtime/agent-runtime-execution.ts +++ b/src/adapters/runtime/agent-runtime-execution.ts @@ -211,7 +211,12 @@ export class AgentRuntimeExecutionPort implements ExecutionPort { let terminal: Extract | undefined for await (const event of streamAgentTurn( runtimeBackend, - { prompt: input.text }, + { + prompt: input.text, + ...(input.contextTransfer === undefined + ? {} + : { contextTransfer: input.contextTransfer }), + }, { signal: localAbort.signal, preserveToolParts: true, @@ -406,5 +411,6 @@ function admissionKey(input: ExecuteTurnInput, profileDigest: string): string { mode: input.mode ?? null, sessionId: input.sessionId ?? null, contextBoundary: input.contextBoundary ?? null, + contextTransfer: input.contextTransfer ?? null, }) } diff --git a/src/adapters/runtime/mode-routing-execution.ts b/src/adapters/runtime/mode-routing-execution.ts index 0ea48404..263a7566 100644 --- a/src/adapters/runtime/mode-routing-execution.ts +++ b/src/adapters/runtime/mode-routing-execution.ts @@ -35,6 +35,10 @@ export class ModeRoutingExecutionPort implements ExecutionPort { readonly admissionMode: 'sync' | 'async' readonly capabilities: NonNullable readonly environmentCapabilities?: NonNullable + readonly context?: NonNullable + readonly contextTransfer?: NonNullable + readonly workspaceBranching?: NonNullable + readonly provider?: string constructor(options: ModeRoutingExecutionOptions) { this.#headless = options.headless @@ -48,6 +52,15 @@ export class ModeRoutingExecutionPort implements ExecutionPort { if (options.headless.environmentCapabilities !== undefined) { this.environmentCapabilities = options.headless.environmentCapabilities.bind(options.headless) } + const context = options.headless.context ?? options.interactive.context + if (context !== undefined) this.context = context + const contextTransfer = options.headless.contextTransfer ?? options.interactive.contextTransfer + if (contextTransfer !== undefined) this.contextTransfer = contextTransfer + const workspaceBranching = + options.headless.workspaceBranching ?? options.interactive.workspaceBranching + if (workspaceBranching !== undefined) this.workspaceBranching = workspaceBranching + const provider = options.headless.provider ?? options.interactive.provider + if (provider !== undefined) this.provider = provider } async admit(input: ExecuteTurnInput) { diff --git a/src/adapters/tui/ui-conversation-dispatch.ts b/src/adapters/tui/ui-conversation-dispatch.ts index 3e125998..9f192ff0 100644 --- a/src/adapters/tui/ui-conversation-dispatch.ts +++ b/src/adapters/tui/ui-conversation-dispatch.ts @@ -67,11 +67,17 @@ export async function dispatchConversationRunCommand( } case 'fork': { const workspace = intent.args.includes('--workspace') - const throughMessageId = intent.args.find((argument) => argument !== '--workspace') + const runner = flagValue(intent.args, '--runner') + const destinationProvider = flagValue(intent.args, '--provider') + const throughMessageId = intent.args.find((argument) => argument.startsWith('message-')) + const text = forkText(intent.args, throughMessageId) const plan = context.app.conversations.branches.plan({ operationId, - kind: workspace ? 'workspace' : 'conversation', + kind: workspace ? 'workspace' : runner === undefined ? 'conversation' : 'cross-runner', ...(throughMessageId === undefined ? {} : { throughMessageId }), + ...(runner === undefined ? {} : { runner }), + ...(destinationProvider === undefined ? {} : { destinationProvider }), + ...(text === undefined ? {} : { text }), }) context.setForkPreview(forkPreview(plan)) return accepted( @@ -282,18 +288,51 @@ export async function dispatchConversationHeadlessCommand( function forkInput(params: Readonly>, operationId: string) { const workspace = params.workspace === true || params.workspace === 'true' + const runner = optionalStringValue(params.runner) return { operationId, - kind: workspace ? ('workspace' as const) : ('conversation' as const), + kind: workspace + ? ('workspace' as const) + : runner === undefined + ? ('conversation' as const) + : ('cross-runner' as const), ...optionalString(params, 'conversationId'), ...optionalString(params, 'branchId'), ...renamedOptionalString(params, 'messageId', 'throughMessageId'), ...optionalString(params, 'runner'), ...optionalString(params, 'model'), ...optionalString(params, 'effort'), + ...optionalString(params, 'text'), + ...optionalString(params, 'acceptedDigest'), + ...optionalString(params, 'destinationProvider'), } } +function flagValue(args: readonly string[], flag: string): string | undefined { + const inline = args.find((argument) => argument.startsWith(`${flag}=`)) + if (inline !== undefined) return inline.slice(flag.length + 1) || undefined + const index = args.indexOf(flag) + const value = index < 0 ? undefined : args[index + 1] + return value === undefined || value.startsWith('--') ? undefined : value +} + +function forkText(args: readonly string[], boundary: string | undefined): string | undefined { + const values: string[] = [] + for (let index = 0; index < args.length; index += 1) { + const value = args[index] + if (value === undefined) continue + if (value === '--workspace' || value === boundary) continue + if (value === '--runner' || value === '--provider') { + index += 1 + continue + } + if (value.startsWith('--runner=') || value.startsWith('--provider=')) continue + values.push(value) + } + const text = values.join(' ').trim() + return text === '' ? undefined : text +} + function forkPreview(plan: ForkPlan): ForkPreviewView { return { plan: Object.freeze(plan), diff --git a/src/app/application-types.ts b/src/app/application-types.ts index 6871c98b..756ca9b8 100644 --- a/src/app/application-types.ts +++ b/src/app/application-types.ts @@ -1,3 +1,8 @@ +import type { + PortableContextPlan as CanonicalPortableContextPlan, + ContextTransferReceipt as PortableContextTransferReceipt, + ContextTransferRequest as PortableContextTransferRequest, +} from '@tangle-network/agent-interface' import type { BraidControlKind, BraidEventEnvelope } from '../domain/events.js' import type { ContextTransferReceipt, @@ -20,6 +25,11 @@ export interface SendInput { readonly sessionId?: string readonly contextPlan?: PortableContextPlan readonly contextTransfer?: ContextTransferReceipt + /** Canonical context plan used by a provider-owned fresh session. */ + readonly portableContextPlan?: CanonicalPortableContextPlan + /** Canonical request and receipt are kept separate from Braid's compact receipt. */ + readonly portableContextTransferRequest?: PortableContextTransferRequest + readonly portableContextTransferReceipt?: PortableContextTransferReceipt readonly nativeContextBoundaryProof?: NativeContextBoundaryProof } diff --git a/src/app/application.ts b/src/app/application.ts index 6992f4a5..cbd61f9e 100644 --- a/src/app/application.ts +++ b/src/app/application.ts @@ -290,6 +290,8 @@ export class BraidApplication { }, coordinate: (input, action) => this.#conversationOperations.run(input.operationId, input.digest, action), + execution: this.#execution, + send: (input) => this.send(input), ...(options.conversationStorage === undefined ? {} : { storage: options.conversationStorage }), diff --git a/src/app/conversation-branch-effects.ts b/src/app/conversation-branch-effects.ts new file mode 100644 index 00000000..495ed54a --- /dev/null +++ b/src/app/conversation-branch-effects.ts @@ -0,0 +1,998 @@ +import { + type ContextTransferRequest, + type ContextTransferResult, + contextTransferRequestDigest, + contextTransferResultMatchesRequest, + type PlacementInfo, + type PortableContextPlanRequest, + type PortableContextPlanResult, + portableContextPlanRequestDigest, + portableContextPlanResultMatchesRequest, + type WorkspaceCheckpointRequest, + type WorkspaceCheckpointResult, + type WorkspaceCleanupAcknowledgement, + type WorkspaceCleanupRequest, + type WorkspaceForkRequest, + type WorkspaceForkResult, + workspaceCheckpointRequestDigest, + workspaceCheckpointResultMatchesRequest, + workspaceCleanupAcknowledgementMatches, + workspaceCleanupRequestDigest, + workspaceForkRequestDigest, + workspaceForkResultMatchesRequest, +} from '@tangle-network/agent-interface' +import { canonicalDigest } from '../domain/canonical.js' +import type { + BranchRecord, + CheckpointRecord, + EnvironmentRecord, + OperationRecord, +} from '../domain/entities.js' +import { graphEdge, graphNode } from '../domain/graph-records.js' +import { + createCheckpointId, + createEnvironmentId, + type Digest, + parseBranchId, + parseCheckpointId, + parseEnvironmentId, + parseMessageId, + parseOperationId, + parseRunId, +} from '../domain/ids.js' +import type { BraidState } from '../domain/state.js' +import type { ExecutionPort } from '../ports/execution.js' +import type { + ConversationHost, + ForkPlan, + ForkPlanInput, + WorkspaceForkCleanupInput, + WorkspaceForkCleanupResult, +} from './conversation-types.js' +import { AppError } from './errors.js' + +type ForkExecutionInput = ForkPlanInput & { readonly planDigest: string } +type CreateBranch = (input: ForkPlanInput) => Promise + +/** Execute provider-owned context transfer or workspace branching. */ +export async function executeBranchEffect( + host: ConversationHost, + input: ForkExecutionInput, + plan: ForkPlan, + createBranch: CreateBranch, +): Promise { + if (plan.kind === 'cross-runner') return executeCrossRunner(host, input, plan, createBranch) + if (plan.kind === 'workspace') return executeWorkspace(host, input, plan, createBranch) + throw new AppError('FORK_PLAN_CONFLICT', 'The provider effect does not match this fork plan') +} + +/** Explicitly release provider checkpoint and fork resources. */ +export async function cleanupWorkspaceFork( + host: ConversationHost, + input: WorkspaceForkCleanupInput, +): Promise { + const execution = host.execution + const branching = execution?.workspaceBranching + const state = host.state() + const operationId = parseOperationId(input.operationId) + const checkpoint = + input.checkpointId === undefined + ? undefined + : state.checkpoints.find( + (candidate) => candidate.id === parseCheckpointId(input.checkpointId), + ) + const environment = + input.environmentId === undefined + ? undefined + : state.environments.find( + (candidate) => candidate.id === parseEnvironmentId(input.environmentId), + ) + if (input.checkpointId !== undefined && checkpoint === undefined) + throw new AppError('UNKNOWN_CHECKPOINT', `Checkpoint ${input.checkpointId} is unavailable`) + if (input.environmentId !== undefined && environment === undefined) + throw new AppError('UNKNOWN_ENVIRONMENT', `Environment ${input.environmentId} is unavailable`) + if (checkpoint === undefined && environment === undefined) + throw new AppError('INVALID_CLEANUP', 'Specify a checkpoint or destination environment') + if (environment !== undefined && checkpoint !== undefined) { + if (environment.id === checkpoint.sourceEnvironmentId) + throw new AppError('INVALID_CLEANUP', 'The source environment cannot be cleaned up') + const forked = state.graphEdges.some((edge) => { + const source = graphReference(state, edge.source) + const destination = graphReference(state, edge.destination) + return ( + edge.kind === 'forked_environment' && + destination?.kind === 'environment' && + destination.id === environment.id && + source?.kind === 'checkpoint' && + source.id === checkpoint.id + ) + }) + if (!forked) + throw new AppError( + 'INVALID_CLEANUP', + 'The destination environment is not the fork created from this checkpoint', + ) + } + if (environment !== undefined && checkpoint === undefined) { + const forked = state.graphEdges.some((edge) => { + const destination = graphReference(state, edge.destination) + return ( + edge.kind === 'forked_environment' && + destination?.kind === 'environment' && + destination.id === environment.id + ) + }) + if (!forked) + throw new AppError('INVALID_CLEANUP', 'Only a recorded forked environment can be cleaned up') + } + const providerCheckpointId = + checkpoint === undefined ? undefined : providerCheckpointIdFor(state, checkpoint) + if (checkpoint !== undefined && providerCheckpointId === undefined) + throw new AppError('UNKNOWN_CHECKPOINT', 'The checkpoint has no provider reference') + if (environment !== undefined && environment.providerEnvironmentId === undefined) + throw new AppError('UNKNOWN_ENVIRONMENT', 'The environment has no provider reference') + assertCleanupCapabilities(state, checkpoint, environment) + const digest = canonicalDigest({ + command: 'cleanup_workspace_fork', + operationId, + checkpointId: checkpoint?.id ?? null, + providerCheckpointId: providerCheckpointId ?? null, + environmentId: environment?.id ?? null, + providerEnvironmentId: environment?.providerEnvironmentId ?? null, + }) + const reserved = await reserveOperation(host, operationId, digest) + const existing = reserved.operations.find((candidate) => candidate.id === operationId) + if (existing?.status === 'acknowledged') { + const result = cleanupResultFromOperation(existing) + if (result === undefined) + throw new AppError('OPERATION_INCOMPLETE', `Operation ${operationId} has no cleanup result`) + return result + } + if (!hasWorkspaceBranching(branching)) + throw new AppError('CAPABILITY_UNAVAILABLE', 'Workspace cleanup is unavailable') + const previous = cleanupResultFromOperation(existing) + + const checkpointOutcome = + checkpoint === undefined + ? 'not_requested' + : previous?.checkpoint === 'deleted' || previous?.checkpoint === 'already_absent' + ? previous.checkpoint + : await cleanupCheckpoint( + host, + branching, + derivedOperationId(String(operationId), 'checkpoint-cleanup'), + checkpoint, + ) + await updateOperation(host, operationId, digest, { + status: 'pending', + result: { checkpoint: checkpointOutcome, environment: 'not_requested' }, + }) + const environmentOutcome = + environment === undefined + ? 'not_requested' + : previous?.environment === 'deleted' || previous?.environment === 'already_absent' + ? previous.environment + : await cleanupEnvironment( + host, + branching, + derivedOperationId(String(operationId), 'fork-cleanup'), + environment, + ) + const result: WorkspaceForkCleanupResult = { + checkpoint: checkpointOutcome, + environment: environmentOutcome, + } + await acknowledgeCleanupOperation(host, operationId, digest, result) + return result +} + +async function executeCrossRunner( + host: ConversationHost, + input: ForkExecutionInput, + plan: ForkPlan, + createBranch: CreateBranch, +): Promise { + const portablePlan = plan.portableContextPlan + const contextPort = contextTransferPort(host.execution) + if (portablePlan === undefined || contextPort?.transfer === undefined) + throw new AppError( + 'CAPABILITY_UNAVAILABLE', + 'Canonical fresh-session context transfer is unavailable', + ) + const state = host.state() + const sourceEnvironment = + plan.sourceEnvironmentId === undefined + ? undefined + : state.environments.find((environment) => environment.id === plan.sourceEnvironmentId) + if (sourceEnvironment === undefined || sourceEnvironment.providerEnvironmentId === undefined) + throw new AppError( + 'CAPABILITY_UNAVAILABLE', + 'Canonical context transfer requires a recorded source environment', + ) + if (sourceEnvironment.providerEnvironmentId !== portablePlan.source.source.environmentId) + throw new AppError( + 'FORK_PLAN_CONFLICT', + 'The portable plan names a different source environment', + ) + if (portablePlan.requiresAcceptance && input.acceptedDigest !== portablePlan.digest) + throw new AppError( + 'CONTEXT_PLAN_ACCEPTANCE_REQUIRED', + 'The transformed portable context plan requires explicit acceptance', + ) + + const operationId = parseOperationId(input.operationId) + const digest = canonicalDigest({ + command: 'execute_cross_runner_fork', + operationId, + planDigest: plan.digest, + acceptedDigest: input.acceptedDigest ?? null, + }) + const reserved = await reserveOperation(host, operationId, digest) + const existing = reserved.operations.find((operation) => operation.id === operationId) + if (existing?.status === 'acknowledged') return branchForOperation(state, existing) + + const planRequestMaterial = { + requestId: `${input.operationId}:plan`, + source: portablePlan.source, + destination: portablePlan.destination, + } + const planRequest: PortableContextPlanRequest = { + ...planRequestMaterial, + requestDigest: portableContextPlanRequestDigest(planRequestMaterial), + } + if (contextPort.plan !== undefined) { + const planned = await contextPort.plan(planRequest) + if (!portableContextPlanResultMatchesRequest(planRequest, planned)) + throw new AppError( + 'CONTEXT_PLAN_CONFLICT', + 'The provider context plan does not match its request', + ) + assertReadyPlan(planned) + if (planned.plan.digest !== portablePlan.digest) + throw new AppError('CONTEXT_PLAN_CONFLICT', 'The provider changed the accepted context plan') + } + + const acceptedAt = host.now() + const transferMaterial = { + operationId: `${input.operationId}:context`, + plan: portablePlan, + acceptance: { + planDigest: portablePlan.digest, + acceptedAt, + acceptedBy: input.acceptedDigest === undefined ? ('policy' as const) : ('user' as const), + }, + } + const transferRequest: ContextTransferRequest = { + ...transferMaterial, + requestDigest: contextTransferRequestDigest(transferMaterial), + } + const transfer = await lookupOrTransfer(contextPort, transferRequest) + if (!contextTransferResultMatchesRequest(transferRequest, transfer)) + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The context transfer result does not match its request', + ) + const receipt = assertAcceptedTransfer(transfer) + const destinationEnvironment = await recordDestinationEnvironment(host, plan, receipt) + const branch = await createBranch({ + ...input, + operationId: derivedOperationId(input.operationId, 'branch'), + destinationBranchId: plan.destinationBranchId, + ...(destinationEnvironment === undefined ? {} : { environmentId: destinationEnvironment.id }), + }) + await recordHandedOffEdge(host, plan, branch, receipt.contextDigest, operationId) + + if (input.text !== undefined && input.text.trim() !== '' && host.send !== undefined) { + const sent = host.send({ + operationId: derivedOperationId(input.operationId, 'send'), + conversationId: branch.conversationId, + branchId: branch.id, + text: input.text, + sessionId: receipt.sessionId, + portableContextPlan: portablePlan, + portableContextTransferRequest: transferRequest, + portableContextTransferReceipt: receipt, + }) + await sent.admissionReady + } + await acknowledgeOperation(host, operationId, digest, branch, { + kind: 'handoff', + branchId: String(branch.id), + planDigest: plan.digest, + receipt, + }) + return branch +} + +async function executeWorkspace( + host: ConversationHost, + input: ForkExecutionInput, + plan: ForkPlan, + createBranch: CreateBranch, +): Promise { + const branching = host.execution?.workspaceBranching + if (!hasWorkspaceBranching(branching)) + throw new AppError('CAPABILITY_UNAVAILABLE', plan.reason ?? 'Workspace fork is unavailable') + const state = host.state() + const operationId = parseOperationId(input.operationId) + const sourceRun = sourceRunForPlan(state, plan) + const source = sourceRun?.controlRef + if (sourceRun === undefined || source === undefined) + throw new AppError( + 'CAPABILITY_UNAVAILABLE', + 'Workspace fork requires an exact source run reference', + ) + const sourceEnvironment = plan.sourceEnvironmentId + if (sourceEnvironment === undefined || sourceRun.environmentId === undefined) + throw new AppError( + 'CAPABILITY_UNAVAILABLE', + 'Workspace fork requires a recorded source environment', + ) + if (sourceRun.environmentId !== parseEnvironmentId(sourceEnvironment)) + throw new AppError('FORK_PLAN_CONFLICT', 'The source run and branch environment do not match') + const sourceEnvironmentRecord = state.environments.find( + (environment) => environment.id === parseEnvironmentId(sourceEnvironment), + ) + if ( + sourceEnvironmentRecord === undefined || + sourceEnvironmentRecord.providerEnvironmentId !== source.environmentId + ) + throw new AppError( + 'CAPABILITY_UNAVAILABLE', + 'Workspace fork requires an exact recorded source environment', + ) + const capabilities = sourceRun.capabilities.environment?.branching + if ( + capabilities?.checkpoint !== true || + capabilities.fork !== true || + capabilities.retrySafe !== true || + capabilities.lookup !== true || + capabilities.cleanup !== true + ) + throw new AppError( + 'CAPABILITY_UNAVAILABLE', + 'The selected run does not report retry-safe checkpoint and environment fork support', + ) + + const digest = canonicalDigest({ + command: 'execute_workspace_fork', + operationId, + planDigest: plan.digest, + sourceRunId: sourceRun.id, + sourceEnvironment, + }) + const reserved = await reserveOperation(host, operationId, digest) + const existing = reserved.operations.find((operation) => operation.id === operationId) + if (existing?.status === 'acknowledged') return branchForOperation(reserved, existing) + + const checkpointMaterial = { + source, + name: `braid checkpoint ${plan.sourceBranchId}`, + metadata: { + braidOperationId: input.operationId, + sourceBranchId: String(plan.sourceBranchId), + ...(plan.throughMessageId === undefined ? {} : { throughMessageId: plan.throughMessageId }), + }, + } + const checkpointRequest: WorkspaceCheckpointRequest = { + ...checkpointMaterial, + idempotencyKey: `${input.operationId}:checkpoint`, + requestDigest: workspaceCheckpointRequestDigest(checkpointMaterial), + } + const checkpointResult = await lookupOrCheckpoint(branching, checkpointRequest) + if (!workspaceCheckpointResultMatchesRequest(checkpointRequest, checkpointResult)) + throw new AppError('CHECKPOINT_CONFLICT', 'The checkpoint result does not match its request') + const checkpoint = assertCheckpointResult(checkpointResult) + const checkpointRecord = toCheckpointRecord(plan, operationId, checkpointRequest, checkpoint) + if (!state.checkpoints.some((candidate) => candidate.id === checkpointRecord.id)) { + await host.commit({ kind: 'checkpoint.upserted', checkpoint: checkpointRecord }) + await host.commit({ + kind: 'graph.node.upserted', + node: graphNode( + { kind: 'checkpoint', id: checkpointRecord.id }, + checkpointRecord.createdAt, + 'Workspace checkpoint', + ), + }) + await host.commit({ + kind: 'graph.edge.upserted', + edge: graphEdge({ + kind: 'checkpointed', + source: { kind: 'environment', id: parseEnvironmentId(sourceEnvironment) }, + destination: { kind: 'checkpoint', id: checkpointRecord.id }, + at: checkpointRecord.createdAt, + provenance: { operationId, sourceDigest: stripSha(checkpointRequest.requestDigest) }, + }), + }) + } + await updateOperation(host, operationId, digest, { + status: 'pending', + result: { + checkpointId: String(checkpointRecord.id), + providerCheckpointId: checkpoint.checkpoint.checkpointId, + }, + }) + + const placement: PlacementInfo = input.placement ?? { kind: 'provider' } + const forkMaterial = { + checkpoint: checkpoint.checkpoint, + name: `braid fork ${plan.destinationBranchId}`, + placement, + metadata: { + braidOperationId: input.operationId, + destinationBranchId: String(plan.destinationBranchId), + }, + } + const forkRequest: WorkspaceForkRequest = { + ...forkMaterial, + idempotencyKey: `${input.operationId}:fork`, + requestDigest: workspaceForkRequestDigest(forkMaterial), + } + const forkResult = await lookupOrFork(branching, forkRequest) + if (!workspaceForkResultMatchesRequest(forkRequest, forkResult)) + throw new AppError('FORK_CONFLICT', 'The environment fork result does not match its request') + const fork = assertForkResult(forkResult) + if (fork.environment.sourceEnvironmentId !== source.environmentId) + throw new AppError( + 'FORK_PLAN_CONFLICT', + 'The provider fork names a different source environment', + ) + if (fork.environment.environmentId === source.environmentId) + throw new AppError('FORK_PLAN_CONFLICT', 'The provider fork reused the source environment') + const destination = await recordForkedEnvironment(host, plan, fork.environment) + const branch = await createBranch({ + ...input, + operationId: derivedOperationId(input.operationId, 'branch'), + destinationBranchId: plan.destinationBranchId, + environmentId: destination.id, + }) + await host.commit({ + kind: 'graph.edge.upserted', + edge: graphEdge({ + kind: 'forked_environment', + source: { kind: 'checkpoint', id: checkpointRecord.id }, + destination: { kind: 'environment', id: destination.id }, + at: destination.createdAt, + provenance: { operationId, sourceDigest: stripSha(forkRequest.requestDigest) }, + }), + }) + await acknowledgeOperation(host, operationId, digest, branch, { + kind: 'workspace-fork', + branchId: String(branch.id), + planDigest: plan.digest, + checkpointId: String(checkpointRecord.id), + providerCheckpointId: checkpoint.checkpoint.checkpointId, + providerEnvironmentId: fork.environment.environmentId, + }) + return branch +} + +async function lookupOrTransfer( + port: NonNullable>, + request: ContextTransferRequest, +): Promise { + const found = port.lookup === undefined ? undefined : await port.lookup(request) + if (found !== undefined) return found + return ( + (await port.transfer?.(request)) ?? { + status: 'unknown', + operationId: request.operationId, + requestDigest: request.requestDigest, + message: 'The provider did not expose context transfer', + retryable: false, + } + ) +} + +async function lookupOrCheckpoint( + branching: NonNullable, + request: WorkspaceCheckpointRequest, +): Promise { + const lookup = await branching.lookupCheckpoint({ + idempotencyKey: request.idempotencyKey, + requestDigest: request.requestDigest, + }) + if (lookup.status === 'found') return { ...lookup, status: 'replayed' } + if (lookup.status === 'conflict') + throw new AppError('CHECKPOINT_CONFLICT', 'Checkpoint idempotency key has a different request') + if (lookup.status === 'unknown') throw new AppError('CHECKPOINT_UNKNOWN', lookup.message) + return branching.checkpoint(request) +} + +async function lookupOrFork( + branching: NonNullable, + request: WorkspaceForkRequest, +): Promise { + const lookup = await branching.lookupFork({ + idempotencyKey: request.idempotencyKey, + requestDigest: request.requestDigest, + }) + if (lookup.status === 'found') return { ...lookup, status: 'replayed' } + if (lookup.status === 'conflict') + throw new AppError('FORK_CONFLICT', 'Fork idempotency key has a different request') + if (lookup.status === 'unknown') throw new AppError('FORK_UNKNOWN', lookup.message) + return branching.fork(request) +} + +async function cleanupCheckpoint( + host: ConversationHost, + branching: NonNullable, + operationId: ReturnType, + checkpoint: CheckpointRecord, +): Promise<'deleted' | 'already_absent'> { + const providerCheckpointId = providerCheckpointIdFor(host.state(), checkpoint) + if (providerCheckpointId === undefined) + throw new AppError('UNKNOWN_CHECKPOINT', 'The checkpoint has no provider reference') + const provider = providerForCheckpoint(host.state(), checkpoint) + const material = { kind: 'checkpoint' as const, targetId: providerCheckpointId, provider } + const request: WorkspaceCleanupRequest = { + operationId, + ...material, + requestDigest: workspaceCleanupRequestDigest(material), + } + const ack = await branching.deleteCheckpoint({ ...request, kind: 'checkpoint' }) + assertCleanupAcknowledgement(request, ack) + if (ack.status === 'deleted' || ack.status === 'already_absent') { + await host.commit({ + kind: 'checkpoint.upserted', + checkpoint: { ...checkpoint, status: 'deleted' }, + }) + return ack.status + } + throw new AppError('CLEANUP_UNKNOWN', ack.message ?? 'Checkpoint cleanup is unresolved') +} + +async function cleanupEnvironment( + host: ConversationHost, + branching: NonNullable, + operationId: ReturnType, + environment: EnvironmentRecord, +): Promise<'deleted' | 'already_absent'> { + const targetId = environment.providerEnvironmentId + if (targetId === undefined) + throw new AppError('UNKNOWN_ENVIRONMENT', 'The environment has no provider reference') + const material = { + kind: 'fork' as const, + targetId, + provider: environment.placement.provider, + } + const request: WorkspaceCleanupRequest = { + operationId, + ...material, + requestDigest: workspaceCleanupRequestDigest(material), + } + const ack = await branching.destroyFork({ ...request, kind: 'fork' }) + assertCleanupAcknowledgement(request, ack) + if (ack.status === 'deleted' || ack.status === 'already_absent') { + await host.commit({ + kind: 'environment.upserted', + environment: { ...environment, lifecycle: 'destroyed', updatedAt: host.now() }, + }) + return ack.status + } + throw new AppError('CLEANUP_UNKNOWN', ack.message ?? 'Environment cleanup is unresolved') +} + +function assertCleanupAcknowledgement( + request: WorkspaceCleanupRequest, + acknowledgement: WorkspaceCleanupAcknowledgement, +): void { + if (!workspaceCleanupAcknowledgementMatches(request, acknowledgement)) + throw new AppError('CLEANUP_CONFLICT', 'The cleanup acknowledgement does not match its request') +} + +function assertCleanupCapabilities( + state: BraidState, + checkpoint: CheckpointRecord | undefined, + environment: EnvironmentRecord | undefined, +): void { + const sourceCheckpoint = + checkpoint ?? + (environment === undefined + ? undefined + : (() => { + const edge = state.graphEdges.find((candidate) => { + const source = graphReference(state, candidate.source) + const destination = graphReference(state, candidate.destination) + return ( + candidate.kind === 'forked_environment' && + destination?.kind === 'environment' && + destination.id === environment.id && + source?.kind === 'checkpoint' + ) + }) + const source = edge === undefined ? undefined : graphReference(state, edge.source) + return source?.kind === 'checkpoint' + ? state.checkpoints.find((candidate) => candidate.id === source.id) + : undefined + })()) + const sourceRun = + sourceCheckpoint?.sourceRunId === undefined + ? undefined + : state.runs.find((candidate) => candidate.id === sourceCheckpoint.sourceRunId) + const branching = sourceRun?.capabilities.environment?.branching + if ( + sourceRun === undefined || + branching?.checkpoint !== true || + branching.fork !== true || + branching.retrySafe !== true || + branching.lookup !== true || + branching.cleanup !== true + ) + throw new AppError( + 'CAPABILITY_UNAVAILABLE', + 'The selected run does not report retry-safe workspace cleanup support', + ) +} + +function cleanupResultFromOperation( + operation: OperationRecord | undefined, +): WorkspaceForkCleanupResult | undefined { + if (operation?.result === undefined) return undefined + const checkpoint = operation.result.checkpoint + const environment = operation.result.environment + if (!isCleanupStatus(checkpoint) || !isCleanupStatus(environment)) + throw new AppError( + 'OPERATION_INCOMPLETE', + `Operation ${operation.id} has an invalid cleanup result`, + ) + return { checkpoint, environment } +} + +function isCleanupStatus(value: unknown): value is WorkspaceForkCleanupResult['checkpoint'] { + return value === 'deleted' || value === 'already_absent' || value === 'not_requested' +} + +function assertReadyPlan( + result: PortableContextPlanResult, +): asserts result is Extract { + if (result.status !== 'ready') throw new AppError('CONTEXT_PLAN_UNAVAILABLE', result.message) +} + +function assertAcceptedTransfer( + result: ContextTransferResult, +): Extract { + if (result.status === 'accepted' || result.status === 'replayed') return result + if (result.status === 'conflict') + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The provider rejected a changed context transfer request', + ) + if (result.status === 'unknown' || result.status === 'transport_failure') + throw new AppError('CONTEXT_TRANSFER_UNKNOWN', result.message) + throw new AppError('CONTEXT_TRANSFER_UNKNOWN', 'The provider did not accept context transfer') +} + +function assertCheckpointResult( + result: WorkspaceCheckpointResult, +): Extract { + if (result.status === 'created' || result.status === 'replayed') return result + if (result.status === 'conflict') + throw new AppError('CHECKPOINT_CONFLICT', 'The provider rejected a changed checkpoint request') + if (result.status === 'unknown') throw new AppError('CHECKPOINT_UNKNOWN', result.message) + throw new AppError('CHECKPOINT_UNKNOWN', 'The provider did not create the checkpoint') +} + +function assertForkResult( + result: WorkspaceForkResult, +): Extract { + if (result.status === 'created' || result.status === 'replayed') return result + if (result.status === 'conflict') + throw new AppError('FORK_CONFLICT', 'The provider rejected a changed fork request') + if (result.status === 'unknown') throw new AppError('FORK_UNKNOWN', result.message) + throw new AppError('FORK_UNKNOWN', 'The provider did not create the environment fork') +} + +function sourceRunForPlan( + state: BraidState, + plan: ForkPlan, +): BraidState['runs'][number] | undefined { + if (plan.sourceRunId !== undefined) { + const run = state.runs.find((candidate) => candidate.id === plan.sourceRunId) + if (run !== undefined) return run + } + return state.runs + .filter((run) => run.branchId === plan.sourceBranchId && run.controlRef !== undefined) + .at(-1) +} + +function toCheckpointRecord( + plan: ForkPlan, + operationId: ReturnType, + request: WorkspaceCheckpointRequest, + result: Extract, +): CheckpointRecord { + return { + id: createCheckpointId( + `checkpoint-${canonicalDigest({ provider: result.checkpoint.provider, id: result.checkpoint.checkpointId }).slice(0, 32)}`, + ), + sourceEnvironmentId: parseEnvironmentId( + plan.sourceEnvironmentId ?? result.checkpoint.source.environmentId, + ), + sourceBranchId: parseBranchId(plan.sourceBranchId), + ...(plan.sourceRunId === undefined ? {} : { sourceRunId: parseRunId(plan.sourceRunId) }), + ...(plan.throughMessageId === undefined + ? {} + : { throughMessageId: parseMessageId(plan.throughMessageId) }), + requestDigest: stripSha(request.requestDigest), + operationId, + createdAt: result.checkpoint.createdAt, + status: 'ready', + } +} + +async function recordDestinationEnvironment( + host: ConversationHost, + plan: ForkPlan, + receipt: Extract, +): Promise { + const source = host + .state() + .environments.find((environment) => environment.id === plan.sourceEnvironmentId) + if (source === undefined) return undefined + const id = createEnvironmentId( + `environment-handoff-${canonicalDigest({ provider: receipt.provider, environmentId: receipt.environmentId, operationId: receipt.operationId }).slice(0, 32)}`, + ) + if (id === source.id) + throw new AppError('FORK_PLAN_CONFLICT', 'The destination environment matches the source') + const at = receipt.admittedAt + const environment: EnvironmentRecord = { + id, + workspaceId: source.workspaceId, + connectionId: source.connectionId, + lifecycle: 'ready', + placement: { + provider: receipt.provider, + confidentialRequested: false, + confidentialVerified: false, + }, + providerEnvironmentId: receipt.environmentId, + continuity: 'session', + location: 'remote', + secretNames: [], + createdAt: at, + startedAt: at, + lastActivityAt: at, + updatedAt: at, + } + const existing = host.state().environments.find((candidate) => candidate.id === id) + if (existing === undefined) { + await host.commit({ kind: 'environment.upserted', environment }) + await host.commit({ + kind: 'graph.node.upserted', + node: graphNode({ kind: 'environment', id }, at, 'Handoff environment'), + }) + } + return existing ?? environment +} + +async function recordForkedEnvironment( + host: ConversationHost, + plan: ForkPlan, + ref: Extract['environment'], +): Promise { + const source = host + .state() + .environments.find((environment) => environment.id === plan.sourceEnvironmentId) + if (source === undefined) + throw new AppError('UNKNOWN_ENVIRONMENT', 'The source environment record is unavailable') + const id = createEnvironmentId( + `environment-fork-${canonicalDigest({ provider: ref.provider, environmentId: ref.environmentId, operationId: ref.idempotencyKey }).slice(0, 32)}`, + ) + const at = ref.createdAt + const environment: EnvironmentRecord = { + id, + workspaceId: source.workspaceId, + connectionId: source.connectionId, + lifecycle: 'ready', + placement: { + provider: ref.provider, + ...(ref.placement.region === undefined ? {} : { region: ref.placement.region }), + confidentialRequested: ref.confidentialRequested, + confidentialVerified: false, + }, + providerEnvironmentId: ref.environmentId, + continuity: 'session', + location: 'remote', + secretNames: [], + createdAt: at, + startedAt: at, + lastActivityAt: at, + updatedAt: at, + } + const existing = host.state().environments.find((candidate) => candidate.id === id) + if (existing === undefined) { + await host.commit({ kind: 'environment.upserted', environment }) + await host.commit({ + kind: 'graph.node.upserted', + node: graphNode({ kind: 'environment', id }, at, 'Workspace fork environment'), + }) + } + return existing ?? environment +} + +async function recordHandedOffEdge( + host: ConversationHost, + plan: ForkPlan, + branch: BranchRecord, + sourceDigest: string, + operationId: ReturnType, +): Promise { + const edge = graphEdge({ + kind: 'handed_off', + source: { kind: 'branch', id: parseBranchId(plan.sourceBranchId) }, + destination: { kind: 'branch', id: branch.id }, + at: host.now(), + provenance: { operationId, sourceDigest: stripSha(sourceDigest) }, + }) + if (!host.state().graphEdges.some((candidate) => candidate.id === edge.id)) + await host.commit({ kind: 'graph.edge.upserted', edge }) +} + +async function reserveOperation( + host: ConversationHost, + operationId: ReturnType, + digest: string, +): Promise { + const state = host.state() + const existing = state.operations.find((operation) => operation.id === operationId) + if (existing !== undefined && existing.kind !== 'conversation-fork') + throw new AppError( + 'OPERATION_ID_CONFLICT', + `Operation ${operationId} was already used by another command`, + ) + if (existing !== undefined && existing.requestDigest !== digest) + throw new AppError( + 'OPERATION_ID_CONFLICT', + `Operation ${operationId} was already used with different input`, + ) + if (existing !== undefined) return state + const at = host.now() + const operation: OperationRecord = { + id: operationId, + kind: 'conversation-fork', + requestDigest: digest as Digest, + status: 'pending', + createdAt: at, + updatedAt: at, + } + await host.commit({ kind: 'operation.requested', operation }) + return host.state() +} + +async function updateOperation( + host: ConversationHost, + operationId: ReturnType, + digest: string, + input: Pick, +): Promise { + const current = host.state().operations.find((operation) => operation.id === operationId) + if (current === undefined) + throw new AppError('OPERATION_INCOMPLETE', `Operation ${operationId} is missing`) + const operation = + input.result === undefined + ? { + ...current, + requestDigest: digest as Digest, + status: input.status, + updatedAt: host.now(), + } + : { + ...current, + requestDigest: digest as Digest, + status: input.status, + result: input.result, + updatedAt: host.now(), + } + await host.commit({ + kind: 'operation.updated', + operation, + }) +} + +async function acknowledgeOperation( + host: ConversationHost, + operationId: ReturnType, + digest: string, + branch: BranchRecord, + result: Record, +): Promise { + const current = host.state().operations.find((operation) => operation.id === operationId) + if (current === undefined) + throw new AppError('OPERATION_INCOMPLETE', `Operation ${operationId} is missing`) + await host.commit({ + kind: 'operation.updated', + operation: { + ...current, + requestDigest: digest as Digest, + status: 'acknowledged', + target: { kind: 'branch', id: branch.id }, + result: result as unknown as NonNullable, + updatedAt: host.now(), + acknowledgedAt: host.now(), + }, + }) +} + +async function acknowledgeCleanupOperation( + host: ConversationHost, + operationId: ReturnType, + digest: string, + result: WorkspaceForkCleanupResult, +): Promise { + const current = host.state().operations.find((operation) => operation.id === operationId) + if (current === undefined) + throw new AppError('OPERATION_INCOMPLETE', `Operation ${operationId} is missing`) + await host.commit({ + kind: 'operation.updated', + operation: { + ...current, + requestDigest: digest as Digest, + status: 'acknowledged', + result: result as unknown as NonNullable, + updatedAt: host.now(), + acknowledgedAt: host.now(), + }, + }) +} + +function branchForOperation(state: BraidState, operation: OperationRecord): BranchRecord { + if (operation.target?.kind !== 'branch') + throw new AppError('OPERATION_INCOMPLETE', `Operation ${operation.id} has no branch result`) + const branch = state.branches.find((candidate) => candidate.id === operation.target?.id) + if (branch === undefined) + throw new AppError( + 'OPERATION_INCOMPLETE', + `Operation ${operation.id} has no durable branch result`, + ) + return branch +} + +function derivedOperationId(operationId: string, label: string): string { + return `operation-${canonicalDigest({ operationId, label }).slice(0, 48)}` +} + +function contextTransferPort( + execution: ExecutionPort | undefined, +): NonNullable | undefined { + return execution?.context ?? execution?.contextTransfer +} + +function hasWorkspaceBranching( + branching: ExecutionPort['workspaceBranching'], +): branching is NonNullable { + return ( + branching !== undefined && + typeof branching.checkpoint === 'function' && + typeof branching.lookupCheckpoint === 'function' && + typeof branching.deleteCheckpoint === 'function' && + typeof branching.fork === 'function' && + typeof branching.lookupFork === 'function' && + typeof branching.destroyFork === 'function' + ) +} + +function graphReference(state: BraidState, id: string) { + return state.graphNodes.find((node) => node.id === id)?.reference +} + +function providerCheckpointIdFor( + state: BraidState, + checkpoint: CheckpointRecord, +): string | undefined { + const operation = state.operations.find((candidate) => candidate.id === checkpoint.operationId) + const value = operation?.result?.providerCheckpointId + return typeof value === 'string' ? value : undefined +} + +function providerForCheckpoint(state: BraidState, checkpoint: CheckpointRecord): string { + const environment = state.environments.find( + (candidate) => candidate.id === checkpoint.sourceEnvironmentId, + ) + return environment?.placement.provider ?? 'unknown-provider' +} + +function stripSha(value: string): Digest { + const digest = value.startsWith('sha256:') ? value.slice('sha256:'.length) : value + return digest as Digest +} diff --git a/src/app/conversation-branches.ts b/src/app/conversation-branches.ts index 105a1706..8065491a 100644 --- a/src/app/conversation-branches.ts +++ b/src/app/conversation-branches.ts @@ -1,3 +1,4 @@ +import { canonicalAgentProfileDigestHex } from '../adapters/agent-interface/profile-runtime.js' import { canonicalDigest } from '../domain/canonical.js' import type { BranchRecord, ConversationRecord, MessageRecord } from '../domain/entities.js' import { graphEdge, graphNode } from '../domain/graph-records.js' @@ -7,10 +8,18 @@ import { type OperationId, parseBranchId, parseConversationId, + parseEnvironmentId, parseMessageId, + parseOperationId, } from '../domain/ids.js' import type { BraidState } from '../domain/state.js' -import { messagesVisibleOnBranch, portablePlanForState } from './conversation-context.js' +import type { ExecutionPort } from '../ports/execution.js' +import { cleanupWorkspaceFork, executeBranchEffect } from './conversation-branch-effects.js' +import { + canonicalPortableContextPlanForState, + messagesVisibleOnBranch, + portablePlanForState, +} from './conversation-context.js' import { conversationBundle, draftRecord, @@ -121,7 +130,14 @@ export class ConversationBranches { const digest = requestDigest('branch', normalized) const replay = operationReplay(state, operationId, 'branch-create', digest) if (replay) return branchForOperation(state, replay) - const ids = stableBranchIds(operationId, digest) + const ids = + input.destinationBranchId === undefined + ? stableBranchIds(operationId, digest) + : { + branchId: parseBranchId(input.destinationBranchId), + draftId: stableBranchIds(operationId, digest).draftId, + queueId: stableBranchIds(operationId, digest).queueId, + } const at = this.#host.now() const draft = draftRecord(ids.draftId, ids.branchId, at, input.text) const queue = queueRecord(ids.queueId, ids.branchId, at) @@ -149,8 +165,12 @@ export class ConversationBranches { ...(input.mode === undefined ? {} : { mode: input.mode }), }), ...(source.branch.environmentId === undefined - ? {} - : { environmentId: source.branch.environmentId }), + ? input.environmentId === undefined + ? {} + : { environmentId: parseEnvironmentId(input.environmentId) } + : input.environmentId === undefined + ? { environmentId: source.branch.environmentId } + : { environmentId: parseEnvironmentId(input.environmentId) }), draftId: draft.id, queueId: queue.id, ...(source.through === undefined ? {} : { tipMessageId: source.through.id }), @@ -259,14 +279,53 @@ export class ConversationBranches { const normalized = branchRequest(source, input) const branchDigest = requestDigest('branch', normalized) const destinationBranchId = stableBranchIds(operationId, branchDigest).branchId - const kind = input.kind ?? 'conversation' + const sourceRunner = source.branch.overrides.runner ?? state.profile.harness + const requestedRunner = input.runner ?? sourceRunner + const sourceRun = sourceRunForBranch(state, source.branch.id, source.through?.runId) + const sourceEnvironmentId = source.branch.environmentId ?? sourceRun?.environmentId + const kind = + input.kind ?? + (input.runner !== undefined && input.runner !== sourceRunner + ? ('cross-runner' as const) + : ('conversation' as const)) const context = portablePlanForState(state, { branchId: source.branch.id, ...(source.through === undefined ? {} : { throughMessageId: source.through.id }), ...(input.runner === undefined ? {} : { destinationRunner: input.runner }), }) - const workspaceAvailable = workspaceForkReported(state, source.branch) - const allowed = kind === 'conversation' + const workspaceAvailable = workspaceForkReported( + state, + sourceRun, + this.#host.execution, + sourceEnvironmentId, + ) + const portableContextPlan = + kind === 'cross-runner' + ? canonicalPortableContextPlanForState(state, { + operationId, + branchId: source.branch.id, + ...(source.through === undefined ? {} : { throughMessageId: source.through.id }), + destinationRunner: requestedRunner ?? 'unknown-runner', + ...(input.destinationProvider === undefined + ? {} + : { destinationProvider: input.destinationProvider }), + ...(input.model === undefined ? {} : { destinationModel: input.model }), + profileDigest: canonicalAgentProfileDigestHex(state.profile), + }) + : undefined + const contextPort = contextTransferPort(this.#host.execution) + const crossRunnerAvailable = + kind === 'cross-runner' && + portableContextPlan !== undefined && + sourceEnvironmentId !== undefined && + state.environments.some( + (environment) => + environment.id === sourceEnvironmentId && + environment.providerEnvironmentId === portableContextPlan.source.source.environmentId, + ) && + contextPort?.transfer !== undefined + const allowed = + kind === 'conversation' || (kind === 'workspace' ? workspaceAvailable : crossRunnerAvailable) const plan = { kind, operationId, @@ -275,15 +334,30 @@ export class ConversationBranches { ...(source.through === undefined ? {} : { throughMessageId: source.through.id }), destinationBranchId, context, + ...(portableContextPlan === undefined ? {} : { portableContextPlan }), + ...(sourceRun === undefined ? {} : { sourceRunId: sourceRun.id }), + ...(sourceEnvironmentId === undefined ? {} : { sourceEnvironmentId }), + ...(portableContextPlan === undefined + ? {} + : { destinationEnvironmentId: portableContextPlan.destination.environmentId }), + ...(input.placement === undefined ? {} : { placement: input.placement }), + ...(input.text === undefined ? {} : { text: input.text }), + ...(input.destinationProvider === undefined + ? {} + : { destinationProvider: input.destinationProvider }), environment: kind === 'conversation' ? ('shared' as const) - : workspaceAvailable - ? ('new' as const) - : ('unavailable' as const), + : kind === 'workspace' + ? workspaceAvailable + ? ('new' as const) + : ('unavailable' as const) + : crossRunnerAvailable + ? ('new' as const) + : ('unavailable' as const), providerSession: 'new' as const, checkpoint: - kind === 'conversation' + kind !== 'workspace' ? ('none' as const) : workspaceAvailable ? ('required' as const) @@ -292,9 +366,12 @@ export class ConversationBranches { ...(allowed ? {} : { - reason: workspaceAvailable - ? 'The current runtime does not expose retry-safe environment fork execution to Braid' - : 'The selected run does not report retry-safe checkpoint and environment fork support', + reason: + kind === 'workspace' + ? workspaceAvailable + ? 'The current runtime does not expose retry-safe environment fork execution to Braid' + : 'The selected run does not report retry-safe checkpoint and environment fork support' + : 'The selected connection does not expose canonical fresh-session context transfer', }), } return { ...plan, digest: canonicalDigest(plan) } @@ -307,6 +384,17 @@ export class ConversationBranches { } async #execute(input: ForkPlanInput & { readonly planDigest: string }): Promise { + const existing = this.#host + .state() + .operations.find((operation) => operation.id === parseOperationId(input.operationId)) + if (existing?.kind === 'conversation-fork' && existing.status === 'acknowledged') { + if (existing.result?.planDigest !== input.planDigest) + throw new AppError( + 'FORK_PLAN_CONFLICT', + 'The accepted fork plan no longer matches the operation', + ) + return branchForOperation(this.#host.state(), existing) + } const plan = this.plan(input) if (plan.digest !== input.planDigest) { throw new AppError( @@ -317,12 +405,23 @@ export class ConversationBranches { if (!plan.allowed) { throw new AppError('CAPABILITY_UNAVAILABLE', plan.reason ?? 'Workspace fork is unavailable') } - const branch = await this.#create(input) + const branch = + plan.kind === 'conversation' + ? await this.#create(input) + : await executeBranchEffect(this.#host, input, plan, (branchInput) => + this.#create(branchInput), + ) if (branch.id !== plan.destinationBranchId) { throw new AppError('FORK_PLAN_CONFLICT', 'Fork execution produced an unexpected branch') } return branch } + + async cleanup(input: import('./conversation-types.js').WorkspaceForkCleanupInput) { + return coordinateConversationOperation(this.#host, 'cleanup_fork', input, () => + cleanupWorkspaceFork(this.#host, input), + ) + } } function resolveSource( @@ -414,12 +513,20 @@ function conversationForOperation( return conversation } -function workspaceForkReported(state: BraidState, branch: BranchRecord): boolean { - if (branch.environmentId === undefined) return false - const run = state.runs.filter((candidate) => candidate.branchId === branch.id).at(-1) +function workspaceForkReported( + state: BraidState, + run: BraidState['runs'][number] | undefined, + execution: ExecutionPort | undefined, + sourceEnvironmentId: string | undefined, +): boolean { + if (sourceEnvironmentId === undefined || run?.environmentId !== sourceEnvironmentId) return false + const environment = state.environments.find((candidate) => candidate.id === sourceEnvironmentId) + if (environment?.providerEnvironmentId === undefined) return false + if (run?.controlRef?.environmentId !== environment.providerEnvironmentId) return false const branching = run?.capabilities.environment?.branching return Boolean( - branching?.checkpoint && + hasWorkspaceBranchingMethods(execution) && + branching?.checkpoint && branching.fork && branching.retrySafe && branching.lookup && @@ -427,4 +534,37 @@ function workspaceForkReported(state: BraidState, branch: BranchRecord): boolean ) } +function sourceRunForBranch( + state: BraidState, + branchId: BranchRecord['id'], + preferredRunId: MessageRecord['runId'], +): BraidState['runs'][number] | undefined { + if (preferredRunId !== undefined) { + const preferred = state.runs.find( + (candidate) => candidate.id === preferredRunId && candidate.branchId === branchId, + ) + if (preferred !== undefined) return preferred + } + return state.runs.filter((candidate) => candidate.branchId === branchId).at(-1) +} + +function contextTransferPort( + execution: ExecutionPort | undefined, +): NonNullable | undefined { + return execution?.context ?? execution?.contextTransfer +} + +function hasWorkspaceBranchingMethods(execution: ExecutionPort | undefined): boolean { + const branching = execution?.workspaceBranching + return Boolean( + branching !== undefined && + typeof branching.checkpoint === 'function' && + typeof branching.lookupCheckpoint === 'function' && + typeof branching.deleteCheckpoint === 'function' && + typeof branching.fork === 'function' && + typeof branching.lookupFork === 'function' && + typeof branching.destroyFork === 'function', + ) +} + export type { BranchId, ConversationId } diff --git a/src/app/conversation-composition.ts b/src/app/conversation-composition.ts index 539c7e58..5c6f2cf7 100644 --- a/src/app/conversation-composition.ts +++ b/src/app/conversation-composition.ts @@ -3,6 +3,7 @@ import type { BraidEvent } from '../domain/events.js' import { parseConversationId, parseOperationId } from '../domain/ids.js' import type { BraidState } from '../domain/state.js' import type { StoragePort } from '../ports/storage.js' +import type { SendInput } from './application-types.js' import { ConversationActions } from './conversations.js' export interface ConversationCompositionInput { @@ -13,6 +14,8 @@ export interface ConversationCompositionInput { input: { readonly operationId: string; readonly digest: string }, action: () => Promise, ) => Promise + readonly execution?: import('../ports/execution.js').ExecutionPort + readonly send?: (input: SendInput) => import('./application-types.js').SendReceipt readonly storage?: Pick } @@ -24,6 +27,8 @@ export function createConversationActions( now: input.now, commit: input.commit, coordinate: input.coordinate, + ...(input.execution === undefined ? {} : { execution: input.execution }), + ...(input.send === undefined ? {} : { send: input.send }), ...(input.storage === undefined ? {} : { diff --git a/src/app/conversation-context.ts b/src/app/conversation-context.ts index b477f5c1..3d9a97a9 100644 --- a/src/app/conversation-context.ts +++ b/src/app/conversation-context.ts @@ -1,3 +1,18 @@ +import type { + BackendMessage, + PortableContextPlan as CanonicalPortableContextPlan, + InputPart, + PortableContextDestination, + PortableContextMessagePlan, + PortableContextPartPlan, + PortableContextSourceBoundary, + PortableConversationContext, + Sha256Digest, +} from '@tangle-network/agent-interface' +import { + portableContextPlanDigest, + portableConversationContextDigest, +} from '@tangle-network/agent-interface' import { canonicalDigest } from '../domain/canonical.js' import type { AnalysisAttachmentRecord, BranchRecord, MessageRecord } from '../domain/entities.js' import type { BranchId } from '../domain/ids.js' @@ -18,6 +33,12 @@ export { messagesVisibleOnBranch } from './conversation-visibility.js' const MAX_CONTEXT_MESSAGES = 20_000 const MAX_CONTEXT_BYTES = 2 * 1024 * 1024 +const MAX_CANONICAL_CONTEXT_MESSAGES = 1_024 +const MAX_CANONICAL_CONTEXT_PARTS = 1_024 +const MAX_CANONICAL_PLAN_BYTES = 1_048_576 + +const canonicalSha256 = (value: string): Sha256Digest => + (value.startsWith('sha256:') ? value : `sha256:${value}`) as Sha256Digest function portablePart(part: MessageRecord['parts'][number]): PortableContextPart | undefined { const id = part.id @@ -252,3 +273,341 @@ export class ConversationContext { return portablePlanForState(this.#host.state(), input) } } + +/** + * Build the shared portable-context contract from the immutable Braid view. + * + * Provider-owned parts are either converted to an input part with an explicit + * transformation or omitted with a reason, so the destination can verify the + * exact content that it receives. + */ +export function canonicalPortableContextPlanForState( + state: BraidState, + input: { + readonly operationId: string + readonly branchId?: string + readonly throughMessageId?: string + readonly destinationRunner: string + readonly destinationProvider?: string + readonly destinationModel?: string + readonly profileDigest: string + }, +): CanonicalPortableContextPlan | undefined { + const branch = resolveBranch(state, input.branchId) + const visible = messagesVisibleOnBranch(state, branch.id) + if (visible.length > MAX_CANONICAL_CONTEXT_MESSAGES) + throw new AppError('CONTEXT_TOO_LARGE', 'Canonical context has too many messages') + const through = + input.throughMessageId === undefined + ? visible.at(-1) + : visible.find((message) => message.id === input.throughMessageId) + if (through === undefined) return undefined + const selected = messagesThroughBoundary(visible, through.id) + if (selected.some((message) => message.parts.length > MAX_CANONICAL_CONTEXT_PARTS)) + throw new AppError('CONTEXT_TOO_LARGE', 'Canonical context has too many parts') + const sourceRun = sourceRunForBoundary(state, branch.id, through.id, through.runId) + const source = sourceBoundaryForRun(sourceRun, branch.id, through.id) + if (source === undefined) return undefined + + const sourceMessages = selected.map((message) => canonicalSourceMessage(message)) + const sourceContextMaterial = { + source, + completeness: sourceMessages.every((message) => message.complete) + ? ('complete' as const) + : ('partial' as const), + messages: sourceMessages.map((message) => message.source), + attachments: [], + } + assertCanonicalBytes(sourceContextMaterial) + const sourceContext: PortableConversationContext = { + ...sourceContextMaterial, + digest: portableConversationContextDigest(sourceContextMaterial), + } + const destination = canonicalDestination({ + operationId: input.operationId, + source, + sourceDigest: sourceContext.digest, + runner: input.destinationRunner, + provider: input.destinationProvider ?? source.provider, + ...(input.destinationModel === undefined ? {} : { model: input.destinationModel }), + profileDigest: canonicalSha256(input.profileDigest), + }) + + const messages: PortableContextMessagePlan[] = [] + const outputMessages: BackendMessage[] = [] + let requiresAcceptance = sourceContext.completeness === 'partial' + for (const message of sourceMessages) { + const partPlans: PortableContextPartPlan[] = [] + const outputParts: InputPart[] = [] + for (const [partIndex, part] of message.source.parts.entries()) { + const decision = canonicalPartDecision(part) + partPlans.push(decision.plan(partIndex)) + if (decision.output !== undefined) outputParts.push(decision.output) + if (decision.changed) requiresAcceptance = true + } + if (outputParts.length === 0) { + requiresAcceptance = true + messages.push({ + messageId: message.source.id, + action: 'omit', + parts: partPlans.map((part) => + part.action === 'omit' + ? part + : { + partIndex: part.partIndex, + action: 'omit' as const, + reason: 'No portable input part remains', + }, + ), + reason: 'Provider-owned message content is not portable', + }) + continue + } + const changed = partPlans.some((part) => part.action !== 'include') + if (changed) requiresAcceptance = true + messages.push({ + messageId: message.source.id, + action: 'include', + parts: partPlans, + ...(changed ? { reason: 'Provider-owned parts were transformed or omitted' } : {}), + }) + outputMessages.push({ + id: message.source.id, + role: message.source.role, + parts: outputParts, + timestamp: message.source.timestamp, + }) + } + + const contextMaterial = { + source, + completeness: requiresAcceptance ? ('partial' as const) : sourceContext.completeness, + messages: outputMessages, + attachments: [], + } + assertCanonicalBytes(contextMaterial) + const context: PortableConversationContext = { + ...contextMaterial, + digest: portableConversationContextDigest(contextMaterial), + } + const material = { + planId: `context-plan-${canonicalDigest({ input, source: sourceContext.digest }).slice(0, 32)}`, + source: sourceContext, + destination, + messages, + context, + estimatedTokens: Math.ceil(Buffer.byteLength(JSON.stringify(context), 'utf8') / 4), + requiresAcceptance, + } + assertCanonicalBytes(material) + return { ...material, digest: portableContextPlanDigest(material) } +} + +interface CanonicalSourceMessage { + readonly source: BackendMessage + readonly complete: boolean +} + +function canonicalSourceMessage(message: MessageRecord): CanonicalSourceMessage { + const parts = message.parts.map((part) => canonicalSourcePart(part)) + const fallback = + parts.length === 0 && message.text.length > 0 + ? [{ type: 'text' as const, text: redactSensitiveText(message.text) }] + : parts + return { + source: { + id: String(message.id), + role: message.role, + parts: fallback, + timestamp: safeTimestamp(message.createdAt), + }, + complete: message.complete && message.partsTruncated !== true, + } +} + +function canonicalSourcePart(part: MessageRecord['parts'][number]): unknown { + const text = redactSensitiveText(part.text ?? part.title ?? part.kind, 16_384) + switch (part.kind) { + case 'text': + return { type: 'text', text } + case 'artifact': + if (part.uri === undefined) + return { type: 'unknown', text: 'Provider artifact omitted because it has no portable URI' } + return { + type: 'file', + url: redactSensitiveText(part.uri, 4_096), + ...(part.mimeType === undefined ? {} : { mediaType: part.mimeType }), + } + case 'reasoning': + return { type: 'reasoning', text } + default: + return { type: part.kind, text } + } +} + +function canonicalPartDecision(part: unknown): { + readonly output?: InputPart + readonly changed: boolean + readonly plan: (partIndex: number) => PortableContextPartPlan +} { + const inputPart = parseInputPart(part) + if (inputPart !== undefined) { + return { + output: inputPart, + changed: false, + plan: (partIndex) => ({ partIndex, action: 'include' }), + } + } + if (isReasoningSourcePart(part)) { + return { + changed: true, + plan: (partIndex) => ({ + partIndex, + action: 'omit', + reason: 'Provider reasoning state is not portable', + }), + } + } + const output: InputPart = { + type: 'text', + text: redactSensitiveText( + typeof part === 'object' && part !== null && 'text' in part + ? String((part as { readonly text?: unknown }).text ?? '') + : 'Provider part converted to portable text', + 16_384, + ), + } + return { + output, + changed: true, + plan: (partIndex) => ({ + partIndex, + action: 'transform', + output, + reason: 'Provider part converted to portable text', + }), + } +} + +function parseInputPart(value: unknown): InputPart | undefined { + if (typeof value !== 'object' || value === null) return undefined + const candidate = value as Record + const type = candidate.type + if (type === 'text') { + return typeof candidate.text === 'string' && candidate.text.length <= 16_384 + ? { type, text: candidate.text } + : undefined + } + if (type === 'file' || type === 'image') { + const allowedKeys = new Set(['type', 'filename', 'mediaType', 'url', 'path', 'content']) + if (Object.keys(candidate).some((key) => !allowedKeys.has(key))) return undefined + for (const key of ['filename', 'mediaType', 'url', 'path', 'content']) { + const entry = candidate[key] + if (entry !== undefined && (typeof entry !== 'string' || entry.length > 16_384)) + return undefined + } + if (type === 'image' && candidate.content !== undefined) return undefined + return { + type, + ...(typeof candidate.filename === 'string' ? { filename: candidate.filename } : {}), + ...(typeof candidate.mediaType === 'string' ? { mediaType: candidate.mediaType } : {}), + ...(typeof candidate.url === 'string' ? { url: candidate.url } : {}), + ...(typeof candidate.path === 'string' ? { path: candidate.path } : {}), + ...(type === 'file' && typeof candidate.content === 'string' + ? { content: candidate.content } + : {}), + } + } + return undefined +} + +function isReasoningSourcePart(value: unknown): boolean { + return ( + typeof value === 'object' && + value !== null && + (value as { readonly type?: unknown }).type === 'reasoning' + ) +} + +function sourceRunForBoundary( + state: BraidState, + branchId: string, + messageId: string, + messageRunId: string | undefined, +): BraidState['runs'][number] | undefined { + if (messageRunId !== undefined) { + const direct = state.runs.find((run) => run.id === messageRunId && run.branchId === branchId) + if (direct !== undefined) return direct + } + return state.runs + .filter( + (run) => + run.branchId === branchId && + run.controlRef !== undefined && + state.messages.some((message) => message.id === messageId && message.runId === run.id), + ) + .at(-1) +} + +function sourceBoundaryForRun( + run: BraidState['runs'][number] | undefined, + branchId: string, + messageId: string, +): PortableContextSourceBoundary | undefined { + if (run === undefined) return undefined + const control = run.controlRef + const provider = control?.provider ?? run.receipt.provider + const environmentId = control?.environmentId ?? run.receipt.environmentId ?? run.environmentId + const sessionId = control?.sessionId ?? run.providerSessionId + const executionId = control?.executionId + const requestDigest = control?.requestDigest ?? run.receipt.requestDigest + if (!provider || !environmentId || !sessionId || !executionId || !requestDigest) return undefined + return { + runId: String(run.id), + messageId, + provider, + environmentId, + sessionId, + executionId, + requestDigest: canonicalSha256(requestDigest), + branchId, + } +} + +function canonicalDestination(input: { + readonly operationId: string + readonly source: PortableContextSourceBoundary + readonly sourceDigest: Sha256Digest + readonly runner: string + readonly provider: string + readonly model?: string + readonly profileDigest: Sha256Digest +}): PortableContextDestination { + const suffix = canonicalDigest({ + operationId: input.operationId, + source: input.source, + sourceDigest: input.sourceDigest, + runner: input.runner, + provider: input.provider, + model: input.model ?? null, + }).slice(0, 32) + return { + runner: input.runner, + provider: input.provider, + environmentId: `environment-handoff-${suffix}`, + sessionId: `session-handoff-${suffix}`, + runId: `run-handoff-${suffix}`, + executionId: `execution-handoff-${suffix}`, + ...(input.model === undefined ? {} : { model: input.model }), + profileDigest: input.profileDigest, + } +} + +function safeTimestamp(value: string): string { + return Number.isFinite(Date.parse(value)) ? value : new Date(0).toISOString() +} + +function assertCanonicalBytes(value: unknown): void { + if (Buffer.byteLength(JSON.stringify(value), 'utf8') > MAX_CANONICAL_PLAN_BYTES) + throw new AppError('CONTEXT_TOO_LARGE', 'Canonical context exceeds the one-megabyte limit') +} diff --git a/src/app/conversation-types.ts b/src/app/conversation-types.ts index 9f222ea6..940fded6 100644 --- a/src/app/conversation-types.ts +++ b/src/app/conversation-types.ts @@ -1,4 +1,8 @@ -import type { HarnessType } from '@tangle-network/agent-interface' +import type { + PortableContextPlan as CanonicalPortableContextPlan, + HarnessType, + PlacementInfo, +} from '@tangle-network/agent-interface' import type { BranchRecord, ConversationRecord, @@ -12,6 +16,8 @@ import type { import type { BraidEvent } from '../domain/events.js' import type { PortableContextPlan } from '../domain/receipts.js' import type { BraidState } from '../domain/state.js' +import type { ExecutionPort } from '../ports/execution.js' +import type { SendInput, SendReceipt } from './application-types.js' export interface ConversationHost { state(): BraidState @@ -22,6 +28,8 @@ export interface ConversationHost { input: { readonly operationId: string; readonly digest: string }, action: () => Promise, ): Promise + readonly execution?: ExecutionPort + readonly send?: (input: SendInput) => SendReceipt } export interface CreateConversationInput { @@ -44,6 +52,7 @@ export interface UpdateConversationInput { export interface CreateBranchInput { readonly operationId: string + readonly destinationBranchId?: string readonly conversationId?: string readonly branchId?: string readonly throughMessageId?: string @@ -52,6 +61,8 @@ export interface CreateBranchInput { readonly model?: string readonly effort?: string readonly mode?: string + /** Internal destination binding supplied after an external fork succeeds. */ + readonly environmentId?: string } export interface SetRunOverridesInput { @@ -79,11 +90,25 @@ export interface PlanContextInput { } export interface ForkPlanInput extends CreateBranchInput { - readonly kind?: 'conversation' | 'workspace' + readonly kind?: 'conversation' | 'workspace' | 'cross-runner' + readonly acceptedDigest?: string + readonly destinationProvider?: string + readonly placement?: PlacementInfo +} + +export interface WorkspaceForkCleanupInput { + readonly operationId: string + readonly checkpointId?: string + readonly environmentId?: string +} + +export interface WorkspaceForkCleanupResult { + readonly checkpoint: 'deleted' | 'already_absent' | 'not_requested' + readonly environment: 'deleted' | 'already_absent' | 'not_requested' } export interface ForkPlan { - readonly kind: 'conversation' | 'workspace' + readonly kind: 'conversation' | 'workspace' | 'cross-runner' readonly operationId: string readonly sourceConversationId: string readonly sourceBranchId: string @@ -93,6 +118,14 @@ export interface ForkPlan { readonly environment: 'shared' | 'new' | 'unavailable' readonly providerSession: 'new' readonly checkpoint: 'none' | 'required' | 'unavailable' + readonly portableContextPlan?: CanonicalPortableContextPlan + readonly sourceRunId?: string + readonly sourceEnvironmentId?: string + readonly destinationEnvironmentId?: string + readonly checkpointId?: string + readonly placement?: PlacementInfo + readonly text?: string + readonly destinationProvider?: string readonly allowed: boolean readonly reason?: string readonly digest: string diff --git a/src/app/conversations.ts b/src/app/conversations.ts index 679791ec..8429f74e 100644 --- a/src/app/conversations.ts +++ b/src/app/conversations.ts @@ -54,4 +54,6 @@ export type { PlanContextInput, SetRunOverridesInput, UpdateConversationInput, + WorkspaceForkCleanupInput, + WorkspaceForkCleanupResult, } from './conversation-types.js' diff --git a/src/app/run-admission-dispatch.ts b/src/app/run-admission-dispatch.ts index 026340f6..14f51b15 100644 --- a/src/app/run-admission-dispatch.ts +++ b/src/app/run-admission-dispatch.ts @@ -1,5 +1,6 @@ import type { AdmissionPort, AsyncAdmissionPort } from './application-ports.js' import type { SendReceipt } from './application-types.js' +import type { ContextTransferReceipt } from '../domain/receipts.js' import { AppError } from './errors.js' import { admitRun, admitRunAsync } from './run-admission-receipt.js' import { RUN_EFFECT_KIND, runEffectRequest } from './run-admission-request.js' @@ -32,7 +33,8 @@ export function sendRun(context: AdmissionPort, input: RunExecutionSnapshot): Se const runId = context.ids.next('run') const turnId = context.ids.next('turn') - if (input.contextTransfer && input.contextTransfer.destinationRunId !== runId) + const contextTransfer = localContextTransfer(input, runId) + if (contextTransfer && contextTransfer.destinationRunId !== runId) throw new AppError( 'CONTEXT_RECEIPT_CONFLICT', 'The context transfer receipt names a different destination run', @@ -49,13 +51,20 @@ export function sendRun(context: AdmissionPort, input: RunExecutionSnapshot): Se ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), signal: new AbortController().signal, ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }), - ...(input.contextPlan === undefined ? {} : { contextBoundary: input.contextPlan.digest }), + ...(input.contextPlan === undefined + ? input.portableContextPlan === undefined + ? {} + : { contextBoundary: input.portableContextPlan.digest } + : { contextBoundary: input.contextPlan.digest }), + ...(input.portableContextTransferRequest === undefined + ? {} + : { contextTransfer: input.portableContextTransferRequest }), }, conversationId, branchId, - input.contextTransfer, + contextTransfer, turnId, - input.contextPlan?.digest, + input.contextPlan?.digest ?? input.portableContextPlan?.digest, input.nativeContextBoundaryProof, input.contextPlan, ) @@ -119,7 +128,8 @@ export async function sendRunAsync( 'RUN_ACTIVE', `Run ${active.id} is still active on this branch; queue the next input explicitly`, ) - if (input.contextTransfer && input.contextTransfer.destinationRunId !== ids.runId) + const contextTransfer = localContextTransfer(input, ids.runId) + if (contextTransfer && contextTransfer.destinationRunId !== ids.runId) throw new AppError( 'CONTEXT_RECEIPT_CONFLICT', 'The context transfer receipt names a different destination run', @@ -136,13 +146,20 @@ export async function sendRunAsync( ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), signal, ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }), - ...(input.contextPlan === undefined ? {} : { contextBoundary: input.contextPlan.digest }), + ...(input.contextPlan === undefined + ? input.portableContextPlan === undefined + ? {} + : { contextBoundary: input.portableContextPlan.digest } + : { contextBoundary: input.contextPlan.digest }), + ...(input.portableContextTransferRequest === undefined + ? {} + : { contextTransfer: input.portableContextTransferRequest }), }, conversationId, branchId, - input.contextTransfer, + contextTransfer, ids.turnId, - input.contextPlan?.digest, + input.contextPlan?.digest ?? input.portableContextPlan?.digest, input.nativeContextBoundaryProof, input.contextPlan, ) @@ -203,3 +220,20 @@ function assertTargetBranch( throw new AppError('UNKNOWN_BRANCH', 'The requested conversation branch is unavailable') } } + +function localContextTransfer( + input: RunExecutionSnapshot, + runId: string, +): ContextTransferReceipt | undefined { + if (input.contextTransfer !== undefined) return input.contextTransfer + const receipt = input.portableContextTransferReceipt + if (receipt === undefined || (receipt.status !== 'accepted' && receipt.status !== 'replayed')) + return undefined + return { + planDigest: receipt.planDigest, + sourceRunId: receipt.source.runId, + destinationRunId: runId, + destinationSessionId: receipt.sessionId, + acceptedAt: receipt.admittedAt, + } +} diff --git a/src/app/run-admission-request.ts b/src/app/run-admission-request.ts index 75e3ee60..cf074a24 100644 --- a/src/app/run-admission-request.ts +++ b/src/app/run-admission-request.ts @@ -18,6 +18,15 @@ export function runEffectRequest(input: RunExecutionSnapshot): Readonly { const committed = context.commitAndWait({ kind: 'run.retained.admitted', diff --git a/src/domain/bounded-structured.ts b/src/domain/bounded-structured.ts index 210a80d3..49d9a7f6 100644 --- a/src/domain/bounded-structured.ts +++ b/src/domain/bounded-structured.ts @@ -33,6 +33,7 @@ const SAFE_NUMERIC_FIELDS = new Set([ 'tokenestimate', ]) const SAFE_BOOLEAN_FIELDS = new Set(['tokensknown']) +const SAFE_NAME_LIST_FIELDS = new Set(['secretnames']) export function isSafeNumericTelemetryField(key: string, value: unknown): value is number { const normalized = key.replace(/[^a-z0-9]/giu, '').toLowerCase() @@ -221,6 +222,9 @@ function sanitize( if (context.preserveNumericTelemetry && key && isSafeNumericTelemetryField(key, value)) { return value } + if (key && isSafeNameListField(key, value)) { + return sanitizeNameList(value, context) + } if (key) { const tokenUsage = safeTokenUsageRecord(key, value) if (tokenUsage !== undefined) return tokenUsage @@ -288,6 +292,26 @@ function sanitize( } } +function isSafeNameListField(key: string, value: unknown): value is readonly unknown[] { + return ( + SAFE_NAME_LIST_FIELDS.has(key.replace(/[^a-z0-9]/giu, '').toLowerCase()) && Array.isArray(value) + ) +} + +function sanitizeNameList( + values: readonly unknown[], + context: RedactionContext, +): readonly string[] { + const output: string[] = [] + for (const value of values) { + if (context.remainingItems <= 0) break + context.remainingItems -= 1 + if (typeof value !== 'string') continue + output.push(boundedString(value, context)) + } + return output +} + function isSafeOpaqueReference(key: string, value: string): boolean { if (OPAQUE_REFERENCE.test(value)) return true return ( diff --git a/src/index.ts b/src/index.ts index 57da55fd..0278c064 100644 --- a/src/index.ts +++ b/src/index.ts @@ -43,6 +43,20 @@ export { type DurableCompositionOptions, STARTER_PROFILE, } from './app/composition.js' +export type { + CloneConversationInput, + ConversationListQuery, + CreateBranchInput, + CreateConversationInput, + ForkPlan, + ForkPlanInput, + OpenConversationInput, + PlanContextInput, + SetRunOverridesInput, + UpdateConversationInput, + WorkspaceForkCleanupInput, + WorkspaceForkCleanupResult, +} from './app/conversations.js' export { type EffectContext, EffectCoordinator, @@ -131,6 +145,7 @@ export type { JournalPort, } from './ports/effect-storage.js' export type { + ContextTransferExecutionPort, ControlAcknowledgement, ExecuteTurnInput, ExecutionAdmission, diff --git a/src/ports/execution.ts b/src/ports/execution.ts index 145d5033..321351be 100644 --- a/src/ports/execution.ts +++ b/src/ports/execution.ts @@ -2,8 +2,13 @@ import type { AgentEnvironmentCapabilities, AgentExactRunControlRef, AgentProfile, + AgentWorkspaceBranching, + ContextTransferRequest, + ContextTransferResult, InteractionResponseCommand, NativeContextBoundaryProof, + PortableContextPlanRequest, + PortableContextPlanResult, } from '@tangle-network/agent-interface' import type { TurnUsage } from '../domain/entities.js' import type { RunAdmissionReceipt } from '../domain/receipts.js' @@ -36,6 +41,8 @@ export interface ExecuteTurnInput { readonly contextBoundary?: string /** Exact provider proof required for one retry-safe same-session turn. */ readonly nativeContextBoundaryProof?: NativeContextBoundaryProof + /** Canonical context transfer request for a fresh destination session. */ + readonly contextTransfer?: ContextTransferRequest readonly onRetainedAdmission?: RetainedRunAdmissionRecorder } @@ -54,6 +61,18 @@ export interface ExecutionAdmission { readonly materializationDigest?: string } +/** + * Optional provider-owned context planning and transfer operations. + * + * The payloads remain the canonical agent-interface contracts; this port only + * describes how Braid reaches an adapter that implements them. + */ +export interface ContextTransferExecutionPort { + readonly plan?: (input: PortableContextPlanRequest) => Promise + readonly transfer?: (input: ContextTransferRequest) => Promise + readonly lookup?: (input: ContextTransferRequest) => Promise +} + export interface ProviderRunSnapshot { readonly runId: string readonly status: RunStatus @@ -155,6 +174,14 @@ export interface ExecutionPort { } & RetainedExecutionRecoveryContext, ): Promise environmentCapabilities?(): AgentEnvironmentCapabilities | Promise + /** Provider-owned context planning and fresh-session transfer, when supported. */ + readonly context?: ContextTransferExecutionPort + /** Alias retained for adapters that name the capability after its operation. */ + readonly contextTransfer?: ContextTransferExecutionPort + /** Retry-safe checkpoint, fork, lookup, and cleanup operations, when supported. */ + readonly workspaceBranching?: AgentWorkspaceBranching + /** Provider identity used when Braid builds a destination context plan. */ + readonly provider?: string } export const DEFAULT_RUN_CAPABILITIES: RunCapabilities = Object.freeze({ diff --git a/src/views/headless/rpc-parser.ts b/src/views/headless/rpc-parser.ts index 55318d77..808166a2 100644 --- a/src/views/headless/rpc-parser.ts +++ b/src/views/headless/rpc-parser.ts @@ -64,7 +64,17 @@ const PARAMETER_KEYS: Readonly> = cancel_run: ['runId', 'reason'], branch: ['conversationId', 'branchId', 'messageId', 'text'], clone: ['conversationId', 'branchId', 'title'], - plan_fork: ['conversationId', 'branchId', 'messageId', 'workspace', 'runner', 'model', 'effort'], + plan_fork: [ + 'conversationId', + 'branchId', + 'messageId', + 'workspace', + 'runner', + 'model', + 'effort', + 'text', + 'destinationProvider', + ], execute_fork: [ 'planDigest', 'conversationId', @@ -74,6 +84,9 @@ const PARAMETER_KEYS: Readonly> = 'runner', 'model', 'effort', + 'text', + 'acceptedDigest', + 'destinationProvider', ], ask: ['source', 'question', 'profileRef', 'connectionId'], analyze: ['source', 'recipe', 'profileRef', 'connectionId'], @@ -143,6 +156,8 @@ const PARAMETER_TYPES: Readonly< runner: 'string', model: 'string', effort: 'string', + text: 'string', + destinationProvider: 'string', }, execute_fork: { planDigest: 'string', @@ -153,6 +168,9 @@ const PARAMETER_TYPES: Readonly< runner: 'string', model: 'string', effort: 'string', + text: 'string', + acceptedDigest: 'string', + destinationProvider: 'string', }, ask: { source: 'string', question: 'string', profileRef: 'string', connectionId: 'string' }, analyze: { source: 'string', recipe: 'string', profileRef: 'string', connectionId: 'string' }, diff --git a/src/views/tui/conversation-overlay-actions.ts b/src/views/tui/conversation-overlay-actions.ts index 039cdae1..1fe867f0 100644 --- a/src/views/tui/conversation-overlay-actions.ts +++ b/src/views/tui/conversation-overlay-actions.ts @@ -238,6 +238,13 @@ export class ConversationOverlayActions { ...(plan.context.destinationRunner === undefined ? {} : { runner: plan.context.destinationRunner }), + ...(plan.destinationProvider === undefined + ? {} + : { destinationProvider: plan.destinationProvider }), + ...(plan.text === undefined ? {} : { text: plan.text }), + ...(plan.portableContextPlan?.requiresAcceptance !== true + ? {} + : { acceptedDigest: plan.portableContextPlan.digest }), }, }) if (result.kind === 'accepted') this.#modals.closeTop() diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts new file mode 100644 index 00000000..cf859fd9 --- /dev/null +++ b/test/conversation-branch-effects.test.ts @@ -0,0 +1,521 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import type { + AgentExactRunControlRef, + ContextTransferRequest, + ContextTransferResult, + WorkspaceCheckpointRequest, + WorkspaceCheckpointResult, + WorkspaceForkRequest, + WorkspaceForkResult, +} from '@tangle-network/agent-interface' +import { createBraidApplication } from '../src/app/composition.js' +import { MemoryJournal } from '../src/app/journal.js' +import { canonicalDigest } from '../src/domain/canonical.js' +import type { ConnectionRecord } from '../src/domain/entities.js' +import { createConnectionId, createOperationId } from '../src/domain/ids.js' +import { FixedClock } from '../src/ports/clock.js' +import { + DEFAULT_RUN_CAPABILITIES, + type ExecutionPort, + type RunCapabilities, +} from '../src/ports/execution.js' + +const AT = '2026-08-28T00:00:00.000Z' +const SOURCE_PROVIDER = 'source-provider' +const TARGET_PROVIDER = 'target-provider' +const SOURCE_SESSION = 'provider-session-source' + +interface WorkspaceProviderState { + readonly checkpoints: Map< + string, + Extract + > + readonly forks: Map< + string, + Extract + > + readonly checkpointRequests: WorkspaceCheckpointRequest[] + readonly forkRequests: WorkspaceForkRequest[] + readonly cleanupRequests: Array<{ + readonly kind: 'checkpoint' | 'fork' + readonly targetId: string + readonly operationId: string + }> +} + +interface ContextProviderState { + readonly transfers: ContextTransferRequest[] +} + +function sourceConnection(): ConnectionRecord { + return { + id: createConnectionId('connection-branch-effects-source'), + kind: 'tangle-sandbox', + name: 'branch effects source', + providerOptions: { transport: 'local' }, + createdAt: AT, + updatedAt: AT, + lastHealth: { status: 'unknown' }, + } +} + +function exactControl(input: { + readonly runId: string + readonly provider: string + readonly environmentId: string + readonly sessionId: string + readonly executionId: string + readonly requestDigest?: string +}): AgentExactRunControlRef { + return { + runId: input.runId, + provider: input.provider, + environmentId: input.environmentId, + sessionId: input.sessionId, + executionId: input.executionId, + requestDigest: `sha256:${input.requestDigest ?? '1'.repeat(64)}`, + } +} + +function branchCapabilities(workspace = false): RunCapabilities { + return { + ...DEFAULT_RUN_CAPABILITIES, + streaming: { ...DEFAULT_RUN_CAPABILITIES.streaming, replay: true }, + sessions: { continue: true, messages: true }, + events: { stableIdentity: true, sequence: true, cursor: true }, + environment: { + branching: { + checkpoint: workspace, + fork: workspace, + retrySafe: workspace, + lookup: workspace, + cleanup: workspace, + }, + }, + } as unknown as RunCapabilities +} + +function contextResult(request: ContextTransferRequest): ContextTransferResult { + const plan = request.plan + const included = plan.messages + .filter((message) => message.action === 'include') + .map((message) => message.messageId) + const omitted = plan.messages + .filter((message) => message.action === 'omit') + .map((message) => message.messageId) + return { + status: 'accepted', + operationId: request.operationId, + requestDigest: request.requestDigest, + planDigest: plan.digest, + contextDigest: plan.context.digest, + source: plan.source.source, + destination: plan.destination, + provider: plan.destination.provider, + environmentId: plan.destination.environmentId, + sessionId: plan.destination.sessionId, + runId: plan.destination.runId, + executionId: plan.destination.executionId, + sessionCreatedForOperationId: request.operationId, + sessionCreatedAt: AT, + transferredMessageIds: included, + omittedMessageIds: omitted, + admittedAt: AT, + } +} + +function workspaceProvider(): { + readonly branching: NonNullable + readonly state: WorkspaceProviderState +} { + const state: WorkspaceProviderState = { + checkpoints: new Map(), + forks: new Map(), + checkpointRequests: [], + forkRequests: [], + cleanupRequests: [], + } + const branching: NonNullable = { + async checkpoint(request) { + state.checkpointRequests.push(request) + const result: WorkspaceCheckpointResult = { + status: 'created', + idempotencyKey: request.idempotencyKey, + requestDigest: request.requestDigest, + checkpoint: { + checkpointId: 'provider-checkpoint-1', + provider: request.source.provider, + source: request.source, + idempotencyKey: request.idempotencyKey, + requestDigest: request.requestDigest, + createdAt: AT, + ...(request.metadata === undefined ? {} : { metadata: request.metadata }), + }, + } + state.checkpoints.set(request.idempotencyKey, result) + return result + }, + async lookupCheckpoint(request) { + const result = state.checkpoints.get(request.idempotencyKey) + return result === undefined + ? { status: 'not_found', ...request } + : { status: 'found', ...request, checkpoint: result.checkpoint } + }, + async deleteCheckpoint(request) { + state.cleanupRequests.push({ + kind: 'checkpoint', + targetId: request.targetId, + operationId: request.operationId, + }) + return { + operationId: request.operationId, + kind: 'checkpoint' as const, + targetId: request.targetId, + provider: request.provider, + requestDigest: request.requestDigest, + status: 'deleted' as const, + } + }, + async fork(request) { + state.forkRequests.push(request) + const result: WorkspaceForkResult = { + status: 'created', + idempotencyKey: request.idempotencyKey, + requestDigest: request.requestDigest, + environment: { + provider: request.checkpoint.provider, + environmentId: 'provider-destination-environment', + sourceEnvironmentId: request.checkpoint.source.environmentId, + source: request.checkpoint.source, + sourceCheckpointId: request.checkpoint.checkpointId, + idempotencyKey: request.idempotencyKey, + requestDigest: request.requestDigest, + createdAt: AT, + placement: request.placement, + confidentialRequested: request.confidential?.requested ?? false, + ...(request.metadata === undefined ? {} : { metadata: request.metadata }), + }, + } + state.forks.set(request.idempotencyKey, result) + return result + }, + async lookupFork(request) { + const result = state.forks.get(request.idempotencyKey) + return result === undefined + ? { status: 'not_found', ...request } + : { status: 'found', ...request, environment: result.environment } + }, + async destroyFork(request) { + state.cleanupRequests.push({ + kind: 'fork', + targetId: request.targetId, + operationId: request.operationId, + }) + return { + operationId: request.operationId, + kind: 'fork' as const, + targetId: request.targetId, + provider: request.provider, + requestDigest: request.requestDigest, + status: 'deleted' as const, + } + }, + } + return { branching, state } +} + +async function prepareSource(app: ReturnType): Promise { + app.initialize('/workspace') + const connection = sourceConnection() + await app.configuration.selectConnection({ + connection, + operation: { + id: createOperationId('operation-select-branch-effects-source'), + kind: 'connection-change', + requestDigest: canonicalDigest({ + command: 'select_connection', + connectionId: connection.id, + }), + status: 'acknowledged', + target: { kind: 'connection', id: connection.id }, + result: { connectionId: connection.id }, + createdAt: AT, + updatedAt: AT, + acknowledgedAt: AT, + }, + }) +} + +function executionFor(options: { + readonly capabilities: ReturnType + readonly contextState?: ContextProviderState + readonly workspaceBranching?: NonNullable +}): ExecutionPort { + const contextState = options.contextState + return { + admissionMode: 'sync', + capabilities: () => options.capabilities, + admit(input) { + const destination = input.contextTransfer !== undefined + return { + capabilities: options.capabilities, + provider: destination ? TARGET_PROVIDER : SOURCE_PROVIDER, + environmentId: destination + ? input.contextTransfer?.plan.destination.environmentId + : 'provider-source-environment', + providerSessionId: destination + ? input.contextTransfer?.plan.destination.sessionId + : SOURCE_SESSION, + materializationReceipt: { provider: destination ? TARGET_PROVIDER : SOURCE_PROVIDER }, + } + }, + async *streamTurn(input) { + if (contextState !== undefined && input.contextTransfer !== undefined) + contextState.transfers.push(input.contextTransfer) + if (!input.contextTransfer) { + yield { + type: 'braid.execution.observed', + observation: { + kind: 'sandbox', + provider: SOURCE_PROVIDER, + providerEnvironmentId: 'provider-source-environment', + lifecycle: 'ready', + lifecycleMode: 'retained', + cleanup: 'explicit', + continuity: 'session', + location: 'remote', + createdAt: AT, + startedAt: AT, + lastActivityAt: AT, + observedAt: AT, + unavailable: [], + }, + controlRef: exactControl({ + runId: input.runId, + provider: SOURCE_PROVIDER, + environmentId: 'provider-source-environment', + sessionId: SOURCE_SESSION, + executionId: 'provider-source-execution', + }), + timestamp: AT, + } + } + yield { + type: 'final', + status: 'completed', + reason: 'completed', + text: `completed ${input.text}`, + metadata: { tokenUsage: { input: 1, output: 1 } }, + task: { id: `task-${input.runId}`, intent: input.text }, + timestamp: AT, + } + }, + ...(contextState === undefined + ? {} + : { + context: { + async transfer(request: ContextTransferRequest) { + contextState.transfers.push(request) + return contextResult(request) + }, + }, + }), + ...(options.workspaceBranching === undefined + ? {} + : { workspaceBranching: options.workspaceBranching }), + } +} + +test('cross-runner handoff transfers canonical history and replays after restart', async () => { + const contextState: ContextProviderState = { transfers: [] } + const execution = executionFor({ + capabilities: branchCapabilities(), + contextState, + }) + const journal = new MemoryJournal(new FixedClock(AT)) + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + journal, + effectStorage: journal, + }) + await prepareSource(app) + await app.send({ operationId: 'op-source-branch-effects', text: 'source history' }).completion + + const plan = app.conversations.branches.plan({ + operationId: 'op-cross-runner-branch-effects', + kind: 'cross-runner', + runner: 'codex', + destinationProvider: TARGET_PROVIDER, + }) + assert.equal(plan.allowed, true) + const portableContextPlan = plan.portableContextPlan + assert(portableContextPlan) + const accepted = portableContextPlan.requiresAcceptance + ? { acceptedDigest: portableContextPlan.digest } + : {} + const branch = await app.conversations.branches.execute({ + operationId: 'op-cross-runner-branch-effects', + kind: 'cross-runner', + runner: 'codex', + destinationProvider: TARGET_PROVIDER, + ...accepted, + planDigest: plan.digest, + }) + + assert.equal(contextState.transfers.length, 1) + assert.equal(contextState.transfers[0]?.plan.destination.runner, 'codex') + assert.equal(branch.id, plan.destinationBranchId) + assert.notEqual(branch.environmentId, plan.sourceEnvironmentId) + const handoffEdge = app.state().graphEdges.find((edge) => edge.kind === 'handed_off') + assert(handoffEdge) + assert.equal( + app.state().graphNodes.find((node) => node.id === handoffEdge.destination)?.reference.id, + branch.id, + ) + assert.equal( + app.state().operations.find((operation) => operation.id === 'op-cross-runner-branch-effects') + ?.status, + 'acknowledged', + ) + + const restarted = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + journal, + effectStorage: journal, + }) + const replay = await restarted.conversations.branches.execute({ + operationId: 'op-cross-runner-branch-effects', + kind: 'cross-runner', + runner: 'codex', + destinationProvider: TARGET_PROVIDER, + ...accepted, + planDigest: plan.digest, + }) + assert.equal(replay.id, branch.id) + assert.equal(contextState.transfers.length, 1) + assert.equal( + restarted.state().branches.filter((candidate) => candidate.id === branch.id).length, + 1, + ) +}) + +test('workspace fork uses exact provider operations, isolates destination, and cleans both resources', async () => { + const provider = workspaceProvider() + const execution = executionFor({ + capabilities: branchCapabilities(true), + workspaceBranching: provider.branching, + }) + const workspaceBranching = execution.workspaceBranching + assert(workspaceBranching) + const journal = new MemoryJournal(new FixedClock(AT)) + const app = createBraidApplication({ + fixture: 'deterministic', + execution: { ...execution, workspaceBranching }, + clock: new FixedClock(AT), + journal, + }) + await prepareSource(app) + await app.send({ operationId: 'op-source-workspace-effects', text: 'checkpoint source' }) + .completion + const plan = app.conversations.branches.plan({ + operationId: 'op-workspace-branch-effects', + kind: 'workspace', + }) + assert.equal(plan.allowed, true) + const branch = await app.conversations.branches.execute({ + operationId: 'op-workspace-branch-effects', + kind: 'workspace', + planDigest: plan.digest, + }) + assert.equal(provider.state.checkpointRequests.length, 1) + assert.equal(provider.state.forkRequests.length, 1) + assert.notEqual(branch.environmentId, plan.sourceEnvironmentId) + assert.equal( + provider.state.forkRequests[0]?.checkpoint.source.environmentId, + app.state().environments.find((environment) => environment.id === plan.sourceEnvironmentId) + ?.providerEnvironmentId, + ) + const checkpoint = app.state().checkpoints[0] + assert(checkpoint) + const destination = app + .state() + .environments.find((environment) => environment.id === branch.environmentId) + assert(destination) + assert.equal(destination.providerEnvironmentId, 'provider-destination-environment') + assert.notEqual( + destination.providerEnvironmentId, + provider.state.forkRequests[0]?.checkpoint.source.environmentId, + ) + + const workspaceReplay = await app.conversations.branches.execute({ + operationId: 'op-workspace-branch-effects', + kind: 'workspace', + planDigest: plan.digest, + }) + assert.equal(workspaceReplay.id, branch.id) + assert.equal(provider.state.checkpointRequests.length, 1) + assert.equal(provider.state.forkRequests.length, 1) + + const cleanup = await app.conversations.branches.cleanup({ + operationId: 'op-cleanup-workspace-effects', + checkpointId: String(checkpoint.id), + environmentId: String(destination.id), + }) + assert.deepEqual(cleanup, { checkpoint: 'deleted', environment: 'deleted' }) + assert.deepEqual( + provider.state.cleanupRequests.map(({ kind, targetId }) => ({ kind, targetId })), + [ + { kind: 'checkpoint', targetId: 'provider-checkpoint-1' }, + { kind: 'fork', targetId: 'provider-destination-environment' }, + ], + ) + assert.notEqual( + provider.state.cleanupRequests[0]?.operationId, + provider.state.cleanupRequests[1]?.operationId, + ) + assert.equal( + app.state().checkpoints.find((candidate) => candidate.id === checkpoint.id)?.status, + 'deleted', + ) + assert.equal( + app.state().environments.find((candidate) => candidate.id === destination.id)?.lifecycle, + 'destroyed', + ) + + const restarted = createBraidApplication({ + fixture: 'deterministic', + execution: { ...execution, workspaceBranching }, + clock: new FixedClock(AT), + journal, + }) + const cleanupReplay = await restarted.conversations.branches.cleanup({ + operationId: 'op-cleanup-workspace-effects', + checkpointId: String(checkpoint.id), + environmentId: String(destination.id), + }) + assert.deepEqual(cleanupReplay, cleanup) + assert.equal(provider.state.cleanupRequests.length, 2) +}) + +test('cross-runner planning stays unavailable without a provider transfer method', async () => { + const execution = executionFor({ capabilities: branchCapabilities() }) + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + }) + await prepareSource(app) + await app.send({ operationId: 'op-source-no-transfer', text: 'source history' }).completion + const plan = app.conversations.branches.plan({ + operationId: 'op-cross-runner-no-transfer', + kind: 'cross-runner', + runner: 'codex', + }) + assert.equal(plan.allowed, false) + assert.match(plan.reason ?? '', /context transfer/iu) +}) diff --git a/test/scripts.test.ts b/test/scripts.test.ts index 121ed634..b2aacb65 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -208,6 +208,7 @@ test('every scoped package alias forwards its declared file set', () => { 'application.test.js', 'canonical.test.js', 'cli-startup.test.js', + 'conversation-branch-effects.test.js', 'conversations.test.js', 'coordination.test.js', 'domain-ids.test.js', @@ -236,6 +237,7 @@ test('every scoped package alias forwards its declared file set', () => { 'cli-bridge-interactions.test.js', 'cli-bridge-profile-contract.test.js', 'cli-bridge-retained-restart.test.js', + 'conversation-branch-effects.test.js', 'conversations.test.js', 'coordination.test.js', 'domain-invariants.test.js', @@ -300,6 +302,7 @@ test('every scoped package alias forwards its declared file set', () => { 'analysis-model-call-roundtrip.test.js', 'cli-startup.test.js', 'configuration-product-flow.test.js', + 'conversation-branch-effects.test.js', 'conversations.test.js', 'coordination.test.js', 'observability.test.js', From ea4588009bb3ae0b750a2f1262049acfd58776cb Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 05:44:26 -0600 Subject: [PATCH 007/136] feat(intelligence): expose analysis progress and supervisor controls --- README.md | 12 + docs/02-experience-specification.md | 8 + docs/03-architecture.md | 19 +- docs/04-runtime-contracts.md | 16 +- docs/06-conversations-forks-and-analysis.md | 16 ++ src/adapters/analysis/eval-analyst.ts | 31 ++- src/adapters/runtime/supervisor-control.ts | 118 +++++--- src/adapters/tui/ui-capabilities.ts | 49 ++++ src/adapters/tui/ui-intelligence-dispatch.ts | 176 ++++++++++-- src/adapters/tui/ui-projection.ts | 14 + src/app/analysis-lifecycle.ts | 90 ++++++- src/app/analysis-service.ts | 5 +- src/app/analysis-types.ts | 3 +- src/app/supervisor-service.ts | 28 +- src/domain/entities-interactions.ts | 10 + src/domain/invariants-run.ts | 11 + src/views/headless/rpc-parser.ts | 23 +- src/views/shared/analysis-presentation.ts | 38 +++ src/views/shared/headless-commands.ts | 15 +- src/views/shared/models.ts | 16 ++ src/views/tui/activity-browser.ts | 36 ++- src/views/tui/entity-browser-layout.ts | 13 +- src/views/tui/supervisor-actions.ts | 80 ++++++ src/views/tui/terminal-overlays.ts | 1 + src/views/tui/terminal-surface-overlays.ts | 269 ++++++++++++++++++- test/analysis-durable.test.ts | 16 +- test/analysis-supervision.test.ts | 82 +++++- test/intelligence-dispatch.test.ts | 113 +++++++- test/tui-core-workflows.test.ts | 121 ++++++++- test/tui-refresh-lifecycle.test.ts | 1 + test/w6-contract.test.ts | 4 + 31 files changed, 1330 insertions(+), 104 deletions(-) create mode 100644 src/views/tui/supervisor-actions.ts diff --git a/README.md b/README.md index 1354abff..d3686661 100644 --- a/README.md +++ b/README.md @@ -171,6 +171,12 @@ These commands inspect or compare recorded work rather than sending another ordi `/ask` does not append a message to the analyzed branch. +`/analyze failure,cost,tools` selects multiple exact analysts, while `/analyze all` selects every available trace analyst. + +The activity view shows each selected analyst as pending, running, completed, skipped, or failed. + +The upstream exact registry runs selected analysts in order, so Braid does not claim they execute concurrently. + Each analysis has its own run identity, source digest, analyst profile, model, budget, usage, latency, cost, completeness, and citations. The standard Braid install includes `uv` for `/ask`. @@ -181,6 +187,12 @@ Set `BRAID_PYTHON` only when an operator must use a preinstalled compatible envi Findings remain separate until the user explicitly sends selected findings to a branch or forks from the analysis. +In the analysis activity scope, `p` promotes a supported cited finding and `x` cancels active analysis work. + +In the worker scope, `x` cancels and `r` refreshes. + +The `s` and `a` keys explain why retry-safe steering and exact attachment are disabled by the current runtime contract. + ## Interactive and headless modes Interactive mode is the full-screen terminal experience with a multiline composer, streaming transcript, selectors, and focused overlays. diff --git a/docs/02-experience-specification.md b/docs/02-experience-specification.md index 2976178e..9e38782d 100644 --- a/docs/02-experience-specification.md +++ b/docs/02-experience-specification.md @@ -173,6 +173,14 @@ F2 opens the focused activity browser for active and historical work. The activity browser uses one list/detail surface and keeps direct turns, analyses, and workers distinct. +Each running analysis lists the selected analysts and their exact registry progress. + +The analysis scope exposes promote, cancel, and refresh keys without hiding the current result. + +The worker scope exposes steer, cancel, attach, and refresh keys only through reported runtime capabilities. + +An unavailable attach action explains the missing runtime contract and does not create a replacement run. + Graph, details, and workspace views use focused overlays. No secondary surface reduces the transcript below its minimum width because secondary surfaces replace the shell. diff --git a/docs/03-architecture.md b/docs/03-architecture.md index 7d585f64..9f0dabe3 100644 --- a/docs/03-architecture.md +++ b/docs/03-architecture.md @@ -234,8 +234,9 @@ interface AnalysisPort { interface SupervisorPort { snapshots(input: SupervisorWatchInput): AsyncIterable - steer(input: WorkerSteerInput): Promise - cancel(input: WorkerCancelInput): Promise + steerWorker(input: WorkerSteerInput): Promise + cancelWorker(input: WorkerCancelInput): Promise + cancelSupervisor(input: SupervisorCancelInput): Promise } interface StoragePort { @@ -580,7 +581,11 @@ Every headless request carries a connection-local client request identifier. Every side-effecting headless command also carries a caller-created, globally stable operation identifier that survives reconnect and process restart. -The protocol supports initialization, workspace open, conversation navigation, profile and connection selection, send, queue, steer, interaction response, cancel, branch, clone, fork, ask, compare, query, subscribe, export, and shutdown. +The protocol supports initialization, workspace open, conversation navigation, profile and connection selection, send, queue, steer, interaction response, and cancel. + +It also supports branch, clone, fork, ask, analyze, compare, activity queries, analysis cancellation, supervisor refresh, worker steering, and supervisor cancellation. + +Every supervisor mutation resolves a public Braid identifier to one runtime identifier before it calls the runtime-owned API. The protocol never exposes a provider client object or allows arbitrary method invocation. @@ -606,6 +611,14 @@ A layout function maps width and height to narrow, standard, or wide composition The activity rail and focused activity browser consume the same activity document projection, so filtering and event status do not diverge between layouts. +`AnalysisLifecycle` reduces exact analyst events into durable per-analyst progress records. + +`ActivityBrowserPanel` renders those records and emits typed promote, cancel, steer, attach, and refresh actions. + +`WorkerSteerPrompt` collects one sanitized steering instruction and does not access runtime state. + +`TerminalSurfaceOverlays` owns confirmations and routes each action through the application controller with a stable operation identifier. + Theme tokens are semantic and views cannot use raw ANSI codes. Untrusted content passes through one sanitizer before it reaches text, markdown, link, image, clipboard, title, or notification components. diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index 6c2fe997..506ccbef 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -261,21 +261,25 @@ Braid adapts `loadTopSnapshot` into its own worker view, but it does not copy th The runtime kernel exports `writeWorkerSteer` for worker inbox delivery. -Braid resolves its public supervisor and worker identifiers to the exact runtime references before it calls that function. +That function generates a new request identifier on every call and does not accept a caller operation identifier. + +Braid keeps worker steering disabled until Runtime supports same-body replay and changed-body conflict for a stable operation identifier. An explicit parent reference stays visible when no worker resolves it, and Braid does not create a replacement supervisor edge. The snapshot has no Braid run identifier, so Braid does not infer a run binding from snapshot order, current selection, or time. -The snapshot also omits partial-read diagnostics. +The snapshot reports completeness and bounded diagnostics for unreadable or partial sources. + +The runtime kernel exports `cancelWorker` and `cancelRun` as idempotent cancellation operations. -[agent-runtime issue 757](https://github.com/tangle-network/agent-runtime/issues/757) requests bounded completeness evidence. +Braid supplies the runtime state directory, exact runtime target, and caller operation identifier. -The runtime does not export worker-scoped cancellation or reconnectable external root cancellation. +An `unknown` effect means the request awaits acknowledgement and never becomes local success. -Braid therefore keeps those actions unavailable instead of treating an unread request as acknowledgement. +The runtime snapshot does not expose a retained interactive reference for one worker. -[agent-runtime issue 758](https://github.com/tangle-network/agent-runtime/issues/758) tracks acknowledged worker and external root cancellation. +Braid therefore disables worker attachment until Runtime owns a worker-to-retained-session attachment operation. The shared stream has no stable provider-native child-task lifecycle. diff --git a/docs/06-conversations-forks-and-analysis.md b/docs/06-conversations-forks-and-analysis.md index aede0cb7..481aabec 100644 --- a/docs/06-conversations-forks-and-analysis.md +++ b/docs/06-conversations-forks-and-analysis.md @@ -308,6 +308,16 @@ The analyst uses canonical bounded trace tools and cannot mutate the source work Analysis runs in a separate runtime execution context and has its own cancellation and cost. +One request can select explicit analyst identifiers, comma-separated recipe aliases, or every available trace analyst with `all`. + +Braid validates and removes duplicate selections before dispatch. + +The exact registry reports analyst start and completion events in its defined serial order. + +Braid stores those events as pending, running, completed, skipped, or failed progress under the analysis record. + +Restart replay restores the last committed analyst state before terminal reconciliation. + ### Analysis result The result stores analyst identity, source digest, question or recipe, findings, exact citations, uncertainty, deterministic checks, errors, usage, cost, latency, and package versions. @@ -330,6 +340,8 @@ The destination agent sees that the content is an external analysis rather than Promotion is a user action and never follows automatically from analyst completion. +The activity browser lets the user repeat `p` to promote supported cited findings one at a time. + ## Named analyses `/analyze failure` runs deterministic trace checks and the configured failure-mode analyst. @@ -344,6 +356,10 @@ Recipes are registered through `agent-eval` and versioned by exact identifier. Braid may add presentation aliases but cannot duplicate analyst logic in a command handler. +Comma-separated aliases can select several analysts without creating separate analysis records. + +`/analyze all` selects every available trace analyst except the dedicated free-form question analyst. + ## Comparison `/compare` freezes two source records and calls the appropriate `agent-eval` paired comparison. diff --git a/src/adapters/analysis/eval-analyst.ts b/src/adapters/analysis/eval-analyst.ts index 019e70b4..6d109bd3 100644 --- a/src/adapters/analysis/eval-analyst.ts +++ b/src/adapters/analysis/eval-analyst.ts @@ -114,10 +114,11 @@ export class AgentEvalAnalystAdapter { const available = this.#registry.list() const availableIds = new Set(available.map((entry) => entry.id)) if (request.analystIds !== undefined) { - const unknown = request.analystIds.filter((id) => !availableIds.has(id)) + const selected = [...new Set(request.analystIds.map((id) => id.trim()).filter(Boolean))] + const unknown = selected.filter((id) => !availableIds.has(id)) if (unknown.length > 0) throw unavailable(unknown[0] ?? 'custom', available) - if (request.analystIds.length === 0) throw unavailable('custom', available) - return [...request.analystIds] + if (selected.length === 0) throw unavailable('custom', available) + return selected } const recipe = request.recipe ?? 'ask' @@ -126,10 +127,26 @@ export class AgentEvalAnalystAdapter { return [BRAID_QUESTION_ANALYST_ID] } - const candidates = RECIPE_ALIASES[recipe] ?? [recipe] - const selected = candidates.find((candidate) => availableIds.has(candidate)) - if (selected === undefined) throw unavailable(recipe, available) - return [selected] + const recipes = recipe + .split(',') + .map((value) => value.trim()) + .filter(Boolean) + if (recipes.includes('all')) { + const selected = available + .map((entry) => entry.id) + .filter((id) => id !== BRAID_QUESTION_ANALYST_ID) + if (selected.length === 0) throw unavailable('all', available) + return selected + } + const selected: string[] = [] + for (const item of recipes) { + const candidates = RECIPE_ALIASES[item] ?? [item] + const analystId = candidates.find((candidate) => availableIds.has(candidate)) + if (analystId === undefined) throw unavailable(item, available) + if (!selected.includes(analystId)) selected.push(analystId) + } + if (selected.length === 0) throw unavailable(recipe, available) + return selected } async *stream(request: EvalAnalystRequest): AsyncGenerator { diff --git a/src/adapters/runtime/supervisor-control.ts b/src/adapters/runtime/supervisor-control.ts index fddbf6ea..26d9fec2 100644 --- a/src/adapters/runtime/supervisor-control.ts +++ b/src/adapters/runtime/supervisor-control.ts @@ -1,5 +1,11 @@ -import { type RootHandle, writeWorkerSteer } from '@tangle-network/agent-runtime/kernel' -import type { WorkerView } from '@tangle-network/agent-runtime/tui' +import { + cancelRun, + cancelWorker, + type RunCancellation, + type WorkerCancellation, + writeWorkerSteer, +} from '@tangle-network/agent-runtime/kernel' +import type { SupervisorView, WorkerView } from '@tangle-network/agent-runtime/tui' import { AGENT_RUNTIME_VERSION } from './agent-runtime-version.js' import { type RuntimeSupervisorSnapshotPort, RuntimeSupervisorWatcher } from './supervisor-watch.js' @@ -22,26 +28,23 @@ export interface SupervisorWorkerSteerResult { } export interface SupervisorWorkerCancelResult { - readonly status: 'unavailable' + readonly status: 'requested' | 'acknowledged' | 'unavailable' readonly worker: string - readonly issue: SupervisorCapabilityIssue + readonly operationId?: string + readonly effect?: WorkerCancellation['effect'] + readonly detail?: string + readonly terminated?: readonly string[] + readonly issue?: SupervisorCapabilityIssue } export interface SupervisorCancelResult { - readonly status: 'accepted' | 'unavailable' + readonly status: 'requested' | 'acknowledged' | 'unavailable' + readonly operationId?: string + readonly effect?: RunCancellation['effect'] + readonly detail?: string readonly issue?: SupervisorCapabilityIssue } -export const WORKER_CANCEL_UNAVAILABLE: SupervisorCapabilityIssue = { - capability: 'supervisor.worker.cancel', - packageName: '@tangle-network/agent-runtime', - packageVersion: AGENT_RUNTIME_VERSION, - reason: - 'The published runtime exposes RootHandle.abort for the whole supervisor and writeWorkerSteer for a worker inbox, but no worker-scoped cancellation method.', - reproduction: - "import { writeWorkerSteer } from '@tangle-network/agent-runtime/kernel'; import { loadTopSnapshot } from '@tangle-network/agent-runtime/tui'; console.log(Object.keys({ writeWorkerSteer, loadTopSnapshot }));", -} - function missingWorkerIssue(worker: string): SupervisorCapabilityIssue { return { capability: 'supervisor.worker.resolve', @@ -53,15 +56,14 @@ function missingWorkerIssue(worker: string): SupervisorCapabilityIssue { } } -function externalCancelIssue(): SupervisorCapabilityIssue { +function missingSupervisorIssue(supervisorId: string): SupervisorCapabilityIssue { return { - capability: 'supervisor.cancel.external', + capability: 'supervisor.resolve', packageName: '@tangle-network/agent-runtime', packageVersion: AGENT_RUNTIME_VERSION, - reason: - 'The published runtime monitor can reload persisted state and enqueue worker steering, but it does not expose an external root cancellation operation.', + reason: `Runtime snapshot contains no supervisor with id '${supervisorId}'`, reproduction: - "import * as runtime from '@tangle-network/agent-runtime/kernel'; console.log('RootHandle.abort exists only on an in-process handle', runtime);", + "import { loadTopSnapshot } from '@tangle-network/agent-runtime/tui'; console.log(loadTopSnapshot(rootDir).supervisors);", } } @@ -71,19 +73,22 @@ function findWorker(workers: readonly WorkerView[], target: string): WorkerView export class RuntimeSupervisorController { readonly #watcher: RuntimeSupervisorSnapshotPort - readonly #rootHandle: RootHandle | undefined readonly #write: typeof writeWorkerSteer + readonly #cancelWorker: typeof cancelWorker + readonly #cancelRun: typeof cancelRun constructor( options: { readonly watcher?: RuntimeSupervisorSnapshotPort - readonly rootHandle?: RootHandle readonly write?: typeof writeWorkerSteer + readonly cancelWorker?: typeof cancelWorker + readonly cancelRun?: typeof cancelRun } = {}, ) { this.#watcher = options.watcher ?? new RuntimeSupervisorWatcher() - this.#rootHandle = options.rootHandle this.#write = options.write ?? writeWorkerSteer + this.#cancelWorker = options.cancelWorker ?? cancelWorker + this.#cancelRun = options.cancelRun ?? cancelRun } steerWorker( @@ -113,14 +118,67 @@ export class RuntimeSupervisorController { } } - cancelWorker(worker: string): SupervisorWorkerCancelResult { - return { status: 'unavailable', worker, issue: WORKER_CANCEL_UNAVAILABLE } + cancelWorker( + rootDir: string, + supervisorId: string, + workerIdOrLabel: string, + operationId: string, + reason = 'cancelled by user', + source = 'braid', + ): SupervisorWorkerCancelResult { + const supervisor = this.#findSupervisor(rootDir, supervisorId) + if (supervisor === undefined) { + return { + status: 'unavailable', + worker: workerIdOrLabel, + issue: missingSupervisorIssue(supervisorId), + } + } + const worker = findWorker(supervisor.workers, workerIdOrLabel) + if (worker === undefined) { + return { + status: 'unavailable', + worker: workerIdOrLabel, + issue: missingWorkerIssue(workerIdOrLabel), + } + } + const cancellation = this.#cancelWorker(supervisor.stateDir, worker.id, operationId, { + reason, + source, + }) + return { + status: cancellation.effect === 'unknown' ? 'requested' : 'acknowledged', + worker: worker.id, + operationId: cancellation.operationId, + effect: cancellation.effect, + ...(cancellation.detail === undefined ? {} : { detail: cancellation.detail }), + terminated: cancellation.terminated, + } + } + + cancelSupervisor( + rootDir: string, + supervisorId: string, + operationId: string, + reason = 'cancelled by user', + source = 'braid', + ): SupervisorCancelResult { + const supervisor = this.#findSupervisor(rootDir, supervisorId) + if (supervisor === undefined) { + return { status: 'unavailable', issue: missingSupervisorIssue(supervisorId) } + } + const cancellation = this.#cancelRun(supervisor.stateDir, operationId, { reason, source }) + return { + status: cancellation.effect === 'unknown' ? 'requested' : 'acknowledged', + operationId: cancellation.operationId, + effect: cancellation.effect, + ...(cancellation.detail === undefined ? {} : { detail: cancellation.detail }), + } } - cancelSupervisor(reason = 'cancelled by user'): SupervisorCancelResult { - if (this.#rootHandle === undefined) - return { status: 'unavailable', issue: externalCancelIssue() } - this.#rootHandle.abort(reason) - return { status: 'accepted' } + #findSupervisor(rootDir: string, supervisorId: string): SupervisorView | undefined { + return this.#watcher + .snapshot(rootDir) + .supervisors.find((candidate) => candidate.id === supervisorId) } } diff --git a/src/adapters/tui/ui-capabilities.ts b/src/adapters/tui/ui-capabilities.ts index a9729ab1..f59e6754 100644 --- a/src/adapters/tui/ui-capabilities.ts +++ b/src/adapters/tui/ui-capabilities.ts @@ -18,6 +18,10 @@ export const UNSUPPORTED = Object.freeze({ 'interaction.automation': 'Interaction automation requires the shared response contract', 'run.interactive': 'Native terminal mode requires an interactive TUI and a supported provider', 'run.attach': 'Native terminal attachment requires an interactive TUI and a retained session', + 'supervisor.worker.attach': + 'The runtime snapshot does not carry the retained interactive reference required to attach to an exact worker', + 'supervisor.worker.steer': + 'The runtime steer API generates a new request identifier on every call and cannot replay a caller operation identifier safely', 'export.create': 'Redacted export is not exposed by the current storage adapter', } satisfies Readonly>) @@ -69,6 +73,15 @@ export function capabilityMap( reason: 'Two completed or failed runs are required for comparison', } : { available: true, source: 'application' } + capabilities['analysis.cancel'] = state.analyses.some( + (analysis) => analysis.status === 'preparing' || analysis.status === 'running', + ) + ? { available: true, source: 'application' } + : { + available: false, + source: 'application', + reason: 'There is no running analysis to cancel', + } capabilities['application.quit'] = { available: true, source: 'local' } capabilities['help.read'] = { available: true, source: 'local' } capabilities['profile.select'] = { available: true, source: 'application' } @@ -77,6 +90,42 @@ export function capabilityMap( capabilities['activity.read'] = { available: true, source: 'local' } capabilities['graph.read'] = { available: true, source: 'local' } capabilities['details.read'] = { available: true, source: 'local' } + const hasWorkspace = state.workspace !== null + const hasRunningWorker = state.workers.some((worker) => worker.status === 'running') + const hasRunningSupervisor = state.supervisors.some( + (supervisor) => supervisor.status === 'running', + ) + capabilities['supervisor.refresh'] = hasWorkspace + ? { available: true, source: 'runtime' } + : { + available: false, + source: 'runtime', + reason: 'Initialize a workspace before refreshing runtime supervision', + } + capabilities['supervisor.worker.steer'] = { + available: false, + source: 'runtime', + reason: UNSUPPORTED['supervisor.worker.steer'], + } + capabilities['supervisor.worker.cancel'] = hasRunningWorker + ? { available: true, source: 'runtime' } + : { + available: false, + source: 'runtime', + reason: 'There is no running supervised worker to cancel', + } + capabilities['supervisor.cancel'] = hasRunningSupervisor + ? { available: true, source: 'runtime' } + : { + available: false, + source: 'runtime', + reason: 'There is no running supervisor to cancel', + } + capabilities['supervisor.worker.attach'] = { + available: false, + source: 'runtime', + reason: UNSUPPORTED['supervisor.worker.attach'], + } capabilities['interaction.respond'] = canRespond ? { available: true, source: 'runtime' } : { diff --git a/src/adapters/tui/ui-intelligence-dispatch.ts b/src/adapters/tui/ui-intelligence-dispatch.ts index 968276ef..25d9424f 100644 --- a/src/adapters/tui/ui-intelligence-dispatch.ts +++ b/src/adapters/tui/ui-intelligence-dispatch.ts @@ -6,7 +6,9 @@ import { AnalysisCapabilityError } from '../../app/analysis-types.js' import type { BraidApplication } from '../../app/application.js' import { AppError } from '../../app/errors.js' import type { BraidState } from '../../domain/state.js' +import { capabilityForHeadlessCommand } from '../../views/shared/headless-commands.js' import type { BraidIntent, UiDispatchResult } from '../../views/shared/intents.js' +import type { BraidViewModel } from '../../views/shared/models.js' import { redactSensitiveText } from '../../views/shared/sanitize.js' import type { UiFixture } from './ui-fixtures.js' import { resolveIntelligenceFixture } from './ui-intelligence-fixtures.js' @@ -14,6 +16,7 @@ import { resolveIntelligenceFixture } from './ui-intelligence-fixtures.js' interface IntelligenceDispatchContext { readonly app: BraidApplication readonly fixture: UiFixture | undefined + readonly view: () => BraidViewModel readonly notify: () => void readonly setNotice: (notice: string) => void } @@ -49,12 +52,31 @@ function requiresOperationId(intent: BraidIntent): boolean { intent.command === 'analyze' || intent.command === 'compare' || intent.command === 'promote_analysis' || + intent.command === 'cancel_analysis' || intent.command === 'reconnect' || intent.command === 'steer_worker' || - intent.command === 'cancel_worker' + intent.command === 'cancel_worker' || + intent.command === 'cancel_supervisor' || + intent.command === 'attach_worker' ) } +function isIntelligenceHeadlessCommand(command: string): boolean { + return [ + 'ask', + 'analyze', + 'compare', + 'promote_analysis', + 'cancel_analysis', + 'reconnect', + 'refresh_supervision', + 'steer_worker', + 'cancel_worker', + 'cancel_supervisor', + 'attach_worker', + ].includes(command) +} + function accepted(app: BraidApplication, data: unknown, operationId?: string): UiDispatchResult { return { kind: 'accepted', @@ -197,11 +219,12 @@ function analysisRequestForCommand( return { request: { ...source, question, recipe: 'ask' } } } if (command === 'analyze') { - if (args.length !== 1 || !['failure', 'cost', 'tools', 'improvement'].includes(args[0] ?? '')) { - invalid('INVALID_PARAMS', '/analyze requires one of failure, cost, tools, or improvement') - } - const recipe = args[0] - if (recipe === undefined) invalid('INVALID_PARAMS', '/analyze requires a named recipe') + const recipe = args + .flatMap((value) => value.split(',')) + .map((value) => value.trim()) + .filter(Boolean) + .join(',') + if (!recipe) invalid('INVALID_PARAMS', '/analyze requires a named recipe or all') return { request: { ...sourceRequest(state, 'last'), recipe } } } invalid('INVALID_PARAMS', '/compare requires two source references') @@ -273,6 +296,15 @@ function runtimeWorkerReference( } } +function runtimeSupervisorReference( + state: BraidState, + supervisorId: string, +): { readonly rootDir: string; readonly runtimeSupervisorId: string } | undefined { + const supervisor = state.supervisors.find((candidate) => String(candidate.id) === supervisorId) + if (supervisor === undefined || state.workspace !== supervisor.runtimeRoot) return undefined + return { rootDir: supervisor.runtimeRoot, runtimeSupervisorId: supervisor.runtimeId } +} + async function dispatchSupervisorWorker( command: 'steer_worker' | 'cancel_worker', context: IntelligenceDispatchContext, @@ -285,14 +317,41 @@ async function dispatchSupervisorWorker( if (typeof supervisorId !== 'string') { invalid('INVALID_PARAMS', `${command} requires supervisorId and workerId`) } - if (command === 'cancel_worker') { - const result = await context.app.intelligence.supervisor.cancelWorker(workerId) - return unavailable(issueReason(result.issue)) - } const reference = runtimeWorkerReference(context.app.state(), supervisorId, workerId) if (reference === undefined) { return unavailable('The selected worker is not present under the selected supervisor') } + if (command === 'cancel_worker') { + if (operationId === undefined) + invalid('OPERATION_ID_REQUIRED', 'cancel_worker requires operationId') + const reason = typeof params.reason === 'string' ? params.reason : undefined + try { + const result = await context.app.intelligence.supervisor.cancelWorker( + reference.rootDir, + reference.runtimeSupervisorId, + reference.runtimeWorkerId, + operationId, + reason, + ) + if (result.status === 'unavailable') { + return unavailable( + result.issue === undefined + ? 'Worker cancellation is unavailable' + : issueReason(result.issue), + ) + } + context.setNotice( + result.effect === 'cancelled' + ? `Worker cancellation confirmed: ${workerId}` + : `Worker cancellation ${result.effect ?? 'requested'}: ${workerId}`, + ) + return accepted(context.app, { ...result, worker: workerId }, operationId) + } catch (error) { + return unavailable( + `Worker cancellation is unavailable: ${error instanceof Error ? error.message : String(error)}`, + ) + } + } const text = params.text if (typeof text !== 'string') { invalid('INVALID_PARAMS', 'steer_worker requires supervisorId, workerId, and text') @@ -317,6 +376,48 @@ async function dispatchSupervisorWorker( } } +async function dispatchSupervisorCancel( + context: IntelligenceDispatchContext, + params: Readonly>, + operationId?: string, +): Promise { + const supervisorId = params.supervisorId + if (typeof supervisorId !== 'string') + invalid('INVALID_PARAMS', 'cancel_supervisor requires supervisorId') + if (operationId === undefined) + invalid('OPERATION_ID_REQUIRED', 'cancel_supervisor requires operationId') + const reference = runtimeSupervisorReference(context.app.state(), supervisorId) + if (reference === undefined) { + return unavailable('The selected supervisor is not present in the current workspace') + } + const reason = typeof params.reason === 'string' ? params.reason : undefined + try { + const result = await context.app.intelligence.supervisor.cancelSupervisor( + reference.rootDir, + reference.runtimeSupervisorId, + operationId, + reason, + ) + if (result.status === 'unavailable') { + return unavailable( + result.issue === undefined + ? 'Supervisor cancellation is unavailable' + : issueReason(result.issue), + ) + } + context.setNotice( + result.effect === 'cancelled' + ? `Supervisor cancellation confirmed: ${supervisorId}` + : `Supervisor cancellation ${result.effect ?? 'requested'}: ${supervisorId}`, + ) + return accepted(context.app, result, operationId) + } catch (error) { + return unavailable( + `Supervisor cancellation is unavailable: ${error instanceof Error ? error.message : String(error)}`, + ) + } +} + export async function dispatchIntelligenceIntent( intent: BraidIntent, context: IntelligenceDispatchContext, @@ -336,6 +437,14 @@ export async function dispatchIntelligenceIntent( if (operationId === undefined) invalid('OPERATION_ID_REQUIRED', `${command} requires operationId`) } + if (intent.type === 'headless-command' && isIntelligenceHeadlessCommand(intent.command)) { + const capability = capabilityForHeadlessCommand(intent.command) + const availability = + capability === undefined ? undefined : context.view().capabilities[capability] + if (availability !== undefined && !availability.available) { + return unavailable(availability.reason ?? 'Capability is unavailable') + } + } const fixture = resolveIntelligenceFixture(intent, context.fixture) if (fixture !== undefined) { context.setNotice(fixture.notice) @@ -388,15 +497,25 @@ export async function dispatchIntelligenceIntent( case 'analyze': { const source = intent.params.source const recipe = intent.params.recipe - if (typeof source !== 'string' || typeof recipe !== 'string') { - invalid('INVALID_PARAMS', 'analyze requires source and recipe') + const analystIds = intent.params.analystIds + if ( + typeof source !== 'string' || + (recipe !== undefined && typeof recipe !== 'string') || + (analystIds !== undefined && + (!Array.isArray(analystIds) || !analystIds.every((id) => typeof id === 'string'))) + ) { + invalid('INVALID_PARAMS', 'analyze requires source and a recipe or analystIds') } - if (!['failure', 'cost', 'tools', 'improvement'].includes(recipe)) { - invalid('INVALID_PARAMS', `Unknown analysis recipe '${recipe}'`) + if (recipe === undefined && analystIds === undefined) { + invalid('INVALID_PARAMS', 'analyze requires a recipe or analystIds') } return runAnalysis( context, - { ...sourceRequest(context.app.state(), source), recipe }, + { + ...sourceRequest(context.app.state(), source), + ...(recipe === undefined ? {} : { recipe }), + ...(analystIds === undefined ? {} : { analystIds }), + }, intent.operationId, ) } @@ -450,6 +569,25 @@ export async function dispatchIntelligenceIntent( }) return accepted(context.app, attachment, intent.operationId) } + case 'cancel_analysis': { + const analysisId = intent.params.analysisId + if (typeof analysisId !== 'string') + invalid('INVALID_PARAMS', 'cancel_analysis requires analysisId') + const analysis = context.app + .state() + .analyses.find((candidate) => String(candidate.id) === analysisId) + if (analysis === undefined) + invalid('UNKNOWN_ANALYSIS', `Analysis ${analysisId} is not present`) + const reason = + typeof intent.params.reason === 'string' + ? intent.params.reason + : 'cancelled from analysis activity' + if (!context.app.intelligence.analysis.cancel(analysis.id, reason)) { + return unavailable(`Analysis ${analysisId} is not active in this process`) + } + context.setNotice(`Analysis cancellation requested: ${analysisId}`) + return accepted(context.app, { analysisId, status: 'cancel_requested' }, intent.operationId) + } case 'reconnect': { const runId = intent.params.runId if ( @@ -465,9 +603,17 @@ export async function dispatchIntelligenceIntent( } return undefined } + case 'refresh_supervision': + return dispatchSupervisorQuery('snapshot', context) case 'steer_worker': case 'cancel_worker': return dispatchSupervisorWorker(intent.command, context, intent.params, intent.operationId) + case 'cancel_supervisor': + return dispatchSupervisorCancel(context, intent.params, intent.operationId) + case 'attach_worker': + return unavailable( + 'Worker attachment is unavailable: the runtime snapshot does not carry the retained interactive reference required to reconnect the exact worker', + ) default: return undefined } diff --git a/src/adapters/tui/ui-projection.ts b/src/adapters/tui/ui-projection.ts index 2741f36e..cfd9b0d5 100644 --- a/src/adapters/tui/ui-projection.ts +++ b/src/adapters/tui/ui-projection.ts @@ -470,11 +470,15 @@ function queueViews(state: BraidState): readonly { export function activityFor(state: BraidState): ActivityItemView[] { const workers = new Map(state.workers.map((worker) => [String(worker.id), worker] as const)) + const analyses = new Map( + state.analyses.map((analysis) => [String(analysis.id), analysis] as const), + ) const workerDepth = new Map() const runs = new Map(state.runs.map((run) => [String(run.id), run] as const)) return queryActivity(state, { limit: MAX_VISIBLE_RUNS }).activity.map((item) => { const run = item.runId === undefined ? undefined : runs.get(item.runId) const worker = item.entityType === 'worker' ? workers.get(item.entityId ?? '') : undefined + const analysis = item.entityType === 'analysis' ? analyses.get(item.entityId ?? '') : undefined const parentId = worker?.parentRuntimeRef !== undefined && worker.parentWorkerId === undefined ? undefined @@ -503,6 +507,16 @@ export function activityFor(state: BraidState): ActivityItemView[] { ...(item.entityId === undefined ? {} : { entityId: item.entityId }), ...(parentId === undefined ? {} : { parentId: String(parentId) }), ...(depth === undefined ? {} : { depth }), + ...(worker === undefined ? {} : { supervisorId: String(worker.supervisorId) }), + ...(analysis === undefined + ? {} + : { + analysisFindings: analysis.findings.map((finding) => ({ + id: finding.id, + title: sanitizeTerminalText(finding.text), + supported: finding.supported && finding.citations.length > 0, + })), + }), } }) } diff --git a/src/app/analysis-lifecycle.ts b/src/app/analysis-lifecycle.ts index b64f5626..3c6818d8 100644 --- a/src/app/analysis-lifecycle.ts +++ b/src/app/analysis-lifecycle.ts @@ -1,4 +1,5 @@ import type { AnalysisRecord } from '../domain/entities.js' +import type { ExactAnalystRunEvent } from '@tangle-network/agent-eval' import type { RetainedRunAdmissionRecord } from '../domain/run-contracts.js' import { type AnalysisIdentity, @@ -53,12 +54,29 @@ export class AnalysisLifecycle { await commitAnalysisEvent(this.#host, { kind: 'analysis.created', analysis: record }) } - async running(record: AnalysisRecord): Promise { - const running: AnalysisRecord = { ...record, status: 'running', updatedAt: this.#host.now() } + async running(record: AnalysisRecord, analystIds: readonly string[]): Promise { + const running: AnalysisRecord = { + ...record, + status: 'running', + analysts: analystIds.map((analystId) => ({ analystId, status: 'pending' })), + updatedAt: this.#host.now(), + } await commitAnalysisEvent(this.#host, { kind: 'analysis.updated', analysis: running }) return running } + async progress(record: AnalysisRecord, event: ExactAnalystRunEvent): Promise { + const analysts = analystProgress(record, event) + if (sameAnalystProgress(record.analysts ?? [], analysts)) return record + const next: AnalysisRecord = { + ...record, + analysts, + updatedAt: this.#host.now(), + } + await commitAnalysisEvent(this.#host, { kind: 'analysis.updated', analysis: next }) + return next + } + async recordRetainedAdmission( identity: AnalysisIdentity, callId: string, @@ -145,3 +163,71 @@ export class AnalysisLifecycle { } } } + +function analystProgress( + record: AnalysisRecord, + event: ExactAnalystRunEvent, +): NonNullable { + if (event.type === 'run-started') { + return event.analyst_ids.map((analystId) => ({ analystId, status: 'pending' })) + } + if (event.type === 'run-completed') { + return event.result.per_analyst.map((summary) => + progressFromSummary( + summary, + record.analysts?.find((candidate) => candidate.analystId === summary.analyst_id), + ), + ) + } + const analystId = event.type === 'analyst-started' ? event.analyst_id : event.summary.analyst_id + const current = record.analysts ?? [] + const update = + event.type === 'analyst-started' + ? { analystId, status: 'running' as const, startedAt: event.started_at } + : progressFromSummary( + event.summary, + current.find((candidate) => candidate.analystId === analystId), + ) + const found = current.some((candidate) => candidate.analystId === analystId) + return found + ? current.map((candidate) => (candidate.analystId === analystId ? update : candidate)) + : [...current, update] +} + +function progressFromSummary( + summary: Extract['summary'], + previous?: NonNullable[number], +): NonNullable[number] { + return { + analystId: summary.analyst_id, + status: + summary.status === 'ok' ? 'completed' : summary.status === 'skipped' ? 'skipped' : 'failed', + findingsCount: summary.findings_count, + latencyMs: summary.latency_ms, + ...(previous?.startedAt === undefined ? {} : { startedAt: previous.startedAt }), + ...(summary.reason === undefined + ? summary.error === undefined + ? {} + : { detail: summary.error.message } + : { detail: summary.reason }), + } +} + +function sameAnalystProgress( + left: readonly NonNullable[number][], + right: readonly NonNullable[number][], +): boolean { + if (left.length !== right.length) return false + return left.every((analyst, index) => { + const candidate = right[index] + return ( + candidate !== undefined && + analyst.analystId === candidate.analystId && + analyst.status === candidate.status && + analyst.startedAt === candidate.startedAt && + analyst.findingsCount === candidate.findingsCount && + analyst.latencyMs === candidate.latencyMs && + analyst.detail === candidate.detail + ) + }) +} diff --git a/src/app/analysis-service.ts b/src/app/analysis-service.ts index 513262f6..69f4f71c 100644 --- a/src/app/analysis-service.ts +++ b/src/app/analysis-service.ts @@ -105,10 +105,10 @@ export class AnalysisService { } await this.#lifecycle.create(current) yield { type: 'started', analysis: current } - current = await this.#lifecycle.running(current) + const analystIds = this.#execution.resolveAnalystIds(request) + current = await this.#lifecycle.running(current, analystIds) yield { type: 'running', analysis: current } - const analystIds = this.#execution.resolveAnalystIds(request) let exactResult: ExactAnalystRunResult | undefined for await (const item of this.#execution.stream({ identity: prepared.identity, @@ -120,6 +120,7 @@ export class AnalysisService { this.#lifecycle.recordRetainedAdmission(prepared.identity, callId, admission), })) { if (item.result !== undefined) exactResult = item.result + current = await this.#lifecycle.progress(current, item.event) yield { type: 'analyst', analysisId: prepared.identity.analysisId, diff --git a/src/app/analysis-types.ts b/src/app/analysis-types.ts index 11ad25ba..3714bcb9 100644 --- a/src/app/analysis-types.ts +++ b/src/app/analysis-types.ts @@ -1,3 +1,4 @@ +import type { ExactAnalystRunEvent } from '@tangle-network/agent-eval' import type { AgentProfile, HarnessType } from '@tangle-network/agent-interface' import type { AnalysisRecord, @@ -97,7 +98,7 @@ export interface AnalysisProgressAnalyst { readonly type: 'analyst' readonly analysisId: AnalysisId readonly analysisRunId: AnalysisRunId - readonly event: unknown + readonly event: ExactAnalystRunEvent } export interface AnalysisProgressCompleted { diff --git a/src/app/supervisor-service.ts b/src/app/supervisor-service.ts index 5ee020fd..2c3fba69 100644 --- a/src/app/supervisor-service.ts +++ b/src/app/supervisor-service.ts @@ -82,14 +82,34 @@ export class SupervisorService { return controller.steerWorker(rootDir, supervisorId, workerIdOrLabel, message, source) } - async cancelWorker(worker: string): Promise { + async cancelWorker( + rootDir: string, + supervisorId: string, + workerIdOrLabel: string, + operationId: string, + reason?: string, + source?: string, + ): Promise { const controller = await this.#loadController() - return controller.cancelWorker(worker) + return controller.cancelWorker( + rootDir, + supervisorId, + workerIdOrLabel, + operationId, + reason, + source, + ) } - async cancelSupervisor(reason?: string): Promise { + async cancelSupervisor( + rootDir: string, + supervisorId: string, + operationId: string, + reason?: string, + source?: string, + ): Promise { const controller = await this.#loadController() - return controller.cancelSupervisor(reason) + return controller.cancelSupervisor(rootDir, supervisorId, operationId, reason, source) } #loadWatcher(): Promise { diff --git a/src/domain/entities-interactions.ts b/src/domain/entities-interactions.ts index 4aca9303..bd28ad1e 100644 --- a/src/domain/entities-interactions.ts +++ b/src/domain/entities-interactions.ts @@ -156,6 +156,15 @@ export type AnalysisStatus = | 'failed' | 'unknown' +export interface AnalysisAnalystProgressRecord { + readonly analystId: string + readonly status: 'pending' | 'running' | 'completed' | 'skipped' | 'failed' + readonly startedAt?: string + readonly findingsCount?: number + readonly latencyMs?: number + readonly detail?: string +} + export interface AnalysisRecord { readonly id: AnalysisId readonly analysisRunId?: AnalysisRunId @@ -170,6 +179,7 @@ export interface AnalysisRecord { readonly analystProfileId?: ProfileId readonly analystProfileDigest?: Digest readonly status: AnalysisStatus + readonly analysts?: readonly AnalysisAnalystProgressRecord[] readonly findings: readonly AnalysisFinding[] readonly provenance?: AnalysisProvenance readonly checks?: readonly AnalysisCheck[] diff --git a/src/domain/invariants-run.ts b/src/domain/invariants-run.ts index f92e7ae1..bd099572 100644 --- a/src/domain/invariants-run.ts +++ b/src/domain/invariants-run.ts @@ -260,6 +260,17 @@ export function assertAnalysisRecord(record: AnalysisRecord): void { finiteRatio(finding.confidence, 'analysis.finding.confidence') for (const citation of finding.citations) assertAnalysisCitation(citation) } + for (const analyst of record.analysts ?? []) { + nonEmpty(analyst.analystId, 'analysis.analysts.analystId') + if (!['pending', 'running', 'completed', 'skipped', 'failed'].includes(analyst.status)) + fail('analysis.analysts.status is invalid') + if (analyst.startedAt !== undefined) + assertDate(analyst.startedAt, 'analysis.analysts.startedAt') + if (analyst.findingsCount !== undefined) + finiteNonNegative(analyst.findingsCount, 'analysis.analysts.findingsCount') + if (analyst.latencyMs !== undefined) + finiteNonNegative(analyst.latencyMs, 'analysis.analysts.latencyMs') + } if (record.sourceRange !== undefined) { for (const eventId of record.sourceRange.eventIds) assertEntityId('event', eventId, 'analysis.sourceRange.eventId') diff --git a/src/views/headless/rpc-parser.ts b/src/views/headless/rpc-parser.ts index 808166a2..65a81247 100644 --- a/src/views/headless/rpc-parser.ts +++ b/src/views/headless/rpc-parser.ts @@ -89,14 +89,18 @@ const PARAMETER_KEYS: Readonly> = 'destinationProvider', ], ask: ['source', 'question', 'profileRef', 'connectionId'], - analyze: ['source', 'recipe', 'profileRef', 'connectionId'], + analyze: ['source', 'recipe', 'analystIds', 'profileRef', 'connectionId'], compare: ['left', 'right', 'profileRef', 'connectionId'], promote_analysis: ['analysisId', 'findingIds', 'conversationId', 'branchId'], + cancel_analysis: ['analysisId', 'reason'], get_graph: ['conversationId', 'branchId', 'query'], get_activity: ['conversationId', 'branchId', 'runId'], get_details: ['entityType', 'entityId'], + refresh_supervision: [], steer_worker: ['supervisorId', 'workerId', 'text'], cancel_worker: ['supervisorId', 'workerId', 'reason'], + cancel_supervisor: ['supervisorId', 'reason'], + attach_worker: ['supervisorId', 'workerId'], export: ['target', 'format', 'includeRaw', 'destination'], shutdown: ['mode'], } @@ -173,7 +177,13 @@ const PARAMETER_TYPES: Readonly< destinationProvider: 'string', }, ask: { source: 'string', question: 'string', profileRef: 'string', connectionId: 'string' }, - analyze: { source: 'string', recipe: 'string', profileRef: 'string', connectionId: 'string' }, + analyze: { + source: 'string', + recipe: 'string', + analystIds: 'string[]', + profileRef: 'string', + connectionId: 'string', + }, compare: { left: 'string', right: 'string', profileRef: 'string', connectionId: 'string' }, promote_analysis: { analysisId: 'string', @@ -181,11 +191,15 @@ const PARAMETER_TYPES: Readonly< conversationId: 'string', branchId: 'string', }, + cancel_analysis: { analysisId: 'string', reason: 'string' }, get_graph: { conversationId: 'string', branchId: 'string', query: 'string' }, get_activity: { conversationId: 'string', branchId: 'string', runId: 'string' }, get_details: { entityType: 'string', entityId: 'string' }, + refresh_supervision: {}, steer_worker: { supervisorId: 'string', workerId: 'string', text: 'string' }, cancel_worker: { supervisorId: 'string', workerId: 'string', reason: 'string' }, + cancel_supervisor: { supervisorId: 'string', reason: 'string' }, + attach_worker: { supervisorId: 'string', workerId: 'string' }, export: { target: 'string', format: 'string', @@ -223,12 +237,15 @@ const REQUIRED_PARAMETERS: Readonly check.id === 'citation-support', ) + const budgetUsd = analysisBudgetUsd(record) return { source: String(record.source.digest), ...(record.question === undefined ? {} : { question: sanitizeTerminalText(record.question) }), analyst: String(record.analystProfileId ?? 'configured analyst'), recipe: record.recipe ?? (record.question === undefined ? 'analysis' : 'ask'), + ...(typeof budgetUsd === 'number' && Number.isFinite(budgetUsd) + ? { budget: `$${budgetUsd.toFixed(4)}` } + : {}), status: record.status === 'preparing' || record.status === 'running' ? 'running' : record.status, + analysts: (record.analysts ?? []).map((analyst) => ({ + id: sanitizeTerminalText(analyst.analystId), + status: analyst.status, + ...(analyst.findingsCount === undefined ? {} : { findingsCount: analyst.findingsCount }), + ...(analyst.latencyMs === undefined ? {} : { latencyMs: analyst.latencyMs }), + ...(analyst.detail === undefined ? {} : { detail: sanitizeTerminalText(analyst.detail) }), + })), findings: record.findings.map((finding) => ({ id: finding.id, title: finding.text, @@ -132,6 +143,23 @@ export function analysisDocument(analysis: AnalysisView): AnalysisDocument { details.push(sanitizeTerminalText(analysis.question)) } + const analysts = analysis.analysts ?? [] + if (analysts.length > 0) { + details.push(section('analysts')) + for (const [index, analyst] of analysts.entries()) { + const receipt = [ + ...(analyst.findingsCount === undefined ? [] : [`${analyst.findingsCount} finding(s)`]), + ...(analyst.latencyMs === undefined ? [] : [`${Math.round(analyst.latencyMs)}ms`]), + ] + details.push( + `${index + 1}. ${sanitizeTerminalText(analyst.id)} · ${analyst.status}${ + receipt.length === 0 ? '' : ` · ${receipt.join(' · ')}` + }`, + ) + if (analyst.detail !== undefined) details.push(`↳ ${sanitizeTerminalText(analyst.detail)}`) + } + } + details.push(section('findings')) for (const [index, finding] of analysis.findings.entries()) { const severity = finding.severity ? ` · ${sanitizeTerminalText(finding.severity)}` : '' @@ -190,12 +218,22 @@ export function analysisDocument(analysis: AnalysisView): AnalysisDocument { context: [ `source: ${shortDigest(analysis.source)} · frozen`, `analyst: ${sanitizeTerminalText(analysis.analyst)} · ${sanitizeTerminalText(analysis.status)}`, + `recipe: ${sanitizeTerminalText(analysis.recipe)}${ + analysis.budget === undefined ? '' : ` · budget ${sanitizeTerminalText(analysis.budget)}` + }`, ...(route === undefined ? [] : [route]), ], details, } } +function analysisBudgetUsd(record: AnalysisRecord): number | undefined { + const request = record.request + if (request === null || typeof request !== 'object' || Array.isArray(request)) return undefined + const budget = (request as Readonly>).budgetUsd + return typeof budget === 'number' && Number.isFinite(budget) ? budget : undefined +} + function analysisRouteLine(execution: AnalysisView['execution']): string | undefined { if (execution?.runner !== undefined && execution.configuredModel !== undefined) { return `route: runner ${sanitizeTerminalText(execution.runner)} · configured model ${sanitizeTerminalText(execution.configuredModel)}` diff --git a/src/views/shared/headless-commands.ts b/src/views/shared/headless-commands.ts index d0ab2143..7fcc8a3a 100644 --- a/src/views/shared/headless-commands.ts +++ b/src/views/shared/headless-commands.ts @@ -48,11 +48,15 @@ export const HEADLESS_COMMAND_NAMES = [ 'analyze', 'compare', 'promote_analysis', + 'cancel_analysis', 'get_graph', 'get_activity', 'get_details', + 'refresh_supervision', 'steer_worker', 'cancel_worker', + 'cancel_supervisor', + 'attach_worker', 'export', 'shutdown', ] as const @@ -63,8 +67,11 @@ const HEADLESS_ONLY_MUTATIONS: readonly HeadlessCommandName[] = [ 'set_draft', 'remove_queued', 'promote_analysis', + 'cancel_analysis', 'steer_worker', 'cancel_worker', + 'cancel_supervisor', + 'attach_worker', 'cancel', 'detach', 'reconnect', @@ -135,8 +142,12 @@ const HEADLESS_CAPABILITIES: Readonly string | undefined readonly emptyMessage?: string readonly pinned?: string + readonly onAction?: (action: ActivityBrowserAction, selectedId: string | undefined) => void } export class ActivityBrowserPanel extends EntityBrowser { readonly #scopeState: { scope: ActivityBrowserScope } + readonly #onAction: ActivityBrowserOptions['onAction'] constructor(theme: BraidTheme, options: ActivityBrowserOptions) { const scopeState: { scope: ActivityBrowserScope } = { scope: options.scope ?? 'all' } @@ -49,6 +52,7 @@ export class ActivityBrowserPanel extends EntityBrowser { ...(options.openSelected === undefined ? {} : { openSelected: options.openSelected }), }) this.#scopeState = scopeState + this.#onAction = options.onAction } override handleInput(data: string): void { @@ -58,6 +62,11 @@ export class ActivityBrowserPanel extends EntityBrowser { this.invalidate() return } + const action = activityAction(data, this.#scopeState.scope) + if (action !== undefined && this.#onAction !== undefined) { + this.#onAction(action, this.selectedId) + return + } super.handleInput(data) } } @@ -79,7 +88,7 @@ export function activityDocument( .reverse() return { title: scope === 'all' ? 'activity' : scope, - filterHint: `tab filter: ${scope}`, + filterHint: activityFooter(scope, view), ...(pinned === undefined ? {} : { pinned }), ...(notice === undefined ? {} : { notice }), emptyMessage: @@ -93,6 +102,31 @@ export function activityDocument( } } +function activityAction( + data: string, + scope: ActivityBrowserScope, +): ActivityBrowserAction | undefined { + if (matchesKey(data, 'r')) return 'refresh' + if (scope === 'runs') return undefined + if (matchesKey(data, 'x')) return 'cancel' + if (scope === 'analyses') return matchesKey(data, 'p') ? 'promote' : undefined + if (matchesKey(data, 's')) return 'steer' + if (matchesKey(data, 'a')) return 'attach' + if (scope === 'all' && matchesKey(data, 'p')) return 'promote' + return undefined +} + +function activityFooter(scope: ActivityBrowserScope, view: BraidViewModel): string { + if (scope === 'workers') { + const steer = view.capabilities['supervisor.worker.steer']?.available === true + const attach = view.capabilities['supervisor.worker.attach']?.available === true + return steer || attach ? 's steer · x cancel · a/r' : 's/a off · x cancel · r' + } + if (scope === 'analyses') return 'p promote · x cancel · r' + if (scope === 'all') return 'tab filter: selected actions s/x/a/p · r refresh' + return 'tab filter · r refresh' +} + function rowFor( item: ActivityDocumentItem, details: ReadonlyMap, diff --git a/src/views/tui/entity-browser-layout.ts b/src/views/tui/entity-browser-layout.ts index 664483e3..5c83875c 100644 --- a/src/views/tui/entity-browser-layout.ts +++ b/src/views/tui/entity-browser-layout.ts @@ -69,10 +69,15 @@ function candidates( page: string | undefined, filters: readonly (string | undefined)[], ): string[] { - return keys.flatMap((key) => [ - ...(page === undefined ? [] : filters.map((filter) => joinParts(key, page, filter))), - ...filters.map((filter) => joinParts(key, undefined, filter)), - ]) + const contextual = filters.filter((filter): filter is string => filter !== undefined) + return [ + ...(page === undefined + ? [] + : contextual.flatMap((filter) => keys.map((key) => joinParts(key, page, filter)))), + ...contextual.flatMap((filter) => keys.map((key) => joinParts(key, undefined, filter))), + ...(page === undefined ? [] : keys.map((key) => joinParts(key, page))), + ...keys, + ] } function joinParts(...parts: readonly (string | undefined)[]): string { diff --git a/src/views/tui/supervisor-actions.ts b/src/views/tui/supervisor-actions.ts new file mode 100644 index 00000000..3aa9f425 --- /dev/null +++ b/src/views/tui/supervisor-actions.ts @@ -0,0 +1,80 @@ +import { + Container, + type Focusable, + Input, + matchesKey, + Spacer, + Text, + TruncatedText, +} from '@earendil-works/pi-tui' +import { sanitizeTerminalText } from '../shared/sanitize.js' +import type { BraidTheme } from './theme.js' + +export interface WorkerSteerPromptOptions { + readonly theme: BraidTheme + readonly worker: string + readonly onSubmit: (message: string) => void + readonly onCancel: () => void +} + +class WorkerSteerPrompt extends Container implements Focusable { + readonly #input = new Input() + readonly #error: Text + readonly #onSubmit: WorkerSteerPromptOptions['onSubmit'] + readonly #onCancel: WorkerSteerPromptOptions['onCancel'] + #focused = false + #submitted = false + + constructor(options: WorkerSteerPromptOptions) { + super() + this.#onSubmit = options.onSubmit + this.#onCancel = options.onCancel + this.#error = new Text('', 1, 0) + this.addChild(new TruncatedText(options.theme.brand('steer worker'), 1, 0)) + this.addChild(new Spacer(1)) + this.addChild(new TruncatedText(`worker: ${sanitizeTerminalText(options.worker)}`, 1, 0)) + this.addChild(new Text(options.theme.muted('message'), 1, 0)) + this.addChild(this.#input) + this.addChild(this.#error) + this.addChild(new Spacer(1)) + this.addChild(new TruncatedText(options.theme.muted('enter send · esc cancel'), 1, 0)) + } + + get focused(): boolean { + return this.#focused + } + + set focused(value: boolean) { + this.#focused = value + this.#input.focused = value + } + + setError(message: string): void { + this.#submitted = false + this.#error.setText(sanitizeTerminalText(message)) + this.invalidate() + } + + handleInput(data: string): void { + if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c')) { + this.#onCancel() + return + } + if (this.#submitted) return + if (matchesKey(data, 'enter')) { + const message = this.#input.getValue().trim() + if (!message) { + this.setError('A steering message is required') + return + } + this.#submitted = true + this.#onSubmit(message) + return + } + this.#input.handleInput(data) + } +} + +export function createWorkerSteerPrompt(options: WorkerSteerPromptOptions): WorkerSteerPrompt { + return new WorkerSteerPrompt(options) +} diff --git a/src/views/tui/terminal-overlays.ts b/src/views/tui/terminal-overlays.ts index 3d002f3d..16391b4f 100644 --- a/src/views/tui/terminal-overlays.ts +++ b/src/views/tui/terminal-overlays.ts @@ -92,6 +92,7 @@ export class TerminalOverlayController { modals: this.#modals, rows: options.rows, requestRender: options.requestRender, + nextOperationId: options.nextOperationId, ...(options.keyboardDiagnostic === undefined ? {} : { keyboardDiagnostic: options.keyboardDiagnostic }), diff --git a/src/views/tui/terminal-surface-overlays.ts b/src/views/tui/terminal-surface-overlays.ts index 86ccd05a..f53c9c8c 100644 --- a/src/views/tui/terminal-surface-overlays.ts +++ b/src/views/tui/terminal-surface-overlays.ts @@ -1,15 +1,22 @@ import type { Component } from '@earendil-works/pi-tui' import type { AnalysisRecord } from '../../domain/entities.js' -import type { BraidUiController } from '../shared/intents.js' +import type { BraidIntent, BraidUiController } from '../shared/intents.js' +import type { ActivityItemView } from '../shared/models.js' import { sanitizeNotification } from '../shared/sanitize.js' -import { ActivityBrowserPanel, type ActivityBrowserScope } from './activity-browser.js' +import { + type ActivityBrowserAction, + ActivityBrowserPanel, + type ActivityBrowserScope, +} from './activity-browser.js' import { isAnalysisComparisonResult } from './comparison.js' +import { ConversationConfirmation } from './conversation-dialogs.js' import { DetailsViewPanel } from './details.js' import { GraphView } from './graph.js' import { type HelpViewOptions, HelpViewPanel } from './help.js' import type { ModalCoordinator } from './modal-coordinator.js' import { SearchableSelector } from './selector.js' import { UnavailablePanel } from './terminal-shell.js' +import { createWorkerSteerPrompt } from './supervisor-actions.js' import type { BraidTheme } from './theme.js' import type { EntityBrowserRow } from './entity-browser.js' @@ -19,6 +26,7 @@ export interface TerminalSurfaceOverlayOptions { readonly modals: ModalCoordinator readonly rows: () => number readonly requestRender: () => void + readonly nextOperationId: () => string readonly keyboardDiagnostic?: () => string readonly keymapDiagnostic?: () => string | undefined readonly openProfile: () => void @@ -182,6 +190,7 @@ export class TerminalSurfaceOverlays { ...(emptyMessage === undefined ? {} : { emptyMessage }), ...(pinned === undefined ? {} : { pinned }), onOpenSelected: (row) => this.#focusSelectedRun(row), + onAction: (action, actionSelectedId) => this.#handleActivityAction(action, actionSelectedId), openSelected, }) } @@ -191,6 +200,206 @@ export class TerminalSurfaceOverlays { this.#options.focusRun?.(row.runId) } + #handleActivityAction(action: ActivityBrowserAction, selectedId: string | undefined): void { + if (action === 'refresh') { + void this.#manualRefresh() + return + } + const selected = this.#options.controller.view().activity.find((item) => item.id === selectedId) + if (selected === undefined) { + this.openUnavailable('activity action unavailable', 'Select an activity row first') + return + } + if (action === 'steer') { + this.#openWorkerSteer(selected) + return + } + if (action === 'cancel') { + this.#openActivityCancel(selected) + return + } + if (action === 'attach') { + void this.#attachWorker(selected) + return + } + this.#openAnalysisPromotion(selected) + } + + async #manualRefresh(): Promise { + const result = await this.#options.controller.dispatch({ type: 'refresh-supervision' }) + if (result.kind === 'accepted') { + this.#setSupervisionStatus('runtime activity refreshed') + return + } + this.#setSupervisionStatus( + result.kind === 'unavailable' ? result.reason : `refresh failed: ${result.message}`, + ) + } + + #openWorkerSteer(selected: ActivityItemView): void { + if ( + selected.kind !== 'worker' || + selected.entityId === undefined || + selected.supervisorId === undefined + ) { + this.openUnavailable('steer unavailable', 'Select a runtime worker before steering') + return + } + const capability = this.#options.controller.view().capabilities['supervisor.worker.steer'] + if (capability?.available !== true) { + this.openUnavailable( + 'steer unavailable', + capability?.reason ?? 'Runtime did not report retry-safe worker steering', + ) + return + } + const prompt = createWorkerSteerPrompt({ + theme: this.#options.theme, + worker: selected.title, + onCancel: () => this.#options.modals.closeTop(), + onSubmit: (message) => { + void this.#options.controller + .dispatch({ + type: 'headless-command', + command: 'steer_worker', + operationId: this.#options.nextOperationId(), + params: { + supervisorId: selected.supervisorId, + workerId: selected.entityId, + text: message, + }, + }) + .then((result) => { + if (result.kind !== 'accepted') { + prompt.setError(result.kind === 'unavailable' ? result.reason : result.message) + return + } + this.#options.modals.closeTop() + this.#setSupervisionStatus(`steer queued for ${selected.title}`) + }) + .catch((error: unknown) => { + prompt.setError(error instanceof Error ? error.message : 'Worker steering failed') + }) + }, + }) + this.#options.modals.open(prompt, { anchor: 'center', width: '72%', maxHeight: 10 }) + } + + #openActivityCancel(selected: ActivityItemView): void { + const command = cancelCommand(selected, this.#options.nextOperationId()) + if (command === undefined) { + this.openUnavailable( + 'cancel unavailable', + 'Select a running analysis, worker, or supervisor before cancelling', + ) + return + } + const descendants = descendantCount(this.#options.controller.view().activity, selected) + const detail = + descendants === 0 + ? `cancel this ${selected.kind}; the result waits for an exact acknowledgement` + : `cancel this ${selected.kind} and ${descendants} descendant(s); the result waits for exact acknowledgements` + let confirmation: ConversationConfirmation + confirmation = new ConversationConfirmation({ + theme: this.#options.theme, + title: `cancel ${selected.kind}`, + target: selected.title, + detail, + confirmLabel: 'request cancellation', + onCancel: () => this.#options.modals.closeTop(), + onConfirm: () => { + void this.#options.controller + .dispatch(command) + .then((result) => { + if (result.kind !== 'accepted') { + confirmation.setError(result.kind === 'unavailable' ? result.reason : result.message) + return + } + this.#options.modals.closeTop() + this.#setSupervisionStatus(`cancellation requested for ${selected.title}`) + }) + .catch((error: unknown) => { + confirmation.setError( + error instanceof Error ? error.message : 'Cancellation request failed', + ) + }) + }, + }) + this.#options.modals.open(confirmation, { anchor: 'center', width: '78%', maxHeight: 10 }) + } + + async #attachWorker(selected: ActivityItemView): Promise { + if ( + selected.kind !== 'worker' || + selected.entityId === undefined || + selected.supervisorId === undefined + ) { + this.openUnavailable('attach unavailable', 'Select a runtime worker before attaching') + return + } + const result = await this.#options.controller.dispatch({ + type: 'headless-command', + command: 'attach_worker', + operationId: this.#options.nextOperationId(), + params: { supervisorId: selected.supervisorId, workerId: selected.entityId }, + }) + if (result.kind !== 'accepted') { + this.openUnavailable( + 'attach unavailable', + result.kind === 'unavailable' ? result.reason : result.message, + ) + return + } + this.openUnavailable('attach unavailable', 'The runtime returned no terminal attachment') + } + + #openAnalysisPromotion(selected: ActivityItemView): void { + if (selected.kind !== 'analysis' || selected.entityId === undefined) { + this.openUnavailable('promotion unavailable', 'Select a completed analysis first') + return + } + const findings = (selected.analysisFindings ?? []).filter((finding) => finding.supported) + if (findings.length === 0) { + this.openUnavailable( + 'promotion unavailable', + 'This analysis has no cited finding that can be sent to the branch', + ) + return + } + const selector = new SearchableSelector({ + title: 'send cited finding to branch', + items: findings.map((finding) => ({ + value: finding.id, + label: finding.title, + description: 'cited finding', + })), + theme: this.#options.theme, + footer: 'enter send · esc cancel', + onCancel: () => this.#options.modals.closeTop(), + onSelect: (item) => { + void this.#options.controller + .dispatch({ + type: 'headless-command', + command: 'promote_analysis', + operationId: this.#options.nextOperationId(), + params: { analysisId: selected.entityId, findingIds: [item.value] }, + }) + .then((result) => { + this.#options.modals.closeTop() + if (result.kind !== 'accepted') { + this.openUnavailable( + 'promotion unavailable', + result.kind === 'unavailable' ? result.reason : result.message, + ) + return + } + this.#options.requestRender() + }) + }, + }) + this.#options.modals.open(selector, { anchor: 'center', width: '84%', maxHeight: '80%' }) + } + #hasActivity(id: string): boolean { return this.#options.controller.view().activity.some((item) => item.id === id) } @@ -347,3 +556,59 @@ function comparisonActivityId(value: unknown): string | undefined { ? `analysis:${value.analysisId}` : undefined } + +function cancelCommand( + selected: ActivityItemView, + operationId: string, +): Extract | undefined { + if (selected.status !== 'running' && selected.status !== 'starting') return undefined + if (selected.kind === 'analysis' && selected.entityId !== undefined) { + return { + type: 'headless-command', + command: 'cancel_analysis', + operationId, + params: { analysisId: selected.entityId }, + } + } + if ( + selected.kind === 'worker' && + selected.entityId !== undefined && + selected.supervisorId !== undefined + ) { + return { + type: 'headless-command', + command: 'cancel_worker', + operationId, + params: { supervisorId: selected.supervisorId, workerId: selected.entityId }, + } + } + if (selected.kind === 'supervisor' && selected.entityId !== undefined) { + return { + type: 'headless-command', + command: 'cancel_supervisor', + operationId, + params: { supervisorId: selected.entityId }, + } + } + return undefined +} + +function descendantCount( + activity: readonly ActivityItemView[], + selected: ActivityItemView, +): number { + if (selected.entityId === undefined) return 0 + const queue = [selected.entityId] + const descendants = new Set() + while (queue.length > 0) { + const parent = queue.shift() + if (parent === undefined) break + for (const item of activity) { + if (item.parentId !== parent || item.entityId === undefined || descendants.has(item.entityId)) + continue + descendants.add(item.entityId) + queue.push(item.entityId) + } + } + return descendants.size +} diff --git a/test/analysis-durable.test.ts b/test/analysis-durable.test.ts index 3a38da9b..0d183c1a 100644 --- a/test/analysis-durable.test.ts +++ b/test/analysis-durable.test.ts @@ -340,12 +340,24 @@ function registry( execution_plan: {}, } as unknown as ExactAnalystRunEvent const findings = [...(options.findings ?? [])] + const summary = { + analyst_id: runOptions.analystIds[0] ?? 'efficiency-behavioral', + status: 'ok', + findings_count: findings.length, + latency_ms: 1, + usage: { + calls: 0, + tokens: null, + cost: { kind: 'known', usd: 0 }, + knownCostUsd: 0, + }, + } as const yield { type: 'analyst-completed', analyst_id: runOptions.analystIds[0] ?? 'efficiency-behavioral', started_at: NOW, findings, - summary: {}, + summary, } as unknown as ExactAnalystRunEvent const result: ExactAnalystRunResult = { run_id: runId, @@ -353,7 +365,7 @@ function registry( started_at: NOW, ended_at: NOW, findings, - per_analyst: [], + per_analyst: [summary], total_cost_usd: 0, execution_plan: {}, completion: { status: 'complete' }, diff --git a/test/analysis-supervision.test.ts b/test/analysis-supervision.test.ts index 37345a5b..c31f711a 100644 --- a/test/analysis-supervision.test.ts +++ b/test/analysis-supervision.test.ts @@ -399,6 +399,14 @@ test('eval adapter routes exact streaming and reports missing named analysts', a assert.deepEqual((received.options as { analystIds: string[] }).analystIds, [ 'efficiency-behavioral', ]) + assert.deepEqual(adapter.resolveAnalystIds({ recipe: 'cost,tools' }), ['efficiency-behavioral']) + assert.deepEqual(adapter.resolveAnalystIds({ recipe: 'all' }), ['efficiency-behavioral']) + assert.deepEqual( + adapter.resolveAnalystIds({ + analystIds: ['efficiency-behavioral', 'efficiency-behavioral'], + }), + ['efficiency-behavioral'], + ) assert.throws( () => new AgentEvalAnalystAdapter().resolveAnalystIds({ recipe: 'failure' }), (error: unknown) => error instanceof Error && 'issue' in error, @@ -589,8 +597,23 @@ test('analysis service persists only analysis events, emits progress, and preser applicationHost.committed .filter((event) => event.kind.startsWith('analysis.')) .map((event) => event.kind), - ['analysis.created', 'analysis.updated', 'analysis.completed'], + [ + 'analysis.created', + 'analysis.updated', + 'analysis.updated', + 'analysis.updated', + 'analysis.completed', + ], ) + assert.deepEqual(result.analysis.analysts, [ + { + analystId: 'efficiency-behavioral', + status: 'completed', + findingsCount: 1, + latencyMs: 1, + startedAt: NOW, + }, + ]) const analyzed = applicationHost.committed.find((event) => event.kind === 'graph.edge.upserted') assert.equal(analyzed?.kind, 'graph.edge.upserted') if (analyzed?.kind === 'graph.edge.upserted') { @@ -758,7 +781,7 @@ test('promotion records selected finding provenance as a graph attachment', asyn assert.equal(edge.edge.provenance.sourceDigest, evidence.source.digest) }) -test('runtime supervisor adapter reads snapshots, persists projections, and leaves worker cancel unavailable', async () => { +test('runtime supervisor adapter persists projections and routes exact cancel operation ids', async () => { const spend = { iterations: 1, tokensInput: 2, tokensOutput: 3, usd: 0.01, ms: 4 } const raw = { root: '/tmp/braid', @@ -804,6 +827,10 @@ test('runtime supervisor adapter reads snapshots, persists projections, and leav ], } as unknown as TopSnapshot const watcher = new RuntimeSupervisorWatcher(() => raw) + let workerCancelInput: + | { readonly eventDir: string; readonly worker: string; readonly operationId: string } + | undefined + let runCancelInput: { readonly eventDir: string; readonly operationId: string } | undefined const controller = new RuntimeSupervisorController({ watcher, write: (_rootDir, supervisorId, workerLabel, message, source) => ({ @@ -818,6 +845,30 @@ test('runtime supervisor adapter reads snapshots, persists projections, and leav source: source ?? 'braid', }, }), + cancelWorker: (eventDir, worker, operationId, options) => { + workerCancelInput = { eventDir, worker, operationId } + return { + operationId, + worker, + effect: 'cancel_requested', + requestedAt: NOW, + observedAt: NOW, + ...(options?.reason === undefined ? {} : { reason: options.reason }), + detail: 'runtime accepted worker cancellation', + terminated: [], + } + }, + cancelRun: (eventDir, operationId, options) => { + runCancelInput = { eventDir, operationId } + return { + operationId, + effect: 'cancel_requested', + requestedAt: NOW, + observedAt: NOW, + ...(options?.reason === undefined ? {} : { reason: options.reason }), + detail: 'runtime accepted supervisor cancellation', + } + }, }) const first = history() const applicationHost = host(first.state, first.events) @@ -844,7 +895,28 @@ test('runtime supervisor adapter reads snapshots, persists projections, and leav ) assert.equal(queued.status, 'queued') if (queued.status === 'queued') assert.equal(queued.requestId, 'request-1') - const unavailable = await service.cancelWorker('runtime-worker-1') - assert.equal(unavailable.status, 'unavailable') - assert.equal(unavailable.issue.capability, 'supervisor.worker.cancel') + const cancelledWorker = await service.cancelWorker( + '/tmp/braid', + 'runtime-supervisor-1', + 'runtime-worker-1', + 'op-cancel-worker-1', + ) + assert.equal(cancelledWorker.status, 'acknowledged') + assert.equal(cancelledWorker.effect, 'cancel_requested') + assert.deepEqual(workerCancelInput, { + eventDir: '/tmp/braid/.agent', + worker: 'runtime-worker-1', + operationId: 'op-cancel-worker-1', + }) + const cancelledSupervisor = await service.cancelSupervisor( + '/tmp/braid', + 'runtime-supervisor-1', + 'op-cancel-supervisor-1', + ) + assert.equal(cancelledSupervisor.status, 'acknowledged') + assert.equal(cancelledSupervisor.effect, 'cancel_requested') + assert.deepEqual(runCancelInput, { + eventDir: '/tmp/braid/.agent', + operationId: 'op-cancel-supervisor-1', + }) }) diff --git a/test/intelligence-dispatch.test.ts b/test/intelligence-dispatch.test.ts index 42e2901b..35890ddf 100644 --- a/test/intelligence-dispatch.test.ts +++ b/test/intelligence-dispatch.test.ts @@ -53,13 +53,36 @@ function registry(): AnalystRegistryPort { analyst_ids: options.analystIds, execution_plan: {}, } as unknown as ExactAnalystRunEvent + const analystId = options.analystIds[0] ?? 'efficiency-behavioral' + const summary = { + analyst_id: analystId, + status: 'ok', + findings_count: 0, + latency_ms: 1, + usage: { + calls: 0, + tokens: null, + cost: { kind: 'known', usd: 0 }, + knownCostUsd: 0, + }, + } as const + yield { + type: 'analyst-started', + analyst_id: analystId, + started_at: NOW, + } as unknown as ExactAnalystRunEvent + yield { + type: 'analyst-completed', + findings: [], + summary, + } as unknown as ExactAnalystRunEvent const result = { run_id: runId, correlation_id: 'correlation-braid-test', started_at: NOW, ended_at: NOW, findings: [], - per_analyst: [], + per_analyst: [summary], total_cost_usd: 0, execution_plan: {}, completion: { status: 'complete' }, @@ -213,7 +236,13 @@ test('Braid exposes analysis actions through the TUI controller without creating .events() .map((envelope) => envelope.event.kind) .filter((kind) => kind.startsWith('analysis.')), - ['analysis.created', 'analysis.updated', 'analysis.completed'], + [ + 'analysis.created', + 'analysis.updated', + 'analysis.updated', + 'analysis.updated', + 'analysis.completed', + ], ) await app.close() }) @@ -286,7 +315,7 @@ test('runtime supervisors stay unbound until each runtime id is explicitly assig await app.close() }) -test('worker steering resolves the public Braid ids back to exact runtime ids', async () => { +test('supervisor controls resolve public ids while non-idempotent steering and attach fail closed', async () => { const raw = supervisionSnapshot([{ id: 'runtime-worker-control', label: 'worker-control' }]) const watcher = new RuntimeSupervisorWatcher(() => raw) let writeInput: @@ -297,6 +326,10 @@ test('worker steering resolves the public Braid ids back to exact runtime ids', readonly message: string } | undefined + let workerCancelInput: + | { readonly eventDir: string; readonly worker: string; readonly operationId: string } + | undefined + let supervisorCancelInput: { readonly eventDir: string; readonly operationId: string } | undefined const runtimeController = new RuntimeSupervisorController({ watcher, write: (rootDir, supervisorId, worker, message, source) => { @@ -314,6 +347,28 @@ test('worker steering resolves the public Braid ids back to exact runtime ids', }, } }, + cancelWorker: (eventDir, worker, operationId) => { + workerCancelInput = { eventDir, worker, operationId } + return { + operationId, + worker, + effect: 'cancel_requested', + requestedAt: NOW, + observedAt: NOW, + detail: 'runtime accepted worker cancellation', + terminated: [], + } + }, + cancelRun: (eventDir, operationId) => { + supervisorCancelInput = { eventDir, operationId } + return { + operationId, + effect: 'cancel_requested', + requestedAt: NOW, + observedAt: NOW, + detail: 'runtime accepted supervisor cancellation', + } + }, }) const app = createBraidApplication({ fixture: 'deterministic', @@ -348,17 +403,47 @@ test('worker steering resolves the public Braid ids back to exact runtime ids', text: 'inspect the failing test', }, }) - assert.equal(steered.kind, 'accepted') - assert.deepEqual(writeInput, { - rootDir: '/workspace', - supervisorId: 'runtime-supervisor-live', - worker: 'worker-control', - message: 'inspect the failing test', + assert.equal(steered.kind, 'unavailable') + if (steered.kind === 'unavailable') assert.match(steered.reason, /operation identifier/u) + assert.equal(writeInput, undefined) + + const cancelledWorker = await controller.dispatch({ + type: 'headless-command', + command: 'cancel_worker', + operationId: 'op-cancel-public-worker', + params: { supervisorId: supervisor.id, workerId: worker.id }, }) - if (steered.kind === 'accepted') { - assert.equal((steered.data as { readonly worker: string }).worker, worker.id) + assert.equal(cancelledWorker.kind, 'accepted') + assert.deepEqual(workerCancelInput, { + eventDir: '/workspace/.agent', + worker: 'runtime-worker-control', + operationId: 'op-cancel-public-worker', + }) + if (cancelledWorker.kind === 'accepted') { + assert.equal((cancelledWorker.data as { readonly effect: string }).effect, 'cancel_requested') } + const cancelledSupervisor = await controller.dispatch({ + type: 'headless-command', + command: 'cancel_supervisor', + operationId: 'op-cancel-public-supervisor', + params: { supervisorId: supervisor.id }, + }) + assert.equal(cancelledSupervisor.kind, 'accepted') + assert.deepEqual(supervisorCancelInput, { + eventDir: '/workspace/.agent', + operationId: 'op-cancel-public-supervisor', + }) + + const attach = await controller.dispatch({ + type: 'headless-command', + command: 'attach_worker', + operationId: 'op-attach-public-worker', + params: { supervisorId: supervisor.id, workerId: worker.id }, + }) + assert.equal(attach.kind, 'unavailable') + if (attach.kind === 'unavailable') assert.match(attach.reason, /retained interactive reference/u) + writeInput = undefined const rejected = await controller.dispatch({ type: 'headless-command', @@ -844,7 +929,7 @@ test('analysis source includes inherited messages on a forked branch', async () await app.close() }) -test('worker cancellation reports the runtime limitation instead of fabricating success', async () => { +test('worker cancellation fails closed when the selected runtime worker is absent', async () => { const app = createBraidApplication({ fixture: 'deterministic' }) app.initialize('/workspace') const controller = createApplicationUiController(app) @@ -856,7 +941,9 @@ test('worker cancellation reports the runtime limitation instead of fabricating }) assert.equal(result.kind, 'unavailable') - if (result.kind === 'unavailable') assert.match(result.reason, /supervisor\.worker\.cancel/u) + if (result.kind === 'unavailable') { + assert.match(result.reason, /no running supervised worker/u) + } assert.equal(app.state().supervisors.length, 0) await app.close() }) diff --git a/test/tui-core-workflows.test.ts b/test/tui-core-workflows.test.ts index 18045181..7f5436cb 100644 --- a/test/tui-core-workflows.test.ts +++ b/test/tui-core-workflows.test.ts @@ -20,6 +20,7 @@ import { ConversationConfirmation } from '../src/views/tui/conversation-dialogs. import { ForkPreviewPanel } from '../src/views/tui/fork-preview.js' import { GraphView } from '../src/views/tui/graph.js' import { InteractionShell } from '../src/views/tui/interaction.js' +import { createWorkerSteerPrompt } from '../src/views/tui/supervisor-actions.js' import { BraidTerminalApp } from '../src/views/tui/terminal-app.js' import { createBraidTheme } from '../src/views/tui/theme.js' import { VirtualTerminal } from './support/virtual-terminal.js' @@ -374,7 +375,7 @@ test('long workflow state preserves the closing key instead of pushing it below const analysisScreen = await renderOverlay(analysis, 40, 12) assert.match(analysisScreen.join('\n'), /page 1\/\d+/u) analysis.handleInput('\u001b[6~') - assert.match(analysis.render(40).join('\n'), /finding 4/u) + assert.match(analysis.render(40).join('\n'), /finding [2-8]/u) assert.match(analysisScreen.join('\n'), /←\/esc back/u) }) @@ -551,7 +552,7 @@ test('wide activity keeps the list and details together and tabs through bounded browser.handleInput('\t') assert.match(browser.render(120).join('\n'), /workers · 0/u) browser.handleInput('\t') - assert.match(browser.render(120).join('\n'), /tab filter: all/u) + assert.match(browser.render(120).join('\n'), /tab filter/u) browser.handleInput('\u001b[D') assert.equal(leftCloses, 1) @@ -569,6 +570,122 @@ test('wide activity keeps the list and details together and tabs through bounded assert.equal(escapeCloses, 1) }) +test('activity browser exposes keyboard actions for workers and analyses at every reference size', async () => { + const actions: Array<{ action: string; selectedId: string | undefined }> = [] + const recordAction = (action: string, selectedId: string | undefined) => { + actions.push({ action, selectedId }) + } + const workerView: BraidViewModel = { + ...baseView(), + activity: [ + { + id: 'worker:worker-action', + kind: 'worker', + title: 'worker action', + status: 'running', + entityType: 'worker', + entityId: 'worker-action', + supervisorId: 'supervisor-action', + }, + ], + } + for (const [width, rows] of [ + [40, 12], + [80, 24], + [120, 40], + [200, 60], + ] as const) { + const rendered = await renderOverlay( + new ActivityBrowserPanel(theme, { + view: () => workerView, + rows: () => rows, + onClose: () => {}, + scope: 'workers', + onAction: recordAction, + }), + width, + rows, + ) + assert.equal(rendered.length, rows) + assertFits(rendered, width) + assert.match(rendered.join('\n'), /s\/a off/u) + } + const workerBrowser = new ActivityBrowserPanel(theme, { + view: () => workerView, + rows: () => 24, + onClose: () => {}, + scope: 'workers', + onAction: recordAction, + }) + workerBrowser.render(80) + for (const key of ['s', 'x', 'a', 'r']) workerBrowser.handleInput(key) + assert.deepEqual(actions, [ + { action: 'steer', selectedId: 'worker:worker-action' }, + { action: 'cancel', selectedId: 'worker:worker-action' }, + { action: 'attach', selectedId: 'worker:worker-action' }, + { action: 'refresh', selectedId: 'worker:worker-action' }, + ]) + + const analysisBrowser = new ActivityBrowserPanel(theme, { + view: () => ({ + ...baseView(), + activity: [ + { + id: 'analysis:analysis-action', + kind: 'analysis', + title: 'failure review', + status: 'completed', + entityType: 'analysis', + entityId: 'analysis-action', + }, + ], + }), + rows: () => 24, + onClose: () => {}, + scope: 'analyses', + onAction: recordAction, + }) + analysisBrowser.render(80) + analysisBrowser.handleInput('p') + assert.deepEqual(actions.at(-1), { + action: 'promote', + selectedId: 'analysis:analysis-action', + }) +}) + +test('worker steer prompt accepts one message and keeps empty and cancel paths keyboard reachable', async () => { + const submissions: string[] = [] + let cancels = 0 + const prompt = createWorkerSteerPrompt({ + theme, + worker: 'worker-action', + onSubmit: (message) => submissions.push(message), + onCancel: () => { + cancels += 1 + }, + }) + const frame = await renderOverlay(prompt, 40, 12) + assertFits(frame, 40) + assert.match(frame.join('\n'), /enter send · esc cancel/u) + prompt.handleInput('\r') + assert.match(prompt.render(40).join('\n'), /steering message is required/iu) + prompt.handleInput(' inspect the failed check ') + prompt.handleInput('\r') + prompt.handleInput('\r') + assert.deepEqual(submissions, ['inspect the failed check']) + + const cancelled = createWorkerSteerPrompt({ + theme, + worker: 'worker-action', + onSubmit: () => assert.fail('cancel must not submit'), + onCancel: () => { + cancels += 1 + }, + }) + cancelled.handleInput('\u001b') + assert.equal(cancels, 1) +}) + test('wide activity gives one selected result the full surface', () => { const original = baseView() const view: BraidViewModel = { diff --git a/test/tui-refresh-lifecycle.test.ts b/test/tui-refresh-lifecycle.test.ts index 7b310247..8fc52cc9 100644 --- a/test/tui-refresh-lifecycle.test.ts +++ b/test/tui-refresh-lifecycle.test.ts @@ -182,6 +182,7 @@ function surfaceOptions( modals, rows: () => 12, requestRender, + nextOperationId: () => 'op-refresh-lifecycle', openProfile: () => {}, openConnection: () => {}, } diff --git a/test/w6-contract.test.ts b/test/w6-contract.test.ts index 598e4ac3..20871e84 100644 --- a/test/w6-contract.test.ts +++ b/test/w6-contract.test.ts @@ -65,11 +65,15 @@ const REQUIRED_HEADLESS = [ 'analyze', 'compare', 'promote_analysis', + 'cancel_analysis', 'get_graph', 'get_activity', 'get_details', + 'refresh_supervision', 'steer_worker', 'cancel_worker', + 'cancel_supervisor', + 'attach_worker', 'export', 'shutdown', ] as const From 23813cc096d2e15a301da2a203e127296e18f36b Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 05:52:42 -0600 Subject: [PATCH 008/136] fix(conversations): stabilize transfer retry identity --- src/app/conversation-branch-effects.ts | 2 +- test/conversation-branch-effects.test.ts | 74 ++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/app/conversation-branch-effects.ts b/src/app/conversation-branch-effects.ts index 495ed54a..ceea3835 100644 --- a/src/app/conversation-branch-effects.ts +++ b/src/app/conversation-branch-effects.ts @@ -230,6 +230,7 @@ async function executeCrossRunner( const reserved = await reserveOperation(host, operationId, digest) const existing = reserved.operations.find((operation) => operation.id === operationId) if (existing?.status === 'acknowledged') return branchForOperation(state, existing) + const acceptedAt = existing?.createdAt ?? host.now() const planRequestMaterial = { requestId: `${input.operationId}:plan`, @@ -252,7 +253,6 @@ async function executeCrossRunner( throw new AppError('CONTEXT_PLAN_CONFLICT', 'The provider changed the accepted context plan') } - const acceptedAt = host.now() const transferMaterial = { operationId: `${input.operationId}:context`, plan: portablePlan, diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts index cf859fd9..e91dde86 100644 --- a/test/conversation-branch-effects.test.ts +++ b/test/conversation-branch-effects.test.ts @@ -404,6 +404,80 @@ test('cross-runner handoff transfers canonical history and replays after restart ) }) +test('cross-runner retry reuses the original acceptance timestamp in its request digest', async () => { + const contextState: ContextProviderState = { transfers: [] } + let failOnce = true + const baseExecution = executionFor({ + capabilities: branchCapabilities(), + contextState, + }) + const execution: ExecutionPort = { + ...baseExecution, + context: { + async transfer(request) { + contextState.transfers.push(request) + if (failOnce) { + failOnce = false + return { + status: 'unknown', + operationId: request.operationId, + requestDigest: request.requestDigest, + message: 'The provider response was lost', + retryable: true, + } + } + return contextResult(request) + }, + }, + } + const journal = new MemoryJournal(new FixedClock(AT)) + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + journal, + effectStorage: journal, + }) + await prepareSource(app) + await app.send({ operationId: 'op-source-transfer-retry', text: 'source history' }).completion + const plan = app.conversations.branches.plan({ + operationId: 'op-cross-runner-transfer-retry', + kind: 'cross-runner', + runner: 'codex', + destinationProvider: TARGET_PROVIDER, + }) + const portableContextPlan = plan.portableContextPlan + assert(portableContextPlan) + const accepted = portableContextPlan.requiresAcceptance + ? { acceptedDigest: portableContextPlan.digest } + : {} + const input = { + operationId: 'op-cross-runner-transfer-retry', + kind: 'cross-runner' as const, + runner: 'codex', + destinationProvider: TARGET_PROVIDER, + ...accepted, + planDigest: plan.digest, + } + await assert.rejects(() => app.conversations.branches.execute(input), /response was lost/u) + + const restarted = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock('2026-08-29T00:00:00.000Z'), + journal, + effectStorage: journal, + }) + await restarted.conversations.branches.execute(input) + + assert.equal(contextState.transfers.length, 2) + assert.equal( + contextState.transfers[0]?.acceptance.acceptedAt, + contextState.transfers[1]?.acceptance.acceptedAt, + ) + assert.equal(contextState.transfers[0]?.requestDigest, contextState.transfers[1]?.requestDigest) +}) + test('workspace fork uses exact provider operations, isolates destination, and cleans both resources', async () => { const provider = workspaceProvider() const execution = executionFor({ From 8dcbec002254fd3adb248fc8db5b66fc73550b1b Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 05:59:02 -0600 Subject: [PATCH 009/136] docs(components): complete retained lifecycle map --- docs/components/README.md | 6 +- docs/components/retained-run-lifecycle.md | 98 +++++++++++++++++++++++ scripts/run-tests.mjs | 1 + test/component-docs.test.ts | 3 +- test/scripts.test.ts | 1 + 5 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 docs/components/retained-run-lifecycle.md diff --git a/docs/components/README.md b/docs/components/README.md index 7106fea5..9156f2e3 100644 --- a/docs/components/README.md +++ b/docs/components/README.md @@ -52,10 +52,14 @@ It proves keyboard behavior and terminal output at 40×12, 80×24, 120×40, and | Transcript and composer | [transcript-composer.md](transcript-composer.md) | Read one branch and submit, queue, or steer without losing a draft. | | Work Strip | [work-strip.md](work-strip.md) | See and focus concurrent work without a permanent side panel. | | Multi-run orchestration | [multi-run-orchestration.md](multi-run-orchestration.md) | Run independent branches concurrently while preserving branch order. | +| Retained run lifecycle | [retained-run-lifecycle.md](retained-run-lifecycle.md) | Reconnect, replay, detach, cancel, and recover one exact provider run. | +| Native continuation | [native-continuation.md](native-continuation.md) | Continue the exact provider session at a verified branch boundary. | +| Run stream sanitizer | [run-stream-sanitizer.md](run-stream-sanitizer.md) | Make split provider output safe before durable storage and rendering. | | Selectors and commands | [selectors-and-commands.md](selectors-and-commands.md) | Find an action or entity through one keyboard contract. | | Modal coordination | [modal-coordination.md](modal-coordination.md) | Present one bounded decision surface with reliable focus restoration. | | Conversation navigation | [conversation-navigation.md](conversation-navigation.md) | Create, rename, archive, switch, branch, and clone through explicit identities. | | Fork preview | [fork-preview.md](fork-preview.md) | Explain exactly what a fork copies before any external mutation. | +| Conversation branch effects | [conversation-branch-effects.md](conversation-branch-effects.md) | Execute portable context transfer and real workspace forks without hidden provider assumptions. | | Interactions and secrets | [interactions.md](interactions.md) | Answer, decline, cancel, or automate a typed request safely. | | Profiles and connections | [profiles-and-connections.md](profiles-and-connections.md) | Select a portable agent and a credential-bearing execution connection. | | Activity | [activity.md](activity.md) | Find live, queued, waiting, detached, and completed work. | @@ -68,8 +72,6 @@ It proves keyboard behavior and terminal output at 40×12, 80×24, 120×40, and | Safe rendering and responsive layout | [safe-rendering.md](safe-rendering.md) | Preserve terminal integrity and primary meaning at every supported size. | | Headless and accessible presentation | [headless-and-accessibility.md](headless-and-accessibility.md) | Expose the same application through bounded JSONL and plain text. | -The stream sanitizer, native continuation, workspace fork, and retained run documents extend this map at their owning boundaries. - ## Concrete component inventory Every exported terminal component class maps to exactly one product document below. diff --git a/docs/components/retained-run-lifecycle.md b/docs/components/retained-run-lifecycle.md new file mode 100644 index 00000000..1b41002d --- /dev/null +++ b/docs/components/retained-run-lifecycle.md @@ -0,0 +1,98 @@ +# Retained run lifecycle + +## Purpose + +The retained run lifecycle keeps one provider execution observable and controllable after a client disconnects or restarts. + +It preserves exact provider identity and never treats a new execution as a recovered run. + +## Ownership + +`agent-interface` owns exact control references, capability documents, events, interactions, and control acknowledgements. + +`agent-runtime` owns retained handles, provider reconnection, replay cursors, status reconciliation, and idempotent controls. + +Braid owns durable admission receipts, local event reduction, reconnect scheduling, user intents, and terminal presentation. + +The provider owns the live process, native session, environment, and final execution result. + +## Best simple implementation + +Braid records intent before any provider mutation. + +Runtime records the environment and exact control reference as each provider boundary succeeds. + +Every identity field is explicit: Braid run, provider run, environment, execution, session, turn, and operation. + +Reconnect uses the saved exact control reference and the last accepted event sequence. + +Replay rejects duplicates before reduction and records sequence gaps without inventing provider output. + +Detach closes only the local reader and leaves the provider run active. + +Cancel uses one stable operation identifier and reconciles an ambiguous acknowledgement through exact provider status. + +Unknown status remains unknown until a later exact observation resolves it. + +The implementation never parses runner output or reads provider-private state. + +## Durable phases + +| Phase | Durable fact | Safe restart action | +| --- | --- | --- | +| Intent | Request digest, provider, session, execution, and environment key | Repeat admission with the same identifiers. | +| Environment | Exact created environment plus the intent facts | Discover the matching execution before dispatch. | +| Dispatched | Complete exact control reference | Reconnect the retained handle and replay after the saved sequence. | +| Terminal | Final provider result and local terminal event | Render the saved result and perform no provider mutation. | + +A changed request with the same operation identifier fails as a conflict. + +A repeated request with the same digest returns the original acknowledgement. + +## Concurrency and performance + +Each Braid run has one prepared plan, one start promise, one retained handle, and one active reader. + +Replacing a reader aborts the old reader before the new stream consumes events. + +Process-local retained state is bounded and evicts only runs without preparation, startup, or active readers. + +Provider discovery uses bounded pages and validates every returned identity field. + +The event journal remains authoritative for the conversation graph and accepted local sequence. + +## User interface + +The Work Strip shows streaming, waiting, detached, cancelling, terminal, and unknown states for every active run. + +Focus changes the visible transcript without changing which run a control targets. + +Detach, reconnect, cancel, and interaction actions appear only when the reported capabilities support them. + +Unavailable actions remain visible with one plain reason. + +## Failure behavior + +An ambiguous environment or dispatch response triggers lookup with the original identifiers. + +Duplicate environments, conflicting control references, stale sessions, and malformed acknowledgements fail closed. + +A client crash does not imply provider cancellation. + +A stream disconnect does not imply run failure. + +Credentials and raw provider payloads never enter the journal, frame captures, or diagnostics. + +## Proof + +Tests cover intent, environment, and dispatch crashes; restart; replay; duplicate events; sequence gaps; detach; reconnect; cancel; and interaction recovery. + +Live proof kills the first Braid process, reconnects from another process, advances the same session, cancels, and cleans the exact environment. + +Release proof also requires concurrent runs because one retained handle must never block an unrelated branch. + +## Non-goals + +Braid does not implement a runner, provider session store, or retained execution protocol. + +Braid does not infer continuity from matching text, workspace paths, or display labels. diff --git a/scripts/run-tests.mjs b/scripts/run-tests.mjs index c991e447..5b7a0141 100644 --- a/scripts/run-tests.mjs +++ b/scripts/run-tests.mjs @@ -37,6 +37,7 @@ const scopeFiles = { unit: [ 'agent-interface-runtime-parity.test.js', 'canonical.test.js', + 'component-docs.test.js', 'analysis-model-call-observability.test.js', 'analysis-model-call-roundtrip.test.js', 'application.test.js', diff --git a/test/component-docs.test.ts b/test/component-docs.test.ts index 73e06f2a..1b96cd80 100644 --- a/test/component-docs.test.ts +++ b/test/component-docs.test.ts @@ -2,9 +2,8 @@ import assert from 'node:assert/strict' import { existsSync, readFileSync, readdirSync } from 'node:fs' import { dirname, join, relative, resolve } from 'node:path' import test from 'node:test' -import { fileURLToPath } from 'node:url' -const repositoryRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..') +const repositoryRoot = resolve(process.cwd()) const componentIndex = join(repositoryRoot, 'docs/components/README.md') const sourceDirectories = ['src/adapters/tui', 'src/views/tui'] as const diff --git a/test/scripts.test.ts b/test/scripts.test.ts index b2aacb65..90622019 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -208,6 +208,7 @@ test('every scoped package alias forwards its declared file set', () => { 'application.test.js', 'canonical.test.js', 'cli-startup.test.js', + 'component-docs.test.js', 'conversation-branch-effects.test.js', 'conversations.test.js', 'coordination.test.js', From a513452b6c3acefe706b3f5da7726374e0df607f Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 05:58:31 -0600 Subject: [PATCH 010/136] fix(conversations): allow forks during live runs --- test/conversation-branch-effects.test.ts | 69 ++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts index e91dde86..773ea7c1 100644 --- a/test/conversation-branch-effects.test.ts +++ b/test/conversation-branch-effects.test.ts @@ -26,6 +26,17 @@ const SOURCE_PROVIDER = 'source-provider' const TARGET_PROVIDER = 'target-provider' const SOURCE_SESSION = 'provider-session-source' +function deferred(): { + readonly promise: Promise + readonly resolve: (value: T | PromiseLike) => void +} { + let resolve!: (value: T | PromiseLike) => void + const promise = new Promise((complete) => { + resolve = complete + }) + return { promise, resolve } +} + interface WorkspaceProviderState { readonly checkpoints: Map< string, @@ -404,6 +415,64 @@ test('cross-runner handoff transfers canonical history and replays after restart ) }) +test('fork execution on another branch preserves a live run', async () => { + const started = deferred() + const release = deferred() + const baseExecution = executionFor({ capabilities: branchCapabilities() }) + const execution: ExecutionPort = { + ...baseExecution, + async *streamTurn(input) { + started.resolve() + await release.promise + yield { + type: 'final', + status: 'completed', + reason: 'live run completed', + text: `completed ${input.text}`, + metadata: { tokenUsage: { input: 1, output: 1 } }, + task: { id: `task-${input.runId}`, intent: input.text }, + timestamp: AT, + } + }, + } + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + }) + await prepareSource(app) + const sourceBranchId = app.state().branchId + const liveBranch = await app.conversations.branches.create({ + operationId: 'op-create-live-branch', + }) + const live = app.send({ operationId: 'op-live-branch', text: 'keep this run live' }) + + try { + await started.promise + assert.equal(liveBranch.id, app.state().branchId) + assert.equal(app.state().activeRunId, live.runId) + + const plan = app.conversations.branches.plan({ + operationId: 'op-fork-while-live', + kind: 'conversation', + branchId: sourceBranchId, + }) + const fork = await app.conversations.branches.execute({ + operationId: 'op-fork-while-live', + kind: 'conversation', + branchId: sourceBranchId, + planDigest: plan.digest, + }) + + assert.equal(fork.id, plan.destinationBranchId) + assert.equal(app.state().activeRunId, live.runId) + assert.equal(app.state().runs.find((run) => run.id === live.runId)?.status, 'streaming') + } finally { + release.resolve() + await live.completion + } +}) + test('cross-runner retry reuses the original acceptance timestamp in its request digest', async () => { const contextState: ContextProviderState = { transfers: [] } let failOnce = true From aa14d633aeae6334f836b303de4a4e31e855360f Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 06:05:59 -0600 Subject: [PATCH 011/136] fix(ui): expose complete parallel-work paths --- docs/02-experience-specification.md | 4 ++-- src/app/conversation-support.ts | 6 ------ src/views/shared/command-registry.ts | 10 +++++----- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/docs/02-experience-specification.md b/docs/02-experience-specification.md index 9e38782d..c5e0ed00 100644 --- a/docs/02-experience-specification.md +++ b/docs/02-experience-specification.md @@ -288,10 +288,10 @@ An unknown slash command is not sent to the agent and opens a correction list. | `/effort [level]` | Set or clear reasoning effort using canonical allowed values | | `/branch [message]` | Create a new conversation branch at the selected or named message boundary | | `/clone` | Duplicate the active branch into a new conversation with fresh execution identity | -| `/fork [--workspace]` | Preview and create a conversation fork, optionally with a real environment checkpoint and fork | +| `/fork [message] [--workspace \| --runner name [--provider name]]` | Preview a conversation, cross-runner, or real workspace fork | | `/graph` | Open the conversation, analysis, run, environment, and worker graph | | `/ask ` | Run a cited trace analysis against the selected frozen source | -| `/analyze ` | Run a named trace-analysis recipe against the selected source | +| `/analyze ` | Run one or all trace-analysis recipes against the selected source | | `/compare ` | Create a paired comparison of two frozen run or branch sources | | `/approve [scope]` | Accept the focused pending interaction using an allowed scope | | `/reject [feedback]` | Decline the focused pending interaction with optional feedback when accepted by its schema | diff --git a/src/app/conversation-support.ts b/src/app/conversation-support.ts index 0cdbf5a6..bc461688 100644 --- a/src/app/conversation-support.ts +++ b/src/app/conversation-support.ts @@ -118,12 +118,6 @@ export function requireWorkspace(state: BraidState): NonNullable', + 'Run one or all trace-analysis recipes', + '/analyze ', 'analysis.recipe', 'explicit', ], From 1f70c5db795b9c174b9cc4d4172774fe9cca8a71 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 06:25:09 -0600 Subject: [PATCH 012/136] fix(multirun): harden concurrent stream capture --- docs/components/multi-run-orchestration.md | 6 + docs/components/terminal-shell.md | 3 +- scripts/live-required.test.mjs | 1 + .../tangle-sandbox-braid-multirun.mjs | 1011 +++++++++++++++++ .../tangle-sandbox-braid-multirun.test.mjs | 48 + scripts/run-tests.mjs | 2 + src/app/storage-journal-support.ts | 11 +- src/bin/interface-state-recorder.ts | 10 +- test/cli-startup.test.ts | 9 +- test/scripts.test.ts | 2 + test/storage-journal-routing.test.ts | 24 + 11 files changed, 1116 insertions(+), 11 deletions(-) create mode 100644 scripts/live-required/tangle-sandbox-braid-multirun.mjs create mode 100644 scripts/live-required/tangle-sandbox-braid-multirun.test.mjs create mode 100644 test/storage-journal-routing.test.ts diff --git a/docs/components/multi-run-orchestration.md b/docs/components/multi-run-orchestration.md index 7b847eba..46f69516 100644 --- a/docs/components/multi-run-orchestration.md +++ b/docs/components/multi-run-orchestration.md @@ -116,6 +116,8 @@ A duplicate event with a changed payload or position raises a durable conflict. A disconnected reader uses the run's replay capability and cursor before declaring an unknown outcome. +Storage routes late provider events by run identity before it falls back to the selected conversation. + A provider cancellation acknowledgement settles only its target run and leaves other active runs unchanged. An unknown cancellation remains unknown until provider evidence supports a correction. @@ -138,6 +140,10 @@ The compatibility alias adds no second source of truth because normalization der `test/storage-snapshots.test.ts` proves legacy active-run migration, invalid-reference quarantine, restart restoration, and duplicate conflict behavior. +`test/storage-journal-routing.test.ts` proves late background events remain in their run conversation after focus changes. + +`test/cli-startup.test.ts` proves repeated signal captures retain the newest frame during active streaming. + `test/w8-runs.test.ts` retains single-run replay, cursor, cancellation, and queue coverage against the same ports. The unit and storage scopes run the new cases through the production application core and journal interfaces. diff --git a/docs/components/terminal-shell.md b/docs/components/terminal-shell.md index af20ad6f..4c9737ea 100644 --- a/docs/components/terminal-shell.md +++ b/docs/components/terminal-shell.md @@ -72,6 +72,8 @@ No layout creates a permanent side pane. Terminal cleanup must run after normal exit, signal exit, startup failure, stream failure, and test interruption. +The signal lifecycle queues frame requests and atomically replaces the latest signal frame during repeated captures. + Unknown capabilities render through `UnavailablePanel` with the provider reason. All title, status, identity, and notification text is sanitized before terminal output. @@ -99,4 +101,3 @@ Captures prove the shell at 40×12, 80×24, 120×40, and 200×60. The shell does not own agent execution, replay, persistence, profiles, or provider sessions. The shell does not infer a runner or model from display text. - diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index d4d6670c..2868c147 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -42,6 +42,7 @@ import { runStressProof, } from './live-required/tangle-sandbox-stress.mjs' import { runWorker } from './live-required/tangle-sandbox-worker.mjs' +import './live-required/tangle-sandbox-braid-multirun.test.mjs' const repository = resolve(new URL('../', import.meta.url).pathname) diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs new file mode 100644 index 00000000..c8cfa286 --- /dev/null +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -0,0 +1,1011 @@ +import assert from 'node:assert/strict' +import { createHash, randomUUID } from 'node:crypto' +import { mkdir, readFile, stat, writeFile } from 'node:fs/promises' +import { dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +import { AgentExactRunControlRefSchema } from '@tangle-network/agent-interface' +import { Sandbox } from '@tangle-network/sandbox' +import xterm from '@xterm/headless' +import * as pty from 'node-pty' + +import { sendTreeSignal, waitForTreeGone } from '../live-bridge/process-tree.mjs' +import { pause } from '../live-demo/terminal.mjs' +import { connectionConfiguration } from './configuration.mjs' +import { safeJson, safeMessage } from './contracts.mjs' +import { configEvidence, prepareProductionWorkspace, resolveBinary } from './headless.mjs' +import { + cleanupRetainedResourceByControlRef, + observeRetainedResource, +} from './tangle-sandbox-braid-stress.mjs' + +const scriptPath = fileURLToPath(import.meta.url) +const repository = resolve(dirname(scriptPath), '../..') +const DEFAULT_TIMEOUT_MS = 240_000 +const DEFAULT_HOLD_SECONDS = 60 +const DEFAULT_COLUMNS = 120 +const DEFAULT_ROWS = 40 +const TERMINAL_STATUSES = new Set([ + 'completed', + 'failed', + 'aborted', + 'cancelled', + 'expired', + 'blocked', + 'unknown', +]) +const SECRET_ENVIRONMENT_NAMES = [ + 'BRAID_ANALYSIS_AUTH', + 'BRAID_ANALYSIS_API_KEY', + 'BRAID_ANALYSIS_BEARER', + 'BRAID_CLI_BRIDGE_AUTH', + 'BRAID_CLI_BRIDGE_BEARER', + 'BRAID_TANGLE_AUTH', + 'BRAID_TANGLE_API_KEY', + 'BRAID_TANGLE_BEARER', + 'BRAID_TANGLE_SANDBOX_AUTH', + 'BRAID_TANGLE_SANDBOX_API_KEY', + 'BRAID_TANGLE_SANDBOX_BEARER', + 'TANGLE_API_KEY', +] + +function argument(name, argv = process.argv) { + const index = argv.indexOf(`--${name}`) + return index >= 0 && index + 1 < argv.length ? argv[index + 1] : undefined +} + +function positiveEnvironment(environment, name, fallback) { + const value = Number(environment[name]) + return Number.isFinite(value) && value > 0 ? value : fallback +} + +function configurationEnvironment(environment) { + if ( + !environment.BRAID_TANGLE_SANDBOX_CREDENTIAL_REF && + !environment.BRAID_TANGLE_SANDBOX_AUTH && + !environment.BRAID_TANGLE_SANDBOX_API_KEY && + !environment.BRAID_TANGLE_SANDBOX_BEARER && + environment.TANGLE_API_KEY + ) { + return { ...environment, BRAID_TANGLE_SANDBOX_API_KEY: environment.TANGLE_API_KEY } + } + return environment +} + +function sanitizedEnvironment(environment) { + const child = { ...environment } + for (const name of SECRET_ENVIRONMENT_NAMES) delete child[name] + return child +} + +function sandboxConfiguration(environment) { + return connectionConfiguration(configurationEnvironment(environment), { + prefix: 'BRAID_TANGLE_SANDBOX', + kind: 'tangle-sandbox', + endpointNames: ['BRAID_TANGLE_ENDPOINT'], + modelNames: ['BRAID_TANGLE_MODEL'], + runnerNames: ['BRAID_TANGLE_RUNNER'], + providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], + fallbackEndpoint: 'https://sandbox.tangle.tools', + fallbackModel: 'tangle-router/glm-5.2', + fallbackRunner: 'opencode', + fallbackProvider: 'tangle', + }) +} + +function proofId() { + return `braid-multirun-${Date.now()}-${randomUUID().replaceAll('-', '')}` +} + +function markerFor(proof, label) { + return `BRAID_MULTIRUN_${proof}_${label}`.toUpperCase() +} + +function promptFor(marker, holdSeconds) { + return [ + 'Use the current Tangle Sandbox working directory for every command in this turn.', + `Write exactly ${marker} followed by a newline to .braid-live/${marker}/marker.txt.`, + `Read .braid-live/${marker}/marker.txt and print the result.`, + 'Run git -C . rev-parse --is-inside-work-tree and print its result.', + `Run sleep ${holdSeconds} before the final response so another branch can stream concurrently.`, + `Reply with exactly ${marker}.`, + ].join(' ') +} + +function screenFrom(terminal) { + let text = '' + for (let row = 0; row < terminal.rows; row += 1) { + text += terminal.buffer.active.getLine(row)?.translateToString(true) ?? '' + text += '\n' + } + return text +} + +function normalizeScreen(screen) { + return screen.replace(/\s+/gu, ' ').trim() +} + +function createTerminal( + binary, + config, + recordPath, + columns = DEFAULT_COLUMNS, + rows = DEFAULT_ROWS, +) { + const terminal = new xterm.Terminal({ + cols: columns, + rows, + disableStdin: true, + allowProposedApi: true, + }) + const environment = { + ...config.environment, + TERM: 'xterm-256color', + COLORTERM: 'truecolor', + BRAID_SHUTDOWN_MODE: 'cancel', + NO_COLOR: '1', + NODE_NO_WARNINGS: '1', + } + for (const name of SECRET_ENVIRONMENT_NAMES) delete environment[name] + const child = pty.spawn(process.execPath, [binary, '--inline', '--record-state', recordPath], { + cwd: config.workspace, + env: environment, + name: 'xterm-256color', + cols: columns, + rows, + }) + let output = '' + let exited = false + let exitResult + let pendingWrites = 0 + let lastOutputAt = performance.now() + let processCleanup + const exitPromise = new Promise((resolveExit) => { + child.onExit((result) => { + exited = true + exitResult = result + resolveExit(result) + }) + }) + child.onData((data) => { + output += data + lastOutputAt = performance.now() + pendingWrites += 1 + terminal.write(data, () => { + pendingWrites -= 1 + }) + }) + const waitForStable = async (timeoutMs = 10_000) => { + const deadline = performance.now() + timeoutMs + for (;;) { + if (pendingWrites === 0 && performance.now() - lastOutputAt >= 100) return + if (performance.now() >= deadline) throw new Error('terminal output did not become stable') + await pause(25) + } + } + const captureState = async (timeoutMs = 10_000) => { + // A live provider can keep writing stream frames without a quiet interval. + // Signal the recorder after a short drain window instead of waiting for the full phase timeout. + await waitForStable(Math.min(timeoutMs, 1_000)).catch(() => undefined) + if (exited) + throw new Error( + `Braid exited before semantic frame capture (${exitResult?.exitCode ?? 'unknown'})`, + ) + let previousMtime + try { + previousMtime = (await stat(`${recordPath}.frame`)).mtimeNs + } catch {} + process.kill(child.pid, 'SIGUSR2') + const deadline = performance.now() + timeoutMs + for (;;) { + try { + const framePath = `${recordPath}.frame` + const metadata = await stat(framePath) + if (previousMtime === undefined || metadata.mtimeNs !== previousMtime) + return JSON.parse(await readFile(framePath, 'utf8')) + } catch {} + if (performance.now() >= deadline) throw new Error('semantic terminal frame was not recorded') + await pause(25) + } + } + const close = async () => { + if (exited) return { ...exitResult, processCleanup: await waitForTreeGone(child, 10_000) } + for (let layer = 0; layer < 4; layer += 1) { + child.write('\u001b') + await pause(250) + await waitForStable() + } + child.write('\u0003') + const deadline = performance.now() + 10_000 + while (!normalizeScreen(screenFrom(terminal)).includes('Ctrl+C again to quit')) { + if (performance.now() >= deadline) throw new Error('safe quit prompt was not rendered') + await pause(25) + } + child.write('\u0003') + const result = await Promise.race([ + exitPromise, + new Promise((_, reject) => setTimeout(() => reject(new Error('Braid did not exit')), 15_000)), + ]) + processCleanup = await waitForTreeGone(child, 10_000) + return { ...result, processCleanup } + } + const dispose = async () => { + if (!exited) { + await sendTreeSignal(child, 'SIGTERM') + await Promise.race([exitPromise, pause(1_000)]) + if (!exited) { + await sendTreeSignal(child, 'SIGKILL') + await Promise.race([exitPromise, pause(5_000)]) + } + } + processCleanup ??= await waitForTreeGone(child, 10_000) + terminal.dispose() + return processCleanup + } + return { + child, + columns, + rows, + input(value) { + child.write(value) + }, + get exited() { + return exited + }, + get output() { + return output + }, + screen: () => screenFrom(terminal), + snapshot: () => ({ screen: screenFrom(terminal), outputBytes: Buffer.byteLength(output) }), + captureState, + close, + dispose, + } +} + +async function waitFor(label, predicate, timeoutMs) { + const deadline = performance.now() + timeoutMs + let lastError + for (;;) { + try { + const value = await predicate() + if (value) return value + } catch (error) { + lastError = error + } + if (performance.now() >= deadline) { + throw new Error( + `${label} timed out after ${timeoutMs}ms${lastError instanceof Error ? `: ${lastError.message}` : ''}`, + ) + } + await pause(100) + } +} + +async function typeAndSubmit(runtime, value) { + for (const character of value) { + runtime.input(character) + await pause(2) + } + runtime.input('\r') +} + +async function waitForFrame(runtime, label, predicate, timeoutMs) { + return waitFor( + label, + async () => { + const frame = await runtime.captureState(timeoutMs) + return predicate(frame) ? frame : undefined + }, + timeoutMs, + ) +} + +function exactControlRef(value, label) { + const parsed = AgentExactRunControlRefSchema.safeParse(value) + assert.ok(parsed.success, `${label} is not an exact provider control reference`) + return parsed.data +} + +function runFromFrame(frame, runId) { + const stateRun = frame.state?.runs?.find((run) => run.id === runId) + const viewRun = frame.view?.runs?.find((run) => run.id === runId) + if (!stateRun || !viewRun) throw new Error(`frame omitted run ${runId}`) + return { stateRun, viewRun } +} + +function eventIdsForRun(frame, runId) { + const activityIds = (frame?.view?.activity ?? []) + .filter((item) => item.runId === runId && typeof item.sourceEventId === 'string') + .map((item) => item.sourceEventId) + const partIds = (frame?.view?.messages ?? []) + .filter((message) => message.runId === runId) + .flatMap((message) => message.parts ?? []) + .map((part) => part.sourceEventId) + .filter((value) => typeof value === 'string') + return [...activityIds, ...partIds] +} + +function runStatus(frame, runId) { + return runFromFrame(frame, runId).stateRun.status +} + +function isActive(status) { + return !TERMINAL_STATUSES.has(status) +} + +function assertUniqueEventIds(frame, runId, phase) { + const ids = eventIdsForRun(frame, runId) + assert.ok(ids.length > 0, `${phase} did not expose provider event identities for ${runId}`) + assert.equal(ids.length, new Set(ids).size, `${phase} duplicated provider events for ${runId}`) + return [...new Set(ids)] +} + +function identifiersForControl(controlRef) { + return [ + { kind: 'provider-environment', id: controlRef.environmentId }, + { kind: 'provider-session', id: controlRef.sessionId }, + { kind: 'provider-execution', id: controlRef.executionId }, + { kind: 'provider-run', id: controlRef.runId }, + ] +} + +async function accountSnapshot(client, phase) { + const [identity, usage, resources] = await Promise.all([ + client.getIdentity(), + client.usage(), + listBraidResources(client), + ]) + const customerId = identity?.customerId + const billingOwnerId = identity?.billingOwnerId + assert.equal(typeof customerId, 'string', `${phase} account identity omitted customerId`) + assert.equal(typeof billingOwnerId, 'string', `${phase} account identity omitted billingOwnerId`) + const identityDigest = createHash('sha256') + .update(`${customerId}:${billingOwnerId}`) + .digest('hex') + return { + phase, + identityDigest, + usage: { + activeSandboxes: usage.activeSandboxes ?? null, + totalSandboxes: usage.totalSandboxes ?? null, + computeMinutes: usage.computeMinutes ?? null, + gpuSeconds: usage.gpuSeconds ?? null, + gpuCostUsd: usage.gpuCostUsd ?? null, + }, + resources, + } +} + +async function listBraidResources(client) { + const page = await client.list({ limit: 100, offset: 0 }) + assert.ok(Array.isArray(page), 'Sandbox list returned an invalid page') + return page + .filter((box) => box?.metadata?.owner === 'braid' && box.metadata?.lifecycle === 'retained') + .map((box) => ({ + id: box.id, + providerSessionId: box.metadata?.providerSessionId ?? null, + displayName: box.metadata?.displayName ?? null, + createdAt: box.createdAt ?? null, + })) +} + +async function remoteStatus(client, controlRef, expectedStatus, timeoutMs) { + const box = await client.get(controlRef.environmentId) + assert.ok(box, `provider environment ${controlRef.environmentId} was not found`) + const session = box.session(controlRef.sessionId) + return waitFor( + `remote ${expectedStatus} status`, + async () => { + const status = await session.status() + assert.equal(status.latestExecutionId, controlRef.executionId) + assert.equal(status.runControlRef?.executionId, controlRef.executionId) + return status.status === expectedStatus ? status : undefined + }, + timeoutMs, + ) +} + +async function writeArtifact(path, result, environment) { + await mkdir(dirname(path), { recursive: true, mode: 0o700 }) + await writeFile(path, `${safeJson(result, environment)}\n`, { mode: 0o600 }) +} + +export function frameRunIds(frame) { + return (frame.view?.runs ?? []).map((run) => run.id) +} + +export function frameEventIds(frame, runId) { + return eventIdsForRun(frame, runId) +} + +export function assertFrameHasConcurrentRuns(frame, runIds) { + assert.equal(runIds.length, 2, 'concurrent proof requires exactly two run ids') + for (const runId of runIds) { + assert.ok(frameRunIds(frame).includes(runId), `frame omitted concurrent run ${runId}`) + assert.ok(isActive(runStatus(frame, runId)), `run ${runId} is not active`) + assert.ok(eventIdsForRun(frame, runId).length > 0, `run ${runId} has no streamed events`) + } + assert.equal( + frame.view?.activeRuns?.filter((entry) => runIds.includes(entry.runId)).length, + 2, + 'frame did not expose two active run ownership records', + ) + return true +} + +export async function runProof({ + targetRepository = process.env.BRAID_LIVE_REPOSITORY ?? repository, + environment = process.env, +} = {}) { + const startedAt = new Date().toISOString() + const startedClock = performance.now() + const timeoutMs = positiveEnvironment( + environment, + 'BRAID_TANGLE_SANDBOX_MULTI_RUN_TIMEOUT_MS', + DEFAULT_TIMEOUT_MS, + ) + const holdSeconds = Math.max( + 20, + Math.floor( + positiveEnvironment( + environment, + 'BRAID_TANGLE_SANDBOX_MULTI_RUN_HOLD_SECONDS', + DEFAULT_HOLD_SECONDS, + ), + ), + ) + const values = sandboxConfiguration(environment) + assert.equal(values.runner, 'opencode', 'multi-run proof uses the proven OpenCode harness') + assert.ok(values.credentialValue, 'multi-run proof needs a raw Sandbox credential for cleanup') + const proof = proofId() + const markerA = markerFor(proof, 'A') + const markerB = markerFor(proof, 'B') + const outputPath = + argument('output') ?? + join( + targetRepository, + 'artifacts', + 'verification', + 'live', + `tangle-sandbox-braid-multirun-production-${Date.now()}.json`, + ) + const phases = {} + const identifiers = [] + const terminalEvidence = {} + const timings = {} + const controls = new Map() + const runIds = new Set() + let config + let client + let runtime + let restarted + let firstFrame + let secondFrame + let focusAFrame + let focusBFrame + let cancelFrame + let finalFrame + let restartedFrame + let runAId + let runBId + let proofError + const cleanup = { + resources: [], + errors: [], + exact: false, + activeResourceDelta: null, + accountStable: false, + } + let beforeAccount + let afterAccount + + const phase = async (name, operation) => { + const start = performance.now() + try { + const value = await operation() + phases[name] = { status: 'passed', elapsedMs: performance.now() - start } + timings[name] = performance.now() - start + return value + } catch (error) { + phases[name] = { + status: 'failed', + elapsedMs: performance.now() - start, + error: safeMessage(error, environment), + } + timings[name] = performance.now() - start + throw error + } + } + + try { + client = new Sandbox({ baseUrl: values.endpoint, apiKey: values.credentialValue }) + beforeAccount = await phase('account.before', () => accountSnapshot(client, 'before')) + const binary = await phase('binary.resolve', () => resolveBinary(targetRepository, environment)) + config = await phase('workspace.prepare', () => + prepareProductionWorkspace({ + repository: targetRepository, + environment: sanitizedEnvironment(configurationEnvironment(environment)), + kind: values.kind, + endpoint: values.endpoint, + model: values.model, + runner: values.runner, + provider: values.provider, + providerOptions: { lifecycle: 'retained', idleTtlSeconds: 1_800 }, + credentialRef: values.credentialRef, + credentialValue: values.credentialValue, + }), + ) + const recordPath = join(config.root, 'multirun-state.json') + runtime = createTerminal(binary, config, recordPath) + await phase('terminal.start', () => + waitFor('Braid terminal startup', () => /Braid/iu.test(runtime.screen()), timeoutMs), + ) + firstFrame = await runtime.captureState(timeoutMs) + const firstConversation = firstFrame.state.conversationId + const firstBranch = firstFrame.state.branchId + await phase('branch-a.send', async () => { + await typeAndSubmit(runtime, promptFor(markerA, holdSeconds)) + firstFrame = await waitForFrame( + runtime, + 'branch A admission', + (frame) => + frame.view.runs.length >= 1 && + frame.view.runs.some((run) => { + if (run.conversationId !== firstConversation || !isActive(run.status)) return false + try { + exactControlRef(runFromFrame(frame, run.id).stateRun.controlRef, 'branch A control') + return true + } catch { + return false + } + }), + timeoutMs, + ) + }) + const runAView = firstFrame.view.runs.find( + (run) => run.conversationId === firstConversation && isActive(run.status), + ) + assert.ok(runAView, 'branch A did not expose an active run') + runAId = runAView.id + runIds.add(runAId) + const runARecord = runFromFrame(firstFrame, runAId) + const controlA = exactControlRef(runARecord.stateRun.controlRef, 'branch A control') + controls.set(runAId, controlA) + identifiers.push(...identifiersForControl(controlA)) + await phase('branch-a.stream', async () => { + firstFrame = await waitForFrame( + runtime, + 'branch A stream', + (frame) => eventIdsForRun(frame, runAId).length > 0 && isActive(runStatus(frame, runAId)), + timeoutMs, + ) + assertUniqueEventIds(firstFrame, runAId, 'branch A stream') + }) + await phase('conversation-b.create', async () => { + await typeAndSubmit(runtime, `/new ${markerB} conversation`) + secondFrame = await waitForFrame( + runtime, + 'conversation B creation', + (frame) => + frame.view.conversations.length >= 2 && frame.state.conversationId !== firstConversation, + timeoutMs, + ) + }) + const secondConversation = secondFrame.state.conversationId + const secondBranch = secondFrame.state.branchId + assert.notEqual( + secondConversation, + firstConversation, + 'the proof did not create an independent conversation', + ) + assert.notEqual(secondBranch, firstBranch, 'independent conversations reused the branch id') + await phase('branch-b.send', async () => { + await typeAndSubmit(runtime, promptFor(markerB, holdSeconds)) + secondFrame = await waitForFrame( + runtime, + 'branch B admission', + (frame) => + frame.view.runs.some((run) => { + if (run.conversationId !== secondConversation || !isActive(run.status)) return false + try { + exactControlRef(runFromFrame(frame, run.id).stateRun.controlRef, 'branch B control') + return true + } catch { + return false + } + }), + timeoutMs, + ) + }) + const runBView = secondFrame.view.runs.find( + (run) => run.conversationId === secondConversation && isActive(run.status), + ) + assert.ok(runBView, 'branch B did not expose an active run') + runBId = runBView.id + runIds.add(runBId) + assert.notEqual(runAId, runBId, 'independent conversations reused the local run id') + const runBRecord = runFromFrame(secondFrame, runBId) + const controlB = exactControlRef(runBRecord.stateRun.controlRef, 'branch B control') + controls.set(runBId, controlB) + identifiers.push(...identifiersForControl(controlB)) + await phase('concurrent.stream', async () => { + secondFrame = await waitForFrame( + runtime, + 'two concurrent streams', + (frame) => { + try { + return assertFrameHasConcurrentRuns(frame, [runAId, runBId]) + } catch { + return false + } + }, + timeoutMs, + ) + assertUniqueEventIds(secondFrame, runAId, 'concurrent branch A') + assertUniqueEventIds(secondFrame, runBId, 'concurrent branch B') + }) + terminalEvidence.concurrent = runtime.snapshot() + const focusedBefore = secondFrame.view.focusedRunId + assert.equal(focusedBefore, runBId, 'newly admitted branch B was not foreground') + await phase('focus-a', async () => { + runtime.input('\u001bOQ') + await waitFor('activity browser', () => /activity/iu.test(runtime.screen()), timeoutMs) + runtime.input('\t') + await pause(100) + runtime.input('\u001b[B') + runtime.input('\r') + focusAFrame = await waitForFrame( + runtime, + 'focus branch A', + (frame) => frame.view.focusedRunId === runAId, + timeoutMs, + ) + assertFrameHasConcurrentRuns(focusAFrame, [runAId, runBId]) + assert.ok(isActive(runStatus(focusAFrame, runAId))) + assert.ok(isActive(runStatus(focusAFrame, runBId))) + runtime.input('\u001b') + }) + terminalEvidence.focusA = runtime.snapshot() + await phase('focus-b', async () => { + runtime.input('\u001bOQ') + await waitFor('activity browser again', () => /activity/iu.test(runtime.screen()), timeoutMs) + runtime.input('\t') + await pause(100) + runtime.input('\u001b[A') + runtime.input('\r') + focusBFrame = await waitForFrame( + runtime, + 'focus branch B', + (frame) => frame.view.focusedRunId === runBId, + timeoutMs, + ) + assertFrameHasConcurrentRuns(focusBFrame, [runAId, runBId]) + runtime.input('\u001b') + }) + terminalEvidence.focusB = runtime.snapshot() + await phase('cancel-b', async () => { + runtime.input('\u0003') + cancelFrame = await waitForFrame( + runtime, + 'branch B cancellation', + (frame) => + ['aborted', 'cancelled'].includes(runStatus(frame, runBId)) && + isActive(runStatus(frame, runAId)), + timeoutMs, + ) + assert.ok(isActive(runStatus(cancelFrame, runAId)), 'cancelling B stopped branch A') + assertUniqueEventIds(cancelFrame, runAId, 'branch A after branch B cancellation') + assertUniqueEventIds(cancelFrame, runBId, 'branch B cancellation') + }) + terminalEvidence.cancel = runtime.snapshot() + await phase('branch-a.complete', async () => { + finalFrame = await waitForFrame( + runtime, + 'branch A completion', + (frame) => + runStatus(frame, runAId) === 'completed' && + ['aborted', 'cancelled'].includes(runStatus(frame, runBId)), + timeoutMs, + ) + const finalA = runFromFrame(finalFrame, runAId).viewRun + assert.ok((finalA.contentBytes ?? 0) > 0, 'branch A completed without transcript content') + assertUniqueEventIds(finalFrame, runAId, 'branch A completion') + assertUniqueEventIds(finalFrame, runBId, 'branch B terminal state') + }) + await phase('remote.status', async () => { + await remoteStatus(client, controlA, 'completed', timeoutMs) + await remoteStatus(client, controlB, 'cancelled', timeoutMs) + }) + await phase('terminal.first.close', async () => { + const exit = await runtime.close() + assert.equal(exit.exitCode, 0, 'first Braid terminal process exited with a non-zero status') + await runtime.dispose() + }) + terminalEvidence.final = runtime.snapshot() + restarted = createTerminal(binary, config, recordPath) + await phase('terminal.restart', () => + waitFor('restarted Braid terminal', () => /Braid/iu.test(restarted.screen()), timeoutMs), + ) + restartedFrame = await restarted.captureState(timeoutMs) + await phase('replay.restart', async () => { + assert.deepEqual(new Set(frameRunIds(restartedFrame)), new Set([runAId, runBId])) + for (const runId of [runAId, runBId]) { + const ids = assertUniqueEventIds(restartedFrame, runId, 'restart replay') + const prior = new Set(eventIdsForRun(finalFrame, runId)) + assert.deepEqual( + new Set(ids), + prior, + `restart replay changed event identities for ${runId}`, + ) + } + assert.equal( + restartedFrame.state.runs.filter((run) => [runAId, runBId].includes(run.id)).length, + 2, + ) + }) + terminalEvidence.restart = restarted.snapshot() + await phase('terminal.restart.close', async () => { + const exit = await restarted.close() + assert.equal( + exit.exitCode, + 0, + 'restarted Braid terminal process exited with a non-zero status', + ) + await restarted.dispose() + }) + await phase('provider.observe', async () => { + await observeRetainedResource(client, controlA) + await observeRetainedResource(client, controlB) + }) + } catch (error) { + proofError = error + if (runtime !== undefined) { + terminalEvidence.failure = { + ...runtime.snapshot(), + exited: runtime.exited, + outputTail: runtime.output.slice(-20_000), + } + } + if (restarted !== undefined) { + terminalEvidence.restartFailure = { + ...restarted.snapshot(), + exited: restarted.exited, + outputTail: restarted.output.slice(-20_000), + } + } + } + + if (runtime !== undefined && !runtime.exited) { + await runtime + .dispose() + .catch((error) => + cleanup.errors.push({ phase: 'terminal.dispose', error: safeMessage(error, environment) }), + ) + } + if (restarted !== undefined && !restarted.exited) { + await restarted.dispose().catch((error) => + cleanup.errors.push({ + phase: 'terminal.restart.dispose', + error: safeMessage(error, environment), + }), + ) + } + + for (const [runId, controlRef] of controls) { + try { + const result = await cleanupRetainedResourceByControlRef(client, controlRef) + cleanup.resources.push({ runId, environmentId: controlRef.environmentId, ...result }) + } catch (error) { + cleanup.errors.push({ + runId, + environmentId: controlRef.environmentId, + error: safeMessage(error, environment), + }) + } + } + if (client !== undefined) { + const baselineIds = new Set((beforeAccount?.resources ?? []).map((resource) => resource.id)) + const cleanedIds = new Set(cleanup.resources.map((resource) => resource.id)) + try { + const remaining = await listBraidResources(client) + for (const resource of remaining) { + if (baselineIds.has(resource.id) || cleanedIds.has(resource.id)) continue + const box = await client.get(resource.id) + assert.ok(box, `new Braid resource ${resource.id} disappeared before cleanup`) + assert.equal(box.metadata?.owner, 'braid') + assert.equal(box.metadata?.lifecycle, 'retained') + await box.delete() + assert.equal(await client.get(resource.id), null) + cleanup.resources.push({ + runId: null, + environmentId: null, + id: resource.id, + discovered: true, + confirmed: true, + }) + } + } catch (error) { + cleanup.errors.push({ + phase: 'provider.discovery-cleanup', + error: safeMessage(error, environment), + }) + } + } + if (client !== undefined) { + try { + afterAccount = await accountSnapshot(client, 'after') + cleanup.activeResourceDelta = + beforeAccount === undefined || afterAccount === undefined + ? null + : afterAccount.usage.activeSandboxes - beforeAccount.usage.activeSandboxes + cleanup.accountStable = afterAccount.identityDigest === beforeAccount?.identityDigest + } catch (error) { + cleanup.errors.push({ phase: 'account.after', error: safeMessage(error, environment) }) + } + } + if (config !== undefined) { + try { + const workspaceCleanup = await config.cleanup() + cleanup.workspace = workspaceCleanup + } catch (error) { + cleanup.errors.push({ phase: 'workspace.cleanup', error: safeMessage(error, environment) }) + } + } + cleanup.exact = + cleanup.resources.length === controls.size && + cleanup.resources.every((resource) => resource.confirmed === true) && + cleanup.errors.length === 0 && + cleanup.activeResourceDelta === 0 && + cleanup.accountStable === true && + cleanup.workspace?.credentialRemoved === true && + cleanup.workspace?.temporaryRootRemoved === true + const passed = + proofError === undefined && + finalFrame !== undefined && + restartedFrame !== undefined && + controls.size === 2 && + cleanup.exact === true + const completedAt = new Date().toISOString() + const result = { + schemaVersion: 'braid.live-required.multirun.v1', + status: passed ? 'passed' : 'failed', + proofId: proof, + startedAt, + completedAt, + elapsedMs: performance.now() - startedClock, + config: config === undefined ? null : configEvidence(config), + provider: { + endpoint: values.endpoint, + runner: values.runner, + model: values.model, + lifecycle: 'retained', + credentialConfigured: Boolean(values.credentialValue || values.credentialRef), + }, + conversations: { + first: { + conversationId: firstFrame?.state?.conversationId ?? null, + branchId: firstFrame?.state?.branchId ?? null, + }, + second: { + conversationId: secondFrame?.state?.conversationId ?? null, + branchId: secondFrame?.state?.branchId ?? null, + }, + }, + runs: [...runIds].map((runId) => { + const frame = finalFrame ?? secondFrame + const record = frame === undefined ? undefined : runFromFrame(frame, runId) + const viewRun = record?.viewRun + const controlRef = controls.get(runId) + const events = frame === undefined ? [] : eventIdsForRun(frame, runId) + return { + runId, + conversationId: viewRun?.conversationId ?? null, + branchId: viewRun?.branchId ?? null, + turnId: viewRun?.turnId ?? null, + operationId: viewRun?.operationId ?? null, + status: record?.stateRun?.status ?? null, + provider: viewRun?.provider ?? null, + runner: viewRun?.runner ?? null, + model: viewRun?.model ?? null, + environmentId: viewRun?.environmentId ?? null, + materializationDigest: viewRun?.materializationDigest ?? null, + cursor: viewRun?.cursor ?? null, + contentBytes: viewRun?.contentBytes ?? null, + eventCount: events.length, + eventIdsUnique: events.length === new Set(events).size, + identifiers: controlRef === undefined ? [] : identifiersForControl(controlRef), + } + }), + overlap: { + activeRunCount: 2, + streamEventCounts: [runAId, runBId].map((runId) => ({ + runId, + count: eventIdsForRun(secondFrame, runId).length, + })), + workStripCount: secondFrame?.view?.workStrip?.length ?? 0, + independentConversations: + firstFrame?.state?.conversationId !== secondFrame?.state?.conversationId, + }, + focus: { + beforeRunId: secondFrame?.view?.focusedRunId ?? null, + firstSwitchRunId: focusAFrame?.view?.focusedRunId ?? null, + secondSwitchRunId: focusBFrame?.view?.focusedRunId ?? null, + firstSwitchPreservedStatuses: + focusAFrame === undefined + ? false + : [runAId, runBId].every((runId) => isActive(runStatus(focusAFrame, runId))), + secondSwitchPreservedStatuses: + focusBFrame === undefined + ? false + : [runAId, runBId].every((runId) => isActive(runStatus(focusBFrame, runId))), + }, + cancellation: { + targetRunId: runBId ?? null, + targetStatus: + cancelFrame === undefined || runBId === undefined ? null : runStatus(cancelFrame, runBId), + unaffectedRunId: runAId ?? null, + unaffectedStatusAtAck: + cancelFrame === undefined || runAId === undefined ? null : runStatus(cancelFrame, runAId), + unaffectedFinalStatus: + finalFrame === undefined || runAId === undefined ? null : runStatus(finalFrame, runAId), + }, + replay: { + restartedRunCount: + restartedFrame === undefined + ? 0 + : frameRunIds(restartedFrame).filter((runId) => runIds.has(runId)).length, + noDuplicateEventIds: + restartedFrame === undefined + ? false + : [...runIds].every((runId) => { + const events = eventIdsForRun(restartedFrame, runId) + return events.length === new Set(events).size + }), + eventSetsStable: + finalFrame !== undefined && + restartedFrame !== undefined && + [...runIds].every( + (runId) => + new Set(eventIdsForRun(finalFrame, runId)).size === + new Set(eventIdsForRun(restartedFrame, runId)).size, + ), + }, + terminal: { + columns: DEFAULT_COLUMNS, + rows: DEFAULT_ROWS, + phases: terminalEvidence, + }, + identifiers, + timings, + phases, + account: { before: beforeAccount ?? null, after: afterAccount ?? null }, + cleanup, + error: proofError === undefined ? null : safeMessage(proofError, environment), + } + await writeArtifact(outputPath, result, environment) + if (!passed) { + const error = + proofError ?? + new Error('multi-run live proof did not satisfy its cleanup or concurrency checks') + error.artifactPath = outputPath + throw error + } + return { ...result, artifactPath: outputPath } +} + +if (process.argv[1] !== undefined && resolve(process.argv[1]) === scriptPath) { + try { + const result = await runProof() + process.stdout.write( + `${safeJson({ status: result.status, artifactPath: result.artifactPath }, process.env)}\n`, + ) + } catch (error) { + process.stderr.write(`${safeMessage(error, process.env)}\n`) + if (error?.artifactPath) + process.stdout.write( + `${safeJson({ status: 'failed', artifactPath: error.artifactPath }, process.env)}\n`, + ) + process.exitCode = 1 + } +} diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs new file mode 100644 index 00000000..aa867c65 --- /dev/null +++ b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs @@ -0,0 +1,48 @@ +import assert from 'node:assert/strict' +import test from 'node:test' + +import { assertFrameHasConcurrentRuns, frameEventIds } from './tangle-sandbox-braid-multirun.mjs' + +function frame({ statusA = 'streaming', statusB = 'streaming', duplicate = false } = {}) { + const eventA = { id: 'activity-a-1', runId: 'run-a', sourceEventId: 'provider-a-1' } + const eventB = { id: 'activity-b-1', runId: 'run-b', sourceEventId: 'provider-b-1' } + return { + state: { + runs: [ + { id: 'run-a', status: statusA }, + { id: 'run-b', status: statusB }, + ], + }, + view: { + runs: [ + { id: 'run-a', conversationId: 'conversation-a', branchId: 'branch-a' }, + { id: 'run-b', conversationId: 'conversation-b', branchId: 'branch-b' }, + ], + activeRuns: [ + { runId: 'run-a', conversationId: 'conversation-a', branchId: 'branch-a' }, + { runId: 'run-b', conversationId: 'conversation-b', branchId: 'branch-b' }, + ], + activity: duplicate ? [eventA, eventA, eventB] : [eventA, eventB], + messages: [], + }, + } +} + +test('multirun frame guard requires two active streamed runs', () => { + assert.equal(assertFrameHasConcurrentRuns(frame(), ['run-a', 'run-b']), true) + assert.deepEqual(frameEventIds(frame(), 'run-a'), ['provider-a-1']) + assert.deepEqual(frameEventIds(frame(), 'run-b'), ['provider-b-1']) +}) + +test('multirun frame guard rejects a terminal or underpowered run', () => { + assert.throws( + () => assertFrameHasConcurrentRuns(frame({ statusB: 'completed' }), ['run-a', 'run-b']), + /run run-b is not active/u, + ) + assert.throws(() => assertFrameHasConcurrentRuns(frame(), ['run-a']), /exactly two run ids/u) +}) + +test('event extraction preserves duplicates for the live replay assertion', () => { + const duplicated = frame({ duplicate: true }) + assert.deepEqual(frameEventIds(duplicated, 'run-a'), ['provider-a-1', 'provider-a-1']) +}) diff --git a/scripts/run-tests.mjs b/scripts/run-tests.mjs index 5b7a0141..ae0a4e64 100644 --- a/scripts/run-tests.mjs +++ b/scripts/run-tests.mjs @@ -59,6 +59,7 @@ const scopeFiles = { 'run-event-mapper-stream-safety.test.js', 'sanitize.test.js', 'scripts.test.js', + 'storage-journal-routing.test.js', 'terminal-usage-status.test.js', 'usage-projection.test.js', 'w6-ui.test.js', @@ -121,6 +122,7 @@ const scopeFiles = { 'domain-reducer.test.js', 'effect-admission.test.js', 'storage-crash.test.js', + 'storage-journal-routing.test.js', 'storage-snapshots.test.js', 'storage.test.js', ], diff --git a/src/app/storage-journal-support.ts b/src/app/storage-journal-support.ts index 483e7c0a..475cc73a 100644 --- a/src/app/storage-journal-support.ts +++ b/src/app/storage-journal-support.ts @@ -1,6 +1,6 @@ import { createHash } from 'node:crypto' import { canonicalDigest } from '../domain/canonical.js' -import type { BraidEvent, BraidEventEnvelope } from '../domain/events.js' +import { type BraidEvent, type BraidEventEnvelope, eventRunId } from '../domain/events.js' import { type ConversationId, createEventId, @@ -152,6 +152,8 @@ export function runOperationId(event: BraidEvent): OperationId | undefined { export function conversationIdForEvent(state: BraidState, event: BraidEvent): ConversationId { switch (event.kind) { + case 'run.requested': + return event.receipt?.conversationId ?? state.conversationId case 'conversation.created': case 'conversation.imported': case 'conversation.updated': @@ -189,9 +191,12 @@ export function conversationIdForEvent(state: BraidState, event: BraidEvent): Co event.operation.target?.kind === 'conversation' ? event.operation.target.id : state.conversationId - default: - return state.conversationId } + const runId = eventRunId(event) + if (runId !== undefined) { + return state.runs.find((run) => run.id === runId)?.conversationId ?? state.conversationId + } + return state.conversationId } function isPersistedEnvelope(value: unknown): value is PersistedEnvelope { diff --git a/src/bin/interface-state-recorder.ts b/src/bin/interface-state-recorder.ts index 29d6d21c..b2387dfa 100644 --- a/src/bin/interface-state-recorder.ts +++ b/src/bin/interface-state-recorder.ts @@ -1,6 +1,10 @@ import { mkdir } from 'node:fs/promises' import { dirname, resolve } from 'node:path' -import { assertNoSymlinkPath, writePrivateFile } from '../adapters/persistence/safe-file.js' +import { + assertNoSymlinkPath, + replacePrivateFile, + writePrivateFile, +} from '../adapters/persistence/safe-file.js' import type { BraidUiController } from '../views/shared/intents.js' export async function recordInterfaceState( @@ -24,5 +28,7 @@ export async function recordInterfaceState( assertNoSymlinkPath(directory) await mkdir(directory, { recursive: true, mode: 0o700 }) assertNoSymlinkPath(directory) - writePrivateFile(target, payload) + if (capturePhase === 'atomic-signal-frame') { + replacePrivateFile(target, payload, { overwrite: true }) + } else writePrivateFile(target, payload) } diff --git a/test/cli-startup.test.ts b/test/cli-startup.test.ts index fecdd46d..4560010d 100644 --- a/test/cli-startup.test.ts +++ b/test/cli-startup.test.ts @@ -123,12 +123,12 @@ test('startup responsibilities stay split into bounded modules', async () => { assert.match(startupBuild, /['"]koffi['"]/u) }) -test('verification signals capture more than one atomic semantic frame', async () => { +test('repeated verification signals capture frames during streaming', async () => { const root = await mkdtemp(join(tmpdir(), 'braid-signal-frames-')) const recordPath = join(root, 'state.json') let revision = 1 const controller = { - state: () => ({ revision }), + state: () => ({ revision, status: 'streaming' }), view: () => ({ revision }), events: () => [], } as unknown as BraidUiController @@ -147,11 +147,10 @@ test('verification signals capture more than one atomic semantic frame', async ( try { frameSignal('SIGUSR2') await waitForRecordedRevision(`${recordPath}.frame`, 1) - await rm(`${recordPath}.frame`) revision = 2 - frameSignal('SIGUSR2') - await waitForRecordedRevision(`${recordPath}.frame`, 2) + for (let signal = 0; signal < 8; signal += 1) frameSignal('SIGUSR2') await lifecycle.settle() + await waitForRecordedRevision(`${recordPath}.frame`, 2) } finally { lifecycle.dispose() await rm(root, { force: true, recursive: true }) diff --git a/test/scripts.test.ts b/test/scripts.test.ts index 90622019..2b1029af 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -226,6 +226,7 @@ test('every scoped package alias forwards its declared file set', () => { 'run-event-mapper-stream-safety.test.js', 'sanitize.test.js', 'scripts.test.js', + 'storage-journal-routing.test.js', 'terminal-usage-status.test.js', 'usage-projection.test.js', 'w6-ui.test.js', @@ -288,6 +289,7 @@ test('every scoped package alias forwards its declared file set', () => { 'domain-reducer.test.js', 'effect-admission.test.js', 'storage-crash.test.js', + 'storage-journal-routing.test.js', 'storage-snapshots.test.js', 'storage.test.js', ], diff --git a/test/storage-journal-routing.test.ts b/test/storage-journal-routing.test.ts new file mode 100644 index 00000000..195c3d52 --- /dev/null +++ b/test/storage-journal-routing.test.ts @@ -0,0 +1,24 @@ +import assert from 'node:assert/strict' +import test from 'node:test' + +import { STARTER_PROFILE } from '../src/app/composition.js' +import { conversationIdForEvent } from '../src/app/storage-journal-support.js' +import { createConversationId, createRunId } from '../src/domain/ids.js' +import { type BraidState, initialState } from '../src/domain/state.js' + +test('storage routes late run events to the run conversation', () => { + const currentConversationId = createConversationId('conversation-selected') + const runConversationId = createConversationId('conversation-background') + const runId = createRunId('run-background') + const state = { + ...initialState(STARTER_PROFILE, { conversationId: currentConversationId }), + runs: [{ id: runId, conversationId: runConversationId }] as unknown as BraidState['runs'], + } + const event = { + kind: 'run.status.changed' as const, + runId, + status: 'streaming' as const, + } + + assert.equal(conversationIdForEvent(state, event), runConversationId) +}) From 041bb1dba48b0533b8cceb344c29e8affda1f76a Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 06:45:54 -0600 Subject: [PATCH 013/136] fix(ui): make run switching deterministic --- docs/components/activity.md | 5 +++-- src/views/tui/activity-browser.ts | 3 ++- test/activity-document.test.ts | 9 +++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/components/activity.md b/docs/components/activity.md index c639c2a4..e7392ae4 100644 --- a/docs/components/activity.md +++ b/docs/components/activity.md @@ -39,7 +39,9 @@ Rows within a group use canonical event or update order. The browser preserves selection by entity identifier across refreshes. -Filters operate over the projected bounded row set. +The runs filter contains only run ownership rows so keyboard focus switching is deterministic. + +Other filters operate over their matching projected rows. Detached work remains visible because local silence is not completion. @@ -72,4 +74,3 @@ Captures show activity with concurrent work at all required terminal sizes. Activity does not duplicate transcript content or replace the Work Strip. It does not assign a worker to a different run. - diff --git a/src/views/tui/activity-browser.ts b/src/views/tui/activity-browser.ts index c99a4e2e..db567c6f 100644 --- a/src/views/tui/activity-browser.ts +++ b/src/views/tui/activity-browser.ts @@ -276,9 +276,10 @@ function listMeta(item: ActivityDocumentItem, elapsed: number | undefined): stri function included(item: ActivityDocumentItem, scope: ActivityBrowserScope): boolean { if (scope === 'all') return true + if (scope === 'runs') return item.kind === 'run' if (scope === 'analyses') return item.kind === 'analysis' if (scope === 'workers') return item.kind === 'supervisor' || item.kind === 'worker' - return item.kind !== 'analysis' && item.kind !== 'supervisor' && item.kind !== 'worker' + return false } function detailKey(detail: EntityDetailView): string { diff --git a/test/activity-document.test.ts b/test/activity-document.test.ts index 3cecd3d8..c8db9d7f 100644 --- a/test/activity-document.test.ts +++ b/test/activity-document.test.ts @@ -118,6 +118,15 @@ test('live work stays in the focused activity surface instead of docking beside tui.stop() }) +test('the runs scope contains only selectable run ownership rows', () => { + const rows = activityDocument(activityView(), 'runs').rows + + assert.deepEqual( + rows.map((row) => ({ id: row.id, kind: row.kind })), + [{ id: 'run-1', kind: 'run' }], + ) +}) + test('the TUI omits unreported cost and latency fragments without inventing values', () => { assert.deepEqual( omitUnreportedCostAndLatency([ From f9dc860dbcca4be6c71a7c77a23fee5889c0cfc8 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 07:18:42 -0600 Subject: [PATCH 014/136] fix(release): require Tangle multirun proof --- .agent/skill-runs.jsonl | 1 + docs/08-verification.md | 16 +- docs/09-delivery-plan.md | 5 +- package.json | 1 + scripts/live-required.test.mjs | 172 ++++++++++- scripts/live-required/contracts.mjs | 2 + scripts/live-required/multirun-contract.mjs | 287 ++++++++++++++++++ .../tangle-sandbox-braid-multirun.mjs | 72 +++-- .../tangle-sandbox-braid-multirun.test.mjs | 35 ++- scripts/live-required/tangle.mjs | 12 +- scripts/release/collector.mjs | 11 +- scripts/release/live-tangle-proof.mjs | 96 ++++++ scripts/release/release-collector.test.mjs | 47 +++ test/tangle-live07-wiring.test.mjs | 128 +++++++- 14 files changed, 856 insertions(+), 29 deletions(-) create mode 100644 scripts/live-required/multirun-contract.mjs create mode 100644 scripts/release/live-tangle-proof.mjs diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index c05baa50..f1f4c0dc 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -66,3 +66,4 @@ {"skill":"/verify","ts":"2026-08-19T08:55:46Z","project":"braid-exact-interactive-20260816","target":"Braid retained/headless/native PTY verification","operatorPrompt":"","durationMin":null,"verdict":"HOLD: 761/766 full tests pass; 3 external failures remain","dispatchedTo":"upgrade the owning dependencies, then rerun contract and production native routing","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/verify","ts":"2026-08-19T08:59:19Z","project":"braid-exact-interactive-20260816","target":"Braid retained/headless/native PTY verification (final)","operatorPrompt":"","durationMin":null,"verdict":"HOLD: 762/766 full tests pass; 2 pinned dependency failures remain","dispatchedTo":"upgrade the owning dependencies, then rerun contract and production native routing","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/critical-audit","ts":"2026-08-19T11:05:46Z","project":"braid-exact-interactive-20260816","target":"Braid durable interaction and TUI architecture n=70 files","operatorPrompt":"","durationMin":null,"verdict":"REQUEST_CHANGES","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/verify","ts":"2026-08-28T13:02:50Z","project":"braid-10-release-multirun","target":"Braid LIVE-07 Tangle multirun release wiring","operatorPrompt":"","durationMin":null,"verdict":"SHIP_IT","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} diff --git a/docs/08-verification.md b/docs/08-verification.md index 3ac50914..bb9a18a3 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -371,7 +371,7 @@ Model discovery does not make every advertised model a release gate. | LIVE-04 | CLI Bridge restart | Run state becomes honestly unknown or recovers according to retained state; Braid never labels it cancelled or resubmits unsafely | | LIVE-05 | Every advertised interactive bridge runner | Common conformance flow at a pinned minimum runner version; failures remove the interactive capability claim | | LIVE-06 | Tangle inference | Real profile-backed inference route, streaming, usage, cancellation, and immutable receipt | -| LIVE-07 | Tangle sandbox | Ephemeral create, turn, observation, and deletion; retained exact lookup, forced process loss, replay, cancel retry, and confirmed cleanup | +| LIVE-07 | Tangle sandbox | Ephemeral create, turn, observation, and deletion; retained exact lookup, forced process loss, replay, cancel retry, two-conversation concurrent streaming with focus switching, and confirmed cleanup | | LIVE-08 | Tangle interaction | A retained cloud interaction remains answerable after Braid reconnect and continues once from the acknowledged response | | LIVE-09 | Tangle workspace fork | Checkpoint, destination fork, independent destination file change, unchanged source file, and explicit cleanup of both environments | | LIVE-10 | Confidential Tangle path | Requested placement remains unverified until valid attestation is checked; negative nonce and measurement tests fail | @@ -384,6 +384,10 @@ If a required live provider is unavailable, the release is blocked and the manif Run `pnpm test:live:tangle:sandbox:stress` against the public Sandbox endpoint. +The aggregate `pnpm test:live:tangle` command also runs `tangle-sandbox-braid-multirun.mjs` as part of `LIVE-07`. + +The direct `pnpm test:live:tangle:sandbox:multirun` command runs the same proof when an operator needs only the concurrent-session path. + The command runs one canary before it starts the remaining cohort. The default cohort contains three proofs with at most two concurrent proofs. @@ -412,6 +416,16 @@ The cohort also reports observed tokens, costs, active-resource deltas, and expl The command fails when a cloud identity repeats, an account changes, evidence is missing, or one owned resource remains. +The multirun proof creates two independent conversations, streams both retained runs concurrently, and switches focus to each run. + +It cancels only the selected run, closes Braid, replays both runs after restart, and confirms exact cleanup. + +The proof holds each provider turn for 180 seconds and allows 300 seconds per phase by default to absorb public startup variance. + +When a phase fails, its artifact retains the latest semantic terminal frame and the latest frame-capture error. + +The release collector registers the multirun artifact below `live/tangle/evidence.json` and rejects `LIVE-07` when that artifact is absent, failed, incomplete, or not exactly clean. + ### Current core-path observations On 2026-08-09, the packed public setup, RPC dispatch, durable transcript, native continuation, process restart, and post-restart send passed separately against CLI Bridge commit `33695db` for Pi 0.83.0 with `tangle-router/glm-5.2` in 136.492 seconds and Codex CLI 0.147.0 with its default model in 43.462 seconds. diff --git a/docs/09-delivery-plan.md b/docs/09-delivery-plan.md index bf73d629..a51e1460 100644 --- a/docs/09-delivery-plan.md +++ b/docs/09-delivery-plan.md @@ -294,6 +294,7 @@ A repository search and dependency test must prove no Braid-owned runner/model m - Implement shutdown behavior that distinguishes detachable and non-detachable runs. - Run the packed Braid binary against CLI Bridge, Tangle inference, and Tangle sandbox. - Run one Tangle Sandbox canary before a bounded three-proof durability cohort. +- Run the retained two-conversation multirun proof with concurrent streams, focus switching, targeted cancellation, restart replay, and exact cleanup as part of `LIVE-07`. - Record exact cleanup, account identity, latency distributions, tokens, costs, placement, and resource observations for every cloud proof. ### Done when @@ -302,6 +303,8 @@ A repository search and dependency test must prove no Braid-owned runner/model m The event ledger must show zero duplicate displayed part and zero lost committed event across forced disconnect and restart cases. +`LIVE-07` cannot pass without the multirun artifact proving two independent conversations, both streamed runs, both focus switches, targeted cancellation, restart replay, and exact cleanup. + The Tangle Sandbox cohort must leave zero resources owned by its exact operation identities. ## W9: Interactions and automation @@ -406,7 +409,7 @@ All owning repositories for final compatible releases, then `tangle-network/brai - Run `pnpm check` once against the exact main commit. - Build one immutable package with `pnpm release:prepare` and use its installed CLI, RPC, and terminal flows. - Keep live, performance, semantic, soak, and complete-manifest audits available as explicit product audits. -- Do not make provider or sandbox availability an npm publication prerequisite. +- Require a passed `LIVE-07` multirun artifact before release completion; provider or sandbox availability may still block that completion rather than becoming an unavailable claim. - Endorse the exact candidate package and package manifest in an isolated code-free job. - Publish `@tangle-network/braid` with npm provenance. - Download the registry package in clean supported environments and repeat the post-publication smoke. diff --git a/package.json b/package.json index 55c72fa9..c14c6110 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "test:live:required:self": "pnpm run build && node --test scripts/live-required.test.mjs test/tangle-live07-wiring.test.mjs", "test:live:tangle": "node scripts/live-required.mjs live-tangle", "test:live:tangle:sandbox:stress": "pnpm run build && node scripts/live-required/tangle-sandbox-braid-soak.mjs", + "test:live:tangle:sandbox:multirun": "pnpm run build && node scripts/live-required/tangle-sandbox-braid-multirun.mjs", "test:live:tangle:sandbox:interactive": "pnpm run build && node scripts/live-required/tangle-sandbox-braid-interactive.mjs", "test:live:tangle:sandbox:execution": "pnpm run build && node scripts/live-required/tangle-sandbox-braid-execution-soak.mjs", "test:live:supervisor": "node scripts/live-required.mjs live-supervisor", diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index 2868c147..1620ddd7 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -43,6 +43,8 @@ import { } from './live-required/tangle-sandbox-stress.mjs' import { runWorker } from './live-required/tangle-sandbox-worker.mjs' import './live-required/tangle-sandbox-braid-multirun.test.mjs' +import { MULTIRUN_REQUIRED_PHASES } from './live-required/multirun-contract.mjs' +import { readLiveTangleProof } from './release/live-tangle-proof.mjs' const repository = resolve(new URL('../', import.meta.url).pathname) @@ -124,6 +126,172 @@ const TANGLE_SANDBOX_CHECKS = [ 'exact-resource-cleanup', ] +function validMultirunProof() { + const runs = [ + { + runId: 'multirun-a', + conversationId: 'conversation-a', + branchId: 'branch-a', + eventCount: 2, + eventIdsUnique: true, + environmentId: 'environment-a', + identifiers: [ + { kind: 'provider-environment', id: 'environment-a' }, + { kind: 'provider-session', id: 'session-a' }, + { kind: 'provider-execution', id: 'execution-a' }, + { kind: 'provider-run', id: 'multirun-a' }, + ], + status: 'completed', + }, + { + runId: 'multirun-b', + conversationId: 'conversation-b', + branchId: 'branch-b', + eventCount: 2, + eventIdsUnique: true, + environmentId: 'environment-b', + identifiers: [ + { kind: 'provider-environment', id: 'environment-b' }, + { kind: 'provider-session', id: 'session-b' }, + { kind: 'provider-execution', id: 'execution-b' }, + { kind: 'provider-run', id: 'multirun-b' }, + ], + status: 'cancelled', + }, + ] + return { + schemaVersion: 'braid.live-required.multirun.v1', + status: 'passed', + provider: { + endpoint: 'https://sandbox.tangle.tools', + runner: 'opencode', + model: 'tangle-router/glm-5.2', + lifecycle: 'retained', + credentialConfigured: true, + }, + conversations: { + first: { conversationId: 'conversation-a', branchId: 'branch-a' }, + second: { conversationId: 'conversation-b', branchId: 'branch-b' }, + }, + runs, + overlap: { + activeRunCount: 2, + streamEventCounts: runs.map(({ runId, eventCount }) => ({ runId, count: eventCount })), + workStripCount: 2, + independentConversations: true, + }, + focus: { + beforeRunId: 'multirun-b', + firstSwitchRunId: 'multirun-a', + secondSwitchRunId: 'multirun-b', + firstSwitchPreservedStatuses: true, + secondSwitchPreservedStatuses: true, + }, + cancellation: { + targetRunId: 'multirun-b', + targetStatus: 'cancelled', + unaffectedRunId: 'multirun-a', + unaffectedStatusAtAck: 'streaming', + unaffectedFinalStatus: 'completed', + }, + replay: { + restartedRunCount: 2, + noDuplicateEventIds: true, + eventSetsStable: true, + }, + cleanup: { + exact: true, + errors: [], + resources: [ + { + runId: 'multirun-a', + environmentId: 'environment-a', + id: 'resource-a', + confirmed: true, + }, + { + runId: 'multirun-b', + environmentId: 'environment-b', + id: 'resource-b', + confirmed: true, + }, + ], + activeResourceDelta: 0, + accountStable: true, + workspace: { protectedStoreClean: true, temporaryRootRemoved: true }, + }, + error: null, + phases: Object.fromEntries( + MULTIRUN_REQUIRED_PHASES.map((name) => [name, { status: 'passed' }]), + ), + } +} + +function passingTangleProcess() { + const measurements = Array.from({ length: 5 }, (_, index) => ({ + kind: 'scalar', + name: `LIVE-${String(index + 6).padStart(2, '0')}`, + unit: 'verified-flow', + value: 1, + })) + const structuredStdout = Buffer.from( + `BRAID_RELEASE_RESULT_JSON={"status":"passed"}\nBRAID_RELEASE_MEASUREMENTS_JSON=${JSON.stringify({ measurements })}\n`, + ) + return { + exitCode: 0, + signal: null, + timedOut: false, + spawnError: null, + cleanupConfirmed: true, + durationMs: 1, + stdout: { redactionFailClosed: false, bytes: structuredStdout }, + stderr: { redactionFailClosed: false, bytes: Buffer.alloc(0) }, + structuredStdout: { bytes: structuredStdout, error: null }, + } +} + +test('LIVE-07 release artifact validation requires complete multirun evidence and exact cleanup', async () => { + const artifactRoot = await mkdtemp(join(tmpdir(), 'braid-live-tangle-proof-')) + const artifactPath = join(artifactRoot, 'live', 'tangle', 'evidence.json') + try { + await mkdir(join(artifactRoot, 'live', 'tangle'), { recursive: true }) + await writeFile(artifactPath, `${JSON.stringify(validMultirunProof())}\n`) + const passed = await readLiveTangleProof({ + artifactRoot, + checkId: 'live-tangle', + processResult: passingTangleProcess(), + }) + assert.equal(passed.result, 'passed') + + await rm(artifactPath) + const missing = await readLiveTangleProof({ + artifactRoot, + checkId: 'live-tangle', + processResult: passingTangleProcess(), + }) + assert.equal(missing.result, 'uncaptured') + assert.match(missing.reason, /artifact is missing/u) + + for (const proof of [ + { ...validMultirunProof(), status: 'failed' }, + { + ...validMultirunProof(), + cleanup: { ...validMultirunProof().cleanup, exact: false }, + }, + ]) { + await writeFile(artifactPath, `${JSON.stringify(proof)}\n`) + const invalid = await readLiveTangleProof({ + artifactRoot, + checkId: 'live-tangle', + processResult: passingTangleProcess(), + }) + assert.equal(invalid.result, 'uncaptured') + } + } finally { + await rm(artifactRoot, { recursive: true, force: true }) + } +}) + function validTangleSandboxReceiptInput(overrides = {}) { const cloudControl = { provider: 'tangle-sandbox', @@ -164,6 +332,7 @@ function validTangleSandboxReceiptInput(overrides = {}) { phase: 'completed', cloudControl, usage: { inputTokens: 12, outputTokens: 8, costUsd: 0.001 }, + multirun: validMultirunProof(), }, checks: TANGLE_SANDBOX_CHECKS, ...overrides, @@ -489,13 +658,14 @@ test('LIVE-07 wiring carries cloud identity, cleanup proof, and observations int binary: 'unused-injected-binary', invocationId: input.invocationId, stressRunner: async () => cohort, + multirunRunner: async () => validMultirunProof(), }) assert.equal(result.evidence.status, 'passed') assert.deepEqual(result.evidence.facts.cloudControl, input.facts.cloudControl) assert.equal(result.evidence.facts.exactResource, true) assert.equal(result.evidence.facts.activeResourceDelta, 0) - assert.equal(result.evidence.observations.detailed, true) + assert.equal(result.evidence.observations.stress.detailed, true) }) test('passed Tangle Sandbox receipts reject null or forged acceptance facts', () => { diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index 8c3f1702..ce67da76 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -1,6 +1,7 @@ import { randomUUID } from 'node:crypto' import { collectCredentialSecrets, redactText } from '../release/redaction.mjs' +import { assertMultirunProof } from './multirun-contract.mjs' export const EXIT_CODES = Object.freeze({ passed: 0, @@ -447,6 +448,7 @@ function validatePassedTangleSandboxReceipt(receipt) { throw new Error('Passed Tangle Sandbox proof requires numeric activeResourceDelta=0') if (receipt.observations === null || Object.keys(receipt.observations).length === 0) throw new Error('Passed Tangle Sandbox proof requires redacted observations') + assertMultirunProof(receipt.observations.multirun) } function validatePassedTangleSandboxInteractiveReceipt(receipt) { diff --git a/scripts/live-required/multirun-contract.mjs b/scripts/live-required/multirun-contract.mjs new file mode 100644 index 00000000..defa18be --- /dev/null +++ b/scripts/live-required/multirun-contract.mjs @@ -0,0 +1,287 @@ +const REQUIRED_PHASES = Object.freeze([ + 'account.before', + 'binary.resolve', + 'workspace.prepare', + 'terminal.start', + 'branch-a.send', + 'branch-a.stream', + 'conversation-b.create', + 'branch-b.send', + 'concurrent.stream', + 'focus-a', + 'focus-b', + 'cancel-b', + 'branch-a.complete', + 'remote.status', + 'terminal.first.close', + 'terminal.restart', + 'replay.restart', + 'terminal.restart.close', + 'provider.observe', +]) + +export const MULTIRUN_PROOF_SCHEMA = 'braid.live-required.multirun.v1' +export { REQUIRED_PHASES as MULTIRUN_REQUIRED_PHASES } +const PROVIDER_IDENTIFIER_KINDS = Object.freeze([ + 'provider-environment', + 'provider-session', + 'provider-execution', + 'provider-run', +]) + +function assert(condition, message) { + if (!condition) throw new Error(message) +} + +function object(value) { + return value !== null && typeof value === 'object' && !Array.isArray(value) +} + +function text(value) { + return typeof value === 'string' && value.length > 0 +} + +function assertRun(run, index) { + assert(object(run), `multirun proof run ${index} is missing`) + assert(text(run.runId), `multirun proof run ${index} has no run id`) + assert(text(run.conversationId), `multirun proof run ${index} has no conversation id`) + assert(text(run.branchId), `multirun proof run ${index} has no branch id`) + assert( + Number.isInteger(run.eventCount) && run.eventCount > 0, + `multirun proof run ${index} has no streamed events`, + ) + assert(run.eventIdsUnique === true, `multirun proof run ${index} has duplicate event identities`) + assert(text(run.environmentId), `multirun proof run ${index} has no environment id`) + assert( + Array.isArray(run.identifiers) && + run.identifiers.length === PROVIDER_IDENTIFIER_KINDS.length && + run.identifiers.every( + (identifier, identifierIndex) => + object(identifier) && + identifier.kind === PROVIDER_IDENTIFIER_KINDS[identifierIndex] && + text(identifier.id), + ), + `multirun proof run ${index} has incomplete provider identity`, + ) + assert( + run.identifiers[0].id === run.environmentId, + `multirun proof run ${index} has a mismatched environment identity`, + ) + assert( + run.identifiers[3].id === run.runId, + `multirun proof run ${index} has a mismatched run identity`, + ) +} + +/** Validates the complete two-conversation proof used by LIVE-07. */ +export function assertMultirunProof(proof) { + assert(object(proof), 'LIVE-07 multirun evidence is missing') + assert( + proof.schemaVersion === MULTIRUN_PROOF_SCHEMA, + 'LIVE-07 multirun evidence has an unsupported schema', + ) + assert(proof.status === 'passed', 'LIVE-07 multirun evidence did not pass') + assert(object(proof.provider), 'LIVE-07 multirun evidence has no provider receipt') + assert(proof.provider.lifecycle === 'retained', 'LIVE-07 multirun proof is not retained') + assert(proof.provider.runner === 'opencode', 'LIVE-07 multirun proof used an unproven runner') + assert(text(proof.provider.endpoint), 'LIVE-07 multirun proof has no endpoint') + assert(text(proof.provider.model), 'LIVE-07 multirun proof has no model') + assert( + proof.provider.credentialConfigured === true, + 'LIVE-07 multirun proof did not confirm configured credentials', + ) + assert(proof.error === null, 'LIVE-07 multirun proof retained an execution error') + + assert(object(proof.conversations?.first), 'LIVE-07 multirun proof has no first conversation') + assert(object(proof.conversations?.second), 'LIVE-07 multirun proof has no second conversation') + assert( + text(proof.conversations.first.conversationId), + 'LIVE-07 first conversation identity is missing', + ) + assert( + text(proof.conversations.second.conversationId), + 'LIVE-07 second conversation identity is missing', + ) + assert( + proof.conversations.first.conversationId !== proof.conversations.second.conversationId, + 'LIVE-07 multirun proof reused the conversation identity', + ) + assert(text(proof.conversations.first.branchId), 'LIVE-07 first branch identity is missing') + assert(text(proof.conversations.second.branchId), 'LIVE-07 second branch identity is missing') + assert( + proof.conversations.first.branchId !== proof.conversations.second.branchId, + 'LIVE-07 multirun proof reused the branch identity', + ) + + assert( + Array.isArray(proof.runs) && proof.runs.length === 2, + 'LIVE-07 multirun proof requires exactly two runs', + ) + assert( + new Set(proof.runs.map((run) => run?.runId)).size === 2, + 'LIVE-07 multirun proof reused a run identity', + ) + proof.runs.forEach(assertRun) + assert( + new Set(proof.runs.map((run) => run.conversationId)).size === 2, + 'LIVE-07 runs are not on independent conversations', + ) + assert( + new Set(proof.runs.map((run) => run.branchId)).size === 2, + 'LIVE-07 runs are not on independent branches', + ) + const conversations = new Map([ + [proof.conversations.first.conversationId, proof.conversations.first.branchId], + [proof.conversations.second.conversationId, proof.conversations.second.branchId], + ]) + assert( + proof.runs.every((run) => conversations.get(run.conversationId) === run.branchId), + 'LIVE-07 runs do not bind to the recorded conversations and branches', + ) + const providerIdentifiers = proof.runs.flatMap((run) => run.identifiers.map(({ id }) => id)) + assert( + new Set(providerIdentifiers).size === providerIdentifiers.length, + 'LIVE-07 multirun proof reused a provider identity', + ) + + assert(object(proof.overlap), 'LIVE-07 multirun overlap evidence is missing') + assert( + proof.overlap.activeRunCount === 2, + 'LIVE-07 multirun proof did not overlap two active runs', + ) + assert( + proof.overlap.independentConversations === true, + 'LIVE-07 multirun proof did not keep conversations independent', + ) + assert( + Number.isInteger(proof.overlap.workStripCount) && proof.overlap.workStripCount >= 2, + 'LIVE-07 multirun proof did not expose both runs in the work strip', + ) + assert( + Array.isArray(proof.overlap.streamEventCounts) && proof.overlap.streamEventCounts.length === 2, + 'LIVE-07 multirun stream evidence is incomplete', + ) + assert( + proof.overlap.streamEventCounts.every( + (entry) => + object(entry) && text(entry.runId) && Number.isInteger(entry.count) && entry.count > 0, + ), + 'LIVE-07 multirun stream evidence has no events for every run', + ) + const runIds = new Set(proof.runs.map((run) => run.runId)) + assert( + new Set(proof.overlap.streamEventCounts.map((entry) => entry.runId)).size === 2 && + proof.overlap.streamEventCounts.every((entry) => runIds.has(entry.runId)), + 'LIVE-07 multirun stream evidence does not map to both runs', + ) + + assert(object(proof.focus), 'LIVE-07 focus evidence is missing') + const [firstRun, secondRun] = proof.runs + assert(firstRun.status === 'completed', 'LIVE-07 first run did not complete') + assert( + ['aborted', 'cancelled'].includes(secondRun.status), + 'LIVE-07 second run was not cancelled', + ) + assert( + proof.focus.beforeRunId === secondRun.runId, + 'LIVE-07 focus did not foreground the newly admitted run', + ) + assert( + proof.focus.firstSwitchRunId === firstRun.runId, + 'LIVE-07 focus did not switch to the first run', + ) + assert( + proof.focus.secondSwitchRunId === secondRun.runId, + 'LIVE-07 focus did not switch back to the second run', + ) + assert( + proof.focus.firstSwitchPreservedStatuses === true, + 'LIVE-07 focus switch did not preserve both run statuses', + ) + assert( + proof.focus.secondSwitchPreservedStatuses === true, + 'LIVE-07 focus return did not preserve both run statuses', + ) + + assert(object(proof.cancellation), 'LIVE-07 cancellation evidence is missing') + assert(proof.cancellation.targetRunId === secondRun.runId, 'LIVE-07 cancelled the wrong run') + assert( + ['aborted', 'cancelled'].includes(proof.cancellation.targetStatus), + 'LIVE-07 cancellation did not reach a terminal status', + ) + assert( + proof.cancellation.unaffectedRunId === firstRun.runId, + 'LIVE-07 cancellation has no unaffected run', + ) + assert( + proof.cancellation.unaffectedStatusAtAck !== null, + 'LIVE-07 cancellation omitted the unaffected status', + ) + assert( + proof.cancellation.unaffectedFinalStatus === 'completed', + 'LIVE-07 cancellation stopped the unaffected run', + ) + + assert(object(proof.replay), 'LIVE-07 restart replay evidence is missing') + assert(proof.replay.restartedRunCount === 2, 'LIVE-07 restart did not restore both runs') + assert( + proof.replay.noDuplicateEventIds === true, + 'LIVE-07 restart replay duplicated provider events', + ) + assert( + proof.replay.eventSetsStable === true, + 'LIVE-07 restart replay changed provider event identities', + ) + + assert(object(proof.cleanup), 'LIVE-07 multirun cleanup evidence is missing') + assert(proof.cleanup.exact === true, 'LIVE-07 multirun cleanup was not exact') + assert( + Array.isArray(proof.cleanup.errors) && proof.cleanup.errors.length === 0, + 'LIVE-07 multirun cleanup has unresolved errors', + ) + assert( + Array.isArray(proof.cleanup.resources) && proof.cleanup.resources.length === 2, + 'LIVE-07 multirun cleanup did not account for both resources', + ) + assert( + proof.cleanup.resources.every( + (resource) => + object(resource) && + text(resource.runId) && + text(resource.environmentId) && + text(resource.id) && + resource.confirmed === true, + ), + 'LIVE-07 multirun cleanup did not confirm every resource', + ) + const runsById = new Map(proof.runs.map((run) => [run.runId, run])) + assert( + proof.cleanup.resources.every( + (resource) => resource.environmentId === runsById.get(resource.runId)?.environmentId, + ), + 'LIVE-07 multirun cleanup did not bind provider environments to runs', + ) + assert( + new Set(proof.cleanup.resources.map((resource) => resource.runId)).size === 2 && + proof.cleanup.resources.every((resource) => runIds.has(resource.runId)), + 'LIVE-07 multirun cleanup did not bind both run identities', + ) + assert( + proof.cleanup.activeResourceDelta === 0, + 'LIVE-07 multirun cleanup changed active resource count', + ) + assert(proof.cleanup.accountStable === true, 'LIVE-07 multirun cleanup changed account identity') + assert( + proof.cleanup.workspace?.protectedStoreClean === true, + 'LIVE-07 multirun cleanup retained protected workspace state', + ) + assert( + proof.cleanup.workspace?.temporaryRootRemoved === true, + 'LIVE-07 multirun cleanup retained its temporary workspace', + ) + + assert(object(proof.phases), 'LIVE-07 multirun phase evidence is missing') + for (const phase of REQUIRED_PHASES) + assert(proof.phases[phase]?.status === 'passed', `LIVE-07 multirun phase ${phase} did not pass`) + return proof +} diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index c8cfa286..39d23582 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -18,11 +18,12 @@ import { cleanupRetainedResourceByControlRef, observeRetainedResource, } from './tangle-sandbox-braid-stress.mjs' +import { MULTIRUN_PROOF_SCHEMA } from './multirun-contract.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') -const DEFAULT_TIMEOUT_MS = 240_000 -const DEFAULT_HOLD_SECONDS = 60 +const DEFAULT_TIMEOUT_MS = 300_000 +const DEFAULT_HOLD_SECONDS = 180 const DEFAULT_COLUMNS = 120 const DEFAULT_ROWS = 40 const TERMINAL_STATUSES = new Set([ @@ -159,6 +160,8 @@ function createTerminal( let exitResult let pendingWrites = 0 let lastOutputAt = performance.now() + let lastFrame + let lastFrameError let processCleanup const exitPromise = new Promise((resolveExit) => { child.onExit((result) => { @@ -201,9 +204,15 @@ function createTerminal( try { const framePath = `${recordPath}.frame` const metadata = await stat(framePath) - if (previousMtime === undefined || metadata.mtimeNs !== previousMtime) - return JSON.parse(await readFile(framePath, 'utf8')) - } catch {} + if (previousMtime === undefined || metadata.mtimeNs !== previousMtime) { + const frame = JSON.parse(await readFile(framePath, 'utf8')) + lastFrame = frame + lastFrameError = undefined + return frame + } + } catch (error) { + lastFrameError = safeMessage(error, config.environment) + } if (performance.now() >= deadline) throw new Error('semantic terminal frame was not recorded') await pause(25) } @@ -255,6 +264,12 @@ function createTerminal( get output() { return output }, + get lastFrame() { + return lastFrame + }, + get lastFrameError() { + return lastFrameError + }, screen: () => screenFrom(terminal), snapshot: () => ({ screen: screenFrom(terminal), outputBytes: Buffer.byteLength(output) }), captureState, @@ -263,6 +278,17 @@ function createTerminal( } } +/** Preserve the last terminal evidence when a live phase fails. */ +export function terminalFailureEvidence(runtime) { + return { + ...runtime.snapshot(), + exited: runtime.exited, + outputTail: runtime.output.slice(-20_000), + latestFrame: runtime.lastFrame ?? null, + latestFrameError: runtime.lastFrameError ?? null, + } +} + async function waitFor(label, predicate, timeoutMs) { const deadline = performance.now() + timeoutMs let lastError @@ -437,6 +463,7 @@ export function assertFrameHasConcurrentRuns(frame, runIds) { export async function runProof({ targetRepository = process.env.BRAID_LIVE_REPOSITORY ?? repository, environment = process.env, + outputPath: suppliedOutputPath, } = {}) { const startedAt = new Date().toISOString() const startedClock = performance.now() @@ -462,7 +489,10 @@ export async function runProof({ const markerA = markerFor(proof, 'A') const markerB = markerFor(proof, 'B') const outputPath = + suppliedOutputPath ?? argument('output') ?? + environment.BRAID_TANGLE_SANDBOX_MULTI_RUN_EVIDENCE ?? + environment.BRAID_LIVE_TANGLE_EVIDENCE ?? join( targetRepository, 'artifacts', @@ -760,20 +790,9 @@ export async function runProof({ }) } catch (error) { proofError = error - if (runtime !== undefined) { - terminalEvidence.failure = { - ...runtime.snapshot(), - exited: runtime.exited, - outputTail: runtime.output.slice(-20_000), - } - } - if (restarted !== undefined) { - terminalEvidence.restartFailure = { - ...restarted.snapshot(), - exited: restarted.exited, - outputTail: restarted.output.slice(-20_000), - } - } + if (runtime !== undefined) terminalEvidence.failure = terminalFailureEvidence(runtime) + if (restarted !== undefined) + terminalEvidence.restartFailure = terminalFailureEvidence(restarted) } if (runtime !== undefined && !runtime.exited) { @@ -860,6 +879,17 @@ export async function runProof({ cleanup.accountStable === true && cleanup.workspace?.credentialRemoved === true && cleanup.workspace?.temporaryRootRemoved === true + const publicCleanup = { + ...cleanup, + ...(cleanup.workspace === undefined + ? {} + : { + workspace: { + protectedStoreClean: cleanup.workspace.credentialRemoved === true, + temporaryRootRemoved: cleanup.workspace.temporaryRootRemoved === true, + }, + }), + } const passed = proofError === undefined && finalFrame !== undefined && @@ -868,7 +898,7 @@ export async function runProof({ cleanup.exact === true const completedAt = new Date().toISOString() const result = { - schemaVersion: 'braid.live-required.multirun.v1', + schemaVersion: MULTIRUN_PROOF_SCHEMA, status: passed ? 'passed' : 'failed', proofId: proof, startedAt, @@ -980,7 +1010,7 @@ export async function runProof({ timings, phases, account: { before: beforeAccount ?? null, after: afterAccount ?? null }, - cleanup, + cleanup: publicCleanup, error: proofError === undefined ? null : safeMessage(proofError, environment), } await writeArtifact(outputPath, result, environment) diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs index aa867c65..8a78cbab 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs @@ -1,7 +1,12 @@ import assert from 'node:assert/strict' import test from 'node:test' -import { assertFrameHasConcurrentRuns, frameEventIds } from './tangle-sandbox-braid-multirun.mjs' +import { + assertFrameHasConcurrentRuns, + frameEventIds, + terminalFailureEvidence, +} from './tangle-sandbox-braid-multirun.mjs' +import { assertMultirunProof } from './multirun-contract.mjs' function frame({ statusA = 'streaming', statusB = 'streaming', duplicate = false } = {}) { const eventA = { id: 'activity-a-1', runId: 'run-a', sourceEventId: 'provider-a-1' } @@ -46,3 +51,31 @@ test('event extraction preserves duplicates for the live replay assertion', () = const duplicated = frame({ duplicate: true }) assert.deepEqual(frameEventIds(duplicated, 'run-a'), ['provider-a-1', 'provider-a-1']) }) + +test('multirun failure evidence retains the latest semantic frame and capture error', () => { + const latestFrame = { state: { focusedRunId: 'run-b' }, view: { runs: [] } } + const evidence = terminalFailureEvidence({ + snapshot: () => ({ screen: 'screen', outputBytes: 10 }), + exited: false, + output: 'terminal output', + lastFrame: latestFrame, + lastFrameError: 'frame file was incomplete', + }) + assert.deepEqual(evidence.latestFrame, latestFrame) + assert.equal(evidence.latestFrameError, 'frame file was incomplete') + assert.equal(evidence.exited, false) + assert.equal(evidence.outputTail, 'terminal output') +}) + +test('multirun release contract rejects missing, failed, or unclean evidence', () => { + assert.throws(() => assertMultirunProof(undefined), /evidence is missing/u) + assert.throws( + () => assertMultirunProof({ status: 'failed' }), + /evidence has an unsupported schema/u, + ) + assert.throws( + () => + assertMultirunProof({ schemaVersion: 'braid.live-required.multirun.v1', status: 'failed' }), + /evidence did not pass/u, + ) +}) diff --git a/scripts/live-required/tangle.mjs b/scripts/live-required/tangle.mjs index 11c1ceb6..399e590f 100644 --- a/scripts/live-required/tangle.mjs +++ b/scripts/live-required/tangle.mjs @@ -16,6 +16,8 @@ import { } from './headless.mjs' import { runBraidSandboxSoak } from './tangle-sandbox-braid-soak.mjs' import { runInteractiveProof } from './tangle-sandbox-braid-interactive.mjs' +import { assertMultirunProof } from './multirun-contract.mjs' +import { runProof as runMultirunProof } from './tangle-sandbox-braid-multirun.mjs' const TANGLE_ROWS = Object.freeze(['LIVE-06', 'LIVE-07', 'LIVE-08', 'LIVE-09', 'LIVE-10']) const MINIMUM_SANDBOX_STRESS_RUNS = 3 @@ -88,6 +90,7 @@ export async function runSandbox({ binary, invocationId, stressRunner = runBraidSandboxSoak, + multirunRunner = runMultirunProof, }) { const startedAt = new Date().toISOString() const cohort = await stressRunner({ repository, environment, binary }) @@ -117,6 +120,11 @@ export async function runSandbox({ if (proof?.status !== 'passed') { throw new Error('LIVE-07 Braid Tangle Sandbox stress has no passing canary proof') } + const multirun = await multirunRunner({ + targetRepository: repository, + environment, + }) + assertMultirunProof(multirun) const firstRun = proof.runs?.first const runIds = [ ...new Set([ @@ -153,7 +161,7 @@ export async function runSandbox({ environmentId: localEnvironmentId, materializationDigest: firstRun?.materializationDigest ?? null, facts, - observations: cohort, + observations: { stress: cohort, multirun }, environment, checks: [ 'marker', @@ -166,7 +174,7 @@ export async function runSandbox({ 'exact-resource-cleanup', ], }), - observations: cohort, + observations: { stress: cohort, multirun }, } } diff --git a/scripts/release/collector.mjs b/scripts/release/collector.mjs index 927eefef..9899e29e 100644 --- a/scripts/release/collector.mjs +++ b/scripts/release/collector.mjs @@ -37,6 +37,7 @@ import { sanitizeEnvironment, } from './command-runner.mjs' import { readLiveBridgeProof } from './live-bridge-proof.mjs' +import { readLiveTangleProof } from './live-tangle-proof.mjs' function assert(condition, message) { if (!condition) throw new Error(message) @@ -335,11 +336,19 @@ export async function collectReleaseEvidence({ environments.set(environmentValue.id, environmentValue) const attempt = (previousAttempts.get(checkId) ?? 0) + 1 previousAttempts.set(checkId, attempt) - const structuredEvidenceOverride = await readLiveBridgeProof({ + const bridgeEvidence = await readLiveBridgeProof({ artifactRoot: evidenceRoot, checkId, processResult: result, }) + const structuredEvidenceOverride = + bridgeEvidence ?? + (await readLiveTangleProof({ + artifactRoot: evidenceRoot, + checkId, + processResult: result, + redactionSecrets: collectCredentialSecrets(commandEnvironment, redactionSecrets), + })) const record = buildCheckRecord({ checkId, category: result.category, diff --git a/scripts/release/live-tangle-proof.mjs b/scripts/release/live-tangle-proof.mjs new file mode 100644 index 00000000..fe93001c --- /dev/null +++ b/scripts/release/live-tangle-proof.mjs @@ -0,0 +1,96 @@ +import { join } from 'node:path' + +import { assertMultirunProof } from '../live-required/multirun-contract.mjs' +import { structuredChildEvidence } from './collection-contract.mjs' +import { readRegularFileNoFollow } from '../release-files.mjs' + +const TANGLE_CHECK_IDS = new Set([ + 'live-tangle', + 'LIVE-06', + 'LIVE-07', + 'LIVE-08', + 'LIVE-09', + 'LIVE-10', +]) + +function object(value) { + return value !== null && typeof value === 'object' && !Array.isArray(value) +} + +function unavailable(checkId, reason) { + return { + result: 'uncaptured', + measurements: [{ kind: 'uncaptured', name: checkId, reason }], + reason, + } +} + +function resultMarkerStatus(stdoutBytes) { + const markers = String(Buffer.from(stdoutBytes ?? Buffer.alloc(0))) + .split('\n') + .filter((line) => line.startsWith('BRAID_RELEASE_RESULT_JSON=')) + if (markers.length !== 1) return undefined + try { + const marker = JSON.parse(markers[0].slice('BRAID_RELEASE_RESULT_JSON='.length)) + return object(marker) && typeof marker.status === 'string' ? marker.status : undefined + } catch { + return undefined + } +} + +async function readProof(artifactRoot) { + const bytes = await readRegularFileNoFollow(join(artifactRoot, 'live', 'tangle', 'evidence.json')) + const proof = JSON.parse(bytes.toString('utf8')) + assertMultirunProof(proof) + return proof +} + +/** Validates the mandatory LIVE-07 multirun artifact after the command passes. */ +export async function readLiveTangleProof({ + artifactRoot, + checkId, + processResult, + redactionSecrets = [], +} = {}) { + if (!TANGLE_CHECK_IDS.has(checkId)) return undefined + if ( + processResult?.exitCode !== 0 || + processResult.signal !== null || + processResult.timedOut !== false || + processResult.spawnError !== null || + processResult.cleanupConfirmed !== true || + processResult.stdout?.redactionFailClosed !== false || + processResult.stderr?.redactionFailClosed !== false + ) + return undefined + if ( + resultMarkerStatus(processResult.structuredStdout?.bytes ?? processResult.stdout?.bytes) !== + 'passed' + ) + return unavailable(checkId, 'The Tangle live command did not emit a passed release result') + let childEvidence + try { + childEvidence = structuredChildEvidence( + 'live', + processResult.structuredStdout?.bytes ?? processResult.stdout?.bytes, + processResult.durationMs, + checkId, + processResult.structuredStdout?.error, + redactionSecrets, + ) + } catch (error) { + return unavailable(checkId, error instanceof Error ? error.message : String(error)) + } + if (childEvidence.result !== 'passed') return childEvidence + try { + await readProof(artifactRoot) + } catch (error) { + return unavailable( + checkId, + `The mandatory Tangle Sandbox multirun artifact is missing or invalid: ${error instanceof Error ? error.message : String(error)}`, + ) + } + return childEvidence +} + +export { TANGLE_CHECK_IDS } diff --git a/scripts/release/release-collector.test.mjs b/scripts/release/release-collector.test.mjs index cda0996e..88db86fa 100644 --- a/scripts/release/release-collector.test.mjs +++ b/scripts/release/release-collector.test.mjs @@ -823,6 +823,53 @@ test('one local catalog check produces redacted artifacts and an immutable colle }) }) +test('Tangle release collection rejects a passing command without the multirun artifact', async () => { + await withRepo(async ({ root, artifactRoot, tarballPath, proof }) => { + const measurements = Array.from({ length: 5 }, (_, index) => ({ + kind: 'scalar', + name: `LIVE-${String(index + 6).padStart(2, '0')}`, + unit: 'verified-flow', + value: 1, + })) + const output = + 'BRAID_RELEASE_RESULT_JSON={"status":"passed"}\n' + + `BRAID_RELEASE_MEASUREMENTS_JSON=${JSON.stringify({ measurements })}\n` + const result = await collectReleaseEvidence({ + repository: root, + artifactRoot, + tarballPath, + packageProof: proof, + requirementBindings: { 'PR-01': { checks: ['live-tangle'] } }, + checkIds: ['live-tangle'], + environment: { PATH: process.env.PATH ?? '', NODE_ENV: 'test' }, + runCheck: async ({ checkId, cwd, environment }) => { + const evidenceRoot = join(artifactRoot, 'live', 'tangle') + await mkdir(evidenceRoot, { recursive: true }) + await writeFile(join(evidenceRoot, 'stale.json'), '{}\n') + const processResult = await executeArgv({ + file: process.execPath, + args: ['-e', `process.stdout.write(${JSON.stringify(output)})`], + cwd, + environment, + }) + return { + checkId, + category: 'live', + command: 'pnpm test:live:tangle', + argv: ['pnpm', 'test:live:tangle'], + ...processResult, + } + }, + }) + assert.notEqual(result.result, 'passed') + assert.equal(result.envelope.checks[0].result, 'uncaptured') + assert.match( + result.envelope.checks[0].failureDetails.reason, + /multirun artifact is missing or invalid/u, + ) + }) +}) + test('a selected check reports only requirements covered by that check', async () => { await withRepo( async ({ root, artifactRoot, tarballPath, proof }) => { diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 75fc716c..d0b817a4 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -2,6 +2,7 @@ import assert from 'node:assert/strict' import { resolve } from 'node:path' import test from 'node:test' import { PROOF_OPERATIONS, proofReceipt } from '../scripts/live-required/contracts.mjs' +import { MULTIRUN_REQUIRED_PHASES } from '../scripts/live-required/multirun-contract.mjs' import { runSandbox, runTangleFlows } from '../scripts/live-required/tangle.mjs' import { cleanupRetainedResourceByRunId } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' @@ -68,6 +69,103 @@ function passedStressCohort() { } } +function passedMultirunProof() { + const runs = [ + { + runId: 'multirun-a', + conversationId: 'conversation-a', + branchId: 'branch-a', + eventCount: 2, + eventIdsUnique: true, + environmentId: 'environment-a', + identifiers: [ + { kind: 'provider-environment', id: 'environment-a' }, + { kind: 'provider-session', id: 'session-a' }, + { kind: 'provider-execution', id: 'execution-a' }, + { kind: 'provider-run', id: 'multirun-a' }, + ], + status: 'completed', + }, + { + runId: 'multirun-b', + conversationId: 'conversation-b', + branchId: 'branch-b', + eventCount: 2, + eventIdsUnique: true, + environmentId: 'environment-b', + identifiers: [ + { kind: 'provider-environment', id: 'environment-b' }, + { kind: 'provider-session', id: 'session-b' }, + { kind: 'provider-execution', id: 'execution-b' }, + { kind: 'provider-run', id: 'multirun-b' }, + ], + status: 'cancelled', + }, + ] + return { + schemaVersion: 'braid.live-required.multirun.v1', + status: 'passed', + provider: { + endpoint: 'https://sandbox.tangle.tools', + runner: 'opencode', + model: 'tangle-router/glm-5.2', + lifecycle: 'retained', + credentialConfigured: true, + }, + conversations: { + first: { conversationId: 'conversation-a', branchId: 'branch-a' }, + second: { conversationId: 'conversation-b', branchId: 'branch-b' }, + }, + runs, + overlap: { + activeRunCount: 2, + streamEventCounts: runs.map(({ runId, eventCount }) => ({ runId, count: eventCount })), + workStripCount: 2, + independentConversations: true, + }, + focus: { + beforeRunId: 'multirun-b', + firstSwitchRunId: 'multirun-a', + secondSwitchRunId: 'multirun-b', + firstSwitchPreservedStatuses: true, + secondSwitchPreservedStatuses: true, + }, + cancellation: { + targetRunId: 'multirun-b', + targetStatus: 'cancelled', + unaffectedRunId: 'multirun-a', + unaffectedStatusAtAck: 'streaming', + unaffectedFinalStatus: 'completed', + }, + replay: { restartedRunCount: 2, noDuplicateEventIds: true, eventSetsStable: true }, + cleanup: { + exact: true, + errors: [], + resources: [ + { + runId: 'multirun-a', + environmentId: 'environment-a', + id: 'resource-a', + confirmed: true, + }, + { + runId: 'multirun-b', + environmentId: 'environment-b', + id: 'resource-b', + confirmed: true, + }, + ], + activeResourceDelta: 0, + accountStable: true, + workspace: { protectedStoreClean: true, temporaryRootRemoved: true }, + }, + error: null, + phases: Object.fromEntries( + MULTIRUN_REQUIRED_PHASES.map((name) => [name, { status: 'passed' }]), + ), + } +} + function passedInteractiveProof( invocationId, { @@ -148,6 +246,7 @@ test('built-in LIVE-07 and LIVE-08 wiring emits evidence and deduped dispatch', binary: 'unused-injected-binary', invocationId: 'live-required-test-invocation', stressRunner, + multirunRunner: async () => passedMultirunProof(), }) assert.equal(sandbox.status, 'passed') @@ -163,7 +262,8 @@ test('built-in LIVE-07 and LIVE-08 wiring emits evidence and deduped dispatch', measurement: { kind: 'scalar', name: 'LIVE-06', unit: 'verified-flow', value: 1 }, evidence: null, }), - sandboxRunner: (input) => runSandbox({ ...input, stressRunner }), + sandboxRunner: (input) => + runSandbox({ ...input, stressRunner, multirunRunner: async () => passedMultirunProof() }), interactiveRunner: async (input) => { dispatches.push(input) return passedInteractiveProof(input.invocationId) @@ -207,6 +307,32 @@ test('LIVE-07 rejects a passing canary presented as a stress cohort', async () = ) }) +test('LIVE-07 requires passed, complete, and exact multirun evidence', async () => { + const cases = [ + ['missing', undefined, /multirun evidence is missing/u], + ['failed', { ...passedMultirunProof(), status: 'failed' }, /multirun evidence did not pass/u], + [ + 'unclean', + { ...passedMultirunProof(), cleanup: { ...passedMultirunProof().cleanup, exact: false } }, + /multirun cleanup was not exact/u, + ], + ] + for (const [label, multirun, expected] of cases) { + await assert.rejects( + runSandbox({ + repository, + environment: {}, + binary: 'unused-injected-binary', + invocationId: `live-required-test-${label}`, + stressRunner: async () => passedStressCohort(), + multirunRunner: async () => multirun, + }), + expected, + label, + ) + } +}) + test('LIVE-08 rejects a non-Pi runner from the native interactive proof', () => { assert.throws( () => passedInteractiveProof('live-required-non-pi-runner', { runner: 'codex' }), From 6ec4333612d42573ba8666c6e936530c5922b6bb Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 08:03:10 -0600 Subject: [PATCH 015/136] fix(multirun): prove real work strip ownership --- docs/08-verification.md | 4 +++ scripts/live-required.test.mjs | 1 + scripts/live-required/multirun-contract.mjs | 6 ++++ .../tangle-sandbox-braid-multirun.mjs | 30 ++++++++++++----- .../tangle-sandbox-braid-multirun.test.mjs | 33 ++++++++++++++++--- test/tangle-live07-wiring.test.mjs | 1 + 6 files changed, 61 insertions(+), 14 deletions(-) diff --git a/docs/08-verification.md b/docs/08-verification.md index bb9a18a3..205e9e12 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -424,6 +424,10 @@ The proof holds each provider turn for 180 seconds and allows 300 seconds per ph When a phase fails, its artifact retains the latest semantic terminal frame and the latest frame-capture error. +The multi-run proof reads active ownership from `BraidState.activeRuns` and Work Strip items from the real `BraidViewModel`. + +It also requires two actionable Work Strip rows in the packed terminal frame. + The release collector registers the multirun artifact below `live/tangle/evidence.json` and rejects `LIVE-07` when that artifact is absent, failed, incomplete, or not exactly clean. ### Current core-path observations diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index 1620ddd7..13ec6327 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -178,6 +178,7 @@ function validMultirunProof() { activeRunCount: 2, streamEventCounts: runs.map(({ runId, eventCount }) => ({ runId, count: eventCount })), workStripCount: 2, + renderedWorkStripCount: 2, independentConversations: true, }, focus: { diff --git a/scripts/live-required/multirun-contract.mjs b/scripts/live-required/multirun-contract.mjs index defa18be..77da8a61 100644 --- a/scripts/live-required/multirun-contract.mjs +++ b/scripts/live-required/multirun-contract.mjs @@ -22,6 +22,7 @@ const REQUIRED_PHASES = Object.freeze([ export const MULTIRUN_PROOF_SCHEMA = 'braid.live-required.multirun.v1' export { REQUIRED_PHASES as MULTIRUN_REQUIRED_PHASES } + const PROVIDER_IDENTIFIER_KINDS = Object.freeze([ 'provider-environment', 'provider-session', @@ -157,6 +158,11 @@ export function assertMultirunProof(proof) { Number.isInteger(proof.overlap.workStripCount) && proof.overlap.workStripCount >= 2, 'LIVE-07 multirun proof did not expose both runs in the work strip', ) + assert( + Number.isInteger(proof.overlap.renderedWorkStripCount) && + proof.overlap.renderedWorkStripCount >= 2, + 'LIVE-07 multirun proof did not render both work-strip rows', + ) assert( Array.isArray(proof.overlap.streamEventCounts) && proof.overlap.streamEventCounts.length === 2, 'LIVE-07 multirun stream evidence is incomplete', diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 39d23582..8ba5f1d7 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -14,11 +14,11 @@ import { pause } from '../live-demo/terminal.mjs' import { connectionConfiguration } from './configuration.mjs' import { safeJson, safeMessage } from './contracts.mjs' import { configEvidence, prepareProductionWorkspace, resolveBinary } from './headless.mjs' +import { MULTIRUN_PROOF_SCHEMA } from './multirun-contract.mjs' import { cleanupRetainedResourceByControlRef, observeRetainedResource, } from './tangle-sandbox-braid-stress.mjs' -import { MULTIRUN_PROOF_SCHEMA } from './multirun-contract.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') @@ -445,6 +445,13 @@ export function frameEventIds(frame, runId) { return eventIdsForRun(frame, runId) } +export function renderedWorkStripCount(screen) { + return screen + .split('\n') + .filter((line) => /^[·›] .+ · [^/\s]+\/[^\s]+ · \d+ interactions?/u.test(line.trimStart())) + .length +} + export function assertFrameHasConcurrentRuns(frame, runIds) { assert.equal(runIds.length, 2, 'concurrent proof requires exactly two run ids') for (const runId of runIds) { @@ -452,11 +459,10 @@ export function assertFrameHasConcurrentRuns(frame, runIds) { assert.ok(isActive(runStatus(frame, runId)), `run ${runId} is not active`) assert.ok(eventIdsForRun(frame, runId).length > 0, `run ${runId} has no streamed events`) } - assert.equal( - frame.view?.activeRuns?.filter((entry) => runIds.includes(entry.runId)).length, - 2, - 'frame did not expose two active run ownership records', - ) + const activeOwnership = frame.state?.activeRuns?.filter((entry) => runIds.includes(entry.runId)) + assert.equal(activeOwnership?.length, 2, 'frame did not expose two active run ownership records') + const workStrip = frame.view?.workStrip?.filter((entry) => runIds.includes(entry.runId)) + assert.equal(workStrip?.length, 2, 'frame did not project both runs into the work strip') return true } @@ -665,7 +671,10 @@ export async function runProof({ 'two concurrent streams', (frame) => { try { - return assertFrameHasConcurrentRuns(frame, [runAId, runBId]) + return ( + assertFrameHasConcurrentRuns(frame, [runAId, runBId]) && + renderedWorkStripCount(runtime.screen()) >= 2 + ) } catch { return false } @@ -948,12 +957,15 @@ export async function runProof({ } }), overlap: { - activeRunCount: 2, + activeRunCount: + secondFrame?.state?.activeRuns?.filter((entry) => runIds.has(entry.runId)).length ?? 0, streamEventCounts: [runAId, runBId].map((runId) => ({ runId, count: eventIdsForRun(secondFrame, runId).length, })), - workStripCount: secondFrame?.view?.workStrip?.length ?? 0, + workStripCount: + secondFrame?.view?.workStrip?.filter((entry) => runIds.has(entry.runId)).length ?? 0, + renderedWorkStripCount: renderedWorkStripCount(terminalEvidence.concurrent?.screen ?? ''), independentConversations: firstFrame?.state?.conversationId !== secondFrame?.state?.conversationId, }, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs index 8a78cbab..1a69cb0d 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs @@ -1,12 +1,12 @@ import assert from 'node:assert/strict' import test from 'node:test' - +import { assertMultirunProof } from './multirun-contract.mjs' import { assertFrameHasConcurrentRuns, frameEventIds, + renderedWorkStripCount, terminalFailureEvidence, } from './tangle-sandbox-braid-multirun.mjs' -import { assertMultirunProof } from './multirun-contract.mjs' function frame({ statusA = 'streaming', statusB = 'streaming', duplicate = false } = {}) { const eventA = { id: 'activity-a-1', runId: 'run-a', sourceEventId: 'provider-a-1' } @@ -17,15 +17,19 @@ function frame({ statusA = 'streaming', statusB = 'streaming', duplicate = false { id: 'run-a', status: statusA }, { id: 'run-b', status: statusB }, ], + activeRuns: [ + { runId: 'run-a', conversationId: 'conversation-a', branchId: 'branch-a' }, + { runId: 'run-b', conversationId: 'conversation-b', branchId: 'branch-b' }, + ], }, view: { runs: [ { id: 'run-a', conversationId: 'conversation-a', branchId: 'branch-a' }, { id: 'run-b', conversationId: 'conversation-b', branchId: 'branch-b' }, ], - activeRuns: [ - { runId: 'run-a', conversationId: 'conversation-a', branchId: 'branch-a' }, - { runId: 'run-b', conversationId: 'conversation-b', branchId: 'branch-b' }, + workStrip: [ + { runId: 'run-a', branchId: 'branch-a' }, + { runId: 'run-b', branchId: 'branch-b' }, ], activity: duplicate ? [eventA, eventA, eventB] : [eventA, eventB], messages: [], @@ -39,12 +43,31 @@ test('multirun frame guard requires two active streamed runs', () => { assert.deepEqual(frameEventIds(frame(), 'run-b'), ['provider-b-1']) }) +test('rendered work-strip guard counts only actionable ownership rows', () => { + assert.equal( + renderedWorkStripCount( + [ + '· branch-a · streaming · opencode/model · 1 interaction · actions switch/!ask/!steer/cancel', + 'status text mentioning work', + '› branch-b · streaming · opencode/model · 0 interactions · actions swi…', + ].join('\n'), + ), + 2, + ) +}) + test('multirun frame guard rejects a terminal or underpowered run', () => { assert.throws( () => assertFrameHasConcurrentRuns(frame({ statusB: 'completed' }), ['run-a', 'run-b']), /run run-b is not active/u, ) assert.throws(() => assertFrameHasConcurrentRuns(frame(), ['run-a']), /exactly two run ids/u) + const missingOwnership = frame() + missingOwnership.state.activeRuns = missingOwnership.state.activeRuns.slice(0, 1) + assert.throws( + () => assertFrameHasConcurrentRuns(missingOwnership, ['run-a', 'run-b']), + /active run ownership/u, + ) }) test('event extraction preserves duplicates for the live replay assertion', () => { diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index d0b817a4..5c265164 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -121,6 +121,7 @@ function passedMultirunProof() { activeRunCount: 2, streamEventCounts: runs.map(({ runId, eventCount }) => ({ runId, count: eventCount })), workStripCount: 2, + renderedWorkStripCount: 2, independentConversations: true, }, focus: { From 5c24ae6d6743cf74fb0d201ea6111e8896e2268d Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 08:24:14 -0600 Subject: [PATCH 016/136] fix(live-proof): route cancellation after overlay dismissal --- docs/08-verification.md | 4 + docs/09-delivery-plan.md | 2 + scripts/live-required.test.mjs | 11 ++ scripts/live-required/multirun-contract.mjs | 18 +++ .../tangle-sandbox-braid-multirun.mjs | 110 ++++++++++++++++-- .../tangle-sandbox-braid-multirun.test.mjs | 96 +++++++++++++++ test/tangle-live07-wiring.test.mjs | 15 +++ 7 files changed, 249 insertions(+), 7 deletions(-) diff --git a/docs/08-verification.md b/docs/08-verification.md index 205e9e12..32e99a4a 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -418,6 +418,10 @@ The command fails when a cloud identity repeats, an account changes, evidence is The multirun proof creates two independent conversations, streams both retained runs concurrently, and switches focus to each run. +It closes the activity browser before sending cancellation to the selected run. + +It records the canonical cancellation dispatch event and operation before waiting for provider acknowledgement. + It cancels only the selected run, closes Braid, replays both runs after restart, and confirms exact cleanup. The proof holds each provider turn for 180 seconds and allows 300 seconds per phase by default to absorb public startup variance. diff --git a/docs/09-delivery-plan.md b/docs/09-delivery-plan.md index a51e1460..c216d6ff 100644 --- a/docs/09-delivery-plan.md +++ b/docs/09-delivery-plan.md @@ -305,6 +305,8 @@ The event ledger must show zero duplicate displayed part and zero lost committed `LIVE-07` cannot pass without the multirun artifact proving two independent conversations, both streamed runs, both focus switches, targeted cancellation, restart replay, and exact cleanup. +The artifact must record the canonical cancellation operation while branch B is still active after the activity browser closes. + The Tangle Sandbox cohort must leave zero resources owned by its exact operation identities. ## W9: Interactions and automation diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index 13ec6327..6fb30746 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -189,6 +189,13 @@ function validMultirunProof() { secondSwitchPreservedStatuses: true, }, cancellation: { + dispatch: { + eventKind: 'run.control.requested', + control: 'cancel', + runId: 'multirun-b', + operationId: 'operation-cancel-b', + sequence: 3, + }, targetRunId: 'multirun-b', targetStatus: 'cancelled', unaffectedRunId: 'multirun-a', @@ -279,6 +286,10 @@ test('LIVE-07 release artifact validation requires complete multirun evidence an ...validMultirunProof(), cleanup: { ...validMultirunProof().cleanup, exact: false }, }, + { + ...validMultirunProof(), + cancellation: { ...validMultirunProof().cancellation, dispatch: null }, + }, ]) { await writeFile(artifactPath, `${JSON.stringify(proof)}\n`) const invalid = await readLiveTangleProof({ diff --git a/scripts/live-required/multirun-contract.mjs b/scripts/live-required/multirun-contract.mjs index 77da8a61..41d7a216 100644 --- a/scripts/live-required/multirun-contract.mjs +++ b/scripts/live-required/multirun-contract.mjs @@ -10,6 +10,7 @@ const REQUIRED_PHASES = Object.freeze([ 'concurrent.stream', 'focus-a', 'focus-b', + 'cancel-b.dispatch', 'cancel-b', 'branch-a.complete', 'remote.status', @@ -210,6 +211,23 @@ export function assertMultirunProof(proof) { ) assert(object(proof.cancellation), 'LIVE-07 cancellation evidence is missing') + assert(object(proof.cancellation.dispatch), 'LIVE-07 cancellation dispatch evidence is missing') + assert( + proof.cancellation.dispatch.eventKind === 'run.control.requested', + 'LIVE-07 cancellation dispatch used an unknown event kind', + ) + assert( + proof.cancellation.dispatch.control === 'cancel', + 'LIVE-07 cancellation dispatch did not request cancel', + ) + assert( + proof.cancellation.dispatch.runId === secondRun.runId, + 'LIVE-07 cancellation dispatch targeted the wrong run', + ) + assert( + text(proof.cancellation.dispatch.operationId), + 'LIVE-07 cancellation dispatch has no operation identity', + ) assert(proof.cancellation.targetRunId === secondRun.runId, 'LIVE-07 cancelled the wrong run') assert( ['aborted', 'cancelled'].includes(proof.cancellation.targetStatus), diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 8ba5f1d7..40508593 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -126,6 +126,8 @@ function normalizeScreen(screen) { return screen.replace(/\s+/gu, ' ').trim() } +const TRANSCRIPT_FOOTER = 'type / for commands ·' + function createTerminal( binary, config, @@ -308,6 +310,32 @@ async function waitFor(label, predicate, timeoutMs) { } } +export function activityBrowserOpen(screen) { + return typeof screen === 'string' && screen.split('\n').some((line) => /^\s*runs ›/u.test(line)) +} + +export function transcriptSurfaceReady(screen) { + return ( + typeof screen === 'string' && !activityBrowserOpen(screen) && screen.includes(TRANSCRIPT_FOOTER) + ) +} + +export async function waitForActivityBrowserDismissal(runtime, label, timeoutMs) { + return waitFor( + `${label} activity browser dismissal`, + () => transcriptSurfaceReady(runtime.screen()), + timeoutMs, + ) +} + +export async function sendCancellationAfterActivityBrowserDismissal(runtime, label, timeoutMs) { + if (!transcriptSurfaceReady(runtime.screen())) { + runtime.input('\u001b') + await waitForActivityBrowserDismissal(runtime, label, timeoutMs) + } + runtime.input('\u0003') +} + async function typeAndSubmit(runtime, value) { for (const character of value) { runtime.input(character) @@ -445,6 +473,60 @@ export function frameEventIds(frame, runId) { return eventIdsForRun(frame, runId) } +function eventKind(event) { + return event?.kind ?? event?.event?.kind ?? event?.type +} + +function eventPayload(event) { + if (event?.payload !== undefined) return event.payload + if (event?.event?.payload !== undefined) return event.event.payload + return event?.event ?? event +} + +function eventRunId(event) { + return event?.runId ?? eventPayload(event)?.runId +} + +function eventOperationId(event) { + const payload = eventPayload(event) + return event?.operationId ?? payload?.operationId ?? payload?.value?.operationId +} + +export function frameCancellationDispatch(frame, runId) { + const event = (Array.isArray(frame?.events) ? frame.events : []).find((candidate) => { + const payload = eventPayload(candidate) + return ( + eventKind(candidate) === 'run.control.requested' && + eventRunId(candidate) === runId && + payload?.control === 'cancel' && + typeof eventOperationId(candidate) === 'string' && + eventOperationId(candidate).length > 0 + ) + }) + if (event === undefined) return undefined + return { + eventKind: eventKind(event), + control: eventPayload(event)?.control, + runId: eventRunId(event), + operationId: eventOperationId(event), + sequence: event?.sequence ?? event?.event?.sequence ?? null, + } +} + +export function cancellationDispatchVisible(frame, unaffectedRunId, targetRunId) { + const dispatch = frameCancellationDispatch(frame, targetRunId) + if (dispatch === undefined) return false + const targetStatus = runStatus(frame, targetRunId) + return ( + isActive(runStatus(frame, unaffectedRunId)) && + (isActive(targetStatus) || ['aborted', 'cancelled'].includes(targetStatus)) + ) +} + +export function assertSuccessfulTerminalExit(exit, label) { + assert.equal(exit?.exitCode, 0, `${label} Braid terminal process exited with a non-zero status`) +} + export function renderedWorkStripCount(screen) { return screen .split('\n') @@ -520,6 +602,8 @@ export async function runProof({ let secondFrame let focusAFrame let focusBFrame + let cancelDispatchFrame + let cancelDispatch let cancelFrame let finalFrame let restartedFrame @@ -704,6 +788,7 @@ export async function runProof({ assert.ok(isActive(runStatus(focusAFrame, runAId))) assert.ok(isActive(runStatus(focusAFrame, runBId))) runtime.input('\u001b') + await waitForActivityBrowserDismissal(runtime, 'focus branch A', timeoutMs) }) terminalEvidence.focusA = runtime.snapshot() await phase('focus-b', async () => { @@ -721,14 +806,27 @@ export async function runProof({ ) assertFrameHasConcurrentRuns(focusBFrame, [runAId, runBId]) runtime.input('\u001b') + await waitForActivityBrowserDismissal(runtime, 'focus branch B', timeoutMs) }) terminalEvidence.focusB = runtime.snapshot() + await phase('cancel-b.dispatch', async () => { + await sendCancellationAfterActivityBrowserDismissal(runtime, 'branch B', timeoutMs) + cancelDispatchFrame = await waitForFrame( + runtime, + 'branch B cancellation dispatch', + (frame) => cancellationDispatchVisible(frame, runAId, runBId), + timeoutMs, + ) + cancelDispatch = frameCancellationDispatch(cancelDispatchFrame, runBId) + assert.ok(cancelDispatch, 'branch B cancellation did not persist its dispatch event') + terminalEvidence.cancelDispatch = runtime.snapshot() + }) await phase('cancel-b', async () => { - runtime.input('\u0003') cancelFrame = await waitForFrame( runtime, 'branch B cancellation', (frame) => + frameCancellationDispatch(frame, runBId)?.operationId === cancelDispatch?.operationId && ['aborted', 'cancelled'].includes(runStatus(frame, runBId)) && isActive(runStatus(frame, runAId)), timeoutMs, @@ -758,7 +856,7 @@ export async function runProof({ }) await phase('terminal.first.close', async () => { const exit = await runtime.close() - assert.equal(exit.exitCode, 0, 'first Braid terminal process exited with a non-zero status') + assertSuccessfulTerminalExit(exit, 'first') await runtime.dispose() }) terminalEvidence.final = runtime.snapshot() @@ -786,11 +884,7 @@ export async function runProof({ terminalEvidence.restart = restarted.snapshot() await phase('terminal.restart.close', async () => { const exit = await restarted.close() - assert.equal( - exit.exitCode, - 0, - 'restarted Braid terminal process exited with a non-zero status', - ) + assertSuccessfulTerminalExit(exit, 'restarted') await restarted.dispose() }) await phase('provider.observe', async () => { @@ -903,6 +997,7 @@ export async function runProof({ proofError === undefined && finalFrame !== undefined && restartedFrame !== undefined && + cancelDispatch !== undefined && controls.size === 2 && cleanup.exact === true const completedAt = new Date().toISOString() @@ -983,6 +1078,7 @@ export async function runProof({ : [runAId, runBId].every((runId) => isActive(runStatus(focusBFrame, runId))), }, cancellation: { + dispatch: cancelDispatch ?? null, targetRunId: runBId ?? null, targetStatus: cancelFrame === undefined || runBId === undefined ? null : runStatus(cancelFrame, runBId), diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs index 1a69cb0d..f13973f7 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs @@ -2,12 +2,26 @@ import assert from 'node:assert/strict' import test from 'node:test' import { assertMultirunProof } from './multirun-contract.mjs' import { + activityBrowserOpen, + cancellationDispatchVisible, assertFrameHasConcurrentRuns, + assertSuccessfulTerminalExit, + frameCancellationDispatch, frameEventIds, renderedWorkStripCount, + sendCancellationAfterActivityBrowserDismissal, terminalFailureEvidence, + transcriptSurfaceReady, + waitForActivityBrowserDismissal, } from './tangle-sandbox-braid-multirun.mjs' +const activityBrowserScreen = [ + 'Braid', + 'runs › run run-b', + '↑↓ select · PgUp/PgDn detail · home/end jump · ←/esc close · tab filter · r refresh', +].join('\n') +const transcriptScreen = 'Braid\n──────────────── type / for commands · Alt+Enter newline' + function frame({ statusA = 'streaming', statusB = 'streaming', duplicate = false } = {}) { const eventA = { id: 'activity-a-1', runId: 'run-a', sourceEventId: 'provider-a-1' } const eventB = { id: 'activity-b-1', runId: 'run-b', sourceEventId: 'provider-b-1' } @@ -43,6 +57,88 @@ test('multirun frame guard requires two active streamed runs', () => { assert.deepEqual(frameEventIds(frame(), 'run-b'), ['provider-b-1']) }) +test('activity browser dismissal is an explicit waitable terminal state', async () => { + assert.equal(activityBrowserOpen(activityBrowserScreen), true) + assert.equal(transcriptSurfaceReady(activityBrowserScreen), false) + assert.equal(activityBrowserOpen('Braid\nruns › run run-b\ntype / for commands ·'), true) + assert.equal(transcriptSurfaceReady('Braid\nruns › run run-b\ntype / for commands ·'), false) + assert.equal(activityBrowserOpen(transcriptScreen), false) + assert.equal(transcriptSurfaceReady(transcriptScreen), true) + + let screen = activityBrowserScreen + let settled = false + const runtime = { screen: () => screen } + const dismissal = waitForActivityBrowserDismissal(runtime, 'focus branch B', 1_000).then(() => { + settled = true + }) + await new Promise((resolve) => setImmediate(resolve)) + assert.equal(settled, false) + screen = transcriptScreen + await dismissal + assert.equal(settled, true) +}) + +test('cancellation sends Ctrl-C only after the activity browser is closed', async () => { + let screen = activityBrowserScreen + const inputs = [] + const runtime = { + screen: () => screen, + input(value) { + inputs.push(value) + if (value === '\u001b') screen = transcriptScreen + }, + } + await sendCancellationAfterActivityBrowserDismissal(runtime, 'branch B', 1_000) + assert.deepEqual(inputs, ['\u001b', '\u0003']) +}) + +test('cancellation dispatch extraction requires canonical cancel event and operation identity', () => { + const frame = { + events: [ + { + sequence: 4, + kind: 'run.control.requested', + payload: { runId: 'run-b', operationId: 'op-cancel-b', control: 'cancel' }, + }, + ], + } + assert.deepEqual(frameCancellationDispatch(frame, 'run-b'), { + eventKind: 'run.control.requested', + control: 'cancel', + runId: 'run-b', + operationId: 'op-cancel-b', + sequence: 4, + }) + assert.equal(frameCancellationDispatch(frame, 'run-a'), undefined) + assert.equal( + frameCancellationDispatch( + { events: [{ kind: 'run.cancel.requested', payload: { runId: 'run-b' } }] }, + 'run-b', + ), + undefined, + ) +}) + +test('cancellation dispatch accepts a fast acknowledgement after an active proof frame', () => { + const acknowledged = frame({ statusB: 'cancelled' }) + acknowledged.events = [ + { + sequence: 4, + kind: 'run.control.requested', + payload: { runId: 'run-b', operationId: 'op-cancel-b', control: 'cancel' }, + }, + ] + assert.equal(cancellationDispatchVisible(acknowledged, 'run-a', 'run-b'), true) +}) + +test('restart close rejects a nonzero terminal exit code', () => { + assert.doesNotThrow(() => assertSuccessfulTerminalExit({ exitCode: 0 }, 'restarted')) + assert.throws( + () => assertSuccessfulTerminalExit({ exitCode: 1 }, 'restarted'), + /restarted Braid terminal process exited with a non-zero status/u, + ) +}) + test('rendered work-strip guard counts only actionable ownership rows', () => { assert.equal( renderedWorkStripCount( diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 5c265164..6c6fc933 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -132,6 +132,13 @@ function passedMultirunProof() { secondSwitchPreservedStatuses: true, }, cancellation: { + dispatch: { + eventKind: 'run.control.requested', + control: 'cancel', + runId: 'multirun-b', + operationId: 'operation-cancel-b', + sequence: 3, + }, targetRunId: 'multirun-b', targetStatus: 'cancelled', unaffectedRunId: 'multirun-a', @@ -317,6 +324,14 @@ test('LIVE-07 requires passed, complete, and exact multirun evidence', async () { ...passedMultirunProof(), cleanup: { ...passedMultirunProof().cleanup, exact: false } }, /multirun cleanup was not exact/u, ], + [ + 'missing cancellation dispatch', + { + ...passedMultirunProof(), + cancellation: { ...passedMultirunProof().cancellation, dispatch: null }, + }, + /cancellation dispatch evidence is missing/u, + ], ] for (const [label, multirun, expected] of cases) { await assert.rejects( From a4b7eb508138eef7d3577f38828bf9b8a82e22ad Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 08:07:06 -0600 Subject: [PATCH 017/136] fix(ui): mark truncated command descriptions --- .agent/skill-runs.jsonl | 1 + THIRD_PARTY_NOTICES.md | 1 + src/views/tui/command-palette.ts | 1 + src/views/tui/selector.ts | 88 +++++++++++++++++++++++++++++- src/views/tui/terminal-overlays.ts | 1 + test/terminal-responsive.test.ts | 4 ++ test/w6-ui.test.ts | 26 +++++++++ 7 files changed, 121 insertions(+), 1 deletion(-) diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index f1f4c0dc..fd72810d 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -67,3 +67,4 @@ {"skill":"/verify","ts":"2026-08-19T08:59:19Z","project":"braid-exact-interactive-20260816","target":"Braid retained/headless/native PTY verification (final)","operatorPrompt":"","durationMin":null,"verdict":"HOLD: 762/766 full tests pass; 2 pinned dependency failures remain","dispatchedTo":"upgrade the owning dependencies, then rerun contract and production native routing","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/critical-audit","ts":"2026-08-19T11:05:46Z","project":"braid-exact-interactive-20260816","target":"Braid durable interaction and TUI architecture n=70 files","operatorPrompt":"","durationMin":null,"verdict":"REQUEST_CHANGES","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/verify","ts":"2026-08-28T13:02:50Z","project":"braid-10-release-multirun","target":"Braid LIVE-07 Tangle multirun release wiring","operatorPrompt":"","durationMin":null,"verdict":"SHIP_IT","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/product-design","ts":"2026-08-28T14:00:31Z","project":"braid-10-ui-proof-fixes","target":"Braid W6 command-palette overflow marker and packed terminal proof","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 4035ddf5..b9592002 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -23,6 +23,7 @@ Before copied or substantially adapted code is committed, add one row below with | Braid path | Upstream source | Source commit | License | Adaptation | | --- | --- | --- | --- | --- | | `test/support/virtual-terminal.ts` | [`earendil-works/pi`, `packages/tui/test/virtual-terminal.ts`](https://github.com/earendil-works/pi/blob/a6f7317dfca61e357aee65faafe012a1be6c3734/packages/tui/test/virtual-terminal.ts) | `a6f7317dfca61e357aee65faafe012a1be6c3734` | MIT, Copyright (c) 2025 Mario Zechner | Changed imports to the published Pi TUI package and applied Braid formatting; production code does not include this file. | +| `src/views/tui/selector.ts` | [`earendil-works/pi`, `packages/tui/src/components/select-list.ts`](https://github.com/earendil-works/pi/blob/a6f7317dfca61e357aee65faafe012a1be6c3734/packages/tui/src/components/select-list.ts) | `a6f7317dfca61e357aee65faafe012a1be6c3734` | MIT, Copyright (c) 2025 Mario Zechner | Reuses Pi's pinned column-width and truncation calculations to mark description overflow while preserving the shared selector behavior. | | `scripts/live-bridge/windows-job-host-source.mjs` | [`dotnet/aspire`, `src/Aspire.Cli/Processes/WindowsConsoleProcessJob.cs` and `WindowsProcessInterop.cs`](https://github.com/dotnet/aspire/tree/be77aa36daf995fae0e72091141410c7082fcba3/src/Aspire.Cli/Processes) | `be77aa36daf995fae0e72091141410c7082fcba3` | MIT, Copyright (c) .NET Foundation and contributors | Adapted atomic Job Object attachment, kill-on-close containment, and active-process drain checks for Braid's Windows release proof. | The original copyright and license notice must remain with every substantial copied portion. diff --git a/src/views/tui/command-palette.ts b/src/views/tui/command-palette.ts index 3b19b697..87eb345a 100644 --- a/src/views/tui/command-palette.ts +++ b/src/views/tui/command-palette.ts @@ -17,6 +17,7 @@ export class CommandPalette extends SearchableSelector { title: 'commands', items: commandItems(capabilities), theme, + markDescriptionOverflow: true, onSelect: (item) => onCommand(item.value as PaletteCommand), onCancel: () => onCommand('help'), }) diff --git a/src/views/tui/selector.ts b/src/views/tui/selector.ts index 39fc1db8..d866450b 100644 --- a/src/views/tui/selector.ts +++ b/src/views/tui/selector.ts @@ -1,3 +1,13 @@ +/** + * Copyright (c) 2025 Mario Zechner + * + * @derived-from https://github.com/earendil-works/pi + * @source-commit a6f7317dfca61e357aee65faafe012a1be6c3734 + * @source-path packages/tui/src/components/select-list.ts + * @source-license MIT + * @adaptation Reuses Pi's pinned column math to mark description overflow while preserving its list behavior. + */ + import { type Component, Container, @@ -8,6 +18,8 @@ import { type SelectItem, SelectList, Text, + truncateToWidth, + visibleWidth, } from '@earendil-works/pi-tui' import type { SelectorView } from '../shared/models.js' import { sanitizeTerminalText } from '../shared/sanitize.js' @@ -24,6 +36,7 @@ export interface SearchableSelectorOptions { readonly emptyText?: string readonly noMatchText?: string readonly hideInputWhenEmpty?: boolean + readonly markDescriptionOverflow?: boolean readonly embedded?: boolean readonly onAction?: (key: string, item: SelectItem | null) => void readonly onSelect: (item: SelectItem) => void @@ -54,6 +67,7 @@ export class SearchableSelector extends Container implements Focusable { readonly #emptyText: string | undefined readonly #noMatchText: string | undefined readonly #inputHidden: boolean + readonly #markDescriptionOverflow: boolean #focused = false readonly #selectedValue: string | undefined @@ -65,6 +79,7 @@ export class SearchableSelector extends Container implements Focusable { this.#emptyText = safeOptionalText(options.emptyText) this.#noMatchText = safeOptionalText(options.noMatchText) this.#inputHidden = options.hideInputWhenEmpty === true && this.#items.length === 0 + this.#markDescriptionOverflow = options.markDescriptionOverflow === true this.#selectedValue = options.selectedValue this.#onSelect = options.onSelect this.#onCancel = options.onCancel @@ -186,13 +201,84 @@ export class SearchableSelector extends Container implements Focusable { message === undefined ? this.#theme.select : { ...this.#theme.select, noMatch: () => this.#theme.select.noMatch(` ${message}`) } - const list = new SelectList([...items], this.#maxVisible, selectTheme) + const list = new DescriptionOverflowSelectList( + [...items], + this.#maxVisible, + selectTheme, + this.#markDescriptionOverflow, + ) list.onSelect = (item) => this.#onSelect(item) list.onCancel = () => this.#onCancel() return list } } +const DEFAULT_PRIMARY_COLUMN_WIDTH = 32 +const PRIMARY_COLUMN_GAP = 2 +const MIN_DESCRIPTION_WIDTH = 10 + +/** Adds an explicit overflow marker before delegating row layout to Pi TUI. */ +class DescriptionOverflowSelectList extends SelectList { + readonly #items: SelectItem[] + readonly #markDescriptionOverflow: boolean + + constructor( + items: SelectItem[], + maxVisible: number, + theme: SearchableSelectorOptions['theme']['select'], + markDescriptionOverflow: boolean, + ) { + super(items, maxVisible, theme) + this.#items = items + this.#markDescriptionOverflow = markDescriptionOverflow + } + + override render(width: number): string[] { + if (!this.#markDescriptionOverflow) return super.render(width) + + const originalDescriptions = this.#items.map((item) => item.description) + try { + for (const item of this.#items) { + if (item.description === undefined) continue + item.description = truncateDescription( + item.description, + item.label || item.value, + width, + DEFAULT_PRIMARY_COLUMN_WIDTH, + ) + } + return super.render(width) + } finally { + this.#items.forEach((item, index) => { + const original = originalDescriptions[index] + if (original === undefined) delete item.description + else item.description = original + }) + } + } +} + +function truncateDescription( + description: string, + primary: string, + width: number, + primaryColumnWidth: number, +): string { + if (width <= 40) return description + + const prefixWidth = 2 + const effectivePrimaryColumnWidth = Math.max( + 1, + Math.min(primaryColumnWidth, width - prefixWidth - 4), + ) + const maxPrimaryWidth = Math.max(1, effectivePrimaryColumnWidth - PRIMARY_COLUMN_GAP) + const truncatedPrimary = truncateToWidth(primary, maxPrimaryWidth, '') + const spacing = Math.max(1, effectivePrimaryColumnWidth - visibleWidth(truncatedPrimary)) + const remainingWidth = width - prefixWidth - visibleWidth(truncatedPrimary) - spacing - 2 + if (remainingWidth <= MIN_DESCRIPTION_WIDTH) return description + return truncateToWidth(description, remainingWidth, '…') +} + class SelectorRule implements Component { readonly #theme: BraidTheme diff --git a/src/views/tui/terminal-overlays.ts b/src/views/tui/terminal-overlays.ts index 16391b4f..c380609c 100644 --- a/src/views/tui/terminal-overlays.ts +++ b/src/views/tui/terminal-overlays.ts @@ -206,6 +206,7 @@ export class TerminalOverlayController { title: 'Commands', items: commandItems(view.capabilities), theme: this.#theme, + markDescriptionOverflow: true, maxVisible: Math.max(1, Math.min(8, this.#rows() - 6)), footer: this.#columns() < 60 diff --git a/test/terminal-responsive.test.ts b/test/terminal-responsive.test.ts index 51177895..96746ed8 100644 --- a/test/terminal-responsive.test.ts +++ b/test/terminal-responsive.test.ts @@ -35,6 +35,7 @@ const sizes = [ [120, 40], [200, 60], ] as const +const sgrPattern = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, 'gu') function viewForChrome(): BraidViewModel { const app = createBraidApplication({ fixture: 'deterministic' }) @@ -248,6 +249,9 @@ test('command palette stays isolated and keeps close controls at narrow and wide assert.match(screen, /←\/esc close/u) assert.doesNotMatch(screen, /profile Braid starter/u) if (columns >= 80) assert.match(screen, /Inspect and manage connections/u) + const plainScreen = screen.replace(sgrPattern, '') + if (columns === 80) assert.match(plainScreen, /message bound…/u) + if (columns === 120) assert.doesNotMatch(plainScreen, /message bound…/u) for (const line of terminal.getViewport()) assert.ok(visibleWidth(line) <= columns) } finally { view.stop() diff --git a/test/w6-ui.test.ts b/test/w6-ui.test.ts index 434c61a4..44fa9b1b 100644 --- a/test/w6-ui.test.ts +++ b/test/w6-ui.test.ts @@ -34,6 +34,7 @@ import { import { VirtualTerminal } from './support/virtual-terminal.js' const theme = createBraidTheme({ colors: false, highContrast: true, reducedMotion: true }) +const sgrPattern = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, 'gu') function viewFor(status: ViewStatus): BraidViewModel { return Object.freeze({ @@ -599,6 +600,31 @@ test('one searchable selector preserves query and supports keyboard selection', assert.equal(cancellations, 2) }) +test('searchable selector marks descriptions that do not fit the terminal row', () => { + const selector = new SearchableSelector({ + title: 'commands', + items: [ + { + value: 'branch', + label: '/branch', + description: 'Create and open a branch at a message boundary', + }, + ], + theme, + markDescriptionOverflow: true, + onSelect: () => {}, + onCancel: () => {}, + }) + + const standard = selector.render(80).join('\n').replace(sgrPattern, '') + assert.match(standard, /Create and open a branch at a message bound…/u) + assert.ok(selector.render(80).every((line) => visibleWidth(line) <= 80)) + + const wide = selector.render(120).join('\n').replace(sgrPattern, '') + assert.match(wide, /Create and open a branch at a message boundary/u) + assert.doesNotMatch(wide, /boundary…/u) +}) + test('profile selector rows keep the profile identity intact at responsive widths', () => { const profile = { id: 'profile-braid-starter', From fd0944952bc57fd5f49d4b57b6786fa433a7682c Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 08:44:48 -0600 Subject: [PATCH 018/136] fix(live-proof): read semantic control events --- .../tangle-sandbox-braid-multirun.mjs | 17 +++++++++++++--- .../tangle-sandbox-braid-multirun.test.mjs | 20 +++++++++++++++++-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 40508593..64665a10 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -489,7 +489,18 @@ function eventRunId(event) { function eventOperationId(event) { const payload = eventPayload(event) - return event?.operationId ?? payload?.operationId ?? payload?.value?.operationId + return ( + event?.operationId ?? + payload?.operationId ?? + payload?.value?.operationId ?? + payload?.control?.operationId + ) +} + +function eventControl(event) { + const payload = eventPayload(event) + if (typeof payload?.control === 'string') return payload.control + return payload?.value?.control ?? payload?.control?.control } export function frameCancellationDispatch(frame, runId) { @@ -498,7 +509,7 @@ export function frameCancellationDispatch(frame, runId) { return ( eventKind(candidate) === 'run.control.requested' && eventRunId(candidate) === runId && - payload?.control === 'cancel' && + eventControl(candidate) === 'cancel' && typeof eventOperationId(candidate) === 'string' && eventOperationId(candidate).length > 0 ) @@ -506,7 +517,7 @@ export function frameCancellationDispatch(frame, runId) { if (event === undefined) return undefined return { eventKind: eventKind(event), - control: eventPayload(event)?.control, + control: eventControl(event), runId: eventRunId(event), operationId: eventOperationId(event), sequence: event?.sequence ?? event?.event?.sequence ?? null, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs index f13973f7..1f668fe3 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs @@ -98,7 +98,15 @@ test('cancellation dispatch extraction requires canonical cancel event and opera { sequence: 4, kind: 'run.control.requested', - payload: { runId: 'run-b', operationId: 'op-cancel-b', control: 'cancel' }, + payload: { + runId: 'run-b', + control: { + operationId: 'op-cancel-b', + runId: 'run-b', + control: 'cancel', + status: 'requested', + }, + }, }, ], } @@ -125,7 +133,15 @@ test('cancellation dispatch accepts a fast acknowledgement after an active proof { sequence: 4, kind: 'run.control.requested', - payload: { runId: 'run-b', operationId: 'op-cancel-b', control: 'cancel' }, + payload: { + runId: 'run-b', + control: { + operationId: 'op-cancel-b', + runId: 'run-b', + control: 'cancel', + status: 'requested', + }, + }, }, ] assert.equal(cancellationDispatchVisible(acknowledged, 'run-a', 'run-b'), true) From 184f6605df41befa69415b5e5ce3f8883342e262 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 08:58:30 -0600 Subject: [PATCH 019/136] fix(live-proof): isolate restart evidence files --- .../tangle-sandbox-braid-multirun.mjs | 11 +++++++++-- .../tangle-sandbox-braid-multirun.test.mjs | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 64665a10..f1336d8f 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -122,6 +122,13 @@ function screenFrom(terminal) { return text } +export function terminalRecordPath(basePath, instance) { + if (!Number.isSafeInteger(instance) || instance < 0) { + throw new Error('Terminal record instance must be a non-negative safe integer') + } + return instance === 0 ? basePath : `${basePath}.restart-${instance}` +} + function normalizeScreen(screen) { return screen.replace(/\s+/gu, ' ').trim() } @@ -668,7 +675,7 @@ export async function runProof({ }), ) const recordPath = join(config.root, 'multirun-state.json') - runtime = createTerminal(binary, config, recordPath) + runtime = createTerminal(binary, config, terminalRecordPath(recordPath, 0)) await phase('terminal.start', () => waitFor('Braid terminal startup', () => /Braid/iu.test(runtime.screen()), timeoutMs), ) @@ -871,7 +878,7 @@ export async function runProof({ await runtime.dispose() }) terminalEvidence.final = runtime.snapshot() - restarted = createTerminal(binary, config, recordPath) + restarted = createTerminal(binary, config, terminalRecordPath(recordPath, 1)) await phase('terminal.restart', () => waitFor('restarted Braid terminal', () => /Braid/iu.test(restarted.screen()), timeoutMs), ) diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs index 1f668fe3..2822084f 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs @@ -10,6 +10,7 @@ import { frameEventIds, renderedWorkStripCount, sendCancellationAfterActivityBrowserDismissal, + terminalRecordPath, terminalFailureEvidence, transcriptSurfaceReady, waitForActivityBrowserDismissal, @@ -155,6 +156,19 @@ test('restart close rejects a nonzero terminal exit code', () => { ) }) +test('each terminal process owns one final state evidence path', () => { + assert.equal(terminalRecordPath('/tmp/multirun-state.json', 0), '/tmp/multirun-state.json') + assert.equal( + terminalRecordPath('/tmp/multirun-state.json', 1), + '/tmp/multirun-state.json.restart-1', + ) + assert.notEqual( + terminalRecordPath('/tmp/multirun-state.json', 1), + terminalRecordPath('/tmp/multirun-state.json', 2), + ) + assert.throws(() => terminalRecordPath('/tmp/multirun-state.json', -1), /non-negative/u) +}) + test('rendered work-strip guard counts only actionable ownership rows', () => { assert.equal( renderedWorkStripCount( From 28c69b905d38b732d828c78b81487bc9b2c71456 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 08:52:17 -0600 Subject: [PATCH 020/136] fix(live-supervisor): prove runtime worker effects --- docs/08-verification.md | 18 + docs/09-delivery-plan.md | 6 +- docs/components/supervision.md | 30 +- scripts/live-required.test.mjs | 281 ++++++--- scripts/live-required/contracts.mjs | 44 +- scripts/live-required/supervisor.mjs | 818 ++++++++++++++++++++++++--- 6 files changed, 1023 insertions(+), 174 deletions(-) diff --git a/docs/08-verification.md b/docs/08-verification.md index 32e99a4a..494cc4f7 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -380,6 +380,24 @@ Model discovery does not make every advertised model a release gate. If a required live provider is unavailable, the release is blocked and the manifest reports the unavailable check rather than marking it skipped or simulated. +`LIVE-11` uses one reusable flow over the published `@tangle-network/agent-runtime/kernel` and `@tangle-network/agent-runtime/tui` APIs. + +The flow rejects incomplete snapshots and requires an exact supervisor identifier, exact worker identifier, root status, worker status, and complete spend fields. + +It observes a spend change while the worker remains running before it admits any control operation. + +It retries one stable steering operation identifier, then requires a matching request digest, exact worker, and `delivered` Runtime acknowledgement. + +It retries one stable worker-cancellation operation identifier, then requires a `cancelled` acknowledgement that names the terminated worker. + +It reloads the snapshot after cancellation and rereads the same cancellation acknowledgement to prove reconnect persistence. + +When a provider supplies the exact interactive reconnect contract, the flow records the opaque terminal takeover handle. + +When no provider supplies that contract, the flow records the explicit unavailable reason and makes no attachment claim. + +The check returns the `LIVE-11` measurement only after every required effect and reconnect assertion passes; it never returns a partial result. + ### Tangle Sandbox durability stress Run `pnpm test:live:tangle:sandbox:stress` against the public Sandbox endpoint. diff --git a/docs/09-delivery-plan.md b/docs/09-delivery-plan.md index c216d6ff..8419a984 100644 --- a/docs/09-delivery-plan.md +++ b/docs/09-delivery-plan.md @@ -367,7 +367,9 @@ The UI proof includes the source and destination file state of a real cloud envi - Implement `/ask`, failure, cost, tools, improvement, paired comparison, citation validation, finding promotion, and fork from analysis. - Implement feedback trajectory export from structured decisions. - Implement the complete graph with conversation, branch, turn, run, analysis, environment, checkpoint, supervisor, and worker nodes and named edges. -- Implement runtime-owned supervisor snapshot watch, activity, log tail, typed steering, typed cancellation, and reconnect. +- Implement runtime-owned supervisor snapshot watch, activity, log tail, typed steering, typed cancellation, and reconnect through the published Runtime APIs. +- Make the `LIVE-11` release proof require complete root and worker observation, changed spend, acknowledged steering, proven cancellation, stable operation retries, and a fresh reconnect snapshot. +- Record exact terminal takeover only when Runtime returns an opaque handle for a registered provider; preserve the explicit unavailable capability otherwise. - Keep direct-turn, trace-analysis, and delegated-worker usage separate until Runtime exports stable shared call identity. - Add calibrated semantic cases and raw evidence capture. @@ -375,6 +377,8 @@ The UI proof includes the source and destination file state of a real cloud envi `PR-07`, `PR-08`, `AN-01` through `AN-10`, `LIVE-11`, `LIVE-12`, and `EVAL-01` through `EVAL-06` pass. +`LIVE-11` cannot pass from a queued request, an incomplete snapshot, an unacknowledged effect, or a partial result. + An analysis cannot pass if its source branch journal changes before explicit promotion or any cited reference fails deterministic resolution. ## W12: Security, accessibility, performance, and product polish diff --git a/docs/components/supervision.md b/docs/components/supervision.md index 310e1ee5..891ff766 100644 --- a/docs/components/supervision.md +++ b/docs/components/supervision.md @@ -14,6 +14,12 @@ Render it through `GraphView` and the shared entity browser. Dispatch steer or cancel through the runtime control API with a stable operation identifier. +Wait for the runtime acknowledgement and render its effect instead of treating request admission as success. + +Reconnect by loading a fresh runtime snapshot and rereading the same operation identifier. + +Use `attachWorker` only when an exact provider source exists and the runtime returns an opaque interactive handle. + Do not read `.agent/supervisor` files or infer control support from worker status text. ## Component map @@ -21,6 +27,9 @@ Do not read `.agent/supervisor` files or infer control support from worker statu | Component | Responsibility | | --- | --- | | `GraphView` | Filter and navigate the projected hierarchy and open node details. | +| `RuntimeSupervisorWatcher` | Read and refresh the Runtime-owned immutable snapshot. | +| `RuntimeSupervisorController` | Resolve one exact worker and route typed steer, cancel, and attach operations. | +| `SupervisorService` | Serialize projection commits and expose the supervisor port to the application. | The runtime owns graph reads, control reconciliation, and live worker state. @@ -34,6 +43,12 @@ Steer and cancel intents include the source Braid run, supervisor, worker, paylo The component renders the recorded control outcome after runtime reconciliation. +Steer acknowledgement includes the matching request digest, exact worker, and delivered effect. + +Cancellation acknowledgement includes the matching operation, proven terminated worker identifiers, and effect. + +Terminal takeover exposes only the runtime handle or the runtime's explicit unavailable reason. + ## Hierarchy and refresh Projection keeps required ancestors for every retained recent worker. @@ -46,6 +61,8 @@ Refresh ignores an unchanged snapshot and stops when the graph closes. Selection remains on the same node identifier across refreshes. +Reconnect never reuses a stale local control result as a new effect. + ## Capability behavior Steer appears only when the runtime reports steer support for that worker. @@ -56,6 +73,8 @@ Attach remains disabled until Runtime exposes an external-client attach contract The disabled action includes that exact reason. +An available attach result carries the exact provider-owned process handle, not a reconstructed display row. + ## Failure and safety An unavailable runtime read preserves the last confirmed snapshot and shows stale status. @@ -68,6 +87,10 @@ A control can never target a row by display position. Worker output and labels are sanitized before display. +An admitted request without an acknowledgement remains queued or unknown. + +The graph never reports delivered steering or cancellation without the matching Runtime effect. + ## Performance Projection retains a bounded recent set plus required ancestors. @@ -80,11 +103,14 @@ Refresh uses one subscription or bounded poll per open surface. Tests cover hierarchy, cycles, missing parents, two supervisors, status updates, spend, steer, cancel, unavailable actions, restart, and unchanged refresh. -Live proof requires a real root and worker stream plus observed steering and cancellation effects. +The deterministic supervisor fixture exercises the same public Runtime API shape without creating supervisor files. + +Live proof requires a real root and worker stream, a changed spend observation, acknowledged steering, proven cancellation, and a fresh reconnect snapshot. + +The release check records terminal takeover as attached or unavailable and never treats an unavailable provider as an attachment. ## Non-goals Braid does not implement a supervisor, agent loop, worker process, or attach transport. The graph does not equate a branch, run, worker, and provider session. - diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index 6fb30746..c45fc369 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -1,7 +1,7 @@ import assert from 'node:assert/strict' import { execFileSync } from 'node:child_process' import { EventEmitter } from 'node:events' -import { access, chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' +import { access, chmod, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import test from 'node:test' @@ -27,6 +27,7 @@ import { prepareProductionWorkspace, runHeadlessTurn, } from './live-required/headless.mjs' +import { createSupervisorProofFixture, runSupervisorFlow } from './live-required/supervisor.mjs' import { runMatrixAdapter, runSandbox } from './live-required/tangle.mjs' import { executionLatencyDistribution } from './live-required/tangle-sandbox-braid-execution-soak.mjs' import { @@ -351,46 +352,6 @@ function validTangleSandboxReceiptInput(overrides = {}) { } } -function expectedFailureOutput(scope, environment, expectedStatus = 1) { - let failure - try { - execFileSync(process.execPath, ['scripts/live-required.mjs', scope], { - cwd: repository, - env: environment, - encoding: 'utf8', - stdio: ['ignore', 'pipe', 'pipe'], - }) - } catch (error) { - failure = error - } - assert(failure, `${scope} unexpectedly passed`) - assert.equal(failure.status, expectedStatus) - return `${failure.stdout ?? ''}${failure.stderr ?? ''}` -} - -async function createSupervisorFixture(root) { - const supervisorId = 'supervisor-live-required' - const workerId = 'worker-live-required' - const runDir = join(root, '.agent', 'supervisor', supervisorId) - await mkdir(runDir, { recursive: true }) - await writeFile( - join(runDir, 'state.json'), - `${JSON.stringify({ - id: supervisorId, - status: 'running', - task: 'live-required test', - workspaceDir: root, - budget: 1, - })}\n`, - ) - const now = '2026-08-10T00:00:00.000Z' - await writeFile( - join(runDir, 'spawn-journal.jsonl'), - `${JSON.stringify({ kind: 'spawned', id: supervisorId, label: 'root', at: now })}\n${JSON.stringify({ kind: 'spawned', id: workerId, label: workerId, parent: supervisorId, at: now })}\n`, - ) - return { supervisorId, workerId } -} - test('protected live scopes emit unavailable release evidence without credentials', () => { for (const scope of ['live-tangle', 'live-supervisor', 'live-analysis', 'semantic-eval']) { assert.throws( @@ -869,61 +830,201 @@ test('retained Sandbox error details are safe for direct proof output', () => { }) }) -test('configured supervisor failures stay unavailable and redact environment credentials', async () => { - const root = await mkdtemp(join(tmpdir(), 'braid-live-required-supervisor-test-')) - const missingRoot = join(root, 'missing-runtime-root') - const common = { - ...protectedEnvironment(), - BRAID_SUPERVISOR_ROOT: missingRoot, - BRAID_SUPERVISOR_ID: 'configured-supervisor', - BRAID_SUPERVISOR_WORKER: 'configured-worker', +test('supervisor proof proves public observation, effects, replay, and reconnect', async () => { + const fixture = createSupervisorProofFixture({ terminalTakeover: 'attached' }) + const environment = { + BRAID_SUPERVISOR_ROOT: fixture.rootDir, + BRAID_SUPERVISOR_ID: fixture.supervisorId, + BRAID_SUPERVISOR_WORKER: fixture.workerId, + BRAID_SUPERVISOR_STEER_OPERATION_ID: 'supervisor-steer-test-1', + BRAID_SUPERVISOR_CANCEL_OPERATION_ID: 'supervisor-cancel-test-1', + BRAID_SUPERVISOR_MESSAGE: 'inspect the deterministic worker', + BRAID_SUPERVISOR_TIMEOUT_MS: '1000', + BRAID_SUPERVISOR_POLL_MS: '1', } - try { - let output = expectedFailureOutput('live-supervisor', common) - assert.match(output, /failed against the configured live path/u) - assert.doesNotMatch(output, /BRAID_RELEASE_RESULT_JSON=\{"status":"unavailable"/u) - - const { supervisorId, workerId } = await createSupervisorFixture(root) - const wrongShape = join(root, 'wrong-supervisor-adapter.mjs') - await writeFile(wrongShape, 'export default 42\n') - output = expectedFailureOutput( - 'live-supervisor', - { - ...common, - BRAID_SUPERVISOR_ROOT: root, - BRAID_SUPERVISOR_ID: supervisorId, - BRAID_SUPERVISOR_WORKER: workerId, - BRAID_SUPERVISOR_LIVE_ADAPTER: wrongShape, - }, - 2, - ) - assert.match(output, /BRAID_RELEASE_RESULT_JSON=\{"status":"unavailable"/u) + const result = await runSupervisorFlow({ + environment, + invocationId: 'live-required-supervisor-test', + runtime: fixture.api, + providers: {}, + }) + assert.equal(result.status, 'passed') + assert.deepEqual(result.measurements, [ + { kind: 'scalar', name: 'LIVE-11', unit: 'verified-flow', value: 1 }, + ]) + assert.equal(result.steering.effect, 'delivered') + assert.equal(result.steering.replayed, true) + assert.equal(result.cancellation.effect, 'cancelled') + assert.equal(result.terminalTakeover.status, 'attached') + assert.equal(result.proof.facts.spendObserved, true) + assert.equal(result.proof.facts.statusObserved, true) + assert.equal(result.proof.facts.reconnectable, true) + assert.equal(result.proof.facts.cancellationAvailable, true) + assert.equal(assertProofReceipt(result.proof), result.proof) + assert.throws( + () => + assertProofReceipt({ + ...result.proof, + facts: { ...result.proof.facts, cancellationEffect: 'not_live' }, + }), + /cancelled worker effect/u, + ) + assert.throws( + () => + assertProofReceipt({ + ...result.proof, + status: 'partial', + checks: ['snapshot'], + }), + /cannot have a partial status/u, + ) + assert.equal(fixture.calls.filter((call) => call.name === 'writeWorkerSteer').length, 2) + assert.equal(fixture.calls.filter((call) => call.name === 'cancelWorker').length, 2) + assert.equal( + fixture.calls.some((call) => call.name === 'supervisorRunDir'), + true, + ) + assert.equal( + fixture.calls.some((call) => call.name === 'readWorkerCancellation'), + true, + ) +}) - const secret = 'live-required-secret-7e5d' - const throwingAdapter = join(root, 'throwing-supervisor-adapter.mjs') - await writeFile( - throwingAdapter, - 'process.stdout.write(process.env.BRAID_TANGLE_API_KEY)\nthrow new Error(process.env.BRAID_TANGLE_API_KEY)\n', +test('supervisor proof fails closed when a required runtime effect is absent or unclean', async () => { + const cases = [ + [ + 'missing steering acknowledgement', + { steerAcknowledgement: false }, + /worker steer acknowledgement was not acknowledged/u, + ], + ['refused steering effect', { steerEffect: 'refused' }, /did not report delivered effect/u], + [ + 'missing cancellation acknowledgement', + { cancellationAcknowledgement: false }, + /worker cancellation acknowledgement was not acknowledged/u, + ], + [ + 'unclean cancellation effect', + { cancellationEffect: 'not_live' }, + /did not report a proven effect/u, + ], + ] + for (const [label, options, expected] of cases) { + const fixture = createSupervisorProofFixture(options) + await assert.rejects( + () => + runSupervisorFlow({ + environment: { + BRAID_SUPERVISOR_ROOT: fixture.rootDir, + BRAID_SUPERVISOR_ID: fixture.supervisorId, + BRAID_SUPERVISOR_WORKER: fixture.workerId, + BRAID_SUPERVISOR_TIMEOUT_MS: '5', + BRAID_SUPERVISOR_POLL_MS: '1', + }, + invocationId: `live-required-supervisor-${label.replaceAll(' ', '-')}`, + runtime: fixture.api, + }), + expected, + label, ) - const configured = { - ...common, - BRAID_SUPERVISOR_ROOT: root, - BRAID_SUPERVISOR_ID: supervisorId, - BRAID_SUPERVISOR_WORKER: workerId, - BRAID_SUPERVISOR_LIVE_ADAPTER: throwingAdapter, - BRAID_TANGLE_API_KEY: secret, - } - const direct = safeMessage(new Error(`provider rejected ${secret}`), configured) - assert.doesNotMatch(direct, new RegExp(secret, 'u')) - assert.match(direct, /\[REDACTED\]/u) - output = expectedFailureOutput('live-supervisor', configured, 2) - assert.equal(output.includes(secret), false) - assert.match(output, /BRAID_RELEASE_RESULT_JSON=\{"status":"unavailable"/u) - } finally { - await rm(root, { recursive: true, force: true }) } }) +test('supervisor proof rejects incomplete public snapshots before control', async () => { + const fixture = createSupervisorProofFixture({ snapshotCompleteness: 'partial' }) + await assert.rejects( + () => + runSupervisorFlow({ + environment: { + BRAID_SUPERVISOR_ROOT: fixture.rootDir, + BRAID_SUPERVISOR_ID: fixture.supervisorId, + BRAID_SUPERVISOR_WORKER: fixture.workerId, + BRAID_SUPERVISOR_TIMEOUT_MS: '5', + BRAID_SUPERVISOR_POLL_MS: '1', + }, + runtime: fixture.api, + }), + /runtime supervisor snapshot is incomplete/u, + ) + assert.equal( + fixture.calls.some((call) => call.name === 'writeWorkerSteer'), + false, + ) + assert.equal( + fixture.calls.some((call) => call.name === 'cancelWorker'), + false, + ) +}) + +test('supervisor proof fails unavailable when a required Runtime API is missing', async () => { + const fixture = createSupervisorProofFixture() + const runtime = { ...fixture.api } + delete runtime.cancelWorker + await assert.rejects( + () => + runSupervisorFlow({ + environment: { + BRAID_SUPERVISOR_ROOT: fixture.rootDir, + BRAID_SUPERVISOR_ID: fixture.supervisorId, + BRAID_SUPERVISOR_WORKER: fixture.workerId, + }, + runtime, + }), + (error) => { + assert.equal(error.unavailable, true) + assert.equal(error.code, 'RUNTIME_SUPERVISOR_API_REQUIRED') + return true + }, + ) +}) + +test('supervisor proof records unsupported terminal takeover without claiming attachment', async () => { + const fixture = createSupervisorProofFixture() + const result = await runSupervisorFlow({ + environment: { + BRAID_SUPERVISOR_ROOT: fixture.rootDir, + BRAID_SUPERVISOR_ID: fixture.supervisorId, + BRAID_SUPERVISOR_WORKER: fixture.workerId, + BRAID_SUPERVISOR_TIMEOUT_MS: '1000', + BRAID_SUPERVISOR_POLL_MS: '1', + }, + runtime: fixture.api, + }) + assert.equal(result.status, 'passed') + assert.deepEqual(result.terminalTakeover, { + status: 'unavailable', + reason: 'No environment provider source was supplied for exact terminal takeover', + }) + assert.equal(result.proof.facts.terminalTakeover, 'unavailable') +}) + +test('configured supervisor failures are failed and never reported as partial', () => { + let failure + try { + execFileSync(process.execPath, ['scripts/live-required.mjs', 'live-supervisor'], { + cwd: repository, + env: { + ...protectedEnvironment(), + BRAID_SUPERVISOR_ROOT: join(tmpdir(), 'missing-braid-supervisor-root'), + BRAID_SUPERVISOR_ID: 'configured-supervisor', + BRAID_SUPERVISOR_WORKER: 'configured-worker', + BRAID_SUPERVISOR_TIMEOUT_MS: '5', + BRAID_SUPERVISOR_POLL_MS: '1', + }, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }) + } catch (error) { + failure = error + } + assert(failure, 'configured supervisor unexpectedly passed') + assert.equal(failure.status, 1) + const output = `${failure.stdout ?? ''}${failure.stderr ?? ''}` + assert.match(output, /failed against the configured live path/u) + assert.doesNotMatch(output, /status":"partial/u) + assert.doesNotMatch(output, /BRAID_RELEASE_RESULT_JSON=\{"status":"unavailable"/u) +}) + test('configured headless checks execute the real Braid RPC process and validate its marker', async () => { const root = await mkdtemp(join(tmpdir(), 'braid-live-required-script-test-')) const wrapper = join(root, 'fixture-wrapper.mjs') diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index ce67da76..2d0002bc 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -57,7 +57,15 @@ const PROOF_OPERATION_CHECKS = Object.freeze({ 'restart-restored', 'promoted', ]), - [PROOF_OPERATIONS.supervisor]: Object.freeze(['snapshot', 'reconnect', 'steering']), + [PROOF_OPERATIONS.supervisor]: Object.freeze([ + 'snapshot', + 'spend-status', + 'steering', + 'steering-acknowledged', + 'cancellation', + 'reconnect', + 'terminal-takeover', + ]), }) const PROOF_OPERATION_FACT_KEYS = Object.freeze({ @@ -94,6 +102,16 @@ const PROOF_OPERATION_FACT_KEYS = Object.freeze({ 'supervisorId', 'workerId', 'steeringRequestId', + 'steeringOperationId', + 'steeringEffect', + 'cancellationOperationId', + 'cancellationEffect', + 'initialStatus', + 'finalStatus', + 'spendObserved', + 'statusObserved', + 'reconnectable', + 'terminalTakeover', 'cancellationAvailable', ]), }) @@ -371,6 +389,9 @@ function validateProofFacts(operation, status, facts) { if ( key === 'promoted' || key === 'cancellationAvailable' || + key === 'spendObserved' || + key === 'statusObserved' || + key === 'reconnectable' || key === 'processExitedBeforeWorkspaceCleanup' || key === 'terminalResize' || key === 'processGroupExitedBeforeWorkspaceCleanup' @@ -406,6 +427,23 @@ function validateProofFacts(operation, status, facts) { } } +function validatePassedSupervisorReceipt(receipt) { + const { facts } = receipt + for (const key of ['spendObserved', 'statusObserved', 'reconnectable', 'cancellationAvailable']) { + if (facts[key] !== true) throw new Error(`Passed supervisor proof requires ${key} to be true`) + } + if (facts.initialStatus !== 'running') + throw new Error('Passed supervisor proof requires a running worker at the first snapshot') + if (!['cancelled', 'down'].includes(facts.finalStatus)) + throw new Error('Passed supervisor proof requires a terminal cancelled worker snapshot') + if (facts.steeringEffect !== 'delivered') + throw new Error('Passed supervisor proof requires a delivered steering effect') + if (facts.cancellationEffect !== 'cancelled') + throw new Error('Passed supervisor proof requires a cancelled worker effect') + if (!['attached', 'unavailable'].includes(facts.terminalTakeover)) + throw new Error('Passed supervisor proof requires an attached or unavailable terminal takeover') +} + function validatePassedTangleSandboxReceipt(receipt) { if (receipt.run.ids.length === 0) throw new Error('Passed Tangle Sandbox proof requires at least one local run ID') @@ -526,6 +564,8 @@ export function assertProofReceipt(receipt, { invocationId, operation } = {}) { throw new Error('Live proof receipt belongs to a different operation') if (!PROOF_STATUSES.has(receipt.status)) throw new Error('Live proof receipt has an invalid status') + if (receipt.operation === PROOF_OPERATIONS.supervisor && receipt.status === 'partial') + throw new Error('LIVE-11 supervisor proof cannot have a partial status') validTimestamp(receipt.startedAt, 'Live proof startedAt') validTimestamp(receipt.completedAt, 'Live proof completedAt') if (Date.parse(receipt.completedAt) < Date.parse(receipt.startedAt)) @@ -576,6 +616,8 @@ export function assertProofReceipt(receipt, { invocationId, operation } = {}) { receipt.status === 'passed' ) validatePassedTangleSandboxInteractiveReceipt(receipt) + if (receipt.operation === PROOF_OPERATIONS.supervisor && receipt.status === 'passed') + validatePassedSupervisorReceipt(receipt) return receipt } diff --git a/scripts/live-required/supervisor.mjs b/scripts/live-required/supervisor.mjs index b3b43fd0..563f2a24 100644 --- a/scripts/live-required/supervisor.mjs +++ b/scripts/live-required/supervisor.mjs @@ -1,111 +1,769 @@ -import { access, readFile } from 'node:fs/promises' -import { join, resolve } from 'node:path' -import { pathToFileURL } from 'node:url' +import { createHash } from 'node:crypto' import { PROOF_OPERATIONS, proofInvocation, proofReceipt, protectedUnavailable, + scalarMeasurement, } from './contracts.mjs' -export async function runSupervisorFlow({ - repository, - environment, - invocationId = proofInvocation('live-supervisor'), -}) { - const startedAt = new Date().toISOString() - const rootDir = environment.BRAID_SUPERVISOR_ROOT - const supervisorId = environment.BRAID_SUPERVISOR_ID - const workerId = environment.BRAID_SUPERVISOR_WORKER - if (!rootDir || !supervisorId || !workerId) { +const SUPERVISOR_CHECKS = Object.freeze([ + 'snapshot', + 'spend-status', + 'steering', + 'steering-acknowledged', + 'cancellation', + 'reconnect', + 'terminal-takeover', +]) +const DEFAULT_TIMEOUT_MS = 60_000 +const DEFAULT_POLL_INTERVAL_MS = 100 +const SPEND_FIELDS = Object.freeze(['iterations', 'tokensInput', 'tokensOutput', 'usd', 'ms']) +const TOTAL_FIELDS = Object.freeze([ + 'tokensInput', + 'tokensOutput', + 'tokensTotal', + 'usd', + 'latencyMs', +]) + +function requiredText(value, name) { + if (typeof value !== 'string' || value.trim().length === 0) + throw new Error(`${name} must be a non-empty string`) + return value.trim() +} + +function requiredProtectedText(value, name) { + if (typeof value !== 'string' || value.trim().length === 0) throw protectedUnavailable( 'PROTECTED_SUPERVISOR_CONFIGURATION_REQUIRED', - 'Supervisor proof requires BRAID_SUPERVISOR_ROOT, BRAID_SUPERVISOR_ID, and BRAID_SUPERVISOR_WORKER for a real runtime root', + `Supervisor proof requires ${name}`, ) - } - const distRoot = resolve(repository, 'dist', 'adapters', 'runtime') + return value.trim() +} + +function configuredDuration(environment, names, fallback, label) { + const configured = names + .map((name) => environment[name]) + .find((value) => typeof value === 'string' && value.trim().length > 0) + if (configured === undefined) return fallback + const value = Number(configured) + if (!Number.isSafeInteger(value) || value < 1 || value > 300_000) + throw protectedUnavailable( + 'PROTECTED_SUPERVISOR_CONFIGURATION_INVALID', + `${label} must be an integer between 1 and 300000 milliseconds`, + ) + return value +} + +function publicRuntimeApi(runtime) { + if (runtime !== undefined) return runtime + return Promise.all([ + import('@tangle-network/agent-runtime/kernel'), + import('@tangle-network/agent-runtime/tui'), + ]).then(([kernel, tui]) => ({ ...kernel, ...tui })) +} + +async function loadPublicRuntimeApi(runtime) { try { - await access(join(distRoot, 'supervisor-watch.js')) - await access(join(distRoot, 'supervisor-control.js')) + const api = await publicRuntimeApi(runtime) + if (api === null || typeof api !== 'object') + throw new Error('public runtime API is not an object') + return api } catch (error) { throw protectedUnavailable( - 'BRAID_BUILD_REQUIRED', - 'The compiled Braid supervisor adapters are unavailable; run the release build before live checks', + 'RUNTIME_SUPERVISOR_API_REQUIRED', + 'The installed agent-runtime package does not expose the public supervisor APIs', error, ) } - try { - const [{ RuntimeSupervisorWatcher }, { RuntimeSupervisorController }] = await Promise.all([ - import(pathToFileURL(join(distRoot, 'supervisor-watch.js')).href), - import(pathToFileURL(join(distRoot, 'supervisor-control.js')).href), - ]) - const watcher = new RuntimeSupervisorWatcher() - const first = watcher.snapshot(rootDir) - const supervisor = first.supervisors.find((candidate) => candidate.id === supervisorId) - const worker = supervisor?.workers.find( - (candidate) => candidate.id === workerId || candidate.label === workerId, +} + +function requireRuntimeFunctions(runtime) { + const required = [ + 'loadTopSnapshot', + 'supervisorRunDir', + 'writeWorkerSteer', + 'readWorkerSteerAcknowledgement', + 'cancelWorker', + 'readWorkerCancellation', + ] + for (const name of required) { + if (typeof runtime[name] !== 'function') + throw protectedUnavailable( + 'RUNTIME_SUPERVISOR_API_REQUIRED', + `The installed agent-runtime package is missing public supervisor API '${name}'`, + ) + } +} + +function findTarget(snapshot, supervisorId, workerId) { + if ( + snapshot === null || + typeof snapshot !== 'object' || + snapshot.completeness !== 'complete' || + !Array.isArray(snapshot.diagnostics) || + snapshot.diagnostics.length !== 0 + ) { + throw new Error( + `runtime supervisor snapshot is incomplete: ${JSON.stringify({ + completeness: snapshot?.completeness ?? null, + diagnostics: Array.isArray(snapshot?.diagnostics) ? snapshot.diagnostics : null, + })}`, + ) + } + const supervisor = Array.isArray(snapshot.supervisors) + ? snapshot.supervisors.find((candidate) => candidate?.id === supervisorId) + : undefined + const worker = supervisor?.workers?.find((candidate) => candidate?.id === workerId) + if (supervisor === undefined || worker === undefined) { + throw new Error( + `runtime snapshot contains no exact supervisor '${supervisorId}' and worker '${workerId}'`, ) - if (!supervisor || !worker) { + } + if (typeof supervisor.status !== 'string' || supervisor.status.length === 0) + throw new Error(`runtime supervisor '${supervisorId}' has no status`) + if (!['running', 'done', 'down', 'cancelled'].includes(worker.status)) + throw new Error(`runtime worker '${workerId}' has an unknown status`) + return { snapshot, supervisor, worker } +} + +function readTarget(runtime, rootDir, supervisorId, workerId) { + return findTarget(runtime.loadTopSnapshot(rootDir), supervisorId, workerId) +} + +function numericFields(value, fields) { + return ( + value !== null && + typeof value === 'object' && + fields.every((field) => typeof value[field] === 'number' && Number.isFinite(value[field])) + ) +} + +function numericView(value, fields) { + if (!numericFields(value, fields)) return null + return Object.fromEntries(fields.map((field) => [field, value[field]])) +} + +function spendView(supervisor, worker) { + const workerSpend = numericView(worker.spend, SPEND_FIELDS) + const workerMetered = numericView(worker.metered, SPEND_FIELDS) + const driverSpend = numericView(supervisor.driverSpend, SPEND_FIELDS) + const totals = numericView(supervisor.totals, TOTAL_FIELDS) + return { workerSpend, workerMetered, driverSpend, totals } +} + +function knownSpend(view) { + return view.workerSpend !== null && view.workerMetered !== null +} + +function changedSpend(before, after) { + return JSON.stringify(before) !== JSON.stringify(after) +} + +function snapshotObservation(target) { + const spend = spendView(target.supervisor, target.worker) + return { + generatedAt: target.snapshot.generatedAt, + completeness: target.snapshot.completeness, + diagnostics: target.snapshot.diagnostics.length, + supervisor: { + id: target.supervisor.id, + status: target.supervisor.status, + workers: target.supervisor.workers.length, + totals: spend.totals, + }, + worker: { + id: target.worker.id, + status: target.worker.status, + spend: spend.workerSpend, + metered: spend.workerMetered, + }, + } +} + +function delay(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +async function waitForSnapshot({ + runtime, + rootDir, + supervisorId, + workerId, + predicate, + label, + timeoutMs, + pollMs, +}) { + const deadline = Date.now() + timeoutMs + let latest + while (true) { + latest = readTarget(runtime, rootDir, supervisorId, workerId) + if (predicate(latest)) return latest + if (Date.now() >= deadline) throw new Error( - `The configured runtime root contains no supervisor '${supervisorId}' with worker '${workerId}'`, + `${label} was not observed before ${timeoutMs}ms: ${JSON.stringify(snapshotObservation(latest))}`, ) - } - const reconnected = watcher.reconnect(rootDir) - const reconnectedSupervisor = reconnected.supervisors.find( - (candidate) => candidate.id === supervisorId, + await delay(Math.min(pollMs, Math.max(1, deadline - Date.now()))) + } +} + +async function waitForAcknowledgement({ read, eventDir, operationId, label, timeoutMs, pollMs }) { + const deadline = Date.now() + timeoutMs + let latest + while (true) { + latest = read(eventDir, operationId) + if (latest !== undefined) return latest + if (Date.now() >= deadline) + throw new Error( + `${label} was not acknowledged before ${timeoutMs}ms: ${JSON.stringify({ operationId, response: latest })}`, + ) + await delay(Math.min(pollMs, Math.max(1, deadline - Date.now()))) + } +} + +function assertSteerResult(result, workerId, operationId, message) { + if ( + result === null || + typeof result !== 'object' || + result.worker !== workerId || + result.request?.operationId !== operationId || + result.request?.message !== message || + !/^sha256:[0-9a-f]{64}$/u.test(result.request?.requestDigest ?? '') + ) + throw new Error('runtime supervisor returned an invalid worker steer admission') +} + +function assertSteerAcknowledgement(acknowledgement, request, workerId, operationId) { + if ( + acknowledgement === null || + typeof acknowledgement !== 'object' || + acknowledgement.operationId !== operationId || + acknowledgement.worker !== workerId || + acknowledgement.requestDigest !== request.requestDigest || + acknowledgement.effect !== 'delivered' + ) + throw new Error( + `worker steer '${operationId}' did not report delivered effect: ${JSON.stringify({ + worker: acknowledgement.worker, + effect: acknowledgement.effect, + requestDigest: acknowledgement.requestDigest, + })}`, + ) +} + +function assertCancellationAcknowledgement(acknowledgement, workerId, operationId) { + if ( + acknowledgement === null || + typeof acknowledgement !== 'object' || + acknowledgement.operationId !== operationId || + acknowledgement.worker !== workerId || + acknowledgement.effect !== 'cancelled' || + !Array.isArray(acknowledgement.terminated) || + !acknowledgement.terminated.includes(workerId) + ) + throw new Error( + `worker cancellation '${operationId}' did not report a proven effect: ${JSON.stringify({ + worker: acknowledgement.worker, + effect: acknowledgement.effect, + terminated: acknowledgement.terminated, + })}`, + ) +} + +function configuredOperation(environment, name, invocationId) { + return requiredText( + environment[`BRAID_SUPERVISOR_${name}_OPERATION_ID`] ?? + `braid-live-supervisor-${invocationId}-${name.toLowerCase()}`, + `${name} operation id`, + ) +} + +function proofConfig(environment) { + return { + endpoint: environment.BRAID_SUPERVISOR_ENDPOINT ?? null, + connectionId: environment.BRAID_SUPERVISOR_CONNECTION_ID ?? null, + connectionKind: environment.BRAID_SUPERVISOR_CONNECTION_KIND ?? null, + credentialConfigured: + environment.BRAID_SUPERVISOR_CREDENTIAL_CONFIGURED === undefined + ? null + : environment.BRAID_SUPERVISOR_CREDENTIAL_CONFIGURED === '1', + model: environment.BRAID_SUPERVISOR_MODEL ?? null, + runner: environment.BRAID_SUPERVISOR_RUNNER ?? null, + } +} + +/** + * Prove one Runtime supervisor through its published read and control APIs. + * + * The optional `providers` value enables exact terminal takeover when the provider publishes an + * interactive reconnect contract. A missing provider is recorded as unavailable capability, not + * converted into a false attachment. + */ +export async function runSupervisorFlow({ + environment = process.env, + invocationId = proofInvocation('live-supervisor'), + runtime, + providers, +} = {}) { + const startedAt = new Date().toISOString() + const rootDir = requiredProtectedText(environment.BRAID_SUPERVISOR_ROOT, 'BRAID_SUPERVISOR_ROOT') + const supervisorId = requiredProtectedText(environment.BRAID_SUPERVISOR_ID, 'BRAID_SUPERVISOR_ID') + const workerId = requiredProtectedText( + environment.BRAID_SUPERVISOR_WORKER, + 'BRAID_SUPERVISOR_WORKER', + ) + const timeoutMs = configuredDuration( + environment, + ['BRAID_SUPERVISOR_TIMEOUT_MS', 'BRAID_LIVE_REQUIRED_TIMEOUT_MS'], + DEFAULT_TIMEOUT_MS, + 'Supervisor proof timeout', + ) + const pollMs = configuredDuration( + environment, + ['BRAID_SUPERVISOR_POLL_MS'], + DEFAULT_POLL_INTERVAL_MS, + 'Supervisor proof poll interval', + ) + const steerOperationId = configuredOperation(environment, 'STEER', invocationId) + const cancelOperationId = configuredOperation(environment, 'CANCEL', invocationId) + const message = requiredText( + environment.BRAID_SUPERVISOR_MESSAGE ?? `Braid live supervisor ${invocationId}`, + 'BRAID_SUPERVISOR_MESSAGE', + ) + const runtimeApi = await loadPublicRuntimeApi(runtime) + requireRuntimeFunctions(runtimeApi) + + const initial = readTarget(runtimeApi, rootDir, supervisorId, workerId) + if (initial.supervisor.status !== 'running') + throw new Error( + `configured supervisor '${supervisorId}' is ${initial.supervisor.status}; cancellation proof requires a running supervisor`, + ) + if (initial.worker.status !== 'running') + throw new Error( + `configured supervisor worker '${workerId}' is ${initial.worker.status}; cancellation proof requires a live worker`, + ) + const initialSpend = spendView(initial.supervisor, initial.worker) + if (!knownSpend(initialSpend)) + throw new Error(`runtime worker '${workerId}' did not report complete spend fields`) + + const spendUpdated = await waitForSnapshot({ + runtime: runtimeApi, + rootDir, + supervisorId, + workerId, + label: 'worker spend update', + timeoutMs, + pollMs, + predicate: (candidate) => { + const spend = spendView(candidate.supervisor, candidate.worker) + return ( + candidate.worker.status === 'running' && + knownSpend(spend) && + changedSpend(initialSpend, spend) + ) + }, + }) + const updatedSpend = spendView(spendUpdated.supervisor, spendUpdated.worker) + + const reconnected = readTarget(runtimeApi, rootDir, supervisorId, workerId) + if (reconnected.worker.status !== 'running') + throw new Error( + `worker '${workerId}' stopped before reconnectable control proof: ${reconnected.worker.status}`, ) - if (!reconnectedSupervisor?.workers.some((candidate) => candidate.id === worker.id)) { - throw new Error('supervisor reconnect did not recover the selected worker') + const eventDir = requiredText( + runtimeApi.supervisorRunDir(rootDir, supervisorId), + 'Runtime supervisor event directory', + ) + + let terminalTakeover + if (typeof runtimeApi.attachWorker !== 'function') { + terminalTakeover = { status: 'unavailable', reason: 'Runtime has no public attachWorker API' } + } else if (providers === undefined) { + terminalTakeover = { + status: 'unavailable', + reason: 'No environment provider source was supplied for exact terminal takeover', } - const message = environment.BRAID_SUPERVISOR_MESSAGE ?? `Braid live supervisor ${Date.now()}` - const controller = new RuntimeSupervisorController({ watcher }) - const steered = controller.steerWorker(rootDir, supervisorId, worker.id, message, 'braid-live') - if (steered.status !== 'queued' || !steered.requestId || !steered.file) { - throw new Error('runtime supervisor rejected the typed worker steering request') + } else { + const attachment = await runtimeApi.attachWorker(eventDir, workerId, { providers }) + if (attachment?.status === 'available' && attachment.handle !== undefined) { + terminalTakeover = { status: 'attached' } + } else { + terminalTakeover = { + status: 'unavailable', + reason: attachment?.reason ?? 'Runtime did not return an exact interactive handle', + } } - const inbox = await readFile(steered.file, 'utf8') - if (!inbox.includes(message)) - throw new Error('worker inbox did not contain the steering message') - const proof = proofReceipt({ - invocationId, - operation: PROOF_OPERATIONS.supervisor, - startedAt, - completedAt: new Date().toISOString(), - facts: { - supervisorId: supervisor.id, - workerId: worker.id, - steeringRequestId: steered.requestId, - cancellationAvailable: false, + } + + const steer = runtimeApi.writeWorkerSteer(rootDir, supervisorId, workerId, { + operationId: steerOperationId, + message, + source: 'braid-live-supervisor', + interrupt: true, + }) + assertSteerResult(steer, workerId, steerOperationId, message) + const steerReplay = runtimeApi.writeWorkerSteer(rootDir, supervisorId, workerId, { + operationId: steerOperationId, + message, + source: 'braid-live-supervisor', + interrupt: true, + }) + assertSteerResult(steerReplay, workerId, steerOperationId, message) + if ( + steerReplay.replayed !== true || + steerReplay.request.requestDigest !== steer.request.requestDigest + ) + throw new Error('worker steer retry did not replay the same admitted operation') + const steerAcknowledgement = await waitForAcknowledgement({ + read: runtimeApi.readWorkerSteerAcknowledgement, + eventDir, + operationId: steerOperationId, + label: 'worker steer acknowledgement', + timeoutMs, + pollMs, + }) + assertSteerAcknowledgement(steerAcknowledgement, steer.request, workerId, steerOperationId) + + const beforeCancel = readTarget(runtimeApi, rootDir, supervisorId, workerId) + if (beforeCancel.worker.status !== 'running') + throw new Error( + `worker '${workerId}' stopped before cancellation dispatch: ${beforeCancel.worker.status}`, + ) + const cancel = runtimeApi.cancelWorker(eventDir, workerId, cancelOperationId, { + reason: 'Braid live supervisor cancellation proof', + source: 'braid-live-supervisor', + }) + const cancelReplay = runtimeApi.cancelWorker(eventDir, workerId, cancelOperationId, { + reason: 'Braid live supervisor cancellation proof', + source: 'braid-live-supervisor', + }) + if ( + cancel?.operationId !== cancelOperationId || + cancelReplay?.operationId !== cancelOperationId || + cancelReplay?.worker !== workerId + ) + throw new Error('worker cancellation retry did not preserve its operation identity') + const cancellationAcknowledgement = await waitForAcknowledgement({ + read: runtimeApi.readWorkerCancellation, + eventDir, + operationId: cancelOperationId, + label: 'worker cancellation acknowledgement', + timeoutMs, + pollMs, + }) + assertCancellationAcknowledgement(cancellationAcknowledgement, workerId, cancelOperationId) + + const final = await waitForSnapshot({ + runtime: runtimeApi, + rootDir, + supervisorId, + workerId, + label: 'cancelled worker snapshot', + timeoutMs, + pollMs, + predicate: (candidate) => ['cancelled', 'down'].includes(candidate.worker.status), + }) + const persistedCancellation = runtimeApi.readWorkerCancellation(eventDir, cancelOperationId) + assertCancellationAcknowledgement(persistedCancellation, workerId, cancelOperationId) + + const proof = proofReceipt({ + invocationId, + operation: PROOF_OPERATIONS.supervisor, + startedAt, + completedAt: new Date().toISOString(), + config: proofConfig(environment), + facts: { + supervisorId, + workerId, + steeringRequestId: steer.request.operationId, + steeringOperationId: steerOperationId, + steeringEffect: steerAcknowledgement.effect, + cancellationOperationId: cancelOperationId, + cancellationEffect: cancellationAcknowledgement.effect, + initialStatus: initial.worker.status, + finalStatus: final.worker.status, + spendObserved: true, + statusObserved: true, + reconnectable: true, + terminalTakeover: terminalTakeover.status, + cancellationAvailable: true, + }, + checks: SUPERVISOR_CHECKS, + observations: { + snapshots: [ + snapshotObservation(initial), + snapshotObservation(spendUpdated), + snapshotObservation(reconnected), + snapshotObservation(beforeCancel), + snapshotObservation(final), + ], + spend: { initial: initialSpend, updated: updatedSpend }, + steering: { + operationId: steerOperationId, + requestDigest: steer.request.requestDigest, + replayed: steerReplay.replayed === true, + acknowledgement: { + operationId: steerAcknowledgement.operationId, + worker: steerAcknowledgement.worker, + effect: steerAcknowledgement.effect, + detail: steerAcknowledgement.detail, + }, }, - checks: ['snapshot', 'reconnect', 'steering'], - }) - return { - supervisor: supervisor.id, - worker: worker.id, - reconnect: true, - steering: { status: steered.status, requestId: steered.requestId }, - cancellation: 'unavailable: published runtime has no external worker-cancel operation', - proof, - } - } catch (error) { - if (error?.unavailable === true) throw error - throw error + cancellation: { + operationId: cancelOperationId, + acknowledgement: { + operationId: cancellationAcknowledgement.operationId, + worker: cancellationAcknowledgement.worker, + effect: cancellationAcknowledgement.effect, + terminated: cancellationAcknowledgement.terminated, + detail: cancellationAcknowledgement.detail, + }, + replay: { + effect: cancelReplay.effect, + terminated: cancelReplay.terminated, + }, + }, + terminalTakeover, + }, + environment, + }) + return { + status: 'passed', + measurements: [scalarMeasurement('LIVE-11')], + supervisor: supervisorId, + worker: workerId, + steering: { + operationId: steerOperationId, + effect: steerAcknowledgement.effect, + replayed: steerReplay.replayed === true, + }, + cancellation: { + operationId: cancelOperationId, + effect: cancellationAcknowledgement.effect, + replayed: cancelReplay.operationId === cancelOperationId, + }, + reconnect: true, + terminalTakeover, + proof, } } -export async function runSupervisorCheck({ repository, environment }) { - const invocationId = proofInvocation('live-supervisor') - const direct = await runSupervisorFlow({ repository, environment, invocationId }) +export async function runSupervisorCheck({ environment }) { + const direct = await runSupervisorFlow({ environment }) return { - status: 'partial', + status: direct.status, + measurements: direct.measurements, evidence: direct.proof, - unavailable: [ - { - row: 'LIVE-11', - reason: - 'The parent can prove snapshot, reconnect, and steering, but it has no worker-cancel operation. External adapters cannot certify LIVE-11.', - }, - ], + } +} + +function fixtureSpend(iteration) { + return { + iterations: iteration, + tokensInput: iteration * 2, + tokensOutput: iteration, + usd: iteration / 1000, + ms: iteration * 10, + } +} + +function fixtureDigest(value) { + return `sha256:${createHash('sha256').update(JSON.stringify(value)).digest('hex')}` +} + +/** + * Build a deterministic public-runtime substitute for self-tests. + * + * It models the published API and acknowledgement boundaries, including replay-safe operations; + * it never creates or reads Runtime supervisor files. + */ +export function createSupervisorProofFixture({ + rootDir = 'fixture-root', + supervisorId = 'fixture-supervisor', + workerId = 'fixture-worker', + steerAcknowledgement = true, + steerEffect = 'delivered', + cancellationAcknowledgement = true, + cancellationEffect = 'cancelled', + terminalTakeover = 'unavailable', + snapshotCompleteness = 'complete', + snapshotDiagnostics = [], +} = {}) { + let snapshotCount = 0 + let workerStatus = 'running' + let supervisorStatus = 'running' + let spendIteration = 1 + const steerRequests = new Map() + const steerAcks = new Map() + const cancellationAcks = new Map() + const calls = [] + const eventDir = `fixture-event-dir:${supervisorId}` + + function snapshot() { + snapshotCount += 1 + if (workerStatus === 'running' && snapshotCount > 1) spendIteration += 1 + const spend = fixtureSpend(spendIteration) + const worker = { + id: workerId, + label: 'fixture worker', + status: workerStatus, + latencyMs: spend.ms, + spend, + metered: { ...spend }, + liveTail: ['fixture worker is active'], + } + const totals = { + workers: 1, + running: workerStatus === 'running' ? 1 : 0, + done: 0, + down: 0, + cancelled: workerStatus === 'cancelled' ? 1 : 0, + inFlight: workerStatus === 'running' ? 1 : 0, + settled: workerStatus === 'running' ? 0 : 1, + tokensInput: spend.tokensInput, + tokensOutput: spend.tokensOutput, + tokensTotal: spend.tokensInput + spend.tokensOutput, + usd: spend.usd, + latencyMs: spend.ms, + workerLatency: { n: 1, min: spend.ms, median: spend.ms, p90: spend.ms, max: spend.ms }, + } + return { + root: rootDir, + generatedAt: snapshotCount, + supervisors: [ + { + id: supervisorId, + status: supervisorStatus, + task: 'deterministic supervisor proof', + workspaceDir: rootDir, + budget: 1, + stateDir: eventDir, + workers: [worker], + progressTail: ['fixture progress'], + journalTail: [], + driverSpend: { ...spend }, + totals, + }, + ], + completeness: snapshotCompleteness, + diagnostics: snapshotDiagnostics, + discovered: 1, + loaded: 1, + } + } + + const api = { + loadTopSnapshot(root) { + calls.push({ name: 'loadTopSnapshot', root }) + return snapshot() + }, + supervisorRunDir(root, id) { + calls.push({ name: 'supervisorRunDir', root, id }) + if (root !== rootDir || id !== supervisorId) throw new Error('fixture event lookup mismatch') + return eventDir + }, + writeWorkerSteer(root, id, worker, options) { + calls.push({ name: 'writeWorkerSteer', root, id, worker, options: { ...options } }) + if (root !== rootDir || id !== supervisorId || worker !== workerId) + throw new Error('fixture steer target mismatch') + const operation = { + operationId: options.operationId, + worker, + message: options.message, + source: options.source ?? 'human', + interrupt: options.interrupt === true, + } + const requestDigest = fixtureDigest(operation) + const prior = steerRequests.get(options.operationId) + if (prior !== undefined && prior.request.requestDigest !== requestDigest) + throw new Error('fixture steer operation body changed on retry') + const request = prior?.request ?? { + schemaVersion: 1, + operationId: options.operationId, + requestDigest, + at: '2026-08-28T00:00:00.000Z', + source: operation.source, + worker, + message: options.message, + interrupt: operation.interrupt, + } + steerRequests.set(options.operationId, { request }) + if (steerAcknowledgement && !steerAcks.has(options.operationId)) + steerAcks.set(options.operationId, { + schemaVersion: 1, + operationId: options.operationId, + requestDigest, + worker, + effect: steerEffect, + requestedAt: request.at, + observedAt: '2026-08-28T00:00:00.001Z', + detail: `fixture steer ${steerEffect}`, + }) + return { + worker, + file: `fixture-steer-request:${options.operationId}`, + request, + replayed: prior !== undefined, + ...(steerAcks.has(options.operationId) + ? { acknowledgement: steerAcks.get(options.operationId) } + : {}), + } + }, + readWorkerSteerAcknowledgement(event, operationId) { + calls.push({ name: 'readWorkerSteerAcknowledgement', event, operationId }) + return steerAcks.get(operationId) + }, + cancelWorker(event, worker, operationId, options) { + calls.push({ name: 'cancelWorker', event, worker, operationId, options: { ...options } }) + if (event !== eventDir || worker !== workerId) + throw new Error('fixture cancel target mismatch') + if (cancellationAcks.has(operationId)) return cancellationAcks.get(operationId) + if (cancellationAcknowledgement) { + workerStatus = cancellationEffect === 'cancelled' ? 'cancelled' : 'done' + supervisorStatus = 'completed' + const acknowledgement = { + operationId, + worker, + effect: cancellationEffect, + requestedAt: '2026-08-28T00:00:00.002Z', + observedAt: '2026-08-28T00:00:00.003Z', + reason: options?.reason, + detail: `fixture cancellation ${cancellationEffect}`, + terminated: cancellationEffect === 'cancelled' ? [workerId] : [], + } + cancellationAcks.set(operationId, acknowledgement) + return acknowledgement + } + return { + operationId, + worker, + effect: 'unknown', + requestedAt: '2026-08-28T00:00:00.002Z', + observedAt: '2026-08-28T00:00:00.002Z', + terminated: [], + } + }, + readWorkerCancellation(event, operationId) { + calls.push({ name: 'readWorkerCancellation', event, operationId }) + return cancellationAcks.get(operationId) + }, + async attachWorker(event, worker, options) { + calls.push({ name: 'attachWorker', event, worker, providers: options?.providers }) + if (event !== eventDir || worker !== workerId) + throw new Error('fixture attach target mismatch') + if (terminalTakeover === 'attached') return { status: 'available', handle: { fixture: true } } + return { status: 'unavailable', reason: 'fixture has no interactive process' } + }, + } + + return { + api, + calls, + rootDir, + supervisorId, + workerId, } } From 8e429ce4ecc0ded9211aac5a19582e0e148f37a3 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 09:35:24 -0600 Subject: [PATCH 021/136] fix(live-proof): separate provider environment identity --- scripts/live-required.test.mjs | 14 ++++--- scripts/live-required/multirun-contract.mjs | 42 ++++++++++++------- .../tangle-sandbox-braid-multirun.mjs | 13 ++++-- .../tangle-sandbox-braid-multirun.test.mjs | 2 +- test/tangle-live07-wiring.test.mjs | 12 +++--- 5 files changed, 52 insertions(+), 31 deletions(-) diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index c45fc369..ba1c3bcc 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -1,7 +1,7 @@ import assert from 'node:assert/strict' import { execFileSync } from 'node:child_process' import { EventEmitter } from 'node:events' -import { access, chmod, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' +import { access, chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join, resolve } from 'node:path' import test from 'node:test' @@ -135,7 +135,8 @@ function validMultirunProof() { branchId: 'branch-a', eventCount: 2, eventIdsUnique: true, - environmentId: 'environment-a', + localEnvironmentId: 'local-environment-a', + providerEnvironmentId: 'environment-a', identifiers: [ { kind: 'provider-environment', id: 'environment-a' }, { kind: 'provider-session', id: 'session-a' }, @@ -150,7 +151,8 @@ function validMultirunProof() { branchId: 'branch-b', eventCount: 2, eventIdsUnique: true, - environmentId: 'environment-b', + localEnvironmentId: 'local-environment-b', + providerEnvironmentId: 'environment-b', identifiers: [ { kind: 'provider-environment', id: 'environment-b' }, { kind: 'provider-session', id: 'session-b' }, @@ -161,7 +163,7 @@ function validMultirunProof() { }, ] return { - schemaVersion: 'braid.live-required.multirun.v1', + schemaVersion: 'braid.live-required.multirun.v2', status: 'passed', provider: { endpoint: 'https://sandbox.tangle.tools', @@ -214,13 +216,13 @@ function validMultirunProof() { resources: [ { runId: 'multirun-a', - environmentId: 'environment-a', + providerEnvironmentId: 'environment-a', id: 'resource-a', confirmed: true, }, { runId: 'multirun-b', - environmentId: 'environment-b', + providerEnvironmentId: 'environment-b', id: 'resource-b', confirmed: true, }, diff --git a/scripts/live-required/multirun-contract.mjs b/scripts/live-required/multirun-contract.mjs index 41d7a216..208b242c 100644 --- a/scripts/live-required/multirun-contract.mjs +++ b/scripts/live-required/multirun-contract.mjs @@ -21,7 +21,7 @@ const REQUIRED_PHASES = Object.freeze([ 'provider.observe', ]) -export const MULTIRUN_PROOF_SCHEMA = 'braid.live-required.multirun.v1' +export const MULTIRUN_PROOF_SCHEMA = 'braid.live-required.multirun.v2' export { REQUIRED_PHASES as MULTIRUN_REQUIRED_PHASES } const PROVIDER_IDENTIFIER_KINDS = Object.freeze([ @@ -53,7 +53,14 @@ function assertRun(run, index) { `multirun proof run ${index} has no streamed events`, ) assert(run.eventIdsUnique === true, `multirun proof run ${index} has duplicate event identities`) - assert(text(run.environmentId), `multirun proof run ${index} has no environment id`) + assert( + text(run.localEnvironmentId), + `multirun proof run ${index} has no local environment id`, + ) + assert( + text(run.providerEnvironmentId), + `multirun proof run ${index} has no provider environment id`, + ) assert( Array.isArray(run.identifiers) && run.identifiers.length === PROVIDER_IDENTIFIER_KINDS.length && @@ -66,12 +73,8 @@ function assertRun(run, index) { `multirun proof run ${index} has incomplete provider identity`, ) assert( - run.identifiers[0].id === run.environmentId, - `multirun proof run ${index} has a mismatched environment identity`, - ) - assert( - run.identifiers[3].id === run.runId, - `multirun proof run ${index} has a mismatched run identity`, + run.identifiers[0].id === run.providerEnvironmentId, + `multirun proof run ${index} has a mismatched provider environment identity`, ) } @@ -132,6 +135,10 @@ export function assertMultirunProof(proof) { new Set(proof.runs.map((run) => run.branchId)).size === 2, 'LIVE-07 runs are not on independent branches', ) + assert( + new Set(proof.runs.map((run) => run.localEnvironmentId)).size === 2, + 'LIVE-07 multirun proof reused a local environment identity', + ) const conversations = new Map([ [proof.conversations.first.conversationId, proof.conversations.first.branchId], [proof.conversations.second.conversationId, proof.conversations.second.branchId], @@ -140,11 +147,15 @@ export function assertMultirunProof(proof) { proof.runs.every((run) => conversations.get(run.conversationId) === run.branchId), 'LIVE-07 runs do not bind to the recorded conversations and branches', ) - const providerIdentifiers = proof.runs.flatMap((run) => run.identifiers.map(({ id }) => id)) - assert( - new Set(providerIdentifiers).size === providerIdentifiers.length, - 'LIVE-07 multirun proof reused a provider identity', - ) + for (const kind of PROVIDER_IDENTIFIER_KINDS) { + const identifiers = proof.runs.map( + (run) => run.identifiers.find((identifier) => identifier.kind === kind)?.id, + ) + assert( + new Set(identifiers).size === proof.runs.length, + `LIVE-07 multirun proof reused a ${kind} identity`, + ) + } assert(object(proof.overlap), 'LIVE-07 multirun overlap evidence is missing') assert( @@ -272,7 +283,7 @@ export function assertMultirunProof(proof) { (resource) => object(resource) && text(resource.runId) && - text(resource.environmentId) && + text(resource.providerEnvironmentId) && text(resource.id) && resource.confirmed === true, ), @@ -281,7 +292,8 @@ export function assertMultirunProof(proof) { const runsById = new Map(proof.runs.map((run) => [run.runId, run])) assert( proof.cleanup.resources.every( - (resource) => resource.environmentId === runsById.get(resource.runId)?.environmentId, + (resource) => + resource.providerEnvironmentId === runsById.get(resource.runId)?.providerEnvironmentId, ), 'LIVE-07 multirun cleanup did not bind provider environments to runs', ) diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index f1336d8f..c8233afa 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -935,11 +935,15 @@ export async function runProof({ for (const [runId, controlRef] of controls) { try { const result = await cleanupRetainedResourceByControlRef(client, controlRef) - cleanup.resources.push({ runId, environmentId: controlRef.environmentId, ...result }) + cleanup.resources.push({ + runId, + providerEnvironmentId: controlRef.environmentId, + ...result, + }) } catch (error) { cleanup.errors.push({ runId, - environmentId: controlRef.environmentId, + providerEnvironmentId: controlRef.environmentId, error: safeMessage(error, environment), }) } @@ -959,7 +963,7 @@ export async function runProof({ assert.equal(await client.get(resource.id), null) cleanup.resources.push({ runId: null, - environmentId: null, + providerEnvironmentId: null, id: resource.id, discovered: true, confirmed: true, @@ -1060,7 +1064,8 @@ export async function runProof({ provider: viewRun?.provider ?? null, runner: viewRun?.runner ?? null, model: viewRun?.model ?? null, - environmentId: viewRun?.environmentId ?? null, + localEnvironmentId: viewRun?.environmentId ?? null, + providerEnvironmentId: controlRef?.environmentId ?? null, materializationDigest: viewRun?.materializationDigest ?? null, cursor: viewRun?.cursor ?? null, contentBytes: viewRun?.contentBytes ?? null, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs index 2822084f..1f143e21 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs @@ -224,7 +224,7 @@ test('multirun release contract rejects missing, failed, or unclean evidence', ( ) assert.throws( () => - assertMultirunProof({ schemaVersion: 'braid.live-required.multirun.v1', status: 'failed' }), + assertMultirunProof({ schemaVersion: 'braid.live-required.multirun.v2', status: 'failed' }), /evidence did not pass/u, ) }) diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 6c6fc933..7f2b9daf 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -77,7 +77,8 @@ function passedMultirunProof() { branchId: 'branch-a', eventCount: 2, eventIdsUnique: true, - environmentId: 'environment-a', + localEnvironmentId: 'local-environment-a', + providerEnvironmentId: 'environment-a', identifiers: [ { kind: 'provider-environment', id: 'environment-a' }, { kind: 'provider-session', id: 'session-a' }, @@ -92,7 +93,8 @@ function passedMultirunProof() { branchId: 'branch-b', eventCount: 2, eventIdsUnique: true, - environmentId: 'environment-b', + localEnvironmentId: 'local-environment-b', + providerEnvironmentId: 'environment-b', identifiers: [ { kind: 'provider-environment', id: 'environment-b' }, { kind: 'provider-session', id: 'session-b' }, @@ -103,7 +105,7 @@ function passedMultirunProof() { }, ] return { - schemaVersion: 'braid.live-required.multirun.v1', + schemaVersion: 'braid.live-required.multirun.v2', status: 'passed', provider: { endpoint: 'https://sandbox.tangle.tools', @@ -152,13 +154,13 @@ function passedMultirunProof() { resources: [ { runId: 'multirun-a', - environmentId: 'environment-a', + providerEnvironmentId: 'environment-a', id: 'resource-a', confirmed: true, }, { runId: 'multirun-b', - environmentId: 'environment-b', + providerEnvironmentId: 'environment-b', id: 'resource-b', confirmed: true, }, From b5bea05f5b3bae46d994fef9e60dff2b13f467ac Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 09:36:32 -0600 Subject: [PATCH 022/136] feat(supervision): route retry-safe worker steering --- src/adapters/runtime/supervisor-control.ts | 34 +++++++++++++--- src/adapters/tui/ui-capabilities.ts | 16 ++++---- src/adapters/tui/ui-intelligence-dispatch.ts | 3 ++ src/app/supervisor-service.ts | 12 +++++- test/analysis-supervision.test.ts | 20 ++++++---- test/intelligence-dispatch.test.ts | 41 +++++++++++++++----- 6 files changed, 94 insertions(+), 32 deletions(-) diff --git a/src/adapters/runtime/supervisor-control.ts b/src/adapters/runtime/supervisor-control.ts index 26d9fec2..5eb26db7 100644 --- a/src/adapters/runtime/supervisor-control.ts +++ b/src/adapters/runtime/supervisor-control.ts @@ -3,6 +3,8 @@ import { cancelWorker, type RunCancellation, type WorkerCancellation, + type WorkerSteerAcknowledgement, + type WorkerSteerRequest, writeWorkerSteer, } from '@tangle-network/agent-runtime/kernel' import type { SupervisorView, WorkerView } from '@tangle-network/agent-runtime/tui' @@ -20,10 +22,14 @@ export interface SupervisorCapabilityIssue { } export interface SupervisorWorkerSteerResult { - readonly status: 'queued' | 'unavailable' + readonly status: 'queued' | 'acknowledged' | 'unavailable' readonly worker: string - readonly requestId?: string + readonly operationId?: string + readonly requestDigest?: WorkerSteerRequest['requestDigest'] readonly file?: string + readonly replayed?: boolean + readonly effect?: WorkerSteerAcknowledgement['effect'] + readonly detail?: string readonly issue?: SupervisorCapabilityIssue } @@ -95,8 +101,10 @@ export class RuntimeSupervisorController { rootDir: string, supervisorId: string, workerIdOrLabel: string, + operationId: string, message: string, source = 'braid', + interrupt = false, ): SupervisorWorkerSteerResult { const snapshot = this.#watcher.snapshot(rootDir) const supervisor = snapshot.supervisors.find((candidate) => candidate.id === supervisorId) @@ -109,12 +117,28 @@ export class RuntimeSupervisorController { issue: missingWorkerIssue(workerIdOrLabel), } } - const result = this.#write(rootDir, supervisorId, worker.label, message, source) + const result = this.#write(rootDir, supervisorId, worker.id, { + operationId, + message, + source, + interrupt, + }) return { - status: 'queued', + status: + result.acknowledgement !== undefined && result.acknowledgement.effect !== 'unknown' + ? 'acknowledged' + : 'queued', worker: result.worker, - requestId: result.request.id, + operationId: result.request.operationId, + requestDigest: result.request.requestDigest, file: result.file, + replayed: result.replayed, + ...(result.acknowledgement === undefined + ? {} + : { + effect: result.acknowledgement.effect, + detail: result.acknowledgement.detail, + }), } } diff --git a/src/adapters/tui/ui-capabilities.ts b/src/adapters/tui/ui-capabilities.ts index f59e6754..dc20dc7e 100644 --- a/src/adapters/tui/ui-capabilities.ts +++ b/src/adapters/tui/ui-capabilities.ts @@ -1,4 +1,4 @@ -import { activeRunForBranch, isLiveRunStatus, type BraidState } from '../../domain/state.js' +import { activeRunForBranch, type BraidState, isLiveRunStatus } from '../../domain/state.js' import type { CapabilityMap } from '../../views/shared/models.js' import type { UiFixture } from './ui-fixtures.js' @@ -20,8 +20,6 @@ export const UNSUPPORTED = Object.freeze({ 'run.attach': 'Native terminal attachment requires an interactive TUI and a retained session', 'supervisor.worker.attach': 'The runtime snapshot does not carry the retained interactive reference required to attach to an exact worker', - 'supervisor.worker.steer': - 'The runtime steer API generates a new request identifier on every call and cannot replay a caller operation identifier safely', 'export.create': 'Redacted export is not exposed by the current storage adapter', } satisfies Readonly>) @@ -102,11 +100,13 @@ export function capabilityMap( source: 'runtime', reason: 'Initialize a workspace before refreshing runtime supervision', } - capabilities['supervisor.worker.steer'] = { - available: false, - source: 'runtime', - reason: UNSUPPORTED['supervisor.worker.steer'], - } + capabilities['supervisor.worker.steer'] = hasRunningWorker + ? { available: true, source: 'runtime' } + : { + available: false, + source: 'runtime', + reason: 'There is no running supervised worker to steer', + } capabilities['supervisor.worker.cancel'] = hasRunningWorker ? { available: true, source: 'runtime' } : { diff --git a/src/adapters/tui/ui-intelligence-dispatch.ts b/src/adapters/tui/ui-intelligence-dispatch.ts index 25d9424f..c7a53e72 100644 --- a/src/adapters/tui/ui-intelligence-dispatch.ts +++ b/src/adapters/tui/ui-intelligence-dispatch.ts @@ -356,11 +356,14 @@ async function dispatchSupervisorWorker( if (typeof text !== 'string') { invalid('INVALID_PARAMS', 'steer_worker requires supervisorId, workerId, and text') } + if (operationId === undefined) + invalid('OPERATION_ID_REQUIRED', 'steer_worker requires operationId') try { const result = await context.app.intelligence.supervisor.steerWorker( reference.rootDir, reference.runtimeSupervisorId, reference.runtimeWorkerId, + operationId, text, ) if (result.status === 'unavailable') { diff --git a/src/app/supervisor-service.ts b/src/app/supervisor-service.ts index 2c3fba69..ae675ea2 100644 --- a/src/app/supervisor-service.ts +++ b/src/app/supervisor-service.ts @@ -75,11 +75,21 @@ export class SupervisorService { rootDir: string, supervisorId: string, workerIdOrLabel: string, + operationId: string, message: string, source?: string, + interrupt?: boolean, ): Promise { const controller = await this.#loadController() - return controller.steerWorker(rootDir, supervisorId, workerIdOrLabel, message, source) + return controller.steerWorker( + rootDir, + supervisorId, + workerIdOrLabel, + operationId, + message, + source, + interrupt, + ) } async cancelWorker( diff --git a/test/analysis-supervision.test.ts b/test/analysis-supervision.test.ts index c31f711a..c841126a 100644 --- a/test/analysis-supervision.test.ts +++ b/test/analysis-supervision.test.ts @@ -833,17 +833,20 @@ test('runtime supervisor adapter persists projections and routes exact cancel op let runCancelInput: { readonly eventDir: string; readonly operationId: string } | undefined const controller = new RuntimeSupervisorController({ watcher, - write: (_rootDir, supervisorId, workerLabel, message, source) => ({ - worker: workerLabel, + write: (_rootDir, _supervisorId, workerId, options) => ({ + worker: workerId, file: '/tmp/braid/.agent/inbox/request.json', request: { - id: 'request-1', + schemaVersion: 1, + operationId: options.operationId, + requestDigest: `sha256:${'a'.repeat(64)}`, at: NOW, - supervisorId, - worker: workerLabel, - message, - source: source ?? 'braid', + worker: workerId, + message: options.message, + source: options.source ?? 'braid', + interrupt: options.interrupt === true, }, + replayed: false, }), cancelWorker: (eventDir, worker, operationId, options) => { workerCancelInput = { eventDir, worker, operationId } @@ -891,10 +894,11 @@ test('runtime supervisor adapter persists projections and routes exact cancel op '/tmp/braid', 'runtime-supervisor-1', 'worker-one', + 'op-steer-worker-1', 'inspect this', ) assert.equal(queued.status, 'queued') - if (queued.status === 'queued') assert.equal(queued.requestId, 'request-1') + if (queued.status === 'queued') assert.equal(queued.operationId, 'op-steer-worker-1') const cancelledWorker = await service.cancelWorker( '/tmp/braid', 'runtime-supervisor-1', diff --git a/test/intelligence-dispatch.test.ts b/test/intelligence-dispatch.test.ts index 35890ddf..6960f52a 100644 --- a/test/intelligence-dispatch.test.ts +++ b/test/intelligence-dispatch.test.ts @@ -315,7 +315,7 @@ test('runtime supervisors stay unbound until each runtime id is explicitly assig await app.close() }) -test('supervisor controls resolve public ids while non-idempotent steering and attach fail closed', async () => { +test('supervisor controls resolve public ids and preserve retry-safe operation ids', async () => { const raw = supervisionSnapshot([{ id: 'runtime-worker-control', label: 'worker-control' }]) const watcher = new RuntimeSupervisorWatcher(() => raw) let writeInput: @@ -323,6 +323,7 @@ test('supervisor controls resolve public ids while non-idempotent steering and a readonly rootDir: string readonly supervisorId: string readonly worker: string + readonly operationId: string readonly message: string } | undefined @@ -332,19 +333,28 @@ test('supervisor controls resolve public ids while non-idempotent steering and a let supervisorCancelInput: { readonly eventDir: string; readonly operationId: string } | undefined const runtimeController = new RuntimeSupervisorController({ watcher, - write: (rootDir, supervisorId, worker, message, source) => { - writeInput = { rootDir, supervisorId, worker, message } + write: (rootDir, supervisorId, worker, options) => { + writeInput = { + rootDir, + supervisorId, + worker, + operationId: options.operationId, + message: options.message, + } return { worker, file: '/workspace/.agent/inbox/request.json', request: { - id: 'request-public-ids', + schemaVersion: 1, + operationId: options.operationId, + requestDigest: `sha256:${'a'.repeat(64)}`, at: NOW, - supervisorId, worker, - message, - source: source ?? 'braid', + message: options.message, + source: options.source ?? 'braid', + interrupt: options.interrupt === true, }, + replayed: false, } }, cancelWorker: (eventDir, worker, operationId) => { @@ -403,9 +413,20 @@ test('supervisor controls resolve public ids while non-idempotent steering and a text: 'inspect the failing test', }, }) - assert.equal(steered.kind, 'unavailable') - if (steered.kind === 'unavailable') assert.match(steered.reason, /operation identifier/u) - assert.equal(writeInput, undefined) + assert.equal(steered.kind, 'accepted') + if (steered.kind === 'accepted') { + assert.equal( + (steered.data as { readonly operationId: string }).operationId, + 'op-steer-public-worker', + ) + } + assert.deepEqual(writeInput, { + rootDir: '/workspace', + supervisorId: 'runtime-supervisor-live', + worker: 'runtime-worker-control', + operationId: 'op-steer-public-worker', + message: 'inspect the failing test', + }) const cancelledWorker = await controller.dispatch({ type: 'headless-command', From 53fd4b916baabc02221fd6d8a9d7762754929894 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 09:51:07 -0600 Subject: [PATCH 023/136] feat(live-supervisor): provision owned runtime proof runs --- docs/08-verification.md | 16 + docs/09-delivery-plan.md | 2 +- docs/components/supervision.md | 49 +- scripts/live-required.test.mjs | 231 +++++++ scripts/live-required/contracts.mjs | 63 ++ scripts/live-required/supervisor.mjs | 625 ++++++++++++------ .../tangle-sandbox-braid-multirun.mjs | 1 - 7 files changed, 783 insertions(+), 204 deletions(-) diff --git a/docs/08-verification.md b/docs/08-verification.md index 494cc4f7..b99e63a9 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -382,6 +382,14 @@ If a required live provider is unavailable, the release is blocked and the manif `LIVE-11` uses one reusable flow over the published `@tangle-network/agent-runtime/kernel` and `@tangle-network/agent-runtime/tui` APIs. +The protected command calls Runtime `provisionSupervisor` when no complete external supervisor binding is configured. + +Runtime creates the root, worker, acknowledger, and provider-owned process binding through its public APIs. + +The command discovers exact identifiers from the returned Runtime receipt instead of requiring pre-existing `BRAID_SUPERVISOR_*` identifiers. + +The three `BRAID_SUPERVISOR_ROOT`, `BRAID_SUPERVISOR_ID`, and `BRAID_SUPERVISOR_WORKER` values remain an all-or-nothing override for an externally managed run. + The flow rejects incomplete snapshots and requires an exact supervisor identifier, exact worker identifier, root status, worker status, and complete spend fields. It observes a spend change while the worker remains running before it admits any control operation. @@ -396,6 +404,14 @@ When a provider supplies the exact interactive reconnect contract, the flow reco When no provider supplies that contract, the flow records the explicit unavailable reason and makes no attachment claim. +When Runtime reports that the provider supports terminal takeover, an unavailable attachment fails the check. + +An owned run always invokes its Runtime cleanup function after success or failure. + +Cleanup must return the exact root, supervisor, and worker identifiers, terminal statuses, `resourcesReleased: true`, and an empty `remainingResources` list. + +The receipt validator rejects mismatched identifiers, incomplete cleanup, and leaked resources. + The check returns the `LIVE-11` measurement only after every required effect and reconnect assertion passes; it never returns a partial result. ### Tangle Sandbox durability stress diff --git a/docs/09-delivery-plan.md b/docs/09-delivery-plan.md index 8419a984..5fc8408a 100644 --- a/docs/09-delivery-plan.md +++ b/docs/09-delivery-plan.md @@ -368,7 +368,7 @@ The UI proof includes the source and destination file state of a real cloud envi - Implement feedback trajectory export from structured decisions. - Implement the complete graph with conversation, branch, turn, run, analysis, environment, checkpoint, supervisor, and worker nodes and named edges. - Implement runtime-owned supervisor snapshot watch, activity, log tail, typed steering, typed cancellation, and reconnect through the published Runtime APIs. -- Make the `LIVE-11` release proof require complete root and worker observation, changed spend, acknowledged steering, proven cancellation, stable operation retries, and a fresh reconnect snapshot. +- Make the `LIVE-11` release proof provision an owned Runtime root and worker, validate complete observation, changed spend, acknowledged steering, proven cancellation, stable operation retries, fresh reconnect, and exact cleanup. - Record exact terminal takeover only when Runtime returns an opaque handle for a registered provider; preserve the explicit unavailable capability otherwise. - Keep direct-turn, trace-analysis, and delegated-worker usage separate until Runtime exports stable shared call identity. - Add calibrated semantic cases and raw evidence capture. diff --git a/docs/components/supervision.md b/docs/components/supervision.md index 891ff766..e67d3512 100644 --- a/docs/components/supervision.md +++ b/docs/components/supervision.md @@ -8,6 +8,12 @@ The supervisor graph shows the runtime-owned tree of active supervisors and work Read the canonical runtime supervisor snapshot through the shared Runtime API. +The protected LIVE-11 command provisions one Runtime-owned supervisor when no external run is supplied. + +The Runtime provisioner creates the root, worker, acknowledger, and provider binding through its public APIs. + +The provisioner returns exact identifiers and an owner-scoped cleanup function. + Project it into bounded `GraphNodeView` rows with stable supervisor, worker, run, and parent identifiers. Render it through `GraphView` and the shared entity browser. @@ -22,6 +28,10 @@ Use `attachWorker` only when an exact provider source exists and the runtime ret Do not read `.agent/supervisor` files or infer control support from worker status text. +The protected command accepts `BRAID_SUPERVISOR_ROOT`, `BRAID_SUPERVISOR_ID`, and `BRAID_SUPERVISOR_WORKER` only as an all-or-nothing external-run override. + +Those identifiers are not the normal path and Braid never cleans up an external run it does not own. + ## Component map | Component | Responsibility | @@ -30,6 +40,7 @@ Do not read `.agent/supervisor` files or infer control support from worker statu | `RuntimeSupervisorWatcher` | Read and refresh the Runtime-owned immutable snapshot. | | `RuntimeSupervisorController` | Resolve one exact worker and route typed steer, cancel, and attach operations. | | `SupervisorService` | Serialize projection commits and expose the supervisor port to the application. | +| `RuntimeSupervisorProvisioner` | Ask Runtime to create one owned proof run and validate its cleanup receipt. | The runtime owns graph reads, control reconciliation, and live worker state. @@ -69,7 +80,11 @@ Steer appears only when the runtime reports steer support for that worker. Cancel appears only when the runtime reports cancellation support. -Attach remains disabled until Runtime exposes an external-client attach contract. +Attach remains unavailable until Runtime exposes an external-client attach contract. + +If Runtime reports that the selected provider supports terminal takeover, LIVE-11 requires a successful exact attach. + +A failed attach never becomes a simulated terminal row. The disabled action includes that exact reason. @@ -105,10 +120,40 @@ Tests cover hierarchy, cycles, missing parents, two supervisors, status updates, The deterministic supervisor fixture exercises the same public Runtime API shape without creating supervisor files. -Live proof requires a real root and worker stream, a changed spend observation, acknowledged steering, proven cancellation, and a fresh reconnect snapshot. +Live proof provisions a real root and worker through Runtime, then requires a stream, a changed spend observation, acknowledged steering, proven cancellation, and a fresh reconnect snapshot. The release check records terminal takeover as attached or unavailable and never treats an unavailable provider as an attachment. +An owned proof run must return a completed cleanup receipt with terminal root and worker status, `resourcesReleased: true`, and no remaining resources. + +The receipt validator binds cleanup to the provisioned root, supervisor, and worker identifiers. + +Cleanup runs after a passing proof and after every failed observation or control attempt. + +The proof records configured external runs as `not-owned` and records the owner-scoped cleanup receipt for provisioned runs. + +Runtime provisioner contract: + +```text +provisionSupervisor({ invocationId, environment, workspaceDir, timeoutMs, pollMs, profile?, connection? }) + -> { rootDir, supervisorId, workerId, providers?, terminalTakeover, cleanup() } +cleanup() + -> { status: "completed", rootDir, supervisorId, workerId, + supervisorStatus, workerStatus, resourcesReleased: true, remainingResources: [] } +``` + +The environment argument contains only supervisor selectors, endpoints, model and runner preferences, workspace, and opaque credential references. + +The optional profile is the canonical `AgentProfile` supplied by the caller. + +The optional connection is the caller's connection record. + +The Runtime creates its canonical default profile and connection when those optional values are absent. + +The environment argument is never written into the proof receipt. + +The Runtime owns all supervisor files and provider resources created by this contract. + ## Non-goals Braid does not implement a supervisor, agent loop, worker process, or attach transport. diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index ba1c3bcc..a75f3375 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -110,6 +110,8 @@ function protectedEnvironment() { 'BRAID_SUPERVISOR_ROOT', 'BRAID_SUPERVISOR_ID', 'BRAID_SUPERVISOR_WORKER', + 'BRAID_SUPERVISOR_WORKSPACE', + 'BRAID_SUPERVISOR_CREDENTIAL_REF', 'BRAID_SUPERVISOR_LIVE_ADAPTER', ]) delete environment[name] @@ -1000,6 +1002,235 @@ test('supervisor proof records unsupported terminal takeover without claiming at assert.equal(result.proof.facts.terminalTakeover, 'unavailable') }) +test('supervisor proof provisions an owned Runtime run and validates cleanup', async () => { + const fixture = createSupervisorProofFixture({ terminalTakeover: 'attached' }) + const environment = { + ...protectedEnvironment(), + BRAID_SUPERVISOR_ENDPOINT: 'https://router.example/v1', + BRAID_SUPERVISOR_CREDENTIAL_REF: 'cred:v1:supervisor-proof', + BRAID_SUPERVISOR_WORKSPACE: '/tmp/supervisor-proof-workspace', + BRAID_SUPERVISOR_API_KEY: 'must-not-cross-the-provision-boundary', + BRAID_SUPERVISOR_AUTH: 'must-not-cross-the-provision-boundary', + BRAID_SUPERVISOR_TIMEOUT_MS: '1000', + BRAID_SUPERVISOR_POLL_MS: '1', + BRAID_SUPERVISOR_MESSAGE: 'inspect the provisioned worker', + } + let provisionRequest + let cleanupCalls = 0 + const result = await runSupervisorFlow({ + environment, + invocationId: 'live-required-supervisor-provisioned', + runtime: { + ...fixture.api, + provisionSupervisor: async (request) => { + provisionRequest = request + return { + rootDir: fixture.rootDir, + supervisorId: fixture.supervisorId, + workerId: fixture.workerId, + providers: {}, + terminalTakeover: 'required', + cleanup: async () => { + cleanupCalls += 1 + return { + status: 'completed', + rootDir: fixture.rootDir, + supervisorId: fixture.supervisorId, + workerId: fixture.workerId, + supervisorStatus: 'cancelled', + workerStatus: 'cancelled', + resourcesReleased: true, + remainingResources: [], + } + }, + } + }, + }, + }) + assert.equal(result.status, 'passed') + assert.equal(result.provisioning.mode, 'provisioned') + assert.equal(result.provisioning.terminalTakeover, 'required') + assert.equal(result.cleanup.status, 'completed') + assert.equal(cleanupCalls, 1) + assert.equal(provisionRequest.invocationId, 'live-required-supervisor-provisioned') + assert.equal(provisionRequest.timeoutMs, 1000) + assert.equal(provisionRequest.pollMs, 1) + assert.deepEqual(provisionRequest.environment, { + BRAID_SUPERVISOR_ENDPOINT: 'https://router.example/v1', + BRAID_SUPERVISOR_CREDENTIAL_REF: 'cred:v1:supervisor-proof', + BRAID_SUPERVISOR_WORKSPACE: '/tmp/supervisor-proof-workspace', + }) + assert.equal(provisionRequest.profile, undefined) + assert.equal(provisionRequest.connection, undefined) + assert.deepEqual(result.proof.run.ids, [fixture.supervisorId, fixture.workerId]) + assert.equal(result.proof.facts.provisioned, true) + assert.equal(result.proof.facts.cleanupVerified, true) + assert.equal(result.proof.facts.terminalTakeoverRequired, true) + assert.equal(assertProofReceipt(result.proof), result.proof) +}) + +test('supervisor proof cleans an owned Runtime run after an observation failure', async () => { + const fixture = createSupervisorProofFixture({ snapshotCompleteness: 'partial' }) + let cleanupCalls = 0 + await assert.rejects( + () => + runSupervisorFlow({ + environment: { + ...protectedEnvironment(), + BRAID_SUPERVISOR_TIMEOUT_MS: '5', + BRAID_SUPERVISOR_POLL_MS: '1', + }, + invocationId: 'live-required-supervisor-cleanup-on-failure', + runtime: fixture.api, + provision: async () => ({ + rootDir: fixture.rootDir, + supervisorId: fixture.supervisorId, + workerId: fixture.workerId, + terminalTakeover: 'unsupported', + cleanup: async () => { + cleanupCalls += 1 + return { + status: 'completed', + rootDir: fixture.rootDir, + supervisorId: fixture.supervisorId, + workerId: fixture.workerId, + supervisorStatus: 'cancelled', + workerStatus: 'cancelled', + resourcesReleased: true, + remainingResources: [], + } + }, + }), + }), + /runtime supervisor snapshot is incomplete/u, + ) + assert.equal(cleanupCalls, 1) +}) + +test('supervisor proof rejects a supported terminal takeover without a real attachment', async () => { + const fixture = createSupervisorProofFixture({ terminalTakeover: 'unavailable' }) + let cleanupCalls = 0 + await assert.rejects( + () => + runSupervisorFlow({ + environment: { + ...protectedEnvironment(), + BRAID_SUPERVISOR_TIMEOUT_MS: '1000', + BRAID_SUPERVISOR_POLL_MS: '1', + }, + invocationId: 'live-required-supervisor-required-attach', + runtime: fixture.api, + provision: async () => ({ + rootDir: fixture.rootDir, + supervisorId: fixture.supervisorId, + workerId: fixture.workerId, + providers: {}, + terminalTakeover: 'required', + cleanup: async () => { + cleanupCalls += 1 + return { + status: 'completed', + rootDir: fixture.rootDir, + supervisorId: fixture.supervisorId, + workerId: fixture.workerId, + supervisorStatus: 'cancelled', + workerStatus: 'cancelled', + resourcesReleased: true, + remainingResources: [], + } + }, + }), + }), + /supports terminal takeover/u, + ) + assert.equal(cleanupCalls, 1) +}) + +test('supervisor proof refuses an incomplete owned cleanup receipt', async () => { + const fixture = createSupervisorProofFixture() + let cleanupCalls = 0 + await assert.rejects( + () => + runSupervisorFlow({ + environment: { + ...protectedEnvironment(), + BRAID_SUPERVISOR_TIMEOUT_MS: '1000', + BRAID_SUPERVISOR_POLL_MS: '1', + }, + invocationId: 'live-required-supervisor-incomplete-cleanup', + runtime: fixture.api, + provision: async () => ({ + rootDir: fixture.rootDir, + supervisorId: fixture.supervisorId, + workerId: fixture.workerId, + terminalTakeover: 'unsupported', + cleanup: async () => { + cleanupCalls += 1 + return { + status: 'completed', + rootDir: fixture.rootDir, + supervisorId: fixture.supervisorId, + workerId: fixture.workerId, + supervisorStatus: 'cancelled', + workerStatus: 'cancelled', + resourcesReleased: true, + remainingResources: ['worker-process'], + } + }, + }), + }), + /left unconfirmed resources/u, + ) + assert.equal(cleanupCalls, 1) +}) + +test('supervisor proof requires Runtime provisioning when no external run is configured', async () => { + const fixture = createSupervisorProofFixture() + await assert.rejects( + () => + runSupervisorFlow({ + environment: { + ...protectedEnvironment(), + BRAID_SUPERVISOR_TIMEOUT_MS: '5', + BRAID_SUPERVISOR_POLL_MS: '1', + }, + runtime: fixture.api, + }), + (error) => { + assert.equal(error.unavailable, true) + assert.equal(error.code, 'RUNTIME_SUPERVISOR_PROVISION_REQUIRED') + return true + }, + ) +}) + +test('supervisor proof rejects a partial external binding before provisioning', async () => { + const fixture = createSupervisorProofFixture() + let provisionCalls = 0 + await assert.rejects( + () => + runSupervisorFlow({ + environment: { + ...protectedEnvironment(), + BRAID_SUPERVISOR_ROOT: fixture.rootDir, + }, + runtime: { + ...fixture.api, + provisionSupervisor: async () => { + provisionCalls += 1 + throw new Error('provisioning must not run for a partial override') + }, + }, + }), + (error) => { + assert.equal(error.unavailable, true) + assert.equal(error.code, 'PROTECTED_SUPERVISOR_CONFIGURATION_INVALID') + return true + }, + ) + assert.equal(provisionCalls, 0) +}) + test('configured supervisor failures are failed and never reported as partial', () => { let failure try { diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index 2d0002bc..cd32e876 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -112,7 +112,10 @@ const PROOF_OPERATION_FACT_KEYS = Object.freeze({ 'statusObserved', 'reconnectable', 'terminalTakeover', + 'terminalTakeoverRequired', 'cancellationAvailable', + 'provisioned', + 'cleanupVerified', ]), }) @@ -389,9 +392,12 @@ function validateProofFacts(operation, status, facts) { if ( key === 'promoted' || key === 'cancellationAvailable' || + key === 'terminalTakeoverRequired' || key === 'spendObserved' || key === 'statusObserved' || key === 'reconnectable' || + key === 'provisioned' || + key === 'cleanupVerified' || key === 'processExitedBeforeWorkspaceCleanup' || key === 'terminalResize' || key === 'processGroupExitedBeforeWorkspaceCleanup' @@ -442,6 +448,63 @@ function validatePassedSupervisorReceipt(receipt) { throw new Error('Passed supervisor proof requires a cancelled worker effect') if (!['attached', 'unavailable'].includes(facts.terminalTakeover)) throw new Error('Passed supervisor proof requires an attached or unavailable terminal takeover') + if (facts.provisioned === true && facts.cleanupVerified !== true) + throw new Error('Passed provisioned supervisor proof requires verified cleanup') + if (facts.terminalTakeoverRequired === true && facts.terminalTakeover !== 'attached') + throw new Error( + 'Passed supervisor proof requires terminal takeover when the provider supports it', + ) + if (receipt.observations === null || typeof receipt.observations !== 'object') + throw new Error('Passed supervisor proof requires provisioning and cleanup observations') + const provisioning = receipt.observations.provisioning + const cleanup = receipt.observations.cleanup + if (provisioning === undefined || cleanup === undefined) + throw new Error('Passed supervisor proof requires provisioning and cleanup observations') + if (typeof provisioning !== 'object' || Array.isArray(provisioning)) + throw new Error('Passed supervisor provisioning observation must be an object') + if (typeof cleanup !== 'object' || Array.isArray(cleanup)) + throw new Error('Passed supervisor cleanup observation must be an object') + const provisioningKeys = ['mode', 'rootDir', 'supervisorId', 'workerId', 'terminalTakeover'] + exactKeys(provisioning, provisioningKeys, 'Passed supervisor provisioning observation') + if (!['configured', 'provisioned'].includes(provisioning.mode)) + throw new Error('Passed supervisor provisioning mode is invalid') + for (const key of ['rootDir', 'supervisorId', 'workerId']) + validRequiredString(provisioning[key], `Passed supervisor provisioning ${key}`) + if (!['required', 'unsupported', 'unspecified'].includes(provisioning.terminalTakeover)) + throw new Error('Passed supervisor provisioning terminal takeover requirement is invalid') + const cleanupKeys = [ + 'status', + 'rootDir', + 'supervisorId', + 'workerId', + 'supervisorStatus', + 'workerStatus', + 'resourcesReleased', + 'remainingResources', + ] + exactKeys(cleanup, cleanupKeys, 'Passed supervisor cleanup observation') + if (!['completed', 'not-owned'].includes(cleanup.status)) + throw new Error('Passed supervisor cleanup status is invalid') + for (const key of ['rootDir', 'supervisorId', 'workerId']) + validRequiredString(cleanup[key], `Passed supervisor cleanup ${key}`) + if (cleanup.supervisorStatus !== null && typeof cleanup.supervisorStatus !== 'string') + throw new Error('Passed supervisor cleanup supervisorStatus must be a string or null') + if (cleanup.workerStatus !== null && typeof cleanup.workerStatus !== 'string') + throw new Error('Passed supervisor cleanup workerStatus must be a string or null') + if (cleanup.resourcesReleased !== null && typeof cleanup.resourcesReleased !== 'boolean') + throw new Error('Passed supervisor cleanup resourcesReleased must be boolean or null') + if (cleanup.remainingResources !== null && !Array.isArray(cleanup.remainingResources)) + throw new Error('Passed supervisor cleanup remainingResources must be an array or null') + if (facts.provisioned === true) { + if (provisioning.mode !== 'provisioned') + throw new Error('Passed provisioned supervisor proof has a configured provisioning mode') + if (cleanup.status !== 'completed' || cleanup.resourcesReleased !== true) + throw new Error('Passed provisioned supervisor proof requires completed resource cleanup') + if (!Array.isArray(cleanup.remainingResources) || cleanup.remainingResources.length !== 0) + throw new Error('Passed provisioned supervisor proof left resources behind') + } else if (provisioning.mode !== 'configured' || cleanup.status !== 'not-owned') { + throw new Error('Passed configured supervisor proof has an invalid ownership receipt') + } } function validatePassedTangleSandboxReceipt(receipt) { diff --git a/scripts/live-required/supervisor.mjs b/scripts/live-required/supervisor.mjs index 563f2a24..b429045a 100644 --- a/scripts/live-required/supervisor.mjs +++ b/scripts/live-required/supervisor.mjs @@ -27,6 +27,16 @@ const TOTAL_FIELDS = Object.freeze([ 'usd', 'latencyMs', ]) +const PROVISION_ENVIRONMENT_KEYS = Object.freeze([ + 'BRAID_SUPERVISOR_ENDPOINT', + 'BRAID_SUPERVISOR_CONNECTION_ID', + 'BRAID_SUPERVISOR_CONNECTION_KIND', + 'BRAID_SUPERVISOR_CREDENTIAL_CONFIGURED', + 'BRAID_SUPERVISOR_CREDENTIAL_REF', + 'BRAID_SUPERVISOR_MODEL', + 'BRAID_SUPERVISOR_RUNNER', + 'BRAID_SUPERVISOR_WORKSPACE', +]) function requiredText(value, name) { if (typeof value !== 'string' || value.trim().length === 0) @@ -298,23 +308,180 @@ function proofConfig(environment) { /** * Prove one Runtime supervisor through its published read and control APIs. * - * The optional `providers` value enables exact terminal takeover when the provider publishes an - * interactive reconnect contract. A missing provider is recorded as unavailable capability, not - * converted into a false attachment. + * A protected run provisions its own Runtime supervisor unless all three legacy identifiers are + * supplied as an explicit external-resource override. The provisioner owns the run and returns + * its exact identifiers plus a cleanup function; Braid never reads or writes Runtime files. */ +function supervisorConfiguration(environment) { + const values = { + rootDir: environment.BRAID_SUPERVISOR_ROOT, + supervisorId: environment.BRAID_SUPERVISOR_ID, + workerId: environment.BRAID_SUPERVISOR_WORKER, + } + const configured = Object.values(values).filter( + (value) => typeof value === 'string' && value.trim().length > 0, + ).length + if (configured === 0) return undefined + if (configured !== Object.keys(values).length) + throw protectedUnavailable( + 'PROTECTED_SUPERVISOR_CONFIGURATION_INVALID', + 'BRAID_SUPERVISOR_ROOT, BRAID_SUPERVISOR_ID, and BRAID_SUPERVISOR_WORKER must be set together', + ) + return { + mode: 'configured', + rootDir: requiredProtectedText(values.rootDir, 'BRAID_SUPERVISOR_ROOT'), + supervisorId: requiredProtectedText(values.supervisorId, 'BRAID_SUPERVISOR_ID'), + workerId: requiredProtectedText(values.workerId, 'BRAID_SUPERVISOR_WORKER'), + providers: undefined, + terminalTakeover: 'unspecified', + cleanup: undefined, + } +} + +function provisionEnvironment(environment) { + return Object.fromEntries( + PROVISION_ENVIRONMENT_KEYS.flatMap((name) => { + const value = environment[name] + return typeof value === 'string' && value.trim().length > 0 ? [[name, value.trim()]] : [] + }), + ) +} + +function provisionRequest(environment, invocationId, timeoutMs, pollMs, profile, connection) { + const workspaceDir = environment.BRAID_SUPERVISOR_WORKSPACE?.trim() + return { + invocationId, + environment: provisionEnvironment(environment), + workspaceDir: workspaceDir || undefined, + timeoutMs, + pollMs, + ...(profile === undefined ? {} : { profile }), + ...(connection === undefined ? {} : { connection }), + } +} + +function validateProvisionedSupervisor(value) { + if (value === null || typeof value !== 'object' || Array.isArray(value)) + throw new Error('Runtime supervisor provisioner returned no receipt') + const rootDir = requiredText(value.rootDir, 'Runtime provision root directory') + const supervisorId = requiredText(value.supervisorId, 'Runtime provision supervisor id') + const workerId = requiredText(value.workerId, 'Runtime provision worker id') + if (typeof value.cleanup !== 'function') + throw new Error('Runtime supervisor provision receipt has no cleanup function') + const terminalTakeover = value.terminalTakeover ?? 'unspecified' + if (!['required', 'unsupported', 'unspecified'].includes(terminalTakeover)) + throw new Error( + 'Runtime supervisor provision receipt has an invalid terminal takeover requirement', + ) + return { + mode: 'provisioned', + rootDir, + supervisorId, + workerId, + providers: value.providers, + terminalTakeover, + cleanup: value.cleanup, + } +} + +async function acquireSupervisor({ + environment, + invocationId, + runtimeApi, + timeoutMs, + pollMs, + provision, + profile, + connection, +}) { + const configured = supervisorConfiguration(environment) + if (configured !== undefined) return configured + const provisioner = provision ?? runtimeApi.provisionSupervisor + if (typeof provisioner !== 'function') + throw protectedUnavailable( + 'RUNTIME_SUPERVISOR_PROVISION_REQUIRED', + 'The installed agent-runtime package must expose provisionSupervisor for the protected LIVE-11 path', + ) + try { + const receipt = await provisioner( + provisionRequest(environment, invocationId, timeoutMs, pollMs, profile, connection), + ) + return validateProvisionedSupervisor(receipt) + } catch (error) { + if (error?.unavailable === true) throw error + throw new Error('Runtime supervisor provisioning failed before LIVE-11 controls', { + cause: error, + }) + } +} + +function notOwnedCleanup(binding) { + return { + status: 'not-owned', + rootDir: binding.rootDir, + supervisorId: binding.supervisorId, + workerId: binding.workerId, + supervisorStatus: null, + workerStatus: null, + resourcesReleased: null, + remainingResources: null, + } +} + +function validateCleanupReceipt(value, binding) { + if (value === null || typeof value !== 'object' || Array.isArray(value)) + throw new Error('Runtime supervisor cleanup returned no receipt') + if (value.status !== 'completed') + throw new Error(`Runtime supervisor cleanup was not completed: ${String(value.status)}`) + if (value.rootDir !== binding.rootDir) + throw new Error('Runtime supervisor cleanup receipt names another root directory') + if (value.supervisorId !== binding.supervisorId) + throw new Error('Runtime supervisor cleanup receipt names another supervisor') + if (value.workerId !== binding.workerId) + throw new Error('Runtime supervisor cleanup receipt names another worker') + if (typeof value.supervisorStatus !== 'string' || value.supervisorStatus.length === 0) + throw new Error('Runtime supervisor cleanup receipt has no terminal supervisor status') + if (typeof value.workerStatus !== 'string' || value.workerStatus.length === 0) + throw new Error('Runtime supervisor cleanup receipt has no terminal worker status') + if (value.resourcesReleased !== true) + throw new Error('Runtime supervisor cleanup did not prove resource release') + if (!Array.isArray(value.remainingResources) || value.remainingResources.length !== 0) + throw new Error('Runtime supervisor cleanup left unconfirmed resources') + return { + status: 'completed', + rootDir: binding.rootDir, + supervisorId: binding.supervisorId, + workerId: binding.workerId, + supervisorStatus: value.supervisorStatus, + workerStatus: value.workerStatus, + resourcesReleased: true, + remainingResources: [], + } +} + +function cleanupObservation(value) { + return { + status: value.status, + rootDir: value.rootDir, + supervisorId: value.supervisorId, + workerId: value.workerId, + supervisorStatus: value.supervisorStatus, + workerStatus: value.workerStatus, + resourcesReleased: value.resourcesReleased, + remainingResources: value.remainingResources, + } +} + export async function runSupervisorFlow({ environment = process.env, invocationId = proofInvocation('live-supervisor'), runtime, providers, + provision, + profile, + connection, } = {}) { const startedAt = new Date().toISOString() - const rootDir = requiredProtectedText(environment.BRAID_SUPERVISOR_ROOT, 'BRAID_SUPERVISOR_ROOT') - const supervisorId = requiredProtectedText(environment.BRAID_SUPERVISOR_ID, 'BRAID_SUPERVISOR_ID') - const workerId = requiredProtectedText( - environment.BRAID_SUPERVISOR_WORKER, - 'BRAID_SUPERVISOR_WORKER', - ) const timeoutMs = configuredDuration( environment, ['BRAID_SUPERVISOR_TIMEOUT_MS', 'BRAID_LIVE_REQUIRED_TIMEOUT_MS'], @@ -335,219 +502,277 @@ export async function runSupervisorFlow({ ) const runtimeApi = await loadPublicRuntimeApi(runtime) requireRuntimeFunctions(runtimeApi) - - const initial = readTarget(runtimeApi, rootDir, supervisorId, workerId) - if (initial.supervisor.status !== 'running') - throw new Error( - `configured supervisor '${supervisorId}' is ${initial.supervisor.status}; cancellation proof requires a running supervisor`, - ) - if (initial.worker.status !== 'running') - throw new Error( - `configured supervisor worker '${workerId}' is ${initial.worker.status}; cancellation proof requires a live worker`, - ) - const initialSpend = spendView(initial.supervisor, initial.worker) - if (!knownSpend(initialSpend)) - throw new Error(`runtime worker '${workerId}' did not report complete spend fields`) - - const spendUpdated = await waitForSnapshot({ - runtime: runtimeApi, - rootDir, - supervisorId, - workerId, - label: 'worker spend update', + const binding = await acquireSupervisor({ + environment, + invocationId, + runtimeApi, timeoutMs, pollMs, - predicate: (candidate) => { - const spend = spendView(candidate.supervisor, candidate.worker) - return ( - candidate.worker.status === 'running' && - knownSpend(spend) && - changedSpend(initialSpend, spend) - ) - }, + provision, + profile, + connection, }) - const updatedSpend = spendView(spendUpdated.supervisor, spendUpdated.worker) + const { rootDir, supervisorId, workerId } = binding + const providerSource = providers ?? binding.providers + let cleanupStarted = false + let cleanupReceipt = notOwnedCleanup(binding) + const cleanupOwned = async () => { + if (cleanupStarted) return cleanupReceipt + cleanupStarted = true + if (binding.mode === 'configured') return cleanupReceipt + cleanupReceipt = validateCleanupReceipt(await binding.cleanup(), binding) + return cleanupReceipt + } - const reconnected = readTarget(runtimeApi, rootDir, supervisorId, workerId) - if (reconnected.worker.status !== 'running') - throw new Error( - `worker '${workerId}' stopped before reconnectable control proof: ${reconnected.worker.status}`, + try { + const initial = readTarget(runtimeApi, rootDir, supervisorId, workerId) + if (initial.supervisor.status !== 'running') + throw new Error( + `supervisor '${supervisorId}' is ${initial.supervisor.status}; cancellation proof requires a running supervisor`, + ) + if (initial.worker.status !== 'running') + throw new Error( + `supervisor worker '${workerId}' is ${initial.worker.status}; cancellation proof requires a live worker`, + ) + const initialSpend = spendView(initial.supervisor, initial.worker) + if (!knownSpend(initialSpend)) + throw new Error(`runtime worker '${workerId}' did not report complete spend fields`) + + const spendUpdated = await waitForSnapshot({ + runtime: runtimeApi, + rootDir, + supervisorId, + workerId, + label: 'worker spend update', + timeoutMs, + pollMs, + predicate: (candidate) => { + const spend = spendView(candidate.supervisor, candidate.worker) + return ( + candidate.worker.status === 'running' && + knownSpend(spend) && + changedSpend(initialSpend, spend) + ) + }, + }) + const updatedSpend = spendView(spendUpdated.supervisor, spendUpdated.worker) + + const reconnected = readTarget(runtimeApi, rootDir, supervisorId, workerId) + if (reconnected.worker.status !== 'running') + throw new Error( + `worker '${workerId}' stopped before reconnectable control proof: ${reconnected.worker.status}`, + ) + const eventDir = requiredText( + runtimeApi.supervisorRunDir(rootDir, supervisorId), + 'Runtime supervisor event directory', ) - const eventDir = requiredText( - runtimeApi.supervisorRunDir(rootDir, supervisorId), - 'Runtime supervisor event directory', - ) - let terminalTakeover - if (typeof runtimeApi.attachWorker !== 'function') { - terminalTakeover = { status: 'unavailable', reason: 'Runtime has no public attachWorker API' } - } else if (providers === undefined) { - terminalTakeover = { - status: 'unavailable', - reason: 'No environment provider source was supplied for exact terminal takeover', - } - } else { - const attachment = await runtimeApi.attachWorker(eventDir, workerId, { providers }) - if (attachment?.status === 'available' && attachment.handle !== undefined) { - terminalTakeover = { status: 'attached' } - } else { + let terminalTakeover + if (typeof runtimeApi.attachWorker !== 'function') { + terminalTakeover = { status: 'unavailable', reason: 'Runtime has no public attachWorker API' } + } else if (providerSource === undefined) { terminalTakeover = { status: 'unavailable', - reason: attachment?.reason ?? 'Runtime did not return an exact interactive handle', + reason: 'No environment provider source was supplied for exact terminal takeover', + } + } else { + const attachment = await runtimeApi.attachWorker(eventDir, workerId, { + providers: providerSource, + }) + if (attachment?.status === 'available' && attachment.handle !== undefined) { + terminalTakeover = { status: 'attached' } + } else { + terminalTakeover = { + status: 'unavailable', + reason: attachment?.reason ?? 'Runtime did not return an exact interactive handle', + } } } - } - - const steer = runtimeApi.writeWorkerSteer(rootDir, supervisorId, workerId, { - operationId: steerOperationId, - message, - source: 'braid-live-supervisor', - interrupt: true, - }) - assertSteerResult(steer, workerId, steerOperationId, message) - const steerReplay = runtimeApi.writeWorkerSteer(rootDir, supervisorId, workerId, { - operationId: steerOperationId, - message, - source: 'braid-live-supervisor', - interrupt: true, - }) - assertSteerResult(steerReplay, workerId, steerOperationId, message) - if ( - steerReplay.replayed !== true || - steerReplay.request.requestDigest !== steer.request.requestDigest - ) - throw new Error('worker steer retry did not replay the same admitted operation') - const steerAcknowledgement = await waitForAcknowledgement({ - read: runtimeApi.readWorkerSteerAcknowledgement, - eventDir, - operationId: steerOperationId, - label: 'worker steer acknowledgement', - timeoutMs, - pollMs, - }) - assertSteerAcknowledgement(steerAcknowledgement, steer.request, workerId, steerOperationId) + if (binding.terminalTakeover === 'required' && terminalTakeover.status !== 'attached') + throw new Error( + `Runtime provider supports terminal takeover, but LIVE-11 could not attach the exact worker: ${terminalTakeover.reason}`, + ) - const beforeCancel = readTarget(runtimeApi, rootDir, supervisorId, workerId) - if (beforeCancel.worker.status !== 'running') - throw new Error( - `worker '${workerId}' stopped before cancellation dispatch: ${beforeCancel.worker.status}`, + const steer = runtimeApi.writeWorkerSteer(rootDir, supervisorId, workerId, { + operationId: steerOperationId, + message, + source: 'braid-live-supervisor', + interrupt: true, + }) + assertSteerResult(steer, workerId, steerOperationId, message) + const steerReplay = runtimeApi.writeWorkerSteer(rootDir, supervisorId, workerId, { + operationId: steerOperationId, + message, + source: 'braid-live-supervisor', + interrupt: true, + }) + assertSteerResult(steerReplay, workerId, steerOperationId, message) + if ( + steerReplay.replayed !== true || + steerReplay.request.requestDigest !== steer.request.requestDigest ) - const cancel = runtimeApi.cancelWorker(eventDir, workerId, cancelOperationId, { - reason: 'Braid live supervisor cancellation proof', - source: 'braid-live-supervisor', - }) - const cancelReplay = runtimeApi.cancelWorker(eventDir, workerId, cancelOperationId, { - reason: 'Braid live supervisor cancellation proof', - source: 'braid-live-supervisor', - }) - if ( - cancel?.operationId !== cancelOperationId || - cancelReplay?.operationId !== cancelOperationId || - cancelReplay?.worker !== workerId - ) - throw new Error('worker cancellation retry did not preserve its operation identity') - const cancellationAcknowledgement = await waitForAcknowledgement({ - read: runtimeApi.readWorkerCancellation, - eventDir, - operationId: cancelOperationId, - label: 'worker cancellation acknowledgement', - timeoutMs, - pollMs, - }) - assertCancellationAcknowledgement(cancellationAcknowledgement, workerId, cancelOperationId) - - const final = await waitForSnapshot({ - runtime: runtimeApi, - rootDir, - supervisorId, - workerId, - label: 'cancelled worker snapshot', - timeoutMs, - pollMs, - predicate: (candidate) => ['cancelled', 'down'].includes(candidate.worker.status), - }) - const persistedCancellation = runtimeApi.readWorkerCancellation(eventDir, cancelOperationId) - assertCancellationAcknowledgement(persistedCancellation, workerId, cancelOperationId) - - const proof = proofReceipt({ - invocationId, - operation: PROOF_OPERATIONS.supervisor, - startedAt, - completedAt: new Date().toISOString(), - config: proofConfig(environment), - facts: { + throw new Error('worker steer retry did not replay the same admitted operation') + const steerAcknowledgement = await waitForAcknowledgement({ + read: runtimeApi.readWorkerSteerAcknowledgement, + eventDir, + operationId: steerOperationId, + label: 'worker steer acknowledgement', + timeoutMs, + pollMs, + }) + assertSteerAcknowledgement(steerAcknowledgement, steer.request, workerId, steerOperationId) + + const beforeCancel = readTarget(runtimeApi, rootDir, supervisorId, workerId) + if (beforeCancel.worker.status !== 'running') + throw new Error( + `worker '${workerId}' stopped before cancellation dispatch: ${beforeCancel.worker.status}`, + ) + const cancel = runtimeApi.cancelWorker(eventDir, workerId, cancelOperationId, { + reason: 'Braid live supervisor cancellation proof', + source: 'braid-live-supervisor', + }) + const cancelReplay = runtimeApi.cancelWorker(eventDir, workerId, cancelOperationId, { + reason: 'Braid live supervisor cancellation proof', + source: 'braid-live-supervisor', + }) + if ( + cancel?.operationId !== cancelOperationId || + cancelReplay?.operationId !== cancelOperationId || + cancelReplay?.worker !== workerId + ) + throw new Error('worker cancellation retry did not preserve its operation identity') + const cancellationAcknowledgement = await waitForAcknowledgement({ + read: runtimeApi.readWorkerCancellation, + eventDir, + operationId: cancelOperationId, + label: 'worker cancellation acknowledgement', + timeoutMs, + pollMs, + }) + assertCancellationAcknowledgement(cancellationAcknowledgement, workerId, cancelOperationId) + + const final = await waitForSnapshot({ + runtime: runtimeApi, + rootDir, supervisorId, workerId, - steeringRequestId: steer.request.operationId, - steeringOperationId: steerOperationId, - steeringEffect: steerAcknowledgement.effect, - cancellationOperationId: cancelOperationId, - cancellationEffect: cancellationAcknowledgement.effect, - initialStatus: initial.worker.status, - finalStatus: final.worker.status, - spendObserved: true, - statusObserved: true, - reconnectable: true, - terminalTakeover: terminalTakeover.status, - cancellationAvailable: true, - }, - checks: SUPERVISOR_CHECKS, - observations: { - snapshots: [ - snapshotObservation(initial), - snapshotObservation(spendUpdated), - snapshotObservation(reconnected), - snapshotObservation(beforeCancel), - snapshotObservation(final), - ], - spend: { initial: initialSpend, updated: updatedSpend }, + label: 'cancelled worker snapshot', + timeoutMs, + pollMs, + predicate: (candidate) => ['cancelled', 'down'].includes(candidate.worker.status), + }) + const persistedCancellation = runtimeApi.readWorkerCancellation(eventDir, cancelOperationId) + assertCancellationAcknowledgement(persistedCancellation, workerId, cancelOperationId) + + await cleanupOwned() + const provisioning = { + mode: binding.mode, + rootDir, + supervisorId, + workerId, + terminalTakeover: binding.terminalTakeover, + } + const cleanup = cleanupObservation(cleanupReceipt) + const proof = proofReceipt({ + invocationId, + operation: PROOF_OPERATIONS.supervisor, + startedAt, + completedAt: new Date().toISOString(), + config: proofConfig(environment), + runIds: [supervisorId, workerId], + facts: { + supervisorId, + workerId, + steeringRequestId: steer.request.operationId, + steeringOperationId: steerOperationId, + steeringEffect: steerAcknowledgement.effect, + cancellationOperationId: cancelOperationId, + cancellationEffect: cancellationAcknowledgement.effect, + initialStatus: initial.worker.status, + finalStatus: final.worker.status, + spendObserved: true, + statusObserved: true, + reconnectable: true, + terminalTakeover: terminalTakeover.status, + terminalTakeoverRequired: binding.terminalTakeover === 'required', + cancellationAvailable: true, + provisioned: binding.mode === 'provisioned', + cleanupVerified: binding.mode === 'provisioned', + }, + checks: SUPERVISOR_CHECKS, + observations: { + snapshots: [ + snapshotObservation(initial), + snapshotObservation(spendUpdated), + snapshotObservation(reconnected), + snapshotObservation(beforeCancel), + snapshotObservation(final), + ], + spend: { initial: initialSpend, updated: updatedSpend }, + steering: { + operationId: steerOperationId, + requestDigest: steer.request.requestDigest, + replayed: steerReplay.replayed === true, + acknowledgement: { + operationId: steerAcknowledgement.operationId, + worker: steerAcknowledgement.worker, + effect: steerAcknowledgement.effect, + detail: steerAcknowledgement.detail, + }, + }, + cancellation: { + operationId: cancelOperationId, + acknowledgement: { + operationId: cancellationAcknowledgement.operationId, + worker: cancellationAcknowledgement.worker, + effect: cancellationAcknowledgement.effect, + terminated: cancellationAcknowledgement.terminated, + detail: cancellationAcknowledgement.detail, + }, + replay: { + effect: cancelReplay.effect, + terminated: cancelReplay.terminated, + }, + }, + terminalTakeover, + provisioning, + cleanup, + }, + environment, + }) + return { + status: 'passed', + measurements: [scalarMeasurement('LIVE-11')], + supervisor: supervisorId, + worker: workerId, + provisioning, + cleanup, steering: { operationId: steerOperationId, - requestDigest: steer.request.requestDigest, + effect: steerAcknowledgement.effect, replayed: steerReplay.replayed === true, - acknowledgement: { - operationId: steerAcknowledgement.operationId, - worker: steerAcknowledgement.worker, - effect: steerAcknowledgement.effect, - detail: steerAcknowledgement.detail, - }, }, cancellation: { operationId: cancelOperationId, - acknowledgement: { - operationId: cancellationAcknowledgement.operationId, - worker: cancellationAcknowledgement.worker, - effect: cancellationAcknowledgement.effect, - terminated: cancellationAcknowledgement.terminated, - detail: cancellationAcknowledgement.detail, - }, - replay: { - effect: cancelReplay.effect, - terminated: cancelReplay.terminated, - }, + effect: cancellationAcknowledgement.effect, + replayed: cancelReplay.operationId === cancelOperationId, }, + reconnect: true, terminalTakeover, - }, - environment, - }) - return { - status: 'passed', - measurements: [scalarMeasurement('LIVE-11')], - supervisor: supervisorId, - worker: workerId, - steering: { - operationId: steerOperationId, - effect: steerAcknowledgement.effect, - replayed: steerReplay.replayed === true, - }, - cancellation: { - operationId: cancelOperationId, - effect: cancellationAcknowledgement.effect, - replayed: cancelReplay.operationId === cancelOperationId, - }, - reconnect: true, - terminalTakeover, - proof, + proof, + } + } catch (error) { + if (binding.mode === 'provisioned' && !cleanupStarted) { + try { + await cleanupOwned() + } catch (cleanupError) { + throw new AggregateError( + [error, cleanupError], + 'LIVE-11 failed and Runtime supervisor cleanup also failed', + ) + } + } + throw error } } diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index c8233afa..0b7d7cad 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -512,7 +512,6 @@ function eventControl(event) { export function frameCancellationDispatch(frame, runId) { const event = (Array.isArray(frame?.events) ? frame.events : []).find((candidate) => { - const payload = eventPayload(candidate) return ( eventKind(candidate) === 'run.control.requested' && eventRunId(candidate) === runId && From cba2fec780855083fdd3776bffabd58d7038a663 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 10:24:24 -0600 Subject: [PATCH 024/136] fix(live-proof): diagnose pre-admission interaction failures --- .../tangle-sandbox-braid-interactive.mjs | 76 +++++++++++++++++-- test/tangle-live07-wiring.test.mjs | 59 ++++++++++++++ 2 files changed, 130 insertions(+), 5 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 18d4d841..a1a8891d 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -159,6 +159,26 @@ function terminalText(terminal) { return text } +function terminalDiagnostic(runtime) { + if (runtime === undefined) return 'terminal unavailable' + const rows = runtime.screen + .split('\n') + .map((row) => row.trim()) + .filter((row) => row.length > 0) + .slice(-8) + return rows.length === 0 ? 'terminal screen empty' : rows.join(' | ').slice(-768) +} + +function stateDiagnostic(frame) { + const runs = Array.isArray(frame?.state?.runs) ? frame.state.runs : [] + return runs.map((run) => ({ + id: typeof run?.id === 'string' ? run.id : null, + status: typeof run?.status === 'string' ? run.status : null, + retainedAdmission: + typeof run?.retainedAdmission?.phase === 'string' ? run.retainedAdmission.phase : null, + })) +} + async function waitFor(label, predicate, timeoutMs) { const deadline = performance.now() + timeoutMs for (;;) { @@ -451,6 +471,24 @@ function cleanupFailure(label, error) { return new Error(`${label}: ${safeMessage(error)}`, { cause: error }) } +export function interactiveFailureMessages(error, environment = process.env) { + const messages = [] + const seen = new Set() + const visit = (candidate) => { + if (candidate === null || (typeof candidate !== 'object' && typeof candidate !== 'function')) + return + if (seen.has(candidate)) return + seen.add(candidate) + messages.push(safeMessage(candidate, environment)) + if (candidate instanceof AggregateError) { + for (const nested of candidate.errors) visit(nested) + } + visit(candidate.cause) + } + visit(error) + return [...new Set(messages)] +} + function assertStopResultMatchesIdentity(stopResult, identity) { assert.ok(stopResult && typeof stopResult === 'object', 'Braid stop returned no result') const controlRef = assertControlRefsEqual( @@ -519,7 +557,7 @@ export async function finalizeInteractiveProof({ } let resolvedIdentity = identity - if (resolvedIdentity === undefined && recordPath !== undefined) { + if (resolvedIdentity === undefined && executionStarted && recordPath !== undefined) { const recovered = await attemptCleanup(errors, 'recorded Braid identity recovery', async () => { const record = JSON.parse(await readFile(recordPath, 'utf8')) const recoveredIdentity = recoverInteractiveIdentity(record) @@ -727,6 +765,7 @@ async function runProof({ let client let proofData let proofError + let runObserved = false let stopped = false try { packed = await installPackedBraid(targetRepository) @@ -762,10 +801,18 @@ async function runProof({ runtime.write(`${interactiveCommand}\r`) await waitFor( 'native interactive output', - () => occurrences(runtime.output, markers.output) > promptCount, + () => { + if (/This action is unavailable with the selected connection/iu.test(runtime.screen)) { + throw new Error( + `native interactive command was unavailable: ${terminalDiagnostic(runtime)}`, + ) + } + return occurrences(runtime.output, markers.output) > promptCount + }, timeoutMs, ) const initialFrame = await captureStateFrame(runtime, recordPath, timeoutMs) + runObserved = stateDiagnostic(initialFrame).length > 0 const initialIdentity = recoverInteractiveIdentity(initialFrame) assert.ok(initialIdentity, 'interactive frame did not contain one exact Braid run identity') const initialAttach = await observeSandbox( @@ -861,7 +908,25 @@ async function runProof({ }, } } catch (error) { - proofError = error + const failures = [error] + if (runtime !== undefined && !runtime.exited && recordPath !== undefined) { + try { + const failureFrame = await captureStateFrame(runtime, recordPath, exitTimeoutMs) + runObserved ||= stateDiagnostic(failureFrame).length > 0 + identity ??= recoverInteractiveIdentity(failureFrame) + failures.push( + new Error(`failure Braid state: ${JSON.stringify(stateDiagnostic(failureFrame))}`), + ) + } catch (captureError) { + failures.push( + new Error(`failure-state identity capture failed: ${safeMessage(captureError)}`, { + cause: captureError, + }), + ) + } + } + failures.push(new Error(`last Braid terminal screen: ${terminalDiagnostic(runtime)}`)) + proofError = new AggregateError(failures, 'Braid native interactive flow failed') } let cleanup @@ -876,7 +941,7 @@ async function runProof({ client, timeoutMs, exitTimeoutMs, - executionStarted: runtime !== undefined, + executionStarted: runObserved, stopped, stopResult: proofData?.stop, }) @@ -981,8 +1046,9 @@ export async function main(argv = process.argv, environment = process.env) { return EXIT_CODES.passed } catch (error) { const status = error?.unavailable === true ? 'unavailable' : 'failed' + const messages = interactiveFailureMessages(error, environment) process.stderr.write( - `${safeJson({ status, error: safeMessage(error, environment) }, environment)}\n`, + `${safeJson({ status, error: messages[0], causes: messages.slice(1) }, environment)}\n`, ) return status === 'unavailable' ? EXIT_CODES.unavailable : EXIT_CODES.failed } diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 7f2b9daf..618cfd7f 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -4,6 +4,10 @@ import test from 'node:test' import { PROOF_OPERATIONS, proofReceipt } from '../scripts/live-required/contracts.mjs' import { MULTIRUN_REQUIRED_PHASES } from '../scripts/live-required/multirun-contract.mjs' import { runSandbox, runTangleFlows } from '../scripts/live-required/tangle.mjs' +import { + finalizeInteractiveProof, + interactiveFailureMessages, +} from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' import { cleanupRetainedResourceByRunId } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' const repository = resolve(new URL('../', import.meta.url).pathname) @@ -368,6 +372,61 @@ test('LIVE-08 rejects status-only observations from a passed receipt', () => { ) }) +test('LIVE-08 reports sanitized nested proof and cleanup failures', () => { + const secret = 'live-interactive-secret' + const failure = new AggregateError( + [ + new Error(`interaction failed with ${secret}`), + new AggregateError([new Error('exact cleanup failed')], 'cleanup incomplete'), + ], + 'interactive proof failed', + ) + assert.deepEqual(interactiveFailureMessages(failure, { TANGLE_API_KEY: secret }), [ + 'interactive proof failed', + 'interaction failed with [REDACTED]', + 'cleanup incomplete', + 'exact cleanup failed', + ]) +}) + +test('LIVE-08 cleans local resources without inventing a cloud leak before admission', async () => { + let workspaceCleanup = 0 + let packedCleanup = 0 + const result = await finalizeInteractiveProof({ + packed: { + binary: '/tmp/braid', + cleanup: async () => { + packedCleanup += 1 + }, + }, + config: { + cleanup: async () => { + workspaceCleanup += 1 + return { credentialRemoved: true, temporaryRootRemoved: true } + }, + }, + recordPath: '/does/not/exist/without-an-admitted-run.json', + executionStarted: false, + }) + assert.equal(result.identity, undefined) + assert.equal(workspaceCleanup, 1) + assert.equal(packedCleanup, 1) +}) + +test('LIVE-08 refuses cloud cleanup when a run existed without exact identity', async () => { + await assert.rejects( + () => finalizeInteractiveProof({ executionStarted: true }), + (error) => { + assert.ok( + interactiveFailureMessages(error).some((message) => + /run identity was unavailable/u.test(message), + ), + ) + return true + }, + ) +}) + test('fail-safe cleanup derives one exact Braid resource from the first local run ID', async () => { const firstRunId = 'local/run-1' const box = { From 12f75c70842c7f2297622ce8a7d0ac5d6da7e22e Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 11:04:21 -0600 Subject: [PATCH 025/136] perf(ui): bound large worker projections --- src/adapters/tui/ui-entity-details.ts | 34 ++++++-- src/adapters/tui/ui-semantic-state.ts | 114 +++++++++++++++++++++----- test/performance.test.ts | 32 ++++++++ 3 files changed, 150 insertions(+), 30 deletions(-) diff --git a/src/adapters/tui/ui-entity-details.ts b/src/adapters/tui/ui-entity-details.ts index dfa6e7cb..df3c6aaf 100644 --- a/src/adapters/tui/ui-entity-details.ts +++ b/src/adapters/tui/ui-entity-details.ts @@ -22,14 +22,17 @@ export function entityDetailsFor( state: BraidState, activity: readonly ActivityItemView[], ): EntityDetailView[] { - const analyses = new Map(state.analyses.map((record) => [String(record.id), record] as const)) - const supervisors = new Map( - state.supervisors.map((record) => [String(record.id), record] as const), - ) - const workers = new Map(state.workers.map((record) => [String(record.id), record] as const)) - const environments = new Map( - state.environments.map((record) => [String(record.id), record] as const), - ) + const wanted = new Map>() + for (const item of activity) { + if (item.entityType === undefined || item.entityId === undefined) continue + const ids = wanted.get(item.entityType) ?? new Set() + ids.add(item.entityId) + wanted.set(item.entityType, ids) + } + const analyses = selectedRecords(state.analyses, wanted.get('analysis')) + const supervisors = selectedRecords(state.supervisors, wanted.get('supervisor')) + const workers = selectedRecords(state.workers, wanted.get('worker')) + const environments = selectedRecords(state.environments, wanted.get('environment')) const seen = new Set() const details: EntityDetailView[] = [] @@ -53,6 +56,21 @@ export function entityDetailsFor( return details } +function selectedRecords( + records: readonly T[], + ids: ReadonlySet | undefined, +): ReadonlyMap { + if (ids === undefined || ids.size === 0) return new Map() + const selected = new Map() + for (const record of records) { + const id = String(record.id) + if (!ids.has(id)) continue + selected.set(id, record) + if (selected.size === ids.size) break + } + return selected +} + function environmentDetail( record: BraidState['environments'][number] | undefined, ): EntityDetailView | undefined { diff --git a/src/adapters/tui/ui-semantic-state.ts b/src/adapters/tui/ui-semantic-state.ts index ff8faac3..405c5fa9 100644 --- a/src/adapters/tui/ui-semantic-state.ts +++ b/src/adapters/tui/ui-semantic-state.ts @@ -9,6 +9,13 @@ export interface UiSemanticState { readonly hiddenNodeCount: number } +interface RecentValue { + readonly index: number + readonly id: string + readonly createdAtMs: number + readonly updatedAtMs: number +} + /** Bounds terminal graph work while the complete semantic query remains available headlessly. */ export function uiSemanticState(state: BraidState): UiSemanticState { if ( @@ -19,16 +26,15 @@ export function uiSemanticState(state: BraidState): UiSemanticState { } const workersById = new Map(state.workers.map((worker) => [String(worker.id), worker] as const)) - const workersByRecency = orderedByRecency(state.workers) const workerIds = new Set() selectRecent( - workersByRecency, + state.workers, workerIds, (worker) => worker.status === 'pending' || worker.status === 'running' || worker.status === 'waiting', MAX_RECENT_WORKERS, ) - selectRecent(workersByRecency, workerIds, () => true, MAX_RECENT_WORKERS) + selectRecent(state.workers, workerIds, () => true, MAX_RECENT_WORKERS) for (const selectedId of [...workerIds]) { let cursor = workersById.get(selectedId)?.parentWorkerId @@ -47,14 +53,13 @@ export function uiSemanticState(state: BraidState): UiSemanticState { const supervisorId = workersById.get(workerId)?.supervisorId if (supervisorId !== undefined) supervisorIds.add(String(supervisorId)) } - const supervisorsByRecency = orderedByRecency(state.supervisors) selectRecent( - supervisorsByRecency, + state.supervisors, supervisorIds, (supervisor) => supervisor.status === 'starting' || supervisor.status === 'running', MAX_RECENT_SUPERVISORS, ) - selectRecent(supervisorsByRecency, supervisorIds, () => true, MAX_RECENT_SUPERVISORS) + selectRecent(state.supervisors, supervisorIds, () => true, MAX_RECENT_SUPERVISORS) const workers = state.workers.filter((worker) => workerIds.has(String(worker.id))) const supervisors = state.supervisors.filter((supervisor) => @@ -78,29 +83,94 @@ export function uiSemanticState(state: BraidState): UiSemanticState { } } -function orderedByRecency< - T extends { readonly id: string; readonly createdAt: string; readonly updatedAt: string }, ->(values: readonly T[]): T[] { - return [...values].sort((left, right) => { - const updated = Date.parse(left.updatedAt) - Date.parse(right.updatedAt) - if (updated !== 0) return updated - const created = Date.parse(left.createdAt) - Date.parse(right.createdAt) - if (created !== 0) return created - const leftId = String(left.id) - const rightId = String(right.id) - return leftId < rightId ? -1 : leftId > rightId ? 1 : 0 - }) +function compareRecent(left: RecentValue, right: RecentValue): number { + const updated = left.updatedAtMs - right.updatedAtMs + if (Number.isFinite(updated) && updated !== 0) return updated + const created = left.createdAtMs - right.createdAtMs + if (Number.isFinite(created) && created !== 0) return created + if (left.id !== right.id) return left.id < right.id ? -1 : 1 + return left.index - right.index } -function selectRecent( +function swap(values: RecentValue[], left: number, right: number): void { + const value = values[left] + const replacement = values[right] + if (value === undefined || replacement === undefined) return + values[left] = replacement + values[right] = value +} + +function restoreMinimumHeap(values: RecentValue[], start: number): void { + let parent = start + while (true) { + const left = parent * 2 + 1 + const right = left + 1 + let oldest = parent + if ( + left < values.length && + compareRecent(values[left] as RecentValue, values[oldest] as RecentValue) < 0 + ) { + oldest = left + } + if ( + right < values.length && + compareRecent(values[right] as RecentValue, values[oldest] as RecentValue) < 0 + ) { + oldest = right + } + if (oldest === parent) return + swap(values, parent, oldest) + parent = oldest + } +} + +function addRecent(values: RecentValue[], candidate: RecentValue, limit: number): void { + if (values.length < limit) { + values.push(candidate) + let child = values.length - 1 + while (child > 0) { + const parent = Math.floor((child - 1) / 2) + if (compareRecent(values[parent] as RecentValue, values[child] as RecentValue) <= 0) { + break + } + swap(values, parent, child) + child = parent + } + return + } + const oldest = values[0] + if (oldest === undefined || compareRecent(candidate, oldest) <= 0) return + values[0] = candidate + restoreMinimumHeap(values, 0) +} + +function selectRecent< + T extends { readonly id: string; readonly createdAt: string; readonly updatedAt: string }, +>( values: readonly T[], selected: Set, include: (value: T) => boolean, limit: number, ): void { - for (let index = values.length - 1; index >= 0 && selected.size < limit; index -= 1) { + const remaining = limit - selected.size + if (remaining <= 0) return + const recent: RecentValue[] = [] + for (let index = 0; index < values.length; index += 1) { const value = values[index] - if (value === undefined || !include(value)) continue - selected.add(String(value.id)) + if (value === undefined || selected.has(String(value.id)) || !include(value)) continue + addRecent( + recent, + { + index, + id: String(value.id), + createdAtMs: Date.parse(value.createdAt), + updatedAtMs: Date.parse(value.updatedAt), + }, + remaining, + ) + } + recent.sort((left, right) => compareRecent(right, left)) + for (const candidate of recent) { + selected.add(candidate.id) } } diff --git a/test/performance.test.ts b/test/performance.test.ts index b121780c..bc2d9c61 100644 --- a/test/performance.test.ts +++ b/test/performance.test.ts @@ -5,6 +5,7 @@ import { ApplicationUiController, buildBraidViewModel, } from '../src/adapters/tui/application-ui-controller.js' +import { uiSemanticState } from '../src/adapters/tui/ui-semantic-state.js' import type { BraidApplication } from '../src/app/application.js' import type { SupervisorRecord, WorkerRecord } from '../src/domain/entities.js' import { createSupervisorId, createWorkerId } from '../src/domain/ids-values.js' @@ -199,6 +200,37 @@ test('bounded activity matches the exact tail of a scrambled worker history', () assert.deepEqual(actual, expected) }) +test('bounded terminal graphs retain active work and its ancestry before old history', () => { + const source = runtimeWorkerState(3_000) + const workers: WorkerRecord[] = source.workers.map((worker, index) => ({ + ...worker, + updatedAt: new Date(Date.parse(worker.updatedAt) + index * 1_000).toISOString(), + })) + const active = workers[0] + const parent = workers[1] + const newest = workers.at(-1) + const oldCompleted = workers[2] + assert(active && parent && newest && oldCompleted) + workers[0] = { + ...active, + status: 'running', + parentWorkerId: parent.id, + } + + const bounded = uiSemanticState({ ...source, workers }) + const selected = new Set(bounded.state.workers.map((worker) => worker.id)) + assert.equal(selected.has(active.id), true) + assert.equal(selected.has(parent.id), true) + assert.equal(selected.has(newest.id), true) + assert.equal(selected.has(oldCompleted.id), false) + assert.equal(bounded.state.workers.length, 2_049) + assert.equal(bounded.hiddenNodeCount, 951) + assert.deepEqual( + bounded.state.workers.map((worker) => worker.id), + workers.filter((worker) => selected.has(worker.id)).map((worker) => worker.id), + ) +}) + function runtimeWorkerState(count: number): BraidState { const at = '2026-08-09T00:00:00.000Z' const supervisorId = createSupervisorId('supervisor-performance') From 12522f415415ee8122ea9edc8c98fd7d3b6f7e77 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 13:09:50 -0600 Subject: [PATCH 026/136] feat(tangle): add restart-safe workspace proofs --- docs/components/README.md | 1 + docs/components/workspace-branching.md | 97 ++ scripts/live-required/contracts.mjs | 130 +++ .../live-required/tangle-workspace-proof.mjs | 1001 +++++++++++++++++ scripts/live-required/tangle.mjs | 78 +- .../production-connection-providers.ts | 83 +- .../production-connection-types.ts | 16 +- .../connections/production-connections.ts | 7 +- .../runtime/agent-runtime-execution.ts | 12 + .../runtime/mode-routing-execution.ts | 13 + .../production-tangle-sandbox-backend.ts | 6 + .../runtime/tangle-retained-execution.ts | 15 +- .../tangle-retained-interactive-execution.ts | 15 +- src/app/conversation-branch-effects.ts | 109 +- src/app/conversation-branches.ts | 24 +- src/app/conversation-types.ts | 5 + src/app/conversations.ts | 1 + src/app/production-composition.ts | 24 +- src/index.ts | 1 + src/ports/execution.ts | 6 + test/conversation-branch-effects.test.ts | 148 ++- test/tangle-workspace-proof.test.mjs | 143 +++ 22 files changed, 1894 insertions(+), 41 deletions(-) create mode 100644 docs/components/workspace-branching.md create mode 100644 scripts/live-required/tangle-workspace-proof.mjs create mode 100644 test/tangle-workspace-proof.test.mjs diff --git a/docs/components/README.md b/docs/components/README.md index 9156f2e3..99ea5926 100644 --- a/docs/components/README.md +++ b/docs/components/README.md @@ -60,6 +60,7 @@ It proves keyboard behavior and terminal output at 40×12, 80×24, 120×40, and | Conversation navigation | [conversation-navigation.md](conversation-navigation.md) | Create, rename, archive, switch, branch, and clone through explicit identities. | | Fork preview | [fork-preview.md](fork-preview.md) | Explain exactly what a fork copies before any external mutation. | | Conversation branch effects | [conversation-branch-effects.md](conversation-branch-effects.md) | Execute portable context transfer and real workspace forks without hidden provider assumptions. | +| Workspace branching | [workspace-branching.md](workspace-branching.md) | Reconstruct exact provider checkpoints and forks across restart, mutation, and cleanup. | | Interactions and secrets | [interactions.md](interactions.md) | Answer, decline, cancel, or automate a typed request safely. | | Profiles and connections | [profiles-and-connections.md](profiles-and-connections.md) | Select a portable agent and a credential-bearing execution connection. | | Activity | [activity.md](activity.md) | Find live, queued, waiting, detached, and completed work. | diff --git a/docs/components/workspace-branching.md b/docs/components/workspace-branching.md new file mode 100644 index 00000000..ac7bbd45 --- /dev/null +++ b/docs/components/workspace-branching.md @@ -0,0 +1,97 @@ +# Workspace branching + +## Job + +Workspace branching creates an isolated provider environment from an exact source run and records every cleanup result. + +It supports checkpoint, lookup, fork, restart replay, destination mutation, source preservation, and resource cleanup. + +## Component map + +| Component | Responsibility | +| --- | --- | +| `ConversationBranches` | Build and validate the digest-bound workspace plan. | +| `conversation-branch-effects.ts` | Execute provider checkpoint and fork effects, then record Braid identities. | +| `AgentWorkspaceBranchingProvider` | Reconstruct a fresh source-scoped operation handle after restart. | +| `createTangleWorkspaceBranchingProvider` | Resolve Tangle credentials and delegate exact Sandbox operations. | +| `tangle-workspace-proof.mjs` | Run the protected LIVE-09 and LIVE-10 production proofs. | + +## Best simple implementation + +Braid stores the source control reference, operation digest, provider checkpoint identity, and provider environment identity. + +Braid stores no live provider environment handle in durable state. + +The provider exposes `forEnvironment(sourceEnvironmentId)` and creates a fresh operation handle for each recovery path. + +The Tangle adapter owns Sandbox calls for checkpoint, lookup, delete, fork, lookup, and destroy. + +The application validates every response against the canonical request digest before it records a resource. + +The application calls lookup before creation, so a retry cannot create a second checkpoint or fork. + +Cleanup names the resource kind, provider, target identifier, and cleanup request digest. + +The application refuses source cleanup when the target is the source environment. + +## Confidential placement + +The request records `requested` placement separately from provider evidence. + +The Tangle adapter calls `getTeeAttestation` on the forked Sandbox child. + +An operator-supplied verifier must validate the raw provider quote, provider key, nonce, and measurement. + +The adapter rejects a missing key, a copied quote, an invalid nonce, or an untrusted measurement. + +Braid marks `confidentialVerified` only after the canonical external verifier accepts the complete attestation. + +The request and attestation remain unverified when either verifier or attestation evidence is absent. + +## Restart and cleanup flow + +1. Plan from one immutable source branch, run, control reference, and environment. +2. Checkpoint through the fresh source-scoped provider handle. +3. Fork through the same handle with a separate idempotency key. +4. Record the returned destination environment and graph edge. +5. Reopen Braid and replay the same operation digest. +6. Reconstruct the provider handle from the persisted source environment identifier. +7. Look up both resources before cleanup. +8. Delete the checkpoint and destroy the destination environment with separate requests. +9. Verify the source contents and destroy the source environment through a fresh provider environment handle. + +## Production proof + +`LIVE-09` requires source materialization, checkpoint lookup, fork lookup, restart replay, independent destination mutation, unchanged source content, and exact cleanup. + +`LIVE-10` requires a configured external verifier, a valid attestation, missing-attestation rejection, wrong-nonce rejection, wrong-measurement rejection, and exact cleanup. + +The built-in proofs run through Braid application and connection adapters. + +They do not import the Sandbox SDK or call Sandbox methods directly. + +Set `BRAID_TANGLE_TEE_VERIFIER_MODULE` to an absolute or repository-relative module for `LIVE-10`. + +That module must export `verifyTeeAttestation(input)` and `verifyConfidentialAttestation(attestation, expected)`. + +The first function returns `{ providerKeyId, providerSignature, measurement? }` only after raw quote verification. + +The second function returns `true` only after canonical nonce, measurement, policy, and provider-key checks. + +Missing credentials, deployment capability, or verifier configuration returns typed unavailable evidence. + +Configured provider failures remain failed and never become simulated passes. + +## Tests + +`test/conversation-branch-effects.test.ts` proves exact requests, provider reconstruction, restart cleanup, idempotent replay, and source protection. + +`test/tangle-workspace-proof.test.mjs` proves the confidential negative checks reject nonce, measurement, and self-echo mutations. + +The protected live matrix validates both receipts against the public evidence schema. + +## Non-goals + +This component does not parse Sandbox output, persist provider-private state, or infer attestation trust from request fields. + +It does not create a workspace fork when the provider cannot prove lookup and cleanup support. diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index cd32e876..048712b9 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -15,6 +15,8 @@ export const PROOF_OPERATIONS = Object.freeze({ tangleInference: 'tangle.inference.turn', tangleSandbox: 'tangle.sandbox.turn', tangleSandboxInteractive: 'tangle.sandbox.interactive', + tangleWorkspaceFork: 'tangle.sandbox.workspace-fork', + tangleConfidential: 'tangle.sandbox.confidential', traceAnalysis: 'trace.analysis.ask-promote', supervisor: 'supervisor.snapshot-reconnect-steer', }) @@ -51,6 +53,28 @@ const PROOF_OPERATION_CHECKS = Object.freeze({ 'process-exited-before-cleanup', 'process-group-exited-before-cleanup', ]), + [PROOF_OPERATIONS.tangleWorkspaceFork]: Object.freeze([ + 'configuration', + 'source-run', + 'plan', + 'execute', + 'retry', + 'restart', + 'independent-destination', + 'source-unchanged', + 'cleanup-checkpoint', + 'cleanup-environment', + ]), + [PROOF_OPERATIONS.tangleConfidential]: Object.freeze([ + 'configuration', + 'external-verifier', + 'requested-unverified-binding', + 'missing-attestation', + 'valid-attestation', + 'wrong-nonce', + 'wrong-measurement', + 'cleanup', + ]), [PROOF_OPERATIONS.traceAnalysis]: Object.freeze([ 'source-frozen', 'cited-finding', @@ -91,6 +115,29 @@ const PROOF_OPERATION_FACT_KEYS = Object.freeze({ 'terminalResize', 'processGroupExitedBeforeWorkspaceCleanup', ]), + [PROOF_OPERATIONS.tangleWorkspaceFork]: Object.freeze([ + 'sourceProviderEnvironmentId', + 'destinationProviderEnvironmentId', + 'checkpointRetried', + 'forkRetried', + 'restarted', + 'sourceDigestBefore', + 'sourceDigestAfter', + 'destinationDigest', + 'cleanupCheckpoint', + 'cleanupEnvironment', + ]), + [PROOF_OPERATIONS.tangleConfidential]: Object.freeze([ + 'sourceProviderEnvironmentId', + 'destinationProviderEnvironmentId', + 'confidentialRequested', + 'confidentialVerified', + 'missingAttestationRejected', + 'wrongNonceRejected', + 'wrongMeasurementRejected', + 'cleanupCheckpoint', + 'cleanupEnvironment', + ]), [PROOF_OPERATIONS.traceAnalysis]: Object.freeze([ 'analysisId', 'findingCount', @@ -398,6 +445,14 @@ function validateProofFacts(operation, status, facts) { key === 'reconnectable' || key === 'provisioned' || key === 'cleanupVerified' || + key === 'checkpointRetried' || + key === 'forkRetried' || + key === 'restarted' || + key === 'confidentialRequested' || + key === 'confidentialVerified' || + key === 'missingAttestationRejected' || + key === 'wrongNonceRejected' || + key === 'wrongMeasurementRejected' || key === 'processExitedBeforeWorkspaceCleanup' || key === 'terminalResize' || key === 'processGroupExitedBeforeWorkspaceCleanup' @@ -605,6 +660,77 @@ function validatePassedTangleSandboxInteractiveReceipt(receipt) { } } +function validatePassedTangleWorkspaceForkReceipt(receipt) { + const requiredConnectionFields = ['endpoint', 'connectionId', 'connectionKind', 'model', 'runner'] + for (const field of requiredConnectionFields) + validRequiredString( + receipt.connection[field], + `Passed Tangle workspace-fork connection.${field}`, + ) + if (receipt.connection.connectionKind !== 'tangle-sandbox') + throw new Error('Passed Tangle workspace-fork proof requires a tangle-sandbox connection') + if (receipt.connection.credentialConfigured !== true) + throw new Error('Passed Tangle workspace-fork proof requires configured credentials') + if (receipt.run.ids.length !== 1) + throw new Error('Passed Tangle workspace-fork proof requires one source run ID') + validRequiredString(receipt.run.environmentId, 'Passed Tangle workspace-fork environmentId') + for (const field of [ + 'sourceProviderEnvironmentId', + 'destinationProviderEnvironmentId', + 'sourceDigestBefore', + 'sourceDigestAfter', + 'destinationDigest', + ]) + validRequiredString(receipt.facts[field], `Passed Tangle workspace-fork ${field}`) + if (receipt.facts.sourceProviderEnvironmentId === receipt.facts.destinationProviderEnvironmentId) + throw new Error('Passed Tangle workspace-fork proof reused its source environment') + if (receipt.facts.sourceDigestBefore !== receipt.facts.sourceDigestAfter) + throw new Error('Passed Tangle workspace-fork proof changed the source workspace') + for (const field of ['checkpointRetried', 'forkRetried', 'restarted']) { + if (receipt.facts[field] !== true) + throw new Error(`Passed Tangle workspace-fork proof requires ${field}=true`) + } + for (const field of ['cleanupCheckpoint', 'cleanupEnvironment']) { + if (!['deleted', 'already_absent'].includes(receipt.facts[field])) + throw new Error(`Passed Tangle workspace-fork proof requires ${field} cleanup`) + } + if (receipt.observations === null || Object.keys(receipt.observations).length === 0) + throw new Error('Passed Tangle workspace-fork proof requires redacted observations') +} + +function validatePassedTangleConfidentialReceipt(receipt) { + const requiredConnectionFields = ['endpoint', 'connectionId', 'connectionKind', 'model', 'runner'] + for (const field of requiredConnectionFields) + validRequiredString(receipt.connection[field], `Passed Tangle confidential connection.${field}`) + if (receipt.connection.connectionKind !== 'tangle-sandbox') + throw new Error('Passed Tangle confidential proof requires a tangle-sandbox connection') + if (receipt.connection.credentialConfigured !== true) + throw new Error('Passed Tangle confidential proof requires configured credentials') + if (receipt.run.ids.length !== 1) + throw new Error('Passed Tangle confidential proof requires one source run ID') + validRequiredString(receipt.run.environmentId, 'Passed Tangle confidential environmentId') + if (receipt.facts.confidentialRequested !== true) + throw new Error('Passed Tangle confidential proof requires a requested confidential fork') + if (receipt.facts.confidentialVerified !== true) + throw new Error('Passed Tangle confidential proof requires an externally verified attestation') + if ( + receipt.facts.missingAttestationRejected !== true || + receipt.facts.wrongNonceRejected !== true || + receipt.facts.wrongMeasurementRejected !== true + ) + throw new Error('Passed Tangle confidential proof requires all negative checks') + for (const field of ['sourceProviderEnvironmentId', 'destinationProviderEnvironmentId']) + validRequiredString(receipt.facts[field], `Passed Tangle confidential ${field}`) + if (receipt.facts.sourceProviderEnvironmentId === receipt.facts.destinationProviderEnvironmentId) + throw new Error('Passed Tangle confidential proof reused its source environment') + for (const field of ['cleanupCheckpoint', 'cleanupEnvironment']) { + if (!['deleted', 'already_absent'].includes(receipt.facts[field])) + throw new Error(`Passed Tangle confidential proof requires ${field} cleanup`) + } + if (receipt.observations === null || Object.keys(receipt.observations).length === 0) + throw new Error('Passed Tangle confidential proof requires redacted observations') +} + export function proofInvocation(scope) { if (typeof scope !== 'string' || scope.trim().length === 0) throw new Error('Live proof scope must be a non-empty string') @@ -679,6 +805,10 @@ export function assertProofReceipt(receipt, { invocationId, operation } = {}) { receipt.status === 'passed' ) validatePassedTangleSandboxInteractiveReceipt(receipt) + if (receipt.operation === PROOF_OPERATIONS.tangleWorkspaceFork && receipt.status === 'passed') + validatePassedTangleWorkspaceForkReceipt(receipt) + if (receipt.operation === PROOF_OPERATIONS.tangleConfidential && receipt.status === 'passed') + validatePassedTangleConfidentialReceipt(receipt) if (receipt.operation === PROOF_OPERATIONS.supervisor && receipt.status === 'passed') validatePassedSupervisorReceipt(receipt) return receipt diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs new file mode 100644 index 00000000..e20c1320 --- /dev/null +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -0,0 +1,1001 @@ +import { createHash, randomUUID } from 'node:crypto' +import { dirname, isAbsolute, join, resolve } from 'node:path' +import { fileURLToPath, pathToFileURL } from 'node:url' + +import { + confidentialExecutionVerified, + forkedEnvironmentConfidentialityVerified, + workspaceCheckpointRequestDigest, + workspaceForkRequestDigest, +} from '@tangle-network/agent-interface' + +import { connectionConfiguration } from './configuration.mjs' +import { + PROOF_OPERATIONS, + proofInvocation, + proofReceipt, + protectedUnavailable, + scalarMeasurement, +} from './contracts.mjs' +import { configEvidence, prepareProductionWorkspace } from './headless.mjs' + +const DEFAULT_REPOSITORY = resolve(dirname(fileURLToPath(import.meta.url)), '../..') +const DEFAULT_ENDPOINT = 'https://sandbox.tangle.tools' +const DEFAULT_MODEL = 'tangle-router/glm-5.2' +const DEFAULT_RUNNER = 'opencode' +const DEFAULT_PROVIDER = 'tangle' +const DEFAULT_IDLE_TTL_SECONDS = 1_800 +const DEFAULT_ABSENCE_ATTEMPTS = 6 +const DEFAULT_ABSENCE_DELAY_MS = 500 + +function configurationEnvironment(environment) { + if ( + !environment.BRAID_TANGLE_SANDBOX_CREDENTIAL_REF && + !environment.BRAID_TANGLE_SANDBOX_AUTH && + !environment.BRAID_TANGLE_SANDBOX_API_KEY && + !environment.BRAID_TANGLE_SANDBOX_BEARER && + environment.TANGLE_API_KEY + ) { + return { ...environment, BRAID_TANGLE_SANDBOX_API_KEY: environment.TANGLE_API_KEY } + } + return environment +} + +function sandboxConfiguration(environment) { + return connectionConfiguration(configurationEnvironment(environment), { + prefix: 'BRAID_TANGLE_SANDBOX', + kind: 'tangle-sandbox', + endpointNames: ['BRAID_TANGLE_ENDPOINT'], + modelNames: ['BRAID_TANGLE_MODEL'], + runnerNames: ['BRAID_TANGLE_RUNNER'], + providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], + fallbackEndpoint: DEFAULT_ENDPOINT, + fallbackModel: DEFAULT_MODEL, + fallbackRunner: DEFAULT_RUNNER, + fallbackProvider: DEFAULT_PROVIDER, + }) +} + +function idleTtlSeconds(environment) { + const candidate = Number(environment.BRAID_TANGLE_SANDBOX_IDLE_TTL_SECONDS) + if (!Number.isSafeInteger(candidate) || candidate < 60 || candidate > 604_800) + return DEFAULT_IDLE_TTL_SECONDS + return candidate +} + +function shellQuote(value) { + return `'${String(value).replaceAll("'", "'\\''")}'` +} + +function sha256(value) { + return createHash('sha256').update(value, 'utf8').digest('hex') +} + +function sha256Digest(value) { + if (typeof value !== 'string') throw new Error('A provider digest is missing') + if (/^sha256:[0-9a-f]{64}$/u.test(value)) return value + if (/^[0-9a-f]{64}$/u.test(value)) return `sha256:${value}` + throw new Error('A provider returned an invalid SHA-256 digest') +} + +function assertCondition(condition, message) { + if (!condition) throw new Error(message) +} + +function unavailable(code, message, cause) { + return protectedUnavailable(code, message, cause) +} + +function providerEnvironmentId(record, label) { + const value = record?.providerEnvironmentId + if (typeof value !== 'string' || value.length === 0) + throw new Error(`${label} has no provider environment identity`) + return value +} + +function sourceEnvironmentRecord(state, run) { + const environment = state.environments.find((candidate) => candidate.id === run.environmentId) + if (environment === undefined) throw new Error(`Source run ${run.id} has no environment record`) + const providerId = providerEnvironmentId(environment, 'Source environment') + assertCondition( + run.controlRef?.environmentId === providerId, + 'Source run and environment identities do not match', + ) + return { environment, providerId } +} + +function sourceRunFor(state, runId) { + const run = state.runs.find((candidate) => candidate.id === runId) + if (run === undefined) throw new Error(`Source run ${runId} is missing from durable state`) + if (run.status !== 'completed' || run.complete !== true) + throw new Error(`Source run ${runId} did not complete`) + if (run.controlRef === undefined) + throw new Error(`Source run ${runId} has no exact provider control reference`) + return run +} + +async function runtimeModules(repository) { + const dist = resolve(repository, 'dist') + const [startup, application, credentials, connections, profiles] = await Promise.all([ + import(pathToFileURL(join(dist, 'bin', 'production-startup.js')).href), + import(pathToFileURL(join(dist, 'bin', 'production-application.js')).href), + import(pathToFileURL(join(dist, 'bin', 'production-credential-context.js')).href), + import(pathToFileURL(join(dist, 'adapters', 'connections', 'production-connections.js')).href), + import(pathToFileURL(join(dist, 'adapters', 'agent-interface', 'profile-runtime.js')).href), + ]) + return { startup, application, credentials, connections, profiles } +} + +function verifierExports(moduleNamespace) { + const defaultExport = + moduleNamespace.default !== null && typeof moduleNamespace.default === 'object' + ? moduleNamespace.default + : undefined + return { ...(defaultExport ?? {}), ...moduleNamespace } +} + +/** + * Load the deployment's trust decision without inventing a local TEE verdict. + * + * The module must export `verifyTeeAttestation` and `verifyConfidentialAttestation`. + * The first checks the raw provider quote and returns provider key evidence. + * The second checks the canonical attestation against the deployment policy. + */ +export async function loadConfidentialVerifier(environment, repository = DEFAULT_REPOSITORY) { + const configured = + environment.BRAID_TANGLE_TEE_VERIFIER_MODULE ?? + environment.BRAID_TANGLE_CONFIDENTIAL_VERIFIER_MODULE + if (typeof configured !== 'string' || configured.trim().length === 0) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_VERIFIER_REQUIRED', + 'LIVE-10 requires BRAID_TANGLE_TEE_VERIFIER_MODULE with trusted provider-key and measurement checks', + ) + } + const modulePath = isAbsolute(configured) ? configured : resolve(repository, configured) + let loaded + try { + loaded = await import(pathToFileURL(modulePath).href) + } catch (error) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_VERIFIER_UNAVAILABLE', + `LIVE-10 could not load its configured confidential verifier module: ${modulePath}`, + error, + ) + } + const exports = verifierExports(loaded) + const raw = exports.verifyTeeAttestation + const canonical = exports.verifyConfidentialAttestation + if (typeof raw !== 'function' || typeof canonical !== 'function') { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_VERIFIER_INVALID', + 'LIVE-10 verifier module must export verifyTeeAttestation and verifyConfidentialAttestation', + ) + } + return Object.freeze({ + raw: async (input) => { + const result = await raw(input) + if (result === null) return null + if (result === undefined || typeof result !== 'object' || Array.isArray(result)) return null + if ( + typeof result.providerKeyId !== 'string' || + result.providerKeyId.length === 0 || + result.providerKeyId === 'unverified' || + typeof result.providerSignature !== 'string' || + result.providerSignature.length === 0 || + result.providerSignature === 'unverified' + ) { + return null + } + return { + providerKeyId: result.providerKeyId, + providerSignature: result.providerSignature, + ...(result.measurement === undefined ? {} : { measurement: result.measurement }), + } + }, + canonical: (attestation, expected) => { + if ( + attestation === null || + typeof attestation !== 'object' || + Array.isArray(attestation) || + attestation.providerKeyId === 'unverified' || + attestation.providerSignature === 'unverified' || + attestation.providerSignature === attestation.quote + ) { + return false + } + try { + return canonical(attestation, expected) === true + } catch { + return false + } + }, + }) +} + +async function openProofApplication({ repository, config, verifier }) { + const modules = await runtimeModules(repository) + let context + try { + context = modules.credentials.createProductionCredentialContext({ + workspace: config.workspace, + configPath: config.configPath, + databaseKeyFile: config.databaseKeyFile, + dataDirectory: config.dataDirectory, + }) + if (context === undefined) + throw unavailable( + 'PROTECTED_DATABASE_KEY_REQUIRED', + "The live proof could not create Braid's protected credential context", + ) + const startupOptions = { + workspace: config.workspace, + configPath: config.configPath, + databaseKeyFile: config.databaseKeyFile, + credentialContext: context, + credentialStore: context.store, + } + const startup = await modules.startup.loadProductionStartup(startupOptions) + const connection = startup.connections.find( + (candidate) => candidate.id === startup.connectionId, + ) + if (connection === undefined) + throw new Error('The live proof configuration selected no connection') + const connectionOptions = { + ...(startup.connectionOptions ?? {}), + credentials: context.store, + ...(verifier?.raw === undefined + ? {} + : { tangleConfidentialAttestationVerifier: verifier.raw }), + ...(verifier?.canonical === undefined + ? {} + : { confidentialAttestationVerifier: verifier.canonical }), + } + const production = { + ...startup, + workspaceRoot: config.workspace, + connectionOptions, + } + const opened = await modules.application.openProductionApplication({ + workspace: config.workspace, + statePath: config.statePath, + startupOptions, + production, + }) + try { + await modules.application.activateProductionConnection( + opened.app, + startup.connectionId, + startup.connections, + ) + } catch (error) { + await opened.close().catch(() => undefined) + throw error + } + return Object.freeze({ + ...opened, + startup, + production, + connection, + modules, + }) + } catch (error) { + context?.dispose() + throw error + } +} + +function providerAdapters(opened) { + const { createTangleWorkspaceBranchingProvider, getTangleSandboxEnvironment } = + opened.modules.connections + const options = opened.production.connectionOptions ?? {} + const factory = createTangleWorkspaceBranchingProvider(opened.connection, options) + return Object.freeze({ + freshBranching: async (sourceEnvironmentId) => { + const branching = await factory.forEnvironment(sourceEnvironmentId) + if (branching === null) + throw unavailable( + 'PROTECTED_WORKSPACE_BRANCHING_UNAVAILABLE', + `Tangle Sandbox did not expose workspace branching for ${sourceEnvironmentId}`, + ) + return branching + }, + freshEnvironment: (environmentId) => + getTangleSandboxEnvironment(opened.connection, options, environmentId), + }) +} + +function markerFor(proofId, label) { + return `BRAID_WORKSPACE_${proofId}_${label}`.toUpperCase() +} + +function markerPath(proofId) { + return `.braid-live/${proofId}/workspace-marker.txt` +} + +function sourcePrompt(marker, path) { + return [ + 'Use the current Tangle Sandbox working directory for every command in this turn.', + `Run mkdir -p ${shellQuote(dirname(path))}.`, + `Run printf '%s\\n' ${shellQuote(marker)} > ${shellQuote(path)}.`, + `Run cat ${shellQuote(path)} and verify the content is exactly ${shellQuote(marker)}.`, + `Reply with exactly ${marker}.`, + ].join(' ') +} + +async function sendSource(app, proofId) { + const initial = app.state() + const marker = markerFor(proofId, 'SOURCE') + const path = markerPath(proofId) + const operationId = `op-live-required-${proofId}-source-${randomUUID()}` + const receipt = app.send({ + operationId, + conversationId: initial.conversationId, + branchId: initial.branchId, + text: sourcePrompt(marker, path), + }) + await receipt.admissionReady + const terminal = await receipt.completion + const run = sourceRunFor(terminal, receipt.runId) + const source = sourceEnvironmentRecord(terminal, run) + return Object.freeze({ + marker, + path, + operationId, + receipt, + run, + ...source, + }) +} + +async function readWorkspace(adapters, environmentId, path, label) { + const environment = await adapters.freshEnvironment(environmentId) + if (environment === null) + throw new Error(`${label} provider environment ${environmentId} is missing`) + if (typeof environment.read !== 'function') + throw unavailable( + 'PROTECTED_WORKSPACE_READ_UNAVAILABLE', + `Tangle Sandbox did not expose workspace read for ${label}`, + ) + const content = await environment.read(path) + return Object.freeze({ content, digest: sha256(content) }) +} + +async function writeWorkspace(adapters, environmentId, path, content, label) { + const environment = await adapters.freshEnvironment(environmentId) + if (environment === null) + throw new Error(`${label} provider environment ${environmentId} is missing`) + if (typeof environment.write !== 'function') + throw unavailable( + 'PROTECTED_WORKSPACE_WRITE_UNAVAILABLE', + `Tangle Sandbox did not expose workspace write for ${label}`, + ) + await environment.write(path, content) +} + +function checkpointAndForkRequests(state, plan, operationId, sourceRun, destinationId) { + const checkpoint = state.checkpoints.find((candidate) => candidate.operationId === operationId) + if (checkpoint === undefined) throw new Error('Braid did not persist the workspace checkpoint') + const operation = state.operations.find((candidate) => candidate.id === operationId) + const providerCheckpointId = operation?.result?.providerCheckpointId + if (typeof providerCheckpointId !== 'string' || providerCheckpointId.length === 0) + throw new Error('Braid did not persist the provider checkpoint identity') + const source = structuredClone(sourceRun.controlRef) + const checkpointMaterial = { + source, + name: `braid checkpoint ${plan.sourceBranchId}`, + metadata: { + braidOperationId: operationId, + sourceBranchId: String(plan.sourceBranchId), + ...(plan.throughMessageId === undefined ? {} : { throughMessageId: plan.throughMessageId }), + }, + } + const checkpointRequestDigest = workspaceCheckpointRequestDigest(checkpointMaterial) + assertCondition( + sha256Digest(checkpoint.requestDigest) === checkpointRequestDigest, + 'Persisted checkpoint digest does not match Braid request material', + ) + const checkpointRef = { + checkpointId: providerCheckpointId, + provider: source.provider, + source, + idempotencyKey: `${operationId}:checkpoint`, + requestDigest: checkpointRequestDigest, + createdAt: checkpoint.createdAt, + metadata: checkpointMaterial.metadata, + } + const placement = plan.placement ?? { kind: 'provider' } + const forkMaterial = { + checkpoint: checkpointRef, + name: `braid fork ${plan.destinationBranchId}`, + placement, + ...(plan.confidential === undefined ? {} : { confidential: plan.confidential }), + metadata: { + braidOperationId: operationId, + destinationBranchId: String(plan.destinationBranchId), + }, + } + const forkRequestDigest = workspaceForkRequestDigest(forkMaterial) + const graphEdge = state.graphEdges.find((candidate) => { + const sourceNode = state.graphNodes.find((node) => node.id === candidate.source) + const destinationNode = state.graphNodes.find((node) => node.id === candidate.destination) + return ( + candidate.kind === 'forked_environment' && + sourceNode?.reference.kind === 'checkpoint' && + sourceNode.reference.id === checkpoint.id && + destinationNode?.reference.kind === 'environment' && + destinationNode.reference.id === destinationId + ) + }) + assertCondition(graphEdge !== undefined, 'Braid did not persist the fork graph edge') + const recordedForkDigest = graphEdge.provenance.sourceDigest + assertCondition(recordedForkDigest !== undefined, 'Braid fork graph edge has no request digest') + assertCondition( + sha256Digest(recordedForkDigest) === forkRequestDigest, + 'Persisted fork digest does not match Braid request material', + ) + return Object.freeze({ + checkpoint, + checkpointRef, + checkpointRequest: { + ...checkpointMaterial, + idempotencyKey: `${operationId}:checkpoint`, + requestDigest: checkpointRequestDigest, + }, + forkRequest: { + ...forkMaterial, + idempotencyKey: `${operationId}:fork`, + requestDigest: forkRequestDigest, + }, + }) +} + +async function lookupAfterRestart(adapters, sourceProviderEnvironmentId, requests) { + const checkpointHandle = await adapters.freshBranching(sourceProviderEnvironmentId) + const checkpoint = await checkpointHandle.lookupCheckpoint({ + idempotencyKey: requests.checkpointRequest.idempotencyKey, + requestDigest: requests.checkpointRequest.requestDigest, + }) + if (checkpoint.status !== 'found') + throw new Error(`Restart checkpoint lookup returned ${checkpoint.status}`) + assertCondition( + checkpoint.checkpoint.checkpointId === requests.checkpointRef.checkpointId, + 'Restart checkpoint lookup returned another checkpoint', + ) + const forkHandle = await adapters.freshBranching(sourceProviderEnvironmentId) + const fork = await forkHandle.lookupFork({ + idempotencyKey: requests.forkRequest.idempotencyKey, + requestDigest: requests.forkRequest.requestDigest, + }) + if (fork.status !== 'found') throw new Error(`Restart fork lookup returned ${fork.status}`) + assertCondition( + fork.environment.sourceEnvironmentId === sourceProviderEnvironmentId, + 'Restart fork lookup returned another source environment', + ) + return Object.freeze({ checkpoint, fork }) +} + +async function destroySource(adapters, sourceProviderEnvironmentId) { + const environment = await adapters.freshEnvironment(sourceProviderEnvironmentId) + if (environment === null) return true + if (typeof environment.destroy !== 'function') + throw unavailable( + 'PROTECTED_ENVIRONMENT_CLEANUP_UNAVAILABLE', + 'Tangle Sandbox did not expose source environment cleanup', + ) + await environment.destroy() + for (let attempt = 0; attempt < DEFAULT_ABSENCE_ATTEMPTS; attempt += 1) { + if ((await adapters.freshEnvironment(sourceProviderEnvironmentId)) === null) return true + await new Promise((resolvePromise) => setTimeout(resolvePromise, DEFAULT_ABSENCE_DELAY_MS)) + } + throw new Error( + `Source provider environment ${sourceProviderEnvironmentId} remained after cleanup`, + ) +} + +function checkpointIdForDestination(state, destinationId) { + const edge = state.graphEdges.find((candidate) => { + const source = state.graphNodes.find((node) => node.id === candidate.source) + const destination = state.graphNodes.find((node) => node.id === candidate.destination) + return ( + candidate.kind === 'forked_environment' && + destination?.reference.kind === 'environment' && + destination.reference.id === destinationId && + source?.reference.kind === 'checkpoint' + ) + }) + if (edge === undefined) return undefined + const source = state.graphNodes.find((node) => node.id === edge.source) + if (source?.reference.kind !== 'checkpoint') return undefined + return state.checkpoints.find((candidate) => candidate.id === source.reference.id)?.id +} + +function confidentialExpected(source, destinationProviderEnvironmentId, requestDigest) { + return { + provider: source.provider, + environmentId: destinationProviderEnvironmentId, + source: structuredClone(source), + requestDigest, + confidentialRequested: true, + } +} + +/** Run the canonical negative checks used by LIVE-10 and by its deterministic test. */ +export function confidentialNegativeChecks({ + request, + environment, + attestation, + verifyProviderAttestation, +}) { + const wrongNonce = { + ...request, + nonce: `${request.nonce}-wrong`, + } + const wrongMeasurement = { + ...attestation, + measurement: `sha256:${'f'.repeat(64)}`, + } + const selfEcho = { + ...attestation, + providerKeyId: 'unverified', + providerSignature: 'unverified', + } + return Object.freeze({ + missingAttestationRejected: !confidentialExecutionVerified({ + request, + environment, + verifyProviderAttestation, + }), + wrongNonceRejected: !confidentialExecutionVerified({ + request: wrongNonce, + environment, + attestation, + verifyProviderAttestation, + }), + wrongMeasurementRejected: !confidentialExecutionVerified({ + request, + environment, + attestation: wrongMeasurement, + verifyProviderAttestation, + }), + selfEchoRejected: !confidentialExecutionVerified({ + request, + environment, + attestation: selfEcho, + verifyProviderAttestation, + }), + }) +} + +async function runWorkspaceProof({ + repository = DEFAULT_REPOSITORY, + environment = process.env, + invocationId = proofInvocation('live-tangle-workspace'), + confidential = false, +}) { + const proofId = `${Date.now()}-${randomUUID().replaceAll('-', '')}` + const startedAt = new Date().toISOString() + const verifier = confidential + ? await loadConfidentialVerifier(environment, repository) + : undefined + const values = sandboxConfiguration(environment) + const config = await prepareProductionWorkspace({ + repository, + environment, + kind: 'tangle-sandbox', + connectionName: confidential ? 'Live tangle confidential' : 'Live tangle workspace fork', + endpoint: values.endpoint, + model: values.model, + runner: values.runner, + provider: values.provider, + credentialRef: values.credentialRef, + credentialValue: values.credentialValue, + providerOptions: { + lifecycle: 'retained', + idleTtlSeconds: idleTtlSeconds(environment), + }, + }) + let opened + let restarted + let source + let destination + let destinationProviderId + let sourceBefore + let destinationAfterMutation + let sourceAfterCleanup + let branchOperationId + let cleanupOperationId + let resources + let cleanupResult + let sourceDestroyed = false + let primaryError + let completedResult + let cleanupFailure + try { + opened = await openProofApplication({ repository, config, verifier }) + const adapters = providerAdapters(opened) + source = await sendSource(opened.app, proofId) + sourceBefore = await readWorkspace(adapters, source.providerId, source.path, 'source') + assertCondition( + sourceBefore.content.trim() === source.marker, + 'Source workspace marker was not materialized exactly', + ) + branchOperationId = `op-live-required-${proofId}-fork` + const planInput = { + operationId: branchOperationId, + conversationId: opened.app.state().conversationId, + branchId: opened.app.state().branchId, + kind: 'workspace', + placement: { kind: 'provider' }, + ...(confidential + ? { + confidential: { + requested: true, + nonce: `braid-live-${proofId}`, + policy: 'tangle-confidential-v1', + profileDigest: `sha256:${opened.modules.profiles.canonicalAgentProfileDigestHex(opened.app.state().profile)}`, + }, + } + : {}), + } + const plan = opened.app.conversations.branches.plan(planInput) + if (!plan.allowed) + throw unavailable( + 'PROTECTED_WORKSPACE_BRANCHING_UNAVAILABLE', + plan.reason ?? 'Tangle Sandbox did not report retry-safe workspace branching', + ) + const requestedUnverifiedBinding = confidential + ? !confidentialExecutionVerified({ + request: plan.confidential, + environment: confidentialExpected( + source.run.controlRef, + 'pending-destination', + `sha256:${'0'.repeat(64)}`, + ), + verifyProviderAttestation: verifier.canonical, + }) + : true + assertCondition( + requestedUnverifiedBinding, + 'Confidential placement passed without an attestation before execution', + ) + const branch = await opened.app.conversations.branches.execute({ + ...planInput, + planDigest: plan.digest, + }) + const afterExecute = opened.app.state() + const sourceRun = sourceRunFor(afterExecute, source.run.id) + destination = afterExecute.environments.find( + (candidate) => candidate.id === branch.environmentId, + ) + if (destination === undefined) throw new Error('Braid did not persist the forked environment') + destinationProviderId = providerEnvironmentId(destination, 'Destination environment') + assertCondition( + destinationProviderId !== source.providerId, + 'Fork reused the source environment', + ) + resources = checkpointAndForkRequests( + afterExecute, + plan, + branchOperationId, + sourceRun, + destination.id, + ) + const destinationMarker = markerFor(proofId, 'DESTINATION') + await writeWorkspace( + adapters, + destinationProviderId, + source.path, + `${destinationMarker}\n`, + 'destination', + ) + destinationAfterMutation = await readWorkspace( + adapters, + destinationProviderId, + source.path, + 'destination', + ) + assertCondition( + destinationAfterMutation.content.trim() === destinationMarker, + 'Destination mutation was not independently materialized', + ) + const sourceAfterMutation = await readWorkspace( + adapters, + source.providerId, + source.path, + 'source', + ) + assertCondition( + sourceAfterMutation.content === sourceBefore.content, + 'Destination mutation changed the source workspace', + ) + + await opened.close() + opened = undefined + restarted = await openProofApplication({ repository, config, verifier }) + const restartedAdapters = providerAdapters(restarted) + const replayBranch = await restarted.app.conversations.branches.execute({ + ...planInput, + planDigest: plan.digest, + }) + assertCondition(replayBranch.id === branch.id, 'Restart replay produced another branch') + const lookedUp = await lookupAfterRestart(restartedAdapters, source.providerId, resources) + if (confidential) { + const attestation = lookedUp.fork.environment.confidentialAttestation + if (attestation === undefined) + throw unavailable( + 'PROTECTED_CONFIDENTIAL_DEPLOYMENT_UNAVAILABLE', + 'Tangle Sandbox did not return a TEE attestation for the confidential fork', + ) + assertCondition( + attestation.providerKeyId !== 'unverified' && + attestation.providerSignature !== 'unverified', + 'Tangle Sandbox returned an unauthenticated confidential attestation', + ) + assertCondition( + attestation.providerSignature !== attestation.quote, + 'Tangle Sandbox returned the quote as its provider signature', + ) + const expected = confidentialExpected( + sourceRun.controlRef, + destinationProviderId, + resources.forkRequest.requestDigest, + ) + assertCondition( + forkedEnvironmentConfidentialityVerified( + resources.forkRequest, + lookedUp.fork.environment, + verifier.canonical, + ), + 'Canonical confidential attestation verification failed for the valid fork', + ) + const negatives = confidentialNegativeChecks({ + request: resources.forkRequest.confidential, + environment: expected, + attestation, + verifyProviderAttestation: verifier.canonical, + }) + assertCondition( + negatives.missingAttestationRejected, + 'Missing confidential attestation was accepted', + ) + assertCondition(negatives.wrongNonceRejected, 'Wrong confidential nonce was accepted') + assertCondition( + negatives.wrongMeasurementRejected, + 'Wrong confidential measurement was accepted', + ) + assertCondition(negatives.selfEchoRejected, 'Self-echoed confidential evidence was accepted') + assertCondition( + destination.placement.confidentialRequested, + 'Confidential request was not recorded', + ) + assertCondition( + destination.placement.confidentialVerified, + 'Confidential attestation was not verified', + ) + } + cleanupOperationId = `op-live-required-${proofId}-cleanup` + cleanupResult = await restarted.app.conversations.branches.cleanup({ + operationId: cleanupOperationId, + checkpointId: String(resources.checkpoint.id), + environmentId: String(destination.id), + }) + assertCondition( + ['deleted', 'already_absent'].includes(cleanupResult.checkpoint), + 'Checkpoint cleanup did not reach a terminal deletion status', + ) + assertCondition( + ['deleted', 'already_absent'].includes(cleanupResult.environment), + 'Fork cleanup did not reach a terminal deletion status', + ) + const cleanupReplay = await restarted.app.conversations.branches.cleanup({ + operationId: cleanupOperationId, + checkpointId: String(resources.checkpoint.id), + environmentId: String(destination.id), + }) + assertCondition( + JSON.stringify(cleanupReplay) === JSON.stringify(cleanupResult), + 'Cleanup replay returned a different durable result', + ) + const finalState = restarted.app.state() + assertCondition( + finalState.checkpoints.find((candidate) => candidate.id === resources.checkpoint.id) + ?.status === 'deleted', + 'Braid did not record checkpoint cleanup', + ) + assertCondition( + finalState.environments.find((candidate) => candidate.id === destination.id)?.lifecycle === + 'destroyed', + 'Braid did not record fork environment cleanup', + ) + sourceAfterCleanup = await readWorkspace( + restartedAdapters, + source.providerId, + source.path, + 'source', + ) + assertCondition( + sourceAfterCleanup.digest === sourceBefore.digest, + 'Source workspace digest changed during cleanup', + ) + sourceDestroyed = await destroySource(restartedAdapters, source.providerId) + await restarted.close() + restarted = undefined + completedResult = { + status: 'passed', + measurement: scalarMeasurement(confidential ? 'LIVE-10' : 'LIVE-09'), + evidence: proofReceipt({ + invocationId, + operation: confidential + ? PROOF_OPERATIONS.tangleConfidential + : PROOF_OPERATIONS.tangleWorkspaceFork, + startedAt, + completedAt: new Date().toISOString(), + config: configEvidence(config), + runIds: [source.run.id], + environmentId: source.run.environmentId, + materializationDigest: source.run.materializationDigest ?? null, + facts: confidential + ? { + sourceProviderEnvironmentId: source.providerId, + destinationProviderEnvironmentId: destinationProviderId, + confidentialRequested: true, + confidentialVerified: true, + missingAttestationRejected: true, + wrongNonceRejected: true, + wrongMeasurementRejected: true, + cleanupCheckpoint: cleanupResult.checkpoint, + cleanupEnvironment: cleanupResult.environment, + } + : { + sourceProviderEnvironmentId: source.providerId, + destinationProviderEnvironmentId: destinationProviderId, + checkpointRetried: true, + forkRetried: true, + restarted: true, + sourceDigestBefore: sourceBefore.digest, + sourceDigestAfter: sourceAfterCleanup.digest, + destinationDigest: destinationAfterMutation.digest, + cleanupCheckpoint: cleanupResult.checkpoint, + cleanupEnvironment: cleanupResult.environment, + }, + checks: confidential + ? [ + 'configuration', + 'external-verifier', + 'requested-unverified-binding', + 'missing-attestation', + 'valid-attestation', + 'wrong-nonce', + 'wrong-measurement', + 'cleanup', + ] + : [ + 'configuration', + 'source-run', + 'plan', + 'execute', + 'retry', + 'restart', + 'independent-destination', + 'source-unchanged', + 'cleanup-checkpoint', + 'cleanup-environment', + ], + observations: { + source: { + providerEnvironmentId: source.providerId, + path: source.path, + digestBefore: sourceBefore.digest, + digestAfter: sourceAfterCleanup.digest, + destroyed: sourceDestroyed, + }, + destination: { + providerEnvironmentId: destinationProviderId, + digest: destinationAfterMutation.digest, + independentMutation: true, + }, + recovery: { + checkpointLookup: 'found', + forkLookup: 'found', + branchReplay: true, + cleanupReplay: true, + }, + ...(confidential + ? { + attestation: { + providerKeyAuthenticated: true, + signatureDistinctFromQuote: true, + requestedUnverifiedBeforeExecution: true, + wrongNonceRejected: true, + wrongMeasurementRejected: true, + selfEchoRejected: true, + }, + } + : {}), + }, + environment, + }), + } + } catch (error) { + primaryError = error + throw error + } finally { + let cleanupError + let cleanupOwner = restarted ?? opened + let rescueOwner = false + if (source !== undefined) { + if (cleanupOwner === undefined) { + try { + cleanupOwner = await openProofApplication({ repository, config, verifier }) + rescueOwner = true + } catch (error) { + cleanupError ??= error + } + } + const cleanupCheckpointId = + resources?.checkpoint.id ?? + (cleanupOwner === undefined || destination === undefined + ? undefined + : checkpointIdForDestination(cleanupOwner.app.state(), destination.id)) + if ( + cleanupOwner !== undefined && + destination !== undefined && + cleanupCheckpointId !== undefined && + cleanupResult === undefined + ) { + cleanupOperationId ??= `op-live-required-${proofId}-cleanup` + try { + cleanupResult = await cleanupOwner.app.conversations.branches.cleanup({ + operationId: cleanupOperationId, + checkpointId: String(cleanupCheckpointId), + environmentId: String(destination.id), + }) + } catch (error) { + cleanupError ??= error + } + } + if (cleanupOwner !== undefined && !sourceDestroyed) { + try { + sourceDestroyed = await destroySource(providerAdapters(cleanupOwner), source.providerId) + } catch (error) { + cleanupError ??= error + } + } + } + if (rescueOwner && cleanupOwner !== undefined) { + try { + await cleanupOwner.close() + } catch (error) { + cleanupError ??= error + } + if (restarted === cleanupOwner) restarted = undefined + if (opened === cleanupOwner) opened = undefined + } + try { + if (restarted !== undefined) await restarted.close() + } catch (error) { + cleanupError ??= error + } + try { + if (opened !== undefined) await opened.close() + } catch (error) { + cleanupError ??= error + } + try { + await config.cleanup() + } catch (error) { + cleanupError ??= error + } + if (cleanupError !== undefined && primaryError === undefined) cleanupFailure = cleanupError + } + if (cleanupFailure !== undefined) throw cleanupFailure + return completedResult +} + +export function runWorkspaceForkProof(input) { + return runWorkspaceProof({ ...input, confidential: false }) +} + +export function runConfidentialProof(input) { + return runWorkspaceProof({ ...input, confidential: true }) +} diff --git a/scripts/live-required/tangle.mjs b/scripts/live-required/tangle.mjs index 399e590f..4ed195b3 100644 --- a/scripts/live-required/tangle.mjs +++ b/scripts/live-required/tangle.mjs @@ -18,6 +18,7 @@ import { runBraidSandboxSoak } from './tangle-sandbox-braid-soak.mjs' import { runInteractiveProof } from './tangle-sandbox-braid-interactive.mjs' import { assertMultirunProof } from './multirun-contract.mjs' import { runProof as runMultirunProof } from './tangle-sandbox-braid-multirun.mjs' +import { runConfidentialProof, runWorkspaceForkProof } from './tangle-workspace-proof.mjs' const TANGLE_ROWS = Object.freeze(['LIVE-06', 'LIVE-07', 'LIVE-08', 'LIVE-09', 'LIVE-10']) const MINIMUM_SANDBOX_STRESS_RUNS = 3 @@ -178,15 +179,68 @@ export async function runSandbox({ } } -export async function runMatrixAdapter({ environment }) { +export async function runMatrixAdapter({ + repository, + environment, + binary, + invocationId = proofInvocation('live-tangle-matrix'), +}) { const configured = typeof environment.BRAID_TANGLE_LIVE_ADAPTER === 'string' && environment.BRAID_TANGLE_LIVE_ADAPTER.trim().length > 0 + const flows = [] + const measurements = [] + const unavailable = [] + const setFlow = (row, result) => { + const flow = { + row, + status: result.status, + ...(result.reason === undefined ? {} : { reason: result.reason }), + ...(result.evidence === undefined ? {} : { evidence: result.evidence }), + ...(result.observations === undefined ? {} : { observations: result.observations }), + } + const index = flows.findIndex((candidate) => candidate.row === row) + if (index === -1) flows.push(flow) + else flows[index] = flow + } + const addUnavailable = (row, reason) => { + const detail = configured + ? `External Tangle matrix adapters are not accepted as release proof; ${reason}` + : reason + unavailable.push({ row, reason: detail }) + setFlow(row, { status: 'unavailable', reason: detail }) + } + const runBuiltIn = async (row, runner) => { + try { + const result = await runner({ repository, environment, binary, invocationId }) + if (result.status === 'failed') throw new Error(`${row} built-in proof failed`) + if (result.status !== 'passed') { + addUnavailable(row, result.reason ?? `${row} built-in proof is unavailable`) + return + } + setFlow(row, result) + if (result.measurement !== undefined) measurements.push(result.measurement) + } catch (error) { + const classified = classifyExternalFailure(error, `${row} built-in Tangle proof`, environment) + addUnavailable(row, classified.message) + } + } + await runBuiltIn('LIVE-09', runWorkspaceForkProof) + await runBuiltIn('LIVE-10', runConfidentialProof) + const status = + flows.length === 2 && flows.every((flow) => flow.status === 'passed') + ? 'passed' + : flows.every((flow) => flow.status === 'unavailable') + ? 'unavailable' + : 'partial' return { - status: 'unavailable', - reason: configured - ? 'External Tangle matrix adapters are not accepted as release proof; built-in parent checks for LIVE-09 and LIVE-10 are unavailable' - : 'Built-in parent checks for LIVE-09 and LIVE-10 are unavailable', + status, + flows, + measurements, + unavailable, + ...(unavailable.length === 0 + ? {} + : { reason: unavailable.map((entry) => entry.reason).join('; ') }), } } @@ -249,10 +303,18 @@ export async function runTangleFlows({ addUnavailable('LIVE-08', classified.message) } try { - const matrix = await matrixRunner({ repository, environment, binary }) + const matrix = await matrixRunner({ repository, environment, binary, invocationId }) for (const row of TANGLE_ROWS.slice(3)) { - const reason = `${row} remains protected-unavailable: ${matrix.reason}` - addUnavailable(row, reason) + const result = matrix.flows?.find((candidate) => candidate.row === row) + if (result?.status === 'passed') { + setFlow(result.row, result) + const measurement = matrix.measurements?.find((candidate) => candidate.name === row) + if (measurement !== undefined) measurements.push(measurement) + } else if (result?.status === 'failed') { + throw new Error(result.reason ?? `${row} matrix proof failed`) + } else { + addUnavailable(row, result?.reason ?? matrix.reason ?? `${row} matrix proof unavailable`) + } } } catch (error) { const classified = classifyExternalFailure(error, 'Tangle matrix', environment) diff --git a/src/adapters/connections/production-connection-providers.ts b/src/adapters/connections/production-connection-providers.ts index a20a1b8b..98e90730 100644 --- a/src/adapters/connections/production-connection-providers.ts +++ b/src/adapters/connections/production-connection-providers.ts @@ -1,4 +1,11 @@ -import type { AgentEnvironmentCapabilities } from '@tangle-network/agent-interface/environment-provider' +import type { + AgentEnvironment, + AgentEnvironmentCapabilities, +} from '@tangle-network/agent-interface/environment-provider' +import type { + AgentWorkspaceBranching, + AgentWorkspaceBranchingProvider, +} from '@tangle-network/agent-interface' import { createCliBridgeProvider } from '@tangle-network/agent-provider-cli-bridge' import { createTangleProvider, @@ -44,6 +51,55 @@ export async function createTangleSandboxClient( return new Sandbox({ baseUrl: endpoint, apiKey }) as unknown as SandboxClientLike } +/** + * Create a restart-safe source lookup without retaining a live environment. + * + * The provider constructs the source-scoped handle and owns every Sandbox call. + * Braid retains only this lazy factory, so restart recovery cannot use stale state. + */ +export function createTangleWorkspaceBranchingProvider( + record: ConnectionRecord, + options: ProductionConnectionOptions, +): AgentWorkspaceBranchingProvider { + return Object.freeze({ + async forEnvironment( + sourceEnvironmentId: string, + operation?: { readonly signal?: AbortSignal }, + ): Promise { + const client = await createTangleSandboxClient(record, options, operation?.signal) + const provider = createTangleProvider({ + client, + name: 'tangle-sandbox', + ...(options.tangleConfidentialAttestationVerifier === undefined + ? {} + : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), + }) + const branching = provider.workspaceBranching + if (branching === undefined) return null + return branching.forEnvironment(sourceEnvironmentId, operation) + }, + }) +} + +/** Reconstruct one provider environment for an independent workspace check. */ +export async function getTangleSandboxEnvironment( + record: ConnectionRecord, + options: ProductionConnectionOptions, + environmentId: string, + signal?: AbortSignal, +): Promise { + const client = await createTangleSandboxClient(record, options, signal) + const provider = createTangleProvider({ + client, + name: 'tangle-sandbox', + ...(options.tangleConfidentialAttestationVerifier === undefined + ? {} + : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), + }) + if (provider.get === undefined) return null + return provider.get(environmentId, signal === undefined ? undefined : { signal }) +} + export async function capabilitiesForConnection( record: ConnectionRecord, options: ProductionConnectionOptions, @@ -67,9 +123,28 @@ export async function capabilitiesForConnection( list: false, }) case 'tangle-sandbox': { - const reported = options.sandboxClient - ? await createTangleProvider({ client: options.sandboxClient }).capabilities() - : defaultTangleSandboxCapabilities() + const reported = + options.sandboxClient === undefined + ? { + ...defaultTangleSandboxCapabilities(), + branching: { + checkpoint: false, + fork: false, + retrySafe: false, + lookup: false, + cleanup: false, + }, + confidential: false, + } + : await createTangleProvider({ + client: options.sandboxClient, + ...(options.tangleConfidentialAttestationVerifier === undefined + ? {} + : { + confidentialAttestationVerifier: + options.tangleConfidentialAttestationVerifier, + }), + }).capabilities() const environment = tangleConnectionCapabilities( record, reported, diff --git a/src/adapters/connections/production-connection-types.ts b/src/adapters/connections/production-connection-types.ts index 561de77b..0375294f 100644 --- a/src/adapters/connections/production-connection-types.ts +++ b/src/adapters/connections/production-connection-types.ts @@ -1,6 +1,14 @@ -import type { AgentExactRunControlRef, AgentProfile } from '@tangle-network/agent-interface' +import type { + AgentExactRunControlRef, + AgentProfile, + ConfidentialAttestationVerifier, +} from '@tangle-network/agent-interface' import type { AgentEnvironmentCapabilities } from '@tangle-network/agent-interface/environment-provider' -import type { SandboxClientLike } from '@tangle-network/agent-provider-tangle' +import type { + SandboxClientLike, + TangleConfidentialAttestationVerifier, +} from '@tangle-network/agent-provider-tangle' +export type { TangleConfidentialAttestationVerifier } from '@tangle-network/agent-provider-tangle' import type { BridgeModelCredential, RouterTransportConfig, @@ -108,6 +116,10 @@ export interface ProductionConnectionOptions { readonly sandboxClient?: SandboxClientLike readonly sandboxClientFactory?: SandboxClientFactory readonly tangleRetainedControlLookup?: TangleRetainedControlLookup + /** Trusted provider-key and measurement verification for confidential forks. */ + readonly tangleConfidentialAttestationVerifier?: TangleConfidentialAttestationVerifier + /** Canonical Braid-side attestation verifier for returned fork evidence. */ + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier readonly now?: () => IsoDateTime } diff --git a/src/adapters/connections/production-connections.ts b/src/adapters/connections/production-connections.ts index d50eee9e..1c95e63f 100644 --- a/src/adapters/connections/production-connections.ts +++ b/src/adapters/connections/production-connections.ts @@ -14,7 +14,11 @@ export { DEFAULT_TANGLE_INFERENCE_ENDPOINT, normalizeCliBridgeRuntimeBaseUrl, } from './production-connection-endpoints.js' -export { createTangleSandboxClient } from './production-connection-providers.js' +export { + createTangleSandboxClient, + getTangleSandboxEnvironment, + createTangleWorkspaceBranchingProvider, +} from './production-connection-providers.js' export { type ConnectionCapabilityAction, type ConnectionCapabilityReport, @@ -29,6 +33,7 @@ export { type SandboxClientFactoryInput, type TangleRetainedControlLookup, type TangleRetainedControlLookupInput, + type TangleConfidentialAttestationVerifier, } from './production-connection-types.js' export function createProductionConnectionAdapter( diff --git a/src/adapters/runtime/agent-runtime-execution.ts b/src/adapters/runtime/agent-runtime-execution.ts index 61f4c985..075f2779 100644 --- a/src/adapters/runtime/agent-runtime-execution.ts +++ b/src/adapters/runtime/agent-runtime-execution.ts @@ -1,4 +1,8 @@ import type { RuntimeStreamEvent } from '@tangle-network/agent-runtime' +import type { + AgentWorkspaceBranchingProvider, + ConfidentialAttestationVerifier, +} from '@tangle-network/agent-interface' import type { AgentTurnBackend, Executor } from '@tangle-network/agent-runtime/kernel' import { canonicalDigest } from '../../domain/canonical.js' import { publicMaterializationReceipt } from '../../domain/materialization-receipt.js' @@ -43,6 +47,8 @@ export type AgentTurnCancelResolver = ( export interface AgentRuntimeExecutionOptions { readonly admissionMode?: 'sync' | 'async' + readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier } export class AgentRuntimeExecutionPort implements ExecutionPort { @@ -56,6 +62,8 @@ export class AgentRuntimeExecutionPort implements ExecutionPort { >() readonly #preparedOrder: string[] = [] readonly #capabilitySnapshot: RunCapabilities + readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier static readonly #MAX_PREPARED = 128 @@ -78,6 +86,10 @@ export class AgentRuntimeExecutionPort implements ExecutionPort { streaming: { ...UNKNOWN_RUN_CAPABILITIES.streaming, live: true }, } } + if (options.workspaceBranchingProvider !== undefined) + this.workspaceBranchingProvider = options.workspaceBranchingProvider + if (options.confidentialAttestationVerifier !== undefined) + this.confidentialAttestationVerifier = options.confidentialAttestationVerifier } capabilities(): RunCapabilities { diff --git a/src/adapters/runtime/mode-routing-execution.ts b/src/adapters/runtime/mode-routing-execution.ts index 263a7566..dea4d952 100644 --- a/src/adapters/runtime/mode-routing-execution.ts +++ b/src/adapters/runtime/mode-routing-execution.ts @@ -38,6 +38,10 @@ export class ModeRoutingExecutionPort implements ExecutionPort { readonly context?: NonNullable readonly contextTransfer?: NonNullable readonly workspaceBranching?: NonNullable + readonly workspaceBranchingProvider?: NonNullable + readonly confidentialAttestationVerifier?: NonNullable< + ExecutionPort['confidentialAttestationVerifier'] + > readonly provider?: string constructor(options: ModeRoutingExecutionOptions) { @@ -59,6 +63,15 @@ export class ModeRoutingExecutionPort implements ExecutionPort { const workspaceBranching = options.headless.workspaceBranching ?? options.interactive.workspaceBranching if (workspaceBranching !== undefined) this.workspaceBranching = workspaceBranching + const workspaceBranchingProvider = + options.headless.workspaceBranchingProvider ?? options.interactive.workspaceBranchingProvider + if (workspaceBranchingProvider !== undefined) + this.workspaceBranchingProvider = workspaceBranchingProvider + const confidentialAttestationVerifier = + options.headless.confidentialAttestationVerifier ?? + options.interactive.confidentialAttestationVerifier + if (confidentialAttestationVerifier !== undefined) + this.confidentialAttestationVerifier = confidentialAttestationVerifier const provider = options.headless.provider ?? options.interactive.provider if (provider !== undefined) this.provider = provider } diff --git a/src/adapters/runtime/production-tangle-sandbox-backend.ts b/src/adapters/runtime/production-tangle-sandbox-backend.ts index 562bd469..c11360d5 100644 --- a/src/adapters/runtime/production-tangle-sandbox-backend.ts +++ b/src/adapters/runtime/production-tangle-sandbox-backend.ts @@ -79,6 +79,9 @@ export async function resolveTangleSandboxBackend( client: observedClient.client, defaultBackend: runner, name: 'tangle-sandbox', + ...(options.tangleConfidentialAttestationVerifier === undefined + ? {} + : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), }) const capabilities = capabilitiesForLifecycle(await sdkProvider.capabilities(), lifecycle) const providerSessionId = providerSessionFor(input, capabilities) @@ -197,6 +200,9 @@ export async function resolveTangleSandboxRetainedConnection( client: observedClient.client, defaultBackend: runner, name: 'tangle-sandbox', + ...(options.tangleConfidentialAttestationVerifier === undefined + ? {} + : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), }) const reportedCapabilities = await provider.capabilities() const retained = reportedCapabilities.retainedControl diff --git a/src/adapters/runtime/tangle-retained-execution.ts b/src/adapters/runtime/tangle-retained-execution.ts index 182ea762..58a721cb 100644 --- a/src/adapters/runtime/tangle-retained-execution.ts +++ b/src/adapters/runtime/tangle-retained-execution.ts @@ -1,4 +1,8 @@ -import type { AgentExactRunControlRef } from '@tangle-network/agent-interface' +import type { + AgentExactRunControlRef, + AgentWorkspaceBranchingProvider, + ConfidentialAttestationVerifier, +} from '@tangle-network/agent-interface' import type { ExecuteTurnInput, RetainedExecutionRecoveryContext } from '../../ports/execution.js' import type { PreparedTangleRetainedConnection } from './production-tangle-sandbox-backend.js' import { RetainedExecutionPort } from './retained-execution.js' @@ -14,10 +18,15 @@ export interface TangleRetainedExecutionOptions { readonly signal?: AbortSignal } & RetainedExecutionRecoveryContext, ) => Promise + readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier } /** The cloud owns the retained sandbox; Braid owns readers and exact recovery state. */ export class TangleRetainedExecutionPort extends RetainedExecutionPort { + readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier + constructor(options: TangleRetainedExecutionOptions) { super({ resolve: async (input) => createTangleRetainedPlan(await options.resolve(input), input.runId), @@ -37,5 +46,9 @@ export class TangleRetainedExecutionPort extends RetainedExecutionPort { recovery, ), }) + if (options.workspaceBranchingProvider !== undefined) + this.workspaceBranchingProvider = options.workspaceBranchingProvider + if (options.confidentialAttestationVerifier !== undefined) + this.confidentialAttestationVerifier = options.confidentialAttestationVerifier } } diff --git a/src/adapters/runtime/tangle-retained-interactive-execution.ts b/src/adapters/runtime/tangle-retained-interactive-execution.ts index 30c4cb57..3cc03e89 100644 --- a/src/adapters/runtime/tangle-retained-interactive-execution.ts +++ b/src/adapters/runtime/tangle-retained-interactive-execution.ts @@ -1,4 +1,9 @@ -import type { AgentExactRunControlRef, AgentProfile } from '@tangle-network/agent-interface' +import type { + AgentExactRunControlRef, + AgentProfile, + AgentWorkspaceBranchingProvider, + ConfidentialAttestationVerifier, +} from '@tangle-network/agent-interface' import { agentInteractiveSessionStopRequestDigest, canonicalCandidateDigest, @@ -59,6 +64,8 @@ export interface TangleRetainedInteractiveExecutionOptions { readonly recover?: (input: ExecuteTurnInput) => Promise readonly broker: Pick readonly holderId?: string + readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier } interface PreparedInteractiveConnection { @@ -79,12 +86,18 @@ export class TangleRetainedInteractiveExecutionPort implements ExecutionPort { readonly #activeRuns = new Set() readonly #detachRequested = new Set() readonly #cancelledRuns = new Set() + readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier constructor(options: TangleRetainedInteractiveExecutionOptions) { this.#resolve = options.resolve this.#recover = options.recover this.#broker = options.broker this.#holderId = options.holderId ?? 'braid' + if (options.workspaceBranchingProvider !== undefined) + this.workspaceBranchingProvider = options.workspaceBranchingProvider + if (options.confidentialAttestationVerifier !== undefined) + this.confidentialAttestationVerifier = options.confidentialAttestationVerifier } capabilities = (input: ExecuteTurnInput): RunCapabilities | Promise => diff --git a/src/app/conversation-branch-effects.ts b/src/app/conversation-branch-effects.ts index ceea3835..43f720e9 100644 --- a/src/app/conversation-branch-effects.ts +++ b/src/app/conversation-branch-effects.ts @@ -14,6 +14,7 @@ import { type WorkspaceCleanupRequest, type WorkspaceForkRequest, type WorkspaceForkResult, + forkedEnvironmentConfidentialityVerified, workspaceCheckpointRequestDigest, workspaceCheckpointResultMatchesRequest, workspaceCleanupAcknowledgementMatches, @@ -72,7 +73,6 @@ export async function cleanupWorkspaceFork( input: WorkspaceForkCleanupInput, ): Promise { const execution = host.execution - const branching = execution?.workspaceBranching const state = host.state() const operationId = parseOperationId(input.operationId) const checkpoint = @@ -132,6 +132,7 @@ export async function cleanupWorkspaceFork( if (environment !== undefined && environment.providerEnvironmentId === undefined) throw new AppError('UNKNOWN_ENVIRONMENT', 'The environment has no provider reference') assertCleanupCapabilities(state, checkpoint, environment) + const sourceEnvironment = sourceEnvironmentForCleanup(state, checkpoint, environment) const digest = canonicalDigest({ command: 'cleanup_workspace_fork', operationId, @@ -148,9 +149,13 @@ export async function cleanupWorkspaceFork( throw new AppError('OPERATION_INCOMPLETE', `Operation ${operationId} has no cleanup result`) return result } + const previous = cleanupResultFromOperation(existing) + const branching = await workspaceBranchingForEnvironment( + execution, + sourceEnvironment?.providerEnvironmentId, + ) if (!hasWorkspaceBranching(branching)) throw new AppError('CAPABILITY_UNAVAILABLE', 'Workspace cleanup is unavailable') - const previous = cleanupResultFromOperation(existing) const checkpointOutcome = checkpoint === undefined @@ -310,9 +315,6 @@ async function executeWorkspace( plan: ForkPlan, createBranch: CreateBranch, ): Promise { - const branching = host.execution?.workspaceBranching - if (!hasWorkspaceBranching(branching)) - throw new AppError('CAPABILITY_UNAVAILABLE', plan.reason ?? 'Workspace fork is unavailable') const state = host.state() const operationId = parseOperationId(input.operationId) const sourceRun = sourceRunForPlan(state, plan) @@ -364,6 +366,12 @@ async function executeWorkspace( const reserved = await reserveOperation(host, operationId, digest) const existing = reserved.operations.find((operation) => operation.id === operationId) if (existing?.status === 'acknowledged') return branchForOperation(reserved, existing) + const branching = await workspaceBranchingForEnvironment( + host.execution, + sourceEnvironmentRecord.providerEnvironmentId, + ) + if (!hasWorkspaceBranching(branching)) + throw new AppError('CAPABILITY_UNAVAILABLE', plan.reason ?? 'Workspace fork is unavailable') const checkpointMaterial = { source, @@ -418,6 +426,7 @@ async function executeWorkspace( checkpoint: checkpoint.checkpoint, name: `braid fork ${plan.destinationBranchId}`, placement, + ...(plan.confidential === undefined ? {} : { confidential: plan.confidential }), metadata: { braidOperationId: input.operationId, destinationBranchId: String(plan.destinationBranchId), @@ -439,7 +448,7 @@ async function executeWorkspace( ) if (fork.environment.environmentId === source.environmentId) throw new AppError('FORK_PLAN_CONFLICT', 'The provider fork reused the source environment') - const destination = await recordForkedEnvironment(host, plan, fork.environment) + const destination = await recordForkedEnvironment(host, plan, fork.environment, forkRequest) const branch = await createBranch({ ...input, operationId: derivedOperationId(input.operationId, 'branch'), @@ -496,7 +505,9 @@ async function lookupOrCheckpoint( if (lookup.status === 'conflict') throw new AppError('CHECKPOINT_CONFLICT', 'Checkpoint idempotency key has a different request') if (lookup.status === 'unknown') throw new AppError('CHECKPOINT_UNKNOWN', lookup.message) - return branching.checkpoint(request) + const result = await branching.checkpoint(request) + if (result.status === 'unknown' || result.status === 'conflict') assertCheckpointResult(result) + return result } async function lookupOrFork( @@ -511,7 +522,9 @@ async function lookupOrFork( if (lookup.status === 'conflict') throw new AppError('FORK_CONFLICT', 'Fork idempotency key has a different request') if (lookup.status === 'unknown') throw new AppError('FORK_UNKNOWN', lookup.message) - return branching.fork(request) + const result = await branching.fork(request) + if (result.status === 'unknown' || result.status === 'conflict') assertForkResult(result) + return result } async function cleanupCheckpoint( @@ -625,6 +638,35 @@ function assertCleanupCapabilities( ) } +function sourceEnvironmentForCleanup( + state: BraidState, + checkpoint: CheckpointRecord | undefined, + environment: EnvironmentRecord | undefined, +): EnvironmentRecord | undefined { + const sourceCheckpoint = + checkpoint ?? + (environment === undefined + ? undefined + : (() => { + const edge = state.graphEdges.find((candidate) => { + const source = graphReference(state, candidate.source) + const destination = graphReference(state, candidate.destination) + return ( + candidate.kind === 'forked_environment' && + destination?.kind === 'environment' && + destination.id === environment.id && + source?.kind === 'checkpoint' + ) + }) + const source = edge === undefined ? undefined : graphReference(state, edge.source) + return source?.kind === 'checkpoint' + ? state.checkpoints.find((candidate) => candidate.id === source.id) + : undefined + })()) + if (sourceCheckpoint === undefined) return undefined + return state.environments.find((candidate) => candidate.id === sourceCheckpoint.sourceEnvironmentId) +} + function cleanupResultFromOperation( operation: OperationRecord | undefined, ): WorkspaceForkCleanupResult | undefined { @@ -770,6 +812,7 @@ async function recordForkedEnvironment( host: ConversationHost, plan: ForkPlan, ref: Extract['environment'], + request: WorkspaceForkRequest, ): Promise { const source = host .state() @@ -789,7 +832,14 @@ async function recordForkedEnvironment( provider: ref.provider, ...(ref.placement.region === undefined ? {} : { region: ref.placement.region }), confidentialRequested: ref.confidentialRequested, - confidentialVerified: false, + confidentialVerified: + ref.confidentialRequested && host.execution?.confidentialAttestationVerifier !== undefined + ? verifiedForkConfidentiality( + request, + ref, + host.execution.confidentialAttestationVerifier, + ) + : false, }, providerEnvironmentId: ref.environmentId, continuity: 'session', @@ -811,6 +861,34 @@ async function recordForkedEnvironment( return existing ?? environment } +function verifiedForkConfidentiality( + request: WorkspaceForkRequest, + environment: Extract['environment'], + verifier: NonNullable, +): boolean { + try { + return forkedEnvironmentConfidentialityVerified( + request, + environment, + (attestation, expected) => { + if ( + attestation.providerKeyId === 'unverified' || + attestation.providerSignature === 'unverified' || + attestation.providerSignature === attestation.quote + ) + return false + try { + return verifier(attestation, expected) === true + } catch { + return false + } + }, + ) + } catch { + return false + } +} + async function recordHandedOffEdge( host: ConversationHost, plan: ForkPlan, @@ -972,6 +1050,19 @@ function hasWorkspaceBranching( ) } +/** Resolve a fresh source handle when the provider exposes restart-safe lookup. */ +async function workspaceBranchingForEnvironment( + execution: ExecutionPort | undefined, + providerEnvironmentId: string | undefined, +): Promise { + const provider = execution?.workspaceBranchingProvider + if (provider !== undefined) { + if (providerEnvironmentId === undefined) return undefined + return (await provider.forEnvironment(providerEnvironmentId)) ?? undefined + } + return execution?.workspaceBranching +} + function graphReference(state: BraidState, id: string) { return state.graphNodes.find((node) => node.id === id)?.reference } diff --git a/src/app/conversation-branches.ts b/src/app/conversation-branches.ts index 8065491a..8760bde4 100644 --- a/src/app/conversation-branches.ts +++ b/src/app/conversation-branches.ts @@ -38,6 +38,7 @@ import { stableConversationIds, } from './conversation-support.js' import type { + ConfidentialExecutionRequest, CloneConversationInput, ConversationHost, CreateBranchInput, @@ -298,6 +299,7 @@ export class ConversationBranches { sourceRun, this.#host.execution, sourceEnvironmentId, + input.confidential?.requested === true, ) const portableContextPlan = kind === 'cross-runner' @@ -345,6 +347,7 @@ export class ConversationBranches { ...(input.destinationProvider === undefined ? {} : { destinationProvider: input.destinationProvider }), + ...(input.confidential === undefined ? {} : { confidential: input.confidential }), environment: kind === 'conversation' ? ('shared' as const) @@ -370,7 +373,9 @@ export class ConversationBranches { kind === 'workspace' ? workspaceAvailable ? 'The current runtime does not expose retry-safe environment fork execution to Braid' - : 'The selected run does not report retry-safe checkpoint and environment fork support' + : input.confidential?.requested === true + ? 'The selected run does not expose confidential placement and attestation verification' + : 'The selected run does not report retry-safe checkpoint and environment fork support' : 'The selected connection does not expose canonical fresh-session context transfer', }), } @@ -463,7 +468,11 @@ function resolveBranch( return { conversation, branch } } -function branchRequest(source: ResolvedSource, input: CreateBranchInput) { +function branchRequest( + source: ResolvedSource, + input: CreateBranchInput & { readonly confidential?: ConfidentialExecutionRequest }, +) { + const confidential = input.confidential return { conversationId: source.conversation.id, branchId: source.branch.id, @@ -473,6 +482,7 @@ function branchRequest(source: ResolvedSource, input: CreateBranchInput) { model: input.model ?? source.branch.overrides.model ?? null, effort: input.effort ?? source.branch.overrides.effort ?? null, mode: input.mode ?? source.branch.overrides.mode ?? null, + ...(confidential === undefined ? {} : { confidential }), } } @@ -518,13 +528,14 @@ function workspaceForkReported( run: BraidState['runs'][number] | undefined, execution: ExecutionPort | undefined, sourceEnvironmentId: string | undefined, + confidentialRequested: boolean, ): boolean { if (sourceEnvironmentId === undefined || run?.environmentId !== sourceEnvironmentId) return false const environment = state.environments.find((candidate) => candidate.id === sourceEnvironmentId) if (environment?.providerEnvironmentId === undefined) return false if (run?.controlRef?.environmentId !== environment.providerEnvironmentId) return false const branching = run?.capabilities.environment?.branching - return Boolean( + const supported = Boolean( hasWorkspaceBranchingMethods(execution) && branching?.checkpoint && branching.fork && @@ -532,6 +543,12 @@ function workspaceForkReported( branching.lookup && branching.cleanup, ) + if (!supported) return false + return ( + !confidentialRequested || + (run?.capabilities.environment?.confidential === true && + typeof execution?.confidentialAttestationVerifier === 'function') + ) } function sourceRunForBranch( @@ -556,6 +573,7 @@ function contextTransferPort( function hasWorkspaceBranchingMethods(execution: ExecutionPort | undefined): boolean { const branching = execution?.workspaceBranching + if (typeof execution?.workspaceBranchingProvider?.forEnvironment === 'function') return true return Boolean( branching !== undefined && typeof branching.checkpoint === 'function' && diff --git a/src/app/conversation-types.ts b/src/app/conversation-types.ts index 940fded6..3057c10a 100644 --- a/src/app/conversation-types.ts +++ b/src/app/conversation-types.ts @@ -1,8 +1,10 @@ import type { + ConfidentialExecutionRequest, PortableContextPlan as CanonicalPortableContextPlan, HarnessType, PlacementInfo, } from '@tangle-network/agent-interface' +export type { ConfidentialExecutionRequest } from '@tangle-network/agent-interface' import type { BranchRecord, ConversationRecord, @@ -94,6 +96,8 @@ export interface ForkPlanInput extends CreateBranchInput { readonly acceptedDigest?: string readonly destinationProvider?: string readonly placement?: PlacementInfo + /** Confidential placement request. The provider must prove it separately. */ + readonly confidential?: ConfidentialExecutionRequest } export interface WorkspaceForkCleanupInput { @@ -124,6 +128,7 @@ export interface ForkPlan { readonly destinationEnvironmentId?: string readonly checkpointId?: string readonly placement?: PlacementInfo + readonly confidential?: ConfidentialExecutionRequest readonly text?: string readonly destinationProvider?: string readonly allowed: boolean diff --git a/src/app/conversations.ts b/src/app/conversations.ts index 8429f74e..81acc8f3 100644 --- a/src/app/conversations.ts +++ b/src/app/conversations.ts @@ -44,6 +44,7 @@ export type { ImportConversationResult, } from './conversation-imports.js' export type { + ConfidentialExecutionRequest, CloneConversationInput, ConversationListQuery, CreateBranchInput, diff --git a/src/app/production-composition.ts b/src/app/production-composition.ts index d0bdc0c9..873bdab1 100644 --- a/src/app/production-composition.ts +++ b/src/app/production-composition.ts @@ -1,5 +1,8 @@ import type { AgentProfile } from '@tangle-network/agent-interface' -import { connectionEndpoint } from '../adapters/connections/production-connection-endpoints.js' +import { + connectionEndpoint, + createTangleWorkspaceBranchingProvider, +} from '../adapters/connections/production-connections.js' import type { ProductionConnectionOptions } from '../adapters/connections/production-connections.js' import { AgentRuntimeExecutionPort, @@ -189,6 +192,10 @@ export function createProductionComposition( }), } const backendResolver = createProductionBackendResolver(resolverOptions) + const workspaceBranchingProvider = + connection.kind === 'tangle-sandbox' + ? createTangleWorkspaceBranchingProvider(connection, resolverOptions) + : undefined const recoveryInput = ( runId: string, providerSessionId: string | undefined, @@ -235,17 +242,30 @@ export function createProductionComposition( resolverOptions, recoveryInput(runId, providerSessionId, recovery, signal), ), + ...(workspaceBranchingProvider === undefined ? {} : { workspaceBranchingProvider }), + ...(resolverOptions.confidentialAttestationVerifier === undefined + ? {} + : { confidentialAttestationVerifier: resolverOptions.confidentialAttestationVerifier }), }) const broker = new NativeInteractiveRunBroker() const interactive = new TangleRetainedInteractiveExecutionPort({ resolve: (input) => resolveProductionTangleRetainedConnection(resolverOptions, input), recover: (input) => resolveProductionTangleRetainedConnection(resolverOptions, input), broker, + ...(workspaceBranchingProvider === undefined ? {} : { workspaceBranchingProvider }), + ...(resolverOptions.confidentialAttestationVerifier === undefined + ? {} + : { confidentialAttestationVerifier: resolverOptions.confidentialAttestationVerifier }), }) nativeInteractive = broker return new ModeRoutingExecutionPort({ headless, interactive }) } - return new AgentRuntimeExecutionPort(backendResolver) + return new AgentRuntimeExecutionPort(backendResolver, undefined, { + ...(workspaceBranchingProvider === undefined ? {} : { workspaceBranchingProvider }), + ...(resolverOptions.confidentialAttestationVerifier === undefined + ? {} + : { confidentialAttestationVerifier: resolverOptions.confidentialAttestationVerifier }), + }) })() return Object.freeze({ diff --git a/src/index.ts b/src/index.ts index 0278c064..00aaedd8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -45,6 +45,7 @@ export { } from './app/composition.js' export type { CloneConversationInput, + ConfidentialExecutionRequest, ConversationListQuery, CreateBranchInput, CreateConversationInput, diff --git a/src/ports/execution.ts b/src/ports/execution.ts index 321351be..b2bb813d 100644 --- a/src/ports/execution.ts +++ b/src/ports/execution.ts @@ -3,6 +3,8 @@ import type { AgentExactRunControlRef, AgentProfile, AgentWorkspaceBranching, + AgentWorkspaceBranchingProvider, + ConfidentialAttestationVerifier, ContextTransferRequest, ContextTransferResult, InteractionResponseCommand, @@ -180,6 +182,10 @@ export interface ExecutionPort { readonly contextTransfer?: ContextTransferExecutionPort /** Retry-safe checkpoint, fork, lookup, and cleanup operations, when supported. */ readonly workspaceBranching?: AgentWorkspaceBranching + /** Provider-owned source lookup used to reconstruct branching after restart. */ + readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider + /** External verifier required before Braid marks a confidential fork verified. */ + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier /** Provider identity used when Braid builds a destination context plan. */ readonly provider?: string } diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts index 773ea7c1..79d34937 100644 --- a/test/conversation-branch-effects.test.ts +++ b/test/conversation-branch-effects.test.ts @@ -9,6 +9,7 @@ import type { WorkspaceForkRequest, WorkspaceForkResult, } from '@tangle-network/agent-interface' +import type { AgentWorkspaceBranchingProvider } from '@tangle-network/agent-interface' import { createBraidApplication } from '../src/app/composition.js' import { MemoryJournal } from '../src/app/journal.js' import { canonicalDigest } from '../src/domain/canonical.js' @@ -103,6 +104,7 @@ function branchCapabilities(workspace = false): RunCapabilities { lookup: workspace, cleanup: workspace, }, + confidential: workspace, }, } as unknown as RunCapabilities } @@ -190,6 +192,28 @@ function workspaceProvider(): { }, async fork(request) { state.forkRequests.push(request) + const confidential = request.confidential + const confidentialAttestation = + confidential?.requested === true && + confidential.nonce !== undefined && + confidential.policy !== undefined && + confidential.profileDigest !== undefined + ? { + provider: request.checkpoint.provider, + requested: true as const, + nonce: confidential.nonce, + measurement: `sha256:${'a'.repeat(64)}` as `sha256:${string}`, + environmentId: 'provider-destination-environment', + source: request.checkpoint.source, + requestDigest: request.requestDigest, + profileDigest: confidential.profileDigest, + policy: confidential.policy, + quote: 'provider-quote', + providerKeyId: 'trusted-provider-key', + providerSignature: 'trusted-provider-signature', + verifiedAt: AT, + } + : undefined const result: WorkspaceForkResult = { status: 'created', idempotencyKey: request.idempotencyKey, @@ -205,6 +229,7 @@ function workspaceProvider(): { createdAt: AT, placement: request.placement, confidentialRequested: request.confidential?.requested ?? false, + ...(confidentialAttestation === undefined ? {} : { confidentialAttestation }), ...(request.metadata === undefined ? {} : { metadata: request.metadata }), }, } @@ -262,6 +287,8 @@ function executionFor(options: { readonly capabilities: ReturnType readonly contextState?: ContextProviderState readonly workspaceBranching?: NonNullable + readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider + readonly confidentialAttestationVerifier?: NonNullable }): ExecutionPort { const contextState = options.contextState return { @@ -335,6 +362,12 @@ function executionFor(options: { ...(options.workspaceBranching === undefined ? {} : { workspaceBranching: options.workspaceBranching }), + ...(options.workspaceBranchingProvider === undefined + ? {} + : { workspaceBranchingProvider: options.workspaceBranchingProvider }), + ...(options.confidentialAttestationVerifier === undefined + ? {} + : { confidentialAttestationVerifier: options.confidentialAttestationVerifier }), } } @@ -549,16 +582,21 @@ test('cross-runner retry reuses the original acceptance timestamp in its request test('workspace fork uses exact provider operations, isolates destination, and cleans both resources', async () => { const provider = workspaceProvider() + const sourceLookups: string[] = [] + const workspaceBranchingProvider: AgentWorkspaceBranchingProvider = { + async forEnvironment(sourceEnvironmentId) { + sourceLookups.push(sourceEnvironmentId) + return sourceEnvironmentId === 'provider-source-environment' ? provider.branching : null + }, + } const execution = executionFor({ capabilities: branchCapabilities(true), - workspaceBranching: provider.branching, + workspaceBranchingProvider, }) - const workspaceBranching = execution.workspaceBranching - assert(workspaceBranching) const journal = new MemoryJournal(new FixedClock(AT)) const app = createBraidApplication({ fixture: 'deterministic', - execution: { ...execution, workspaceBranching }, + execution, clock: new FixedClock(AT), journal, }) @@ -577,6 +615,7 @@ test('workspace fork uses exact provider operations, isolates destination, and c }) assert.equal(provider.state.checkpointRequests.length, 1) assert.equal(provider.state.forkRequests.length, 1) + assert.deepEqual(sourceLookups, ['provider-source-environment']) assert.notEqual(branch.environmentId, plan.sourceEnvironmentId) assert.equal( provider.state.forkRequests[0]?.checkpoint.source.environmentId, @@ -603,8 +642,15 @@ test('workspace fork uses exact provider operations, isolates destination, and c assert.equal(workspaceReplay.id, branch.id) assert.equal(provider.state.checkpointRequests.length, 1) assert.equal(provider.state.forkRequests.length, 1) + assert.deepEqual(sourceLookups, ['provider-source-environment']) - const cleanup = await app.conversations.branches.cleanup({ + const restarted = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + journal, + }) + const cleanup = await restarted.conversations.branches.cleanup({ operationId: 'op-cleanup-workspace-effects', checkpointId: String(checkpoint.id), environmentId: String(destination.id), @@ -622,27 +668,109 @@ test('workspace fork uses exact provider operations, isolates destination, and c provider.state.cleanupRequests[1]?.operationId, ) assert.equal( - app.state().checkpoints.find((candidate) => candidate.id === checkpoint.id)?.status, + restarted.state().checkpoints.find((candidate) => candidate.id === checkpoint.id)?.status, 'deleted', ) assert.equal( - app.state().environments.find((candidate) => candidate.id === destination.id)?.lifecycle, + restarted.state().environments.find((candidate) => candidate.id === destination.id)?.lifecycle, 'destroyed', ) - const restarted = createBraidApplication({ + const replayRestarted = createBraidApplication({ fixture: 'deterministic', - execution: { ...execution, workspaceBranching }, + execution, clock: new FixedClock(AT), journal, }) - const cleanupReplay = await restarted.conversations.branches.cleanup({ + const cleanupReplay = await replayRestarted.conversations.branches.cleanup({ operationId: 'op-cleanup-workspace-effects', checkpointId: String(checkpoint.id), environmentId: String(destination.id), }) assert.deepEqual(cleanupReplay, cleanup) assert.equal(provider.state.cleanupRequests.length, 2) + assert.deepEqual(sourceLookups, ['provider-source-environment', 'provider-source-environment']) +}) + +test('confidential workspace fork records verification only after canonical attestation checks', async () => { + const provider = workspaceProvider() + const execution = executionFor({ + capabilities: branchCapabilities(true), + workspaceBranchingProvider: { + async forEnvironment(sourceEnvironmentId) { + return sourceEnvironmentId === 'provider-source-environment' ? provider.branching : null + }, + }, + confidentialAttestationVerifier: (attestation, environment) => + attestation.providerKeyId === 'trusted-provider-key' && + attestation.providerSignature === 'trusted-provider-signature' && + attestation.measurement === `sha256:${'a'.repeat(64)}` && + attestation.environmentId === environment.environmentId, + }) + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + }) + await prepareSource(app) + await app.send({ operationId: 'op-source-confidential-effects', text: 'confidential source' }) + .completion + const confidential = { + requested: true as const, + nonce: 'confidential-nonce', + policy: 'confidential-policy', + profileDigest: `sha256:${'b'.repeat(64)}` as `sha256:${string}`, + } + const planInput = { + operationId: 'op-confidential-workspace-effects', + kind: 'workspace' as const, + confidential, + } + const plan = app.conversations.branches.plan(planInput) + assert.equal(plan.allowed, true) + assert.equal(plan.confidential?.requested, true) + const branch = await app.conversations.branches.execute({ + ...planInput, + planDigest: plan.digest, + }) + const destination = app.state().environments.find( + (environment) => environment.id === branch.environmentId, + ) + assert(destination) + assert.equal(destination.placement.confidentialRequested, true) + assert.equal(destination.placement.confidentialVerified, true) + assert.equal(provider.state.forkRequests[0]?.confidential?.requested, true) +}) + +test('confidential workspace planning stays unavailable without an external verifier', async () => { + const provider = workspaceProvider() + const execution = executionFor({ + capabilities: branchCapabilities(true), + workspaceBranchingProvider: { + async forEnvironment(sourceEnvironmentId) { + return sourceEnvironmentId === 'provider-source-environment' ? provider.branching : null + }, + }, + }) + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + }) + await prepareSource(app) + await app.send({ operationId: 'op-source-confidential-unverified', text: 'source' }).completion + const plan = app.conversations.branches.plan({ + operationId: 'op-confidential-unverified', + kind: 'workspace', + confidential: { + requested: true, + nonce: 'confidential-nonce', + policy: 'confidential-policy', + profileDigest: `sha256:${'b'.repeat(64)}` as `sha256:${string}`, + }, + }) + assert.equal(plan.allowed, false) + assert.match(plan.reason ?? '', /confidential placement and attestation verification/u) }) test('cross-runner planning stays unavailable without a provider transfer method', async () => { diff --git a/test/tangle-workspace-proof.test.mjs b/test/tangle-workspace-proof.test.mjs new file mode 100644 index 00000000..185dff0a --- /dev/null +++ b/test/tangle-workspace-proof.test.mjs @@ -0,0 +1,143 @@ +import assert from 'node:assert/strict' +import test from 'node:test' + +import { + workspaceCheckpointRequestDigest, + workspaceForkRequestDigest, +} from '@tangle-network/agent-interface' + +import { + assertProofReceipt, + PROOF_OPERATIONS, + proofReceipt, +} from '../scripts/live-required/contracts.mjs' +import { confidentialNegativeChecks } from '../scripts/live-required/tangle-workspace-proof.mjs' + +const DIGEST = `sha256:${'1'.repeat(64)}` + +function confidentialFixture() { + const source = { + runId: 'run-live-proof', + provider: 'tangle-sandbox', + environmentId: 'sandbox-source', + sessionId: 'session-live-proof', + executionId: 'execution-live-proof', + requestDigest: DIGEST, + } + const checkpointMaterial = { + source, + name: 'checkpoint-live-proof', + metadata: { proof: 'live-proof' }, + } + const checkpoint = { + checkpointId: 'snapshot-live-proof', + provider: source.provider, + source, + idempotencyKey: 'operation-live-proof:checkpoint', + requestDigest: workspaceCheckpointRequestDigest(checkpointMaterial), + createdAt: '2026-08-28T00:00:00.000Z', + } + const requestMaterial = { + checkpoint, + name: 'fork-live-proof', + metadata: { proof: 'live-proof' }, + placement: { kind: 'provider' }, + confidential: { + requested: true, + nonce: 'nonce-live-proof', + policy: 'policy-live-proof', + profileDigest: DIGEST, + }, + } + const request = { + ...requestMaterial, + idempotencyKey: 'operation-live-proof:fork', + requestDigest: workspaceForkRequestDigest(requestMaterial), + } + const environment = { + provider: source.provider, + environmentId: 'sandbox-destination', + sourceEnvironmentId: source.environmentId, + source, + sourceCheckpointId: checkpoint.checkpointId, + idempotencyKey: request.idempotencyKey, + requestDigest: request.requestDigest, + createdAt: '2026-08-28T00:00:01.000Z', + placement: request.placement, + confidentialRequested: true, + } + const attestation = { + provider: source.provider, + requested: true, + nonce: request.confidential.nonce, + measurement: DIGEST, + environmentId: environment.environmentId, + source, + requestDigest: request.requestDigest, + profileDigest: request.confidential.profileDigest, + policy: request.confidential.policy, + quote: 'raw-tee-quote', + providerKeyId: 'provider-key-live-proof', + providerSignature: 'provider-signature-live-proof', + verifiedAt: '2026-08-28T00:00:02.000Z', + } + const verifyProviderAttestation = (candidate, expected) => + candidate.providerKeyId === 'provider-key-live-proof' && + candidate.providerSignature === 'provider-signature-live-proof' && + candidate.measurement === DIGEST && + candidate.environmentId === expected.environmentId + return { request, environment, attestation, verifyProviderAttestation } +} + +test('LIVE-10 negative checks reject nonce, measurement, and self-echo mutations', () => { + const fixture = confidentialFixture() + assert.deepEqual(confidentialNegativeChecks(fixture), { + missingAttestationRejected: true, + wrongNonceRejected: true, + wrongMeasurementRejected: true, + selfEchoRejected: true, + }) +}) + +test('LIVE-10 passed receipts require external verification and every negative check', () => { + const receipt = proofReceipt({ + invocationId: 'live-required-confidential-receipt', + operation: PROOF_OPERATIONS.tangleConfidential, + startedAt: '2026-08-28T00:00:00.000Z', + completedAt: '2026-08-28T00:00:01.000Z', + config: { + endpoint: 'https://sandbox.tangle.tools', + connectionId: 'connection-live-10', + connectionKind: 'tangle-sandbox', + credentialConfigured: true, + model: 'glm-5.2', + runner: 'opencode', + }, + runIds: ['run-live-10'], + environmentId: 'local-environment-live-10', + facts: { + sourceProviderEnvironmentId: 'sandbox-source-live-10', + destinationProviderEnvironmentId: 'sandbox-destination-live-10', + confidentialRequested: true, + confidentialVerified: true, + missingAttestationRejected: true, + wrongNonceRejected: true, + wrongMeasurementRejected: true, + cleanupCheckpoint: 'deleted', + cleanupEnvironment: 'deleted', + }, + checks: [ + 'configuration', + 'external-verifier', + 'requested-unverified-binding', + 'missing-attestation', + 'valid-attestation', + 'wrong-nonce', + 'wrong-measurement', + 'cleanup', + ], + observations: { verified: true }, + environment: {}, + }) + assert.equal(assertProofReceipt(receipt).status, 'passed') +}) From 82763e87213166b8e32eca4679d8a2e2054398aa Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 13:14:56 -0600 Subject: [PATCH 027/136] fix(analysis): enforce reproducible live execution --- README.md | 4 +- docs/04-runtime-contracts.md | 4 +- scripts/live-required/analysis.mjs | 19 ++++++- scripts/live-required/headless.mjs | 15 ++++- .../analysis/managed-analysis-runtime.ts | 6 +- src/adapters/analysis/python-runner.ts | 6 +- src/adapters/analysis/runtime-model-owner.ts | 12 ++-- test/trace-analysis-configuration.test.ts | 57 +++++++++++++++++-- 8 files changed, 103 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index d3686661..20539d82 100644 --- a/README.md +++ b/README.md @@ -181,7 +181,9 @@ Each analysis has its own run identity, source digest, analyst profile, model, b The standard Braid install includes `uv` for `/ask`. -On first use, `uv` downloads a managed Python 3.12 runtime and runs `agent-eval-rpc[dspy]==0.145.15` in an isolated cached environment. +On first use, `uv` downloads a managed Python 3.12 runtime and runs the `agent-eval-rpc[dspy]` release that matches the installed `@tangle-network/agent-eval` package. + +The managed runtime fails closed instead of using packages from the host Python installation. Set `BRAID_PYTHON` only when an operator must use a preinstalled compatible environment instead. diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index 506ccbef..87edfc78 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -474,7 +474,9 @@ Paired comparisons retain outcomes and costs across two frozen candidates. The current DSPy RLM engine accepts a caller-owned model function, stable public call reference, and execution recorder instead of a provider URL or credential. Braid invokes this engine through its bundled `uv` binary and an isolated managed Python 3.12 runtime. -The invocation pins `agent-eval-rpc[dspy]` to `0.149.0` and fixes the dependency resolution cutoff. +The invocation pins `agent-eval-rpc[dspy]` to the installed `@tangle-network/agent-eval` version and fixes the dependency resolution cutoff. + +If the managed runtime cannot resolve that exact cohort, Braid reports analysis as unavailable and does not use host Python packages. Braid never sends model credentials to the managed Python process. Braid gives each analyst invocation one explicit runtime transport attempt by default so its recorded usage and cost cannot hide additional paid retries. diff --git a/scripts/live-required/analysis.mjs b/scripts/live-required/analysis.mjs index ba595899..63da2b23 100644 --- a/scripts/live-required/analysis.mjs +++ b/scripts/live-required/analysis.mjs @@ -49,6 +49,18 @@ function analysisSummary(analysis) { checks: Array.isArray(analysis.checks) ? analysis.checks.map((check) => ({ id: check.id, status: check.status })) : null, + modelCalls: Array.isArray(analysis.modelCalls) + ? analysis.modelCalls.map((call) => ({ + id: call.id, + model: call.model, + status: call.status, + errorKind: call.errorKind, + errorStatus: call.errorStatus, + inputTokens: call.inputTokens, + outputTokens: call.outputTokens, + cost: call.cost, + })) + : null, } } @@ -96,8 +108,13 @@ export async function runTraceAnalysis({ repository, environment }) { const analysis = data?.analysis if (data?.status !== 'completed' || typeof analysis?.id !== 'string') { const detail = typeof data?.error === 'string' ? `: ${data.error}` : '' + const failedAnalysis = + analysis ?? + (Array.isArray(afterResponse.state?.analyses) + ? afterResponse.state.analyses.at(-1) + : undefined) throw new Error( - `trace analysis returned ${String(data?.status ?? 'no status')} instead of completed${detail}`, + `trace analysis returned ${String(data?.status ?? 'no status')} instead of completed; evidence=${JSON.stringify(analysisSummary(failedAnalysis))}${detail}`, ) } if (!supportedFindings(analysis)) { diff --git a/scripts/live-required/headless.mjs b/scripts/live-required/headless.mjs index 18991d55..3068094b 100644 --- a/scripts/live-required/headless.mjs +++ b/scripts/live-required/headless.mjs @@ -492,8 +492,19 @@ export async function runHeadlessTurn({ binary, config, marker, prompt, fixture Number(process.env.BRAID_LIVE_REQUIRED_TIMEOUT_MS ?? 180_000), ) const run = runFromState(terminal.state, response.runId) - if (run?.status !== 'completed') - throw new Error(`turn ${response.runId} ended with status ${run?.status ?? 'missing'}`) + if (run?.status !== 'completed') { + const diagnostics = [ + typeof run?.error === 'string' && run.error.length > 0 + ? `error=${JSON.stringify(safeMessage(run.error, config.environment))}` + : undefined, + typeof run?.model === 'string' && run.model.length > 0 + ? `model=${JSON.stringify(safeMessage(run.model, config.environment))}` + : undefined, + ].filter(Boolean) + throw new Error( + `turn ${response.runId} ended with status ${run?.status ?? 'missing'}${diagnostics.length === 0 ? '' : `; ${diagnostics.join('; ')}`}`, + ) + } const message = terminalMessage(terminal.state, response.runId) if (!exactMarker(message?.text, marker)) { throw new Error( diff --git a/src/adapters/analysis/managed-analysis-runtime.ts b/src/adapters/analysis/managed-analysis-runtime.ts index 1777a7c6..6df23feb 100644 --- a/src/adapters/analysis/managed-analysis-runtime.ts +++ b/src/adapters/analysis/managed-analysis-runtime.ts @@ -1,8 +1,9 @@ import { createRequire } from 'node:module' +import { AGENT_EVAL_VERSION } from './agent-eval-version.js' -const AGENT_EVAL_RPC_VERSION = '0.145.15' +const AGENT_EVAL_RPC_VERSION = AGENT_EVAL_VERSION const PYTHON_VERSION = '3.12' -const RESOLUTION_CUTOFF = '2026-08-11T05:00:00Z' +const RESOLUTION_CUTOFF = '2026-08-21T12:09:00Z' const RUNTIME_PROBE = [ 'import importlib.metadata', 'import sys', @@ -91,3 +92,4 @@ export function managedAnalysisRunner( export const MANAGED_AGENT_EVAL_RPC_VERSION = AGENT_EVAL_RPC_VERSION export const MANAGED_ANALYSIS_PYTHON_VERSION = PYTHON_VERSION export const MANAGED_ANALYSIS_RUNTIME_PROBE = RUNTIME_PROBE +export const MANAGED_ANALYSIS_RESOLUTION_CUTOFF = RESOLUTION_CUTOFF diff --git a/src/adapters/analysis/python-runner.ts b/src/adapters/analysis/python-runner.ts index 2dbd63a5..be71c507 100644 --- a/src/adapters/analysis/python-runner.ts +++ b/src/adapters/analysis/python-runner.ts @@ -271,8 +271,6 @@ export async function resolvePythonRunner( return probeRunner(runner, probe, timeoutMs) } - let packageMissing: PythonRunnerResolution | undefined - let probeFailed: PythonRunnerResolution | undefined if (options.candidates === undefined && !process.env.BRAID_PYTHON?.trim()) { const managed = managedAnalysisRunner() if (managed !== undefined) { @@ -300,7 +298,7 @@ export async function resolvePythonRunner( }, } } - probeFailed = { + return { status: 'python-probe-failed', runner: { command: managed.command, @@ -315,6 +313,8 @@ export async function resolvePythonRunner( } } + let packageMissing: PythonRunnerResolution | undefined + let probeFailed: PythonRunnerResolution | undefined for (const candidate of options.candidates ?? defaultCandidates()) { const runner = normalizedRunner({ command: candidate }, 'detected') if (runner === undefined) continue diff --git a/src/adapters/analysis/runtime-model-owner.ts b/src/adapters/analysis/runtime-model-owner.ts index 52f59cd4..dd999d25 100644 --- a/src/adapters/analysis/runtime-model-owner.ts +++ b/src/adapters/analysis/runtime-model-owner.ts @@ -608,6 +608,11 @@ function analystCallProfile( 'Trace analysis execution limits exceed AgentProfile.model.maxTotalOutputTokens', ) } + const enforceableTotalOutputTokens = + maxTotalOutputTokens ?? + (maxVisibleOutputTokens === undefined || maxReasoningTokens === undefined + ? undefined + : maxVisibleOutputTokens + maxReasoningTokens) return snapshotAgentProfile({ name: `${source.name ?? 'Braid'} trace analyst`, description: 'One bounded trace-analysis model call', @@ -624,11 +629,10 @@ function analystCallProfile( default: model, ...(provider === undefined ? {} : { provider }), ...(reasoningEffort === undefined ? {} : { reasoningEffort }), - ...(maxVisibleOutputTokens === undefined ? {} : { maxVisibleOutputTokens }), - ...(maxReasoningTokens === undefined || maxReasoningTokens <= 0 + ...(bridge || maxVisibleOutputTokens === undefined ? {} : { maxVisibleOutputTokens }), + ...(enforceableTotalOutputTokens === undefined ? {} - : { maxReasoningTokens }), - ...(maxTotalOutputTokens === undefined ? {} : { maxTotalOutputTokens }), + : { maxTotalOutputTokens: enforceableTotalOutputTokens }), metadata: { ...(bridge ? {} : { retry }), ...(request.temperature === undefined ? {} : { temperature: request.temperature }), diff --git a/test/trace-analysis-configuration.test.ts b/test/trace-analysis-configuration.test.ts index 13c3f5b7..f856e92e 100644 --- a/test/trace-analysis-configuration.test.ts +++ b/test/trace-analysis-configuration.test.ts @@ -9,6 +9,7 @@ import { AgentEvalAnalystAdapter } from '../src/adapters/analysis/eval-analyst.j import { MANAGED_AGENT_EVAL_RPC_VERSION, MANAGED_ANALYSIS_PYTHON_VERSION, + MANAGED_ANALYSIS_RESOLUTION_CUTOFF, MANAGED_ANALYSIS_RUNTIME_PROBE, managedAnalysisRunner, } from '../src/adapters/analysis/managed-analysis-runtime.js' @@ -64,7 +65,7 @@ test('managed analysis uses bundled uv with exact isolated runtime versions', () '--with', `agent-eval-rpc[dspy]==${MANAGED_AGENT_EVAL_RPC_VERSION}`, '--exclude-newer', - '2026-08-11T05:00:00Z', + MANAGED_ANALYSIS_RESOLUTION_CUTOFF, '--default-index', 'https://pypi.org/simple', '--keyring-provider', @@ -90,7 +91,7 @@ test('managed analysis uses bundled uv with exact isolated runtime versions', () '--with', `agent-eval-rpc[dspy]==${MANAGED_AGENT_EVAL_RPC_VERSION}`, '--exclude-newer', - '2026-08-11T05:00:00Z', + MANAGED_ANALYSIS_RESOLUTION_CUTOFF, '--default-index', 'https://pypi.org/simple', '--keyring-provider', @@ -179,8 +180,11 @@ test('managed runtime readiness isolates cancellation across concurrent first us test('managed runtime resolution failure is typed before analysis starts', async () => { const previous = process.env.BRAID_PYTHON delete process.env.BRAID_PYTHON - const probe: PythonCommandProbe = async (_command, args) => - args.includes('run') ? { status: 'failed', exitCode: 1 } : { status: 'not-found' } + const calls: string[][] = [] + const probe: PythonCommandProbe = async (_command, args) => { + calls.push([...args]) + return args.includes('run') ? { status: 'failed', exitCode: 1 } : { status: 'ok', exitCode: 0 } + } try { const result = await resolvePythonRunner({ probe, @@ -188,6 +192,8 @@ test('managed runtime resolution failure is typed before analysis starts', async }) assert.equal(result.status, 'python-probe-failed') assert.match(result.message, /could not resolve Python 3\.12/u) + assert.equal(calls.length, 1) + assert.equal(calls[0]?.includes('run'), true) } finally { if (previous === undefined) delete process.env.BRAID_PYTHON else process.env.BRAID_PYTHON = previous @@ -620,6 +626,45 @@ test('runtime-owned trace model call preserves canonical messages, limits, usage assert.match(execution, /"maxAttempts":1/u) }) +test('runtime-owned trace model lowers visible and aggregate ceilings without an unenforceable reasoning ceiling', async () => { + let receivedBody: Record | undefined + const selected = connection( + 'tangle-inference', + 'runtime-owner-bounded', + 'https://router.test', + true, + ) + const owner = createRuntimeTraceModelOwner({ + profile: { + harness: 'cli-base', + model: { + default: 'pi/tangle-router/glm-5.2', + provider: 'tangle-router', + reasoningEffort: 'high', + }, + }, + connection: selected, + baseUrl: 'http://127.0.0.1:3344/v1', + credential: 'credential-never-recorded', + model: 'pi/tangle-router/glm-5.2', + pricing: PRICING, + maxReasoningTokens: 256, + complete: async (body) => { + receivedBody = body + return { + model: 'pi/tangle-router/glm-5.2', + choices: [{ message: { content: '{"answer":"ok"}' }, finish_reason: 'stop' }], + usage: { prompt_tokens: 12, completion_tokens: 3, total_tokens: 15 }, + } + }, + }) + + const result = await owner.call(optimizerRequest()) + assert.equal(result.succeeded, true) + assert.equal(receivedBody?.max_tokens, 64) + assert.equal(receivedBody?.max_completion_tokens, 320) +}) + test('runtime-owned CLI Bridge analysis uses the harness executor with portable profile authority', async () => { const bridge = await startRuntimeBridgeServer({ expectedBearer: 'credential-never-recorded', @@ -693,8 +738,8 @@ test('runtime-owned CLI Bridge analysis uses the harness executor with portable assert.equal(executionProfile.model?.default, 'tangle-router/glm-5.2') assert.equal(executionProfile.model?.provider, 'tangle-router') assert.equal(executionProfile.model?.reasoningEffort, 'none') - assert.equal(executionProfile.model?.maxVisibleOutputTokens, 64) - assert.equal(executionProfile.model?.maxReasoningTokens, 256) + assert.equal(executionProfile.model?.maxVisibleOutputTokens, undefined) + assert.equal(executionProfile.model?.maxReasoningTokens, undefined) assert.equal(executionProfile.model?.maxTotalOutputTokens, 384) assert.equal(Object.hasOwn(executionProfile.model?.metadata ?? {}, 'maxTokens'), false) assert.equal(executionProfile.model?.metadata?.retry, undefined) From ff762776aefdc8edaa9735d3e1b54940b98638dd Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 13:38:17 -0600 Subject: [PATCH 028/136] feat(ui): make parallel run focus explicit --- docs/components/activity.md | 4 ++ docs/components/work-strip.md | 6 +- scripts/capture-visual-definitions.mjs | 72 +++++++++++++++++++ scripts/capture-visual.mjs | 36 ++++++++++ .../tangle-sandbox-braid-multirun.mjs | 5 +- .../tangle-sandbox-braid-multirun.test.mjs | 8 +-- src/views/tui/activity-browser.ts | 7 +- src/views/tui/terminal-chrome.ts | 2 +- test/activity-document.test.ts | 8 ++- test/terminal-responsive.test.ts | 4 +- 10 files changed, 137 insertions(+), 15 deletions(-) diff --git a/docs/components/activity.md b/docs/components/activity.md index e7392ae4..889cbb07 100644 --- a/docs/components/activity.md +++ b/docs/components/activity.md @@ -29,6 +29,10 @@ Run rows also carry conversation and branch identity. Selecting a run emits `focus-run` for that exact run. +The runs view states that Enter opens details and focuses controls. + +The focused row includes a `controls` label, which stays separate from conversation selection. + Selecting another entity opens its details without changing run focus. ## Ordering and state diff --git a/docs/components/work-strip.md b/docs/components/work-strip.md index 37cd6711..dea01b79 100644 --- a/docs/components/work-strip.md +++ b/docs/components/work-strip.md @@ -30,7 +30,7 @@ The activity selector receives keyboard input and a bounded list of run rows. ## Outputs and intents -Each item exposes branch, state, runner, model, pending interaction count, focus marker, and switch, ask, steer, and cancel actions. +Each item exposes branch, state, runner, model, pending interaction count, a `focus` or `work` label, and switch, ask, steer, and cancel actions. Each activity run row carries its run identifier for explicit focus dispatch. @@ -48,7 +48,9 @@ Detached runs remain visible so the operator can distinguish remote work from lo Queued entries remain separate items even when they share a source run. -An item marks focus from `focusedRunId` and does not infer focus from row order. +An item labels the controlled run as `focus` and every other row as `work`. + +The label comes from `focusedRunId` and never from row order or the selected conversation. An item reports runner and model from the admitted run receipt or canonical run record. diff --git a/scripts/capture-visual-definitions.mjs b/scripts/capture-visual-definitions.mjs index e0c0c668..1ba84b25 100644 --- a/scripts/capture-visual-definitions.mjs +++ b/scripts/capture-visual-definitions.mjs @@ -37,6 +37,78 @@ export function createStateDefinitions(normalized) { return { point, record } }, }, + { + name: 'multi-run', + columns: 80, + rows: 24, + environment: { BRAID_FIXTURE_CHUNK_DELAY_MS: '10000' }, + run: async (terminal) => { + terminal.input('parallel run A') + terminal.input('\r') + await terminal.waitFor( + () => normalized(terminal.screen()).includes('working'), + 'first active run', + ) + terminal.input('/new Parallel run B') + terminal.input('\r') + await new Promise((resolve) => setTimeout(resolve, 100)) + terminal.input('parallel run B') + terminal.input('\r') + await terminal.waitFor( + () => + terminal + .screen() + .split('\n') + .filter((line) => /^(?:focus|work) .+ · running · /u.test(line.trimStart())).length >= + 2, + 'two Work Strip rows', + ) + const before = await terminal.captureState() + const switchedFrom = before.record.view?.focusedRunId + const activityRuns = (before.record.view?.activity ?? []) + .filter((item) => item.kind === 'run') + .slice() + .reverse() + const targetIndex = activityRuns.findIndex((item) => item.runId !== switchedFrom) + const targetRunId = activityRuns[targetIndex]?.runId + const targetTitle = activityRuns[targetIndex]?.title + if (typeof targetRunId !== 'string' || typeof targetTitle !== 'string') { + throw new Error('multi-run capture could not resolve the background Activity row') + } + if (targetIndex !== 1) { + throw new Error(`multi-run capture expected one background row, received ${targetIndex}`) + } + terminal.input('\u001bOQ') + await terminal.waitFor(() => /^\s*activity\b/iu.test(terminal.screen()), 'activity browser') + terminal.input('\t') + await new Promise((resolve) => setTimeout(resolve, 250)) + terminal.input('\u001b[B') + await new Promise((resolve) => setTimeout(resolve, 250)) + await terminal.waitForStable('background Activity row') + const selectedLine = terminal + .screen() + .split('\n') + .find((line) => /^\s*›\s/u.test(line)) + if (!selectedLine?.includes(targetTitle)) { + throw new Error( + `multi-run capture could not select ${JSON.stringify(targetTitle)} in Activity; selected=${JSON.stringify(selectedLine ?? '')}`, + ) + } + terminal.input('\r') + await terminal.waitForStable('background focus selection') + terminal.input('\u001b[D') + await terminal.waitForStable('activity list return') + terminal.input('\u001b') + await new Promise((resolve) => setTimeout(resolve, 250)) + await terminal.waitFor( + () => !/^\s*runs\b/iu.test(terminal.screen()), + 'activity browser dismissal', + ) + const { point, record } = await terminal.captureState() + await terminal.closeWithSignal() + return { point, record, switchedFrom, targetRunId } + }, + }, { name: 'interaction', columns: 80, diff --git a/scripts/capture-visual.mjs b/scripts/capture-visual.mjs index 79668f27..5ed73fa0 100644 --- a/scripts/capture-visual.mjs +++ b/scripts/capture-visual.mjs @@ -221,6 +221,7 @@ async function spawnTerminal( const captureState = async () => { await waitForStable() const point = snapshot() + await rm(`${recordPath}.frame`, { force: true }) process.kill(session.pid, 'SIGUSR2') return { point, record: await readRecord('.frame') } } @@ -463,6 +464,26 @@ try { if (!normalized(result.point.screen).includes('working')) throw new Error('active-streaming frame does not show active work') } + if (definition.name === 'multi-run') { + const workStrip = result.record.view?.workStrip ?? [] + const renderedRows = result.point.screen + .split('\n') + .filter((line) => /^(?:focus|work) .+ · running · /u.test(line.trimStart())) + if (workStrip.length !== 2 || renderedRows.length !== 2) { + throw new Error( + `multi-run capture did not expose two Work Strip rows (view=${workStrip.length}, rendered=${renderedRows.length})`, + ) + } + if ( + typeof result.switchedFrom !== 'string' || + typeof result.targetRunId !== 'string' || + result.record.view?.focusedRunId !== result.targetRunId + ) { + throw new Error( + `multi-run capture did not switch the focused run through Activity (before=${String(result.switchedFrom)}, target=${String(result.targetRunId)}, after=${String(result.record.view?.focusedRunId)}, rows=${JSON.stringify(workStrip.map((item) => ({ runId: item.runId, focused: item.focused })))})`, + ) + } + } if ( result.record.capturePhase !== 'atomic-signal-frame' || result.record.state?.revision !== result.record.view?.revision @@ -578,6 +599,11 @@ try { await writeCastGif(join(rawRoot, 'automation-frame.cast'), automationGif) artifacts.push(await artifactFor(automationGif, 'automation-flow', 80, 24, 'automation')) + const multiRunGif = join(outputRoot, '80x24-multirun.gif') + await writeCastGif(join(rawRoot, 'multi-run.cast'), multiRunGif) + const multiRunArtifact = await artifactFor(multiRunGif, 'multi-run-flow', 80, 24, 'multi-run') + artifacts.push(multiRunArtifact) + const keyboardFlow = await transcriptKeyboardCapture() const keyboardCast = join(rawRoot, 'transcript-keyboard.cast') const keyboardGif = join(outputRoot, '80x24-transcript-keyboard.gif') @@ -611,6 +637,16 @@ try { steps: keyboardFlow.steps, artifacts: keyboardArtifacts.map((artifact) => artifact.path), }, + multiRunFlow: { + steps: [ + 'start run A', + 'create conversation B while A remains active', + 'start run B', + 'open Activity', + 'switch focus to run A', + ], + artifacts: [multiRunArtifact.path], + }, states: stateManifests, artifacts, }, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 0b7d7cad..58415325 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -547,8 +547,9 @@ export function assertSuccessfulTerminalExit(exit, label) { export function renderedWorkStripCount(screen) { return screen .split('\n') - .filter((line) => /^[·›] .+ · [^/\s]+\/[^\s]+ · \d+ interactions?/u.test(line.trimStart())) - .length + .filter((line) => + /^(?:focus|work) .+ · [^/\s]+\/[^\s]+ · \d+ interactions?/u.test(line.trimStart()), + ).length } export function assertFrameHasConcurrentRuns(frame, runIds) { diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs index 1f143e21..d06796e8 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs @@ -3,15 +3,15 @@ import test from 'node:test' import { assertMultirunProof } from './multirun-contract.mjs' import { activityBrowserOpen, - cancellationDispatchVisible, assertFrameHasConcurrentRuns, assertSuccessfulTerminalExit, + cancellationDispatchVisible, frameCancellationDispatch, frameEventIds, renderedWorkStripCount, sendCancellationAfterActivityBrowserDismissal, - terminalRecordPath, terminalFailureEvidence, + terminalRecordPath, transcriptSurfaceReady, waitForActivityBrowserDismissal, } from './tangle-sandbox-braid-multirun.mjs' @@ -173,9 +173,9 @@ test('rendered work-strip guard counts only actionable ownership rows', () => { assert.equal( renderedWorkStripCount( [ - '· branch-a · streaming · opencode/model · 1 interaction · actions switch/!ask/!steer/cancel', + 'work branch-a · streaming · opencode/model · 1 interaction · actions switch/!ask/!steer/cancel', 'status text mentioning work', - '› branch-b · streaming · opencode/model · 0 interactions · actions swi…', + 'focus branch-b · streaming · opencode/model · 0 interactions · actions swi…', ].join('\n'), ), 2, diff --git a/src/views/tui/activity-browser.ts b/src/views/tui/activity-browser.ts index db567c6f..e4e57e1a 100644 --- a/src/views/tui/activity-browser.ts +++ b/src/views/tui/activity-browser.ts @@ -88,6 +88,7 @@ export function activityDocument( .reverse() return { title: scope === 'all' ? 'activity' : scope, + ...(scope === 'runs' ? { context: 'Enter opens details and focuses controls' } : {}), filterHint: activityFooter(scope, view), ...(pinned === undefined ? {} : { pinned }), ...(notice === undefined ? {} : { notice }), @@ -150,13 +151,17 @@ function rowFor( : [...activityLines, ...(entity?.lines ?? [])] if (item.kind === 'run') lines.push(...runContext(item, runs, view)) const meta = listMeta(item, elapsed) + const focusedRun = item.kind === 'run' && item.runId === view.focusedRunId + const listMetadata = [focusedRun ? 'controls' : undefined, meta] + .filter((value): value is string => value !== undefined) + .join(' · ') return { id: item.id, kind: item.kind, ...(item.runId === undefined ? {} : { runId: item.runId }), title: entity?.title ?? item.title, status: item.status, - ...(meta === undefined ? {} : { meta }), + ...(listMetadata.length === 0 ? {} : { meta: listMetadata }), ...(item.depth === undefined ? {} : { depth: Math.max(0, item.depth) }), detailLines: lines, } diff --git a/src/views/tui/terminal-chrome.ts b/src/views/tui/terminal-chrome.ts index 4f3aae89..c70e072b 100644 --- a/src/views/tui/terminal-chrome.ts +++ b/src/views/tui/terminal-chrome.ts @@ -143,7 +143,7 @@ function renderWorkStrip( } function workStripItem(theme: BraidTheme, item: WorkStripItemView, width: number): string { - const marker = item.focused ? theme.accent('›') : theme.muted('·') + const marker = item.focused ? theme.accent('focus') : theme.muted('work') const state = sanitizeNotification(item.state) const runner = sanitizeNotification(item.runner ?? '?') const model = sanitizeNotification(item.model ?? '?') diff --git a/test/activity-document.test.ts b/test/activity-document.test.ts index c8db9d7f..9a3824dc 100644 --- a/test/activity-document.test.ts +++ b/test/activity-document.test.ts @@ -119,11 +119,13 @@ test('live work stays in the focused activity surface instead of docking beside }) test('the runs scope contains only selectable run ownership rows', () => { - const rows = activityDocument(activityView(), 'runs').rows + const document = activityDocument({ ...activityView(), focusedRunId: 'run-1' }, 'runs') + const rows = document.rows + assert.equal(document.context, 'Enter opens details and focuses controls') assert.deepEqual( - rows.map((row) => ({ id: row.id, kind: row.kind })), - [{ id: 'run-1', kind: 'run' }], + rows.map((row) => ({ id: row.id, kind: row.kind, meta: row.meta })), + [{ id: 'run-1', kind: 'run', meta: 'controls · 123ms' }], ) }) diff --git a/test/terminal-responsive.test.ts b/test/terminal-responsive.test.ts index 96746ed8..7d7157b4 100644 --- a/test/terminal-responsive.test.ts +++ b/test/terminal-responsive.test.ts @@ -195,9 +195,9 @@ test('work strip is conditional and exposes branch work controls', () => { const wide = chrome.render(120).join('\n') assert.match( wide, - /branch-focused · running · pi\/fixture\/model · 1 interaction · actions switch\/ask\/steer\/cancel/u, + /focus branch-focused · running · pi\/fixture\/model · 1 interaction · actions switch\/ask\/steer\/cancel/u, ) - assert.match(wide, /branch-background · running · pi\/fixture\/model/u) + assert.match(wide, /work branch-background · running · pi\/fixture\/model/u) const narrow = chrome.render(40) assert.equal(narrow.length, 2) assert.match(narrow[1] ?? '', /work 2 · \/activity to switch/u) From 660a1da10d53e21b86214ad9922b89b9972807f7 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 13:16:26 -0600 Subject: [PATCH 029/136] fix(live-supervisor): compose complete runtime profile --- scripts/live-required.test.mjs | 77 +++++++++++++++++++++++++++- scripts/live-required/contracts.mjs | 3 ++ scripts/live-required/supervisor.mjs | 32 ++++++++++-- 3 files changed, 107 insertions(+), 5 deletions(-) diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index a75f3375..709f405e 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -27,7 +27,11 @@ import { prepareProductionWorkspace, runHeadlessTurn, } from './live-required/headless.mjs' -import { createSupervisorProofFixture, runSupervisorFlow } from './live-required/supervisor.mjs' +import { + createSupervisorProofFixture, + runSupervisorFlow, + supervisorProfile, +} from './live-required/supervisor.mjs' import { runMatrixAdapter, runSandbox } from './live-required/tangle.mjs' import { executionLatencyDistribution } from './live-required/tangle-sandbox-braid-execution-soak.mjs' import { @@ -387,6 +391,50 @@ test('protected live scopes emit unavailable release evidence without credential } }) +test('live wrappers preserve provider unavailability', () => { + const providerError = Object.assign(new Error('provider credential is unavailable'), { + unavailable: true, + }) + const normalized = normalizeExternalFailure(providerError, 'live-supervisor', {}) + assert.equal(normalized.code, 'LIVE_PROTECTED_PATH_UNAVAILABLE') + assert.equal(normalized.unavailable, true) + assert.equal(normalized.message, 'provider credential is unavailable') +}) + +test('LIVE-11 composes a complete canonical profile by default', () => { + assert.deepEqual(supervisorProfile({}), { + name: 'Braid live supervisor', + description: 'Protected LIVE-11 supervisor profile', + version: '1.0.0', + harness: 'opencode', + model: { + provider: 'tangle-router', + default: 'tangle-router/glm-5.2', + reasoningEffort: 'none', + }, + prompt: { + instructions: ['Remain available for the protected LIVE-11 supervisor proof.'], + }, + }) + assert.deepEqual( + supervisorProfile({ + BRAID_SUPERVISOR_MODEL: 'custom/model', + BRAID_SUPERVISOR_MODEL_PROVIDER: 'custom-provider', + BRAID_SUPERVISOR_RUNNER: 'pi', + }), + { + name: 'Braid live supervisor', + description: 'Protected LIVE-11 supervisor profile', + version: '1.0.0', + harness: 'pi', + model: { provider: 'custom-provider', default: 'custom/model', reasoningEffort: 'none' }, + prompt: { + instructions: ['Remain available for the protected LIVE-11 supervisor proof.'], + }, + }, + ) +}) + test('only explicit protected configuration failures remain unavailable', () => { const unavailable = normalizeExternalFailure( protectedUnavailable('PROTECTED_CREDENTIAL_REQUIRED', 'credential is missing'), @@ -1204,6 +1252,33 @@ test('supervisor proof requires Runtime provisioning when no external run is con ) }) +test('supervisor provisioning failures retain the provider cause', async () => { + const fixture = createSupervisorProofFixture() + await assert.rejects( + () => + runSupervisorFlow({ + environment: { + ...protectedEnvironment(), + BRAID_SUPERVISOR_TIMEOUT_MS: '5', + BRAID_SUPERVISOR_POLL_MS: '1', + }, + runtime: { + ...fixture.api, + provisionSupervisor: async () => { + throw new Error('SESSION_DELETING') + }, + }, + }), + (error) => { + assert.match( + error.message, + /Runtime supervisor provisioning failed before LIVE-11 controls: SESSION_DELETING/u, + ) + return true + }, + ) +}) + test('supervisor proof rejects a partial external binding before provisioning', async () => { const fixture = createSupervisorProofFixture() let provisionCalls = 0 diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index 048712b9..0336cc48 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -922,6 +922,9 @@ export function normalizeExternalFailure(error, label, environment = process.env if (error.message === message) return error return new LiveRequiredError(error.code, message, { unavailable: error.unavailable }) } + if (error?.unavailable === true) { + return new LiveRequiredError('LIVE_PROTECTED_PATH_UNAVAILABLE', message, { unavailable: true }) + } return new LiveRequiredError( 'LIVE_REAL_PATH_FAILED', `${label} failed against the configured live path: ${message}`, diff --git a/scripts/live-required/supervisor.mjs b/scripts/live-required/supervisor.mjs index b429045a..59b2617f 100644 --- a/scripts/live-required/supervisor.mjs +++ b/scripts/live-required/supervisor.mjs @@ -5,6 +5,7 @@ import { proofInvocation, proofReceipt, protectedUnavailable, + safeMessage, scalarMeasurement, } from './contracts.mjs' @@ -19,6 +20,9 @@ const SUPERVISOR_CHECKS = Object.freeze([ ]) const DEFAULT_TIMEOUT_MS = 60_000 const DEFAULT_POLL_INTERVAL_MS = 100 +const DEFAULT_SUPERVISOR_RUNNER = 'opencode' +const DEFAULT_SUPERVISOR_MODEL = 'tangle-router/glm-5.2' +const DEFAULT_SUPERVISOR_MODEL_PROVIDER = 'tangle-router' const SPEND_FIELDS = Object.freeze(['iterations', 'tokensInput', 'tokensOutput', 'usd', 'ms']) const TOTAL_FIELDS = Object.freeze([ 'tokensInput', @@ -305,6 +309,23 @@ function proofConfig(environment) { } } +export function supervisorProfile(environment) { + const runner = environment.BRAID_SUPERVISOR_RUNNER?.trim() || DEFAULT_SUPERVISOR_RUNNER + const model = environment.BRAID_SUPERVISOR_MODEL?.trim() || DEFAULT_SUPERVISOR_MODEL + const provider = + environment.BRAID_SUPERVISOR_MODEL_PROVIDER?.trim() || DEFAULT_SUPERVISOR_MODEL_PROVIDER + return { + name: 'Braid live supervisor', + description: 'Protected LIVE-11 supervisor profile', + version: '1.0.0', + harness: runner, + model: { provider, default: model, reasoningEffort: 'none' }, + prompt: { + instructions: ['Remain available for the protected LIVE-11 supervisor proof.'], + }, + } +} + /** * Prove one Runtime supervisor through its published read and control APIs. * @@ -409,9 +430,12 @@ async function acquireSupervisor({ return validateProvisionedSupervisor(receipt) } catch (error) { if (error?.unavailable === true) throw error - throw new Error('Runtime supervisor provisioning failed before LIVE-11 controls', { - cause: error, - }) + throw new Error( + `Runtime supervisor provisioning failed before LIVE-11 controls: ${safeMessage(error, environment)}`, + { + cause: error, + }, + ) } } @@ -777,7 +801,7 @@ export async function runSupervisorFlow({ } export async function runSupervisorCheck({ environment }) { - const direct = await runSupervisorFlow({ environment }) + const direct = await runSupervisorFlow({ environment, profile: supervisorProfile(environment) }) return { status: direct.status, measurements: direct.measurements, From a3f07f4948d6bdbd1c6b6167f5f7cd8794bb1b4c Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 13:27:35 -0600 Subject: [PATCH 030/136] fix(live-supervisor): use current router model --- scripts/live-required.test.mjs | 2 +- scripts/live-required/supervisor.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index 709f405e..3c351b57 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -409,7 +409,7 @@ test('LIVE-11 composes a complete canonical profile by default', () => { harness: 'opencode', model: { provider: 'tangle-router', - default: 'tangle-router/glm-5.2', + default: 'tangle-router/glm-5.3', reasoningEffort: 'none', }, prompt: { diff --git a/scripts/live-required/supervisor.mjs b/scripts/live-required/supervisor.mjs index 59b2617f..3dd4e751 100644 --- a/scripts/live-required/supervisor.mjs +++ b/scripts/live-required/supervisor.mjs @@ -21,7 +21,7 @@ const SUPERVISOR_CHECKS = Object.freeze([ const DEFAULT_TIMEOUT_MS = 60_000 const DEFAULT_POLL_INTERVAL_MS = 100 const DEFAULT_SUPERVISOR_RUNNER = 'opencode' -const DEFAULT_SUPERVISOR_MODEL = 'tangle-router/glm-5.2' +const DEFAULT_SUPERVISOR_MODEL = 'tangle-router/glm-5.3' const DEFAULT_SUPERVISOR_MODEL_PROVIDER = 'tangle-router' const SPEND_FIELDS = Object.freeze(['iterations', 'tokensInput', 'tokensOutput', 'usd', 'ms']) const TOTAL_FIELDS = Object.freeze([ From e88ff87079bf89728c97b400d41bdbabc8b01d06 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 13:50:31 -0600 Subject: [PATCH 031/136] perf(ui): reuse stable view projections --- .../2026-08-28-controller-projection-cache.md | 19 ++++++ .agent/skill-runs.jsonl | 3 + docs/components/terminal-shell.md | 4 ++ src/adapters/tui/application-ui-controller.ts | 64 +++++++++++++++++-- test/performance.test.ts | 42 ++++++++++-- 5 files changed, 120 insertions(+), 12 deletions(-) create mode 100644 .agent/autopsies/2026-08-28-controller-projection-cache.md diff --git a/.agent/autopsies/2026-08-28-controller-projection-cache.md b/.agent/autopsies/2026-08-28-controller-projection-cache.md new file mode 100644 index 00000000..12dcbf33 --- /dev/null +++ b/.agent/autopsies/2026-08-28-controller-projection-cache.md @@ -0,0 +1,19 @@ +# Controller projection cache autopsy + +The `pnpm run test` command at commit `a3f07f4` passed 827 functional tests and failed 1 of 16 performance tests. + +The failed test expected stable controller reads to remain below a 10 ms p90. +The assertion did not print the measured p90. + +`ApplicationUiController.view()` cached the cloned application state but called `#project()` on every read. +The source check was `src/adapters/tui/application-ui-controller.ts:80` before the fix. + +The host also ran multiple compiler and model processes during the failure. +Two isolated repetitions passed, so host saturation determined when the repeated work crossed the threshold. + +Classification: infra-bug. + +The fix caches the immutable final view by state, failure signals, and local presentation inputs. +The deterministic check now requires the same view object for every unchanged revision. + +Fix: cache the projection in `src/adapters/tui/application-ui-controller.ts`, then rerun the performance and full test commands. diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index fd72810d..d69a68c3 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -68,3 +68,6 @@ {"skill":"/critical-audit","ts":"2026-08-19T11:05:46Z","project":"braid-exact-interactive-20260816","target":"Braid durable interaction and TUI architecture n=70 files","operatorPrompt":"","durationMin":null,"verdict":"REQUEST_CHANGES","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/verify","ts":"2026-08-28T13:02:50Z","project":"braid-10-release-multirun","target":"Braid LIVE-07 Tangle multirun release wiring","operatorPrompt":"","durationMin":null,"verdict":"SHIP_IT","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/product-design","ts":"2026-08-28T14:00:31Z","project":"braid-10-ui-proof-fixes","target":"Braid W6 command-palette overflow marker and packed terminal proof","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/product-design","ts":"2026-08-28T10:49:51Z","project":"braid-10-complete","target":"integrated concurrent-run terminal workflow","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/diagnose","ts":"2026-08-28T19:50:09Z","project":"braid-10-complete","target":"Braid local performance f=1/n=16 clusters=1","operatorPrompt":"","durationMin":null,"verdict":"ROOT_CAUSE_CONFIRMED","dispatchedTo":"/autopsy","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/autopsy","ts":"2026-08-28T19:50:09Z","project":"braid-10-complete","target":"Braid controller projection cache","operatorPrompt":"","durationMin":null,"verdict":"INFRA_BUG","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} diff --git a/docs/components/terminal-shell.md b/docs/components/terminal-shell.md index 4c9737ea..03ab45f8 100644 --- a/docs/components/terminal-shell.md +++ b/docs/components/terminal-shell.md @@ -84,6 +84,10 @@ The shell never renders credential values or secret-designated interaction answe One frame subscription coalesces stream deltas at the configured frame interval. +`ApplicationUiController` reuses one immutable final view while the application revision, failure signals, and local presentation inputs remain unchanged. + +An application revision or a local surface, notice, preview, or analysis selection change invalidates that view without a provider-specific path. + Rendering remains proportional to the bounded visible transcript and visible Work Strip. The shell does not scan the journal or provider state during render. diff --git a/src/adapters/tui/application-ui-controller.ts b/src/adapters/tui/application-ui-controller.ts index 369a1f7c..0b43a286 100644 --- a/src/adapters/tui/application-ui-controller.ts +++ b/src/adapters/tui/application-ui-controller.ts @@ -43,6 +43,20 @@ interface CachedViewState { readonly state: BraidState } +interface CachedViewProjection { + readonly app: BraidApplication + readonly state: BraidState + readonly storageFailure: string | undefined + readonly cleanupUncertain: string | undefined + readonly selectedSurface: BraidViewModel['selectedSurface'] + readonly graphQuery: string + readonly interactionResolved: boolean + readonly notice: string | undefined + readonly forkPreview: BraidViewModel['forkPreview'] | undefined + readonly selectedIntelligenceData: unknown + readonly value: BraidViewModel +} + export class ApplicationUiController implements BraidUiController { #app: BraidApplication readonly #subscribers = new Set() @@ -64,6 +78,7 @@ export class ApplicationUiController implements BraidUiController { #forkPreview: BraidViewModel['forkPreview'] | undefined #selectedIntelligenceData: unknown #viewStateCache: CachedViewState | undefined + #viewProjectionCache: CachedViewProjection | undefined constructor( app: BraidApplication, @@ -87,10 +102,48 @@ export class ApplicationUiController implements BraidUiController { ) { this.#viewStateCache = { app, revision, state: app.state() } } - return this.#project(this.#viewStateCache.state, app) + const state = this.#viewStateCache.state + const storageFailure = app.storageFailure() + const cleanupUncertain = app.cleanupUncertain() + const cached = this.#viewProjectionCache + if ( + cached !== undefined && + cached.app === app && + cached.state === state && + cached.storageFailure === storageFailure && + cached.cleanupUncertain === cleanupUncertain && + cached.selectedSurface === this.#selectedSurface && + cached.graphQuery === this.#graphQuery && + cached.interactionResolved === this.#interactionResolved && + cached.notice === this.#notice && + cached.forkPreview === this.#forkPreview && + cached.selectedIntelligenceData === this.#selectedIntelligenceData + ) { + return cached.value + } + const value = this.#project(state, app, storageFailure, cleanupUncertain) + this.#viewProjectionCache = { + app, + state, + storageFailure, + cleanupUncertain, + selectedSurface: this.#selectedSurface, + graphQuery: this.#graphQuery, + interactionResolved: this.#interactionResolved, + notice: this.#notice, + forkPreview: this.#forkPreview, + selectedIntelligenceData: this.#selectedIntelligenceData, + value, + } + return value } - #project(state: BraidState, app: BraidApplication): BraidViewModel { + #project( + state: BraidState, + app: BraidApplication, + storageFailure: string | undefined, + cleanupUncertain: string | undefined, + ): BraidViewModel { const canRespond = app.canRespondToInteractions(interactionViews(state)[0]?.runId) const view = withRunUsage( buildBraidViewModel( @@ -98,8 +151,8 @@ export class ApplicationUiController implements BraidUiController { this.#selectedSurface, this.#appearance, app.canCancel(), - app.storageFailure(), - app.cleanupUncertain(), + storageFailure, + cleanupUncertain, canRespond, this.#graphQuery, ), @@ -191,6 +244,7 @@ export class ApplicationUiController implements BraidUiController { this.#app = next this.#profileConnections = undefined this.#viewStateCache = undefined + this.#viewProjectionCache = undefined this.#selectedIntelligenceData = undefined this.#graphQuery = '' this.#interactionResolved = false @@ -314,7 +368,7 @@ export class ApplicationUiController implements BraidUiController { subscriber, options, currentView: () => this.view(), - project: (state) => this.#project(state, app), + project: (state) => this.#project(state, app, app.storageFailure(), app.cleanupUncertain()), }) const unsubscribeApp = app.subscribe((state, envelope) => { delivery.push(state, toEvent(envelope)) diff --git a/test/performance.test.ts b/test/performance.test.ts index bc2d9c61..9090f507 100644 --- a/test/performance.test.ts +++ b/test/performance.test.ts @@ -133,10 +133,12 @@ test('runtime activity projection stays bounded at 10k and 100k saved workers', } }) -test('controller renders reuse one state clone and semantic projection per revision', () => { +test('controller renders reuse one state clone and semantic projection per revision', (t) => { const source = runtimeWorkerState(10_000) let revision = source.revision let stateCalls = 0 + let storageFailure: string | undefined + let cleanupUncertain: string | undefined const app = { revision: () => revision, state: () => { @@ -144,23 +146,49 @@ test('controller renders reuse one state clone and semantic projection per revis return structuredClone({ ...source, revision }) }, canCancel: () => false, - storageFailure: () => undefined, - cleanupUncertain: () => undefined, + storageFailure: () => storageFailure, + cleanupUncertain: () => cleanupUncertain, canRespondToInteractions: () => false, } as unknown as BraidApplication const controller = new ApplicationUiController(app) - controller.view() + const initial = controller.view() const samples: number[] = [] for (let repetition = 0; repetition < 20; repetition += 1) { const started = performance.now() - controller.view() + assert.equal(controller.view(), initial) samples.push(performance.now() - started) } assert.equal(stateCalls, 1) - assert.ok(distribution(samples).p90 < 10) + const stable = distribution(samples) + assert.ok(stable.p90 < 10, `stable controller view p90=${stable.p90.toFixed(1)}ms`) + t.diagnostic( + JSON.stringify({ + name: 'controller-view-cache', + unit: 'ms', + environment: { node: process.version, savedWorkers: 10_000 }, + viewIdentityReused: true, + stateCalls, + ...stable, + }), + ) + + storageFailure = 'storage unavailable' + const failed = controller.view() + assert.notEqual(failed, initial) + assert.equal(failed.storageFailure, storageFailure) + assert.equal(stateCalls, 1) + + storageFailure = undefined + cleanupUncertain = 'cleanup confirmation unavailable' + const cleanup = controller.view() + assert.notEqual(cleanup, failed) + assert.equal(cleanup.cleanupUncertain, cleanupUncertain) + assert.equal(stateCalls, 1) revision += 1 - assert.equal(controller.view().revision, revision) + const changed = controller.view() + assert.notEqual(changed, cleanup) + assert.equal(changed.revision, revision) assert.equal(stateCalls, 2) }) From 47a8bced73d9682d4dfb411eb637adcb096175cc Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 14:01:46 -0600 Subject: [PATCH 032/136] docs(components): standardize implementation guidance --- .../components/conversation-branch-effects.md | 10 ++++++++++ docs/components/multi-run-orchestration.md | 10 ++++++++++ docs/components/run-stream-sanitizer.md | 10 ++++++++++ docs/components/work-strip.md | 10 ++++++++++ test/component-docs.test.ts | 19 ++++++++++++++++++- 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/docs/components/conversation-branch-effects.md b/docs/components/conversation-branch-effects.md index ee6a9635..7026df11 100644 --- a/docs/components/conversation-branch-effects.md +++ b/docs/components/conversation-branch-effects.md @@ -4,6 +4,16 @@ The implementation uses the published `@tangle-network/agent-interface` contracts as the single cross-runner and workspace-fork boundary. +## Best simple implementation + +Plan every branch effect from immutable Braid state and return one digest-bound preview before external work. + +Execute portable transfer, checkpoint, fork, lookup, and cleanup only through the matching published capability. + +Keep provider resources authoritative outside Braid and persist only exact redacted receipts and graph identities. + +Use one stable operation identity for retry and reject a response that does not match the planned source and destination. + ## Inputs and outputs The planner reads immutable Braid state, the selected branch boundary, and the execution port capabilities. diff --git a/docs/components/multi-run-orchestration.md b/docs/components/multi-run-orchestration.md index 46f69516..a8c2f7cf 100644 --- a/docs/components/multi-run-orchestration.md +++ b/docs/components/multi-run-orchestration.md @@ -8,6 +8,16 @@ It keeps one explicit focused run for foreground controls while every non-termin It preserves continuation ordering on one branch while allowing different branches and conversations to stream concurrently. +## Best simple implementation + +Keep one durable active-run index, one explicit focused run, and one independent reader per admitted run. + +Serialize state commits through the journal while different branches execute concurrently. + +Address every control, interaction, queue entry, and replay cursor by exact run and branch identity. + +Do not add a global scheduler when branch admission and stable operation identities already provide the required ordering. + ## Ownership `BraidState.activeRuns` owns the durable index of active run identifiers and their immutable conversation and branch targets. diff --git a/docs/components/run-stream-sanitizer.md b/docs/components/run-stream-sanitizer.md index a556ea35..c690ff8e 100644 --- a/docs/components/run-stream-sanitizer.md +++ b/docs/components/run-stream-sanitizer.md @@ -1,8 +1,18 @@ # Run stream sanitizer +## Job + The application ingestion boundary owns one incremental sanitizer for every active run stream. Each input is a trusted-boundary candidate containing untrusted provider text and an application stream name. Each output is safe text that may be committed to the local event journal and projected to any client surface. + +## Best simple implementation + +Keep one bounded incremental state machine per run and stream name at the application ingestion boundary. +Reject duplicate provider events before sanitation and finalize the exact stream once at its terminal event. +Sanitize terminal controls, secret candidates, URLs, and split Unicode before any journal write or view projection. +Delete stream state at terminal completion and refuse new state after the bounded active-stream limit. + The sanitizer carries terminal-control, credential-candidate, and split-Unicode state between input calls. The sanitizer keeps stream state separate for text, reasoning, and message-part delta streams. The sanitizer rejects terminal control payloads after the bounded control length instead of reopening visible output. diff --git a/docs/components/work-strip.md b/docs/components/work-strip.md index dea01b79..3a1c1f8d 100644 --- a/docs/components/work-strip.md +++ b/docs/components/work-strip.md @@ -8,6 +8,16 @@ It appears only when at least two work items require attention. It provides a compact route to switch focus and inspect the full activity surface. +## Best simple implementation + +Project one immutable row for each non-terminal run or actionable queue entry. + +Show the strip only when at least two rows exist, and move full selection and details into Activity. + +Derive the `focus` label from the exact focused run while leaving conversation selection independent. + +Emit typed run intents and let the application own every control effect. + ## Ownership `workStripFor` in `src/adapters/tui/ui-projection.ts` converts canonical runs and queued entries into immutable work item views. diff --git a/test/component-docs.test.ts b/test/component-docs.test.ts index 1b96cd80..f3981fca 100644 --- a/test/component-docs.test.ts +++ b/test/component-docs.test.ts @@ -1,5 +1,5 @@ import assert from 'node:assert/strict' -import { existsSync, readFileSync, readdirSync } from 'node:fs' +import { existsSync, readdirSync, readFileSync } from 'node:fs' import { dirname, join, relative, resolve } from 'node:path' import test from 'node:test' @@ -65,3 +65,20 @@ test('every exported terminal component maps to one existing design document', ( ) } }) + +test('every product component states its best simple implementation', () => { + const directory = dirname(componentIndex) + const documents = readdirSync(directory) + .filter((filename) => filename.endsWith('.md') && filename !== 'README.md') + .sort() + + assert.ok(documents.length > 0) + for (const document of documents) { + const text = readFileSync(join(directory, document), 'utf8') + assert.match( + text, + /^## Best simple implementation$/mu, + `${document} must state its best simple implementation`, + ) + } +}) From ecc8f6d70366fde6fd9e9b6c7fd20aaa249c825f Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 14:14:20 -0600 Subject: [PATCH 033/136] fix(ui): preserve parallel run controls --- docs/components/work-strip.md | 8 +++-- scripts/capture-visual-definitions.mjs | 11 +++--- scripts/capture-visual.mjs | 6 ++-- src/views/tui/terminal-chrome.ts | 48 +++++++++++++++++++++----- test/scripts.test.ts | 15 +++++++- test/terminal-responsive.test.ts | 29 +++++++++++++++- 6 files changed, 93 insertions(+), 24 deletions(-) diff --git a/docs/components/work-strip.md b/docs/components/work-strip.md index 3a1c1f8d..18e67ec1 100644 --- a/docs/components/work-strip.md +++ b/docs/components/work-strip.md @@ -76,9 +76,11 @@ The projection returns no strip for fewer than two items. The narrow renderer emits one bounded summary line with the item count and activity route. -The standard renderer emits up to three bounded item rows and a browse hint for additional items. +The standard renderer emits up to three rows with bounded branch identities and priority-aware state, waiting, and control fields. -The wide renderer emits up to eight bounded item rows and keeps detail in the selected activity view. +The wide renderer emits up to eight rows, includes unavailable control markers, and keeps detail in the selected activity view. + +Long branch identities retain both a stable prefix and suffix while the canonical identifier remains unchanged in emitted intents. The renderer sanitizes branch, state, runner, model, and action text before terminal output. @@ -108,7 +110,7 @@ An unknown run focus request returns a stable application error without changing Terminal rows remain inspectable but cannot receive live cancellation or steering. -Rows that exceed the available width are atomically clipped without terminal control sequences. +Rows select complete fields by priority before they elide a bounded branch identity, so controls never become partial words. ## Performance diff --git a/scripts/capture-visual-definitions.mjs b/scripts/capture-visual-definitions.mjs index 1ba84b25..fc2a439b 100644 --- a/scripts/capture-visual-definitions.mjs +++ b/scripts/capture-visual-definitions.mjs @@ -1,3 +1,7 @@ +export function isRunningWorkStripRow(line) { + return /^(?:focus|work) .+ · running(?: ·|\s|$)/u.test(line.trimStart()) +} + export function createStateDefinitions(normalized) { return [ ...[40, 80, 120].map((columns) => commandPaletteDefinition(columns, normalized)), @@ -55,12 +59,7 @@ export function createStateDefinitions(normalized) { terminal.input('parallel run B') terminal.input('\r') await terminal.waitFor( - () => - terminal - .screen() - .split('\n') - .filter((line) => /^(?:focus|work) .+ · running · /u.test(line.trimStart())).length >= - 2, + () => terminal.screen().split('\n').filter(isRunningWorkStripRow).length >= 2, 'two Work Strip rows', ) const before = await terminal.captureState() diff --git a/scripts/capture-visual.mjs b/scripts/capture-visual.mjs index 5ed73fa0..bf225cd4 100644 --- a/scripts/capture-visual.mjs +++ b/scripts/capture-visual.mjs @@ -7,7 +7,7 @@ import { join } from 'node:path' import { promisify } from 'node:util' import xterm from '@xterm/headless' import * as pty from 'node-pty' -import { createStateDefinitions } from './capture-visual-definitions.mjs' +import { createStateDefinitions, isRunningWorkStripRow } from './capture-visual-definitions.mjs' import { captureProvenance, createArtifactFor, @@ -466,9 +466,7 @@ try { } if (definition.name === 'multi-run') { const workStrip = result.record.view?.workStrip ?? [] - const renderedRows = result.point.screen - .split('\n') - .filter((line) => /^(?:focus|work) .+ · running · /u.test(line.trimStart())) + const renderedRows = result.point.screen.split('\n').filter(isRunningWorkStripRow) if (workStrip.length !== 2 || renderedRows.length !== 2) { throw new Error( `multi-run capture did not expose two Work Strip rows (view=${workStrip.length}, rendered=${renderedRows.length})`, diff --git a/src/views/tui/terminal-chrome.ts b/src/views/tui/terminal-chrome.ts index c70e072b..907333d8 100644 --- a/src/views/tui/terminal-chrome.ts +++ b/src/views/tui/terminal-chrome.ts @@ -1,4 +1,4 @@ -import type { Component } from '@earendil-works/pi-tui' +import { type Component, sliceByColumn, visibleWidth } from '@earendil-works/pi-tui' import type { BraidViewModel, EnvironmentView, WorkStripItemView } from '../shared/models.js' import { sanitizeNotification } from '../shared/sanitize.js' import type { ComposerMode } from './composer-view.js' @@ -135,28 +135,58 @@ function renderWorkStrip( return [fitTerminalAtomic(theme.muted(`work ${items.length} · /activity to switch`), width)] } const limit = mode === 'wide' ? Math.min(items.length, 8) : Math.min(items.length, 3) - const rows = items.slice(0, limit).map((item) => workStripItem(theme, item, width)) + const rows = items.slice(0, limit).map((item) => workStripItem(theme, item, mode, width)) if (items.length > limit) { rows.push(theme.muted(`work +${items.length - limit} more · /activity to browse`)) } return rows } -function workStripItem(theme: BraidTheme, item: WorkStripItemView, width: number): string { +function workStripItem( + theme: BraidTheme, + item: WorkStripItemView, + mode: Exclude, 'narrow'>, + width: number, +): string { const marker = item.focused ? theme.accent('focus') : theme.muted('work') const state = sanitizeNotification(item.state) const runner = sanitizeNotification(item.runner ?? '?') const model = sanitizeNotification(item.model ?? '?') - const actions = Object.entries(item.actions) - .map(([name, available]) => `${available ? '' : '!'}${name}`) - .join('/') - const actionText = ` · actions ${actions}` - return fitTerminalAtomic( - `${marker} ${item.branchId} · ${state} · ${runner}/${model} · ${item.interactionCount} interaction${item.interactionCount === 1 ? '' : 's'}${actionText}`, + const branchWidth = Math.max(12, Math.min(mode === 'wide' ? 44 : 28, Math.floor(width / 3))) + const branch = compactWorkIdentity(item.branchId, branchWidth) + const actionEntries = Object.entries(item.actions) + const actions = ( + mode === 'wide' + ? actionEntries.map(([name, available]) => `${available ? '' : '!'}${name}`) + : actionEntries.flatMap(([name, available]) => (available ? [name] : [])) + ).join('/') + const waiting = + item.interactionCount === 0 + ? '' + : theme.warning( + `${item.interactionCount} waiting interaction${item.interactionCount === 1 ? '' : 's'}`, + ) + const actionText = actions.length === 0 ? '' : theme.muted(`actions ${actions}`) + return fitTerminalColumns( + [`${marker} ${branch}`, theme.muted(state), theme.muted(`${runner}/${model}`)], + [waiting, actionText], width, + 'left', ) } +function compactWorkIdentity(value: string, maxWidth: number): string { + const safe = sanitizeNotification(value) + const width = visibleWidth(safe) + if (width <= maxWidth) return safe + const contentWidth = Math.max(2, maxWidth - 1) + const prefixWidth = Math.ceil(contentWidth * 0.65) + const suffixWidth = contentWidth - prefixWidth + const prefix = sliceByColumn(safe, 0, prefixWidth, true) + const suffix = sliceByColumn(safe, Math.max(0, width - suffixWidth), suffixWidth, true) + return `${prefix}…${suffix}` +} + function boundedTerminalRows(rows: readonly string[], width: number): string[] { return rows.map((row) => fitTerminalAtomic(row, width)) } diff --git a/test/scripts.test.ts b/test/scripts.test.ts index 2b1029af..7f3b9b5f 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -40,7 +40,8 @@ const { evaluateUpstreamRequirementChecks, UPSTREAM_REQUIREMENT_OWNERS } = upstr // @ts-expect-error The release scripts are intentionally JavaScript entry points. const { renderVerificationReport } = await import('../scripts/release/verification-report.mjs') // @ts-expect-error The visual definitions are an executable JavaScript release helper. -const { createStateDefinitions } = await import('../scripts/capture-visual-definitions.mjs') +const visualDefinitions = await import('../scripts/capture-visual-definitions.mjs') +const { createStateDefinitions, isRunningWorkStripRow } = visualDefinitions const packageJson = JSON.parse( await readFile(new URL('../../package.json', import.meta.url), 'utf8'), @@ -131,6 +132,18 @@ test('active streaming capture waits for a terminal run state before exiting', a assert.equal(closed, true) }) +test('multi-run capture recognizes responsive Work Strip rows without requiring lower-priority fields', () => { + assert.equal( + isRunningWorkStripRow( + 'focus branch-0123456789ab…345-terminal · running actions switch/cancel', + ), + true, + ) + assert.equal(isRunningWorkStripRow('work branch-background · running · pi/fixture/model'), true) + assert.equal(isRunningWorkStripRow('work branch-background · queued'), false) + assert.equal(isRunningWorkStripRow('Fixture response includes work branch · running'), false) +}) + test('the scoped test runner rejects an unregistered scope instead of silently running the wrong suite', async () => { const source = await readFile(new URL('../../scripts/run-tests.mjs', import.meta.url), 'utf8') assert.match(source, /No compiled tests registered for scope/u) diff --git a/test/terminal-responsive.test.ts b/test/terminal-responsive.test.ts index 7d7157b4..29345694 100644 --- a/test/terminal-responsive.test.ts +++ b/test/terminal-responsive.test.ts @@ -195,9 +195,36 @@ test('work strip is conditional and exposes branch work controls', () => { const wide = chrome.render(120).join('\n') assert.match( wide, - /focus branch-focused · running · pi\/fixture\/model · 1 interaction · actions switch\/ask\/steer\/cancel/u, + /focus branch-focused · running · pi\/fixture\/model\s+1 waiting interaction · actions switch\/ask\/steer\/cancel/u, ) assert.match(wide, /work branch-background · running · pi\/fixture\/model/u) + const standard = chrome.render(80).join('\n') + assert.match(standard, /focus branch-focused · running/u) + assert.match(standard, /1 waiting interaction/u) + assert.match(standard, /actions switch\/ask\/steer\/cancel/u) + + chrome.setState({ + view: { + ...base, + focusedRunId: 'run-metrics', + workStrip: Object.freeze([ + item({ + id: 'run-metrics', + runId: 'run-metrics', + branchId: 'branch-0123456789abcdef0123456789abcdef-terminal', + interactionCount: 0, + focused: true, + actions: { switch: true, ask: false, steer: true, cancel: true }, + }), + item({ interactionCount: 0 }), + ]), + }, + ...state, + }) + const generatedIdentityRow = chrome.render(80)[1] ?? '' + assert.match(generatedIdentityRow, /focus branch-0123456789ab…345-terminal · running/u) + assert.match(generatedIdentityRow, /actions switch\/steer\/cancel/u) + assert.doesNotMatch(generatedIdentityRow, /!ask|0123456789abcdef0123456789abcdef/u) const narrow = chrome.render(40) assert.equal(narrow.length, 2) assert.match(narrow[1] ?? '', /work 2 · \/activity to switch/u) From 7d69e1144d2ec466de40e5ae6f8a0fc5687c807c Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 14:32:04 -0600 Subject: [PATCH 034/136] docs(readme): document current operator workflows --- README.md | 363 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 203 insertions(+), 160 deletions(-) diff --git a/README.md b/README.md index 20539d82..6b4895d9 100644 --- a/README.md +++ b/README.md @@ -7,50 +7,59 @@

    -Braid is one durable terminal for coding agents. +Braid is a durable terminal client for coding agents. -A portable [`AgentProfile`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) selects the runner, model, instructions, tools, and permissions. +A portable [`AgentProfile`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) defines one agent's identity, instructions, model, runner preference, tools, and permissions. -Braid sends every turn through [`agent-runtime`](https://github.com/tangle-network/agent-runtime), then keeps the transcript, branches, approvals, activity, graph, and trace analysis together. +Braid sends each turn through [`agent-runtime`](https://github.com/tangle-network/agent-runtime) and keeps the conversation, branches, runs, interactions, activity, graph, supervisors, and trace analyses together. -![Historical Braid recording through Local CLI Bridge and Claude Code](artifacts/demo/braid-live.gif) +Braid is a terminal client, not another agent loop. -The checked-in recording and [capture manifest](artifacts/demo/braid-live.json) are historical Braid `0.1.3` evidence from Local CLI Bridge and Claude Code `opus`. - -They are not the current `0.2.0` Pi release claim. - -A fresh public recording requires a packed `0.2.0` Braid binary, a ready Pi backend, and measured usage from the exact run. +The [component design map](docs/components/README.md) links each visible surface to its owning contract and source component. ## Install Braid requires Node.js 22.19 or newer. -Current validated release targets are Linux x64 and macOS arm64. - -The package rejects Windows installation until encrypted state meets the required path-race boundary there. +The published package currently targets Linux and macOS. ```bash npm install --global @tangle-network/braid braid ``` -The first-run flow selects an AgentProfile and a connection. +The first-run flow selects an `AgentProfile` and a connection. -No runner-specific Braid configuration is required. +A connection supplies transport and credential references. -For a live terminal walkthrough, run the local CLI Bridge capture. +Credential values stay in the operating-system credential facility or their bounded response path. + +Use these launch forms when needed: ```bash -pnpm capture:demo:live +braid --inline # keep normal terminal scrollback +braid --plain # readable non-interactive output +braid rpc # JSON Lines control interface +braid --conversation # open a durable Braid conversation ``` -The capture routes a human prompt through Pi and records the measured result. +`--profile`, `--connection`, `--runner`, `--model`, and `--effort` select defaults for the opened or new branch. + +They do not rewrite the profile source. + +## Operating model -It requires a configured local CLI Bridge and a real provider credential. +The profile defines who the agent is. -## How it works +The connection defines where requests go and which credentials they use. -The core path is deliberately small. +The runner defines which coding program executes one run. + +The SDK field `harness` stores that runner preference. + +Braid owns the user-visible conversation graph, durable event journal, branch choices, interaction decisions, activity views, and terminal/headless presentation. + +The execution route is: ```text AgentProfile + user turn @@ -61,27 +70,21 @@ AgentProfile + user turn ▼ agent-runtime │ - ├── CLI Bridge ── Pi · Codex · Claude Code · Kimi Code · OpenCode · other runners + ├── CLI Bridge ── selected local runner ├── Tangle inference - └── Tangle sandbox ── remote workspace and environment lifecycle + └── Tangle sandbox ── remote workspace │ ▼ normalized events, receipts, activity, and final output ``` -Braid does not implement an agent loop, spawn runner processes directly, parse private runner output, or invent another profile format. - -A concrete local route is `AgentProfile` with `harness: 'pi'` → Braid admission → `agent-runtime` → a CLI Bridge connection → Pi → normalized events back to Braid. +Braid does not launch runner processes directly, parse private runner output, materialize profile files, schedule sandboxes, run trace judges, or implement billing. -## AgentProfile is the configuration unit +An admitted run stores an immutable profile snapshot, effective runner, model, reasoning effort, configured output limits, connection, provider session, environment, and capability snapshot. -`AgentProfile` is the canonical portable definition of one agent. +Configured limits are not measured usage. -It can contain the profile name, instructions, model hints, preferred runner, tools, permissions, resources, skills, MCP connections, modes, hooks, and subagent definitions. - -The `harness` field in the SDK is a runner preference. - -Braid displays that preference as `runner` so the profile remains the agent identity while the execution route remains replaceable. +This is the shape of a profile using the current routed model example: ```ts import type { AgentProfile } from '@tangle-network/agent-interface' @@ -91,11 +94,8 @@ const profile: AgentProfile = { harness: 'pi', model: { provider: 'tangle-router', - default: 'tangle-router/glm-5.2', + default: 'tangle-router/glm-5.3', reasoningEffort: 'high', - maxVisibleOutputTokens: 16_384, - maxReasoningTokens: 32_768, - maxTotalOutputTokens: 49_152, }, prompt: { instructions: [ @@ -108,207 +108,256 @@ const profile: AgentProfile = { } ``` -A connection supplies transport and credential references. +## Parallel work: Work Strip, activity, and focus -The run binds the exact profile snapshot, selected connection, effective runner, model, reasoning effort, three configured output limits, and execution environment before dispatch. +Braid admits one run per conversation branch at a time. -Visible output, reasoning output, and total output limits are separate configured dimensions. +Different branches and conversations can stream concurrently while each branch preserves its own turn order. -Reasoning effort controls the requested thinking tier when the selected route supports it. +Inputs for an active run queue by default. -Configured limits never stand in for measured usage. +`/queue ` always adds the next turn. -### Example effective run receipt +`/steer ` sends live steering only when that run reports steering support. -The main shell and activity details keep these values together without confusing configuration with provider evidence. +`Alt+S` switches between queue and steer when both actions are available. -The following values illustrate the shape of one receipt and are not a live run result. +The Work Strip appears when at least two active, queued, waiting, or detached work items need attention. -| Field | Example value | -| --- | --- | -| Profile | `Release engineer` | -| Runner | `pi` | -| Model | `tangle-router/glm-5.2` | -| Reasoning | `high` | -| Max visible output | `16,384 tokens` | -| Max reasoning output | `32,768 tokens` | -| Max total output | `49,152 tokens` | -| Connection | `Local CLI Bridge` | -| Execution location | `local workspace through CLI Bridge` | -| Environment | `local process; sandbox fields not applicable` | +Each item shows its branch, state, runner and model, pending interaction count, and available actions. -When the route is a Tangle sandbox, Braid shows the environment lifecycle and the resources, placement, and machine details that the provider actually reports. +Standard terminals show up to three items, wide terminals show up to eight, and narrow terminals show one bounded count with `/activity to switch`. -It labels requested, verified, sampled, estimated, and unavailable values separately. +`/activity` opens a full-screen browser instead of adding a permanent side panel. -It never fills an unreported IP address, CPU allocation, RAM value, GPU lease, storage value, or cost with a guess. +`Tab` cycles `all`, `runs`, `analyses`, and `workers` scopes. -## One activity view, three kinds of work +In the `runs` scope, `Enter` opens details and focuses controls for that exact run. -Braid keeps direct turns, trace analyses, and runtime workers distinct. +Changing focus does not pause, cancel, detach, or reassign another run. -| Activity | What it means | Usage and control | -| --- | --- | --- | -| Turn | A user message admitted to the selected runner | Direct model, tool, latency, and cost values for that run | -| Analysis | A separate `agent-eval` execution over a frozen run or branch | Its own analyst profile, model, tokens, latency, cost, citations, and cancellation | -| Worker | A runtime-owned child under a supervisor | Its own status and usage when reported, with parent binding and control capability | +Controls carry the selected run identifier, so a background run cannot receive a focus-dependent action by accident. -The activity browser can show all three in one timeline while preserving their separate totals. +Direct turns, trace analyses, supervisors, and workers remain separate activity records with separate usage totals. -An unbound supervisor remains workspace activity and is not silently attributed to the current turn. +An unbound supervisor remains workspace activity and is not attributed to the current turn. -Missing provider values remain unknown instead of becoming zero. +## Continue, branch, and fork -## Trace analysis commands +### Native continuation -These commands inspect or compare recorded work rather than sending another ordinary prompt to the active coding runner. +An ordinary follow-up uses the exact provider session only when the current branch tip has the same profile and connection, the provider reports session continuation, and the provider proves the recorded message boundary with retry-safe request identity. -| Command | Meaning | -| --- | --- | -| `/ask ` | Ask one free-form question about a selected frozen run or branch and return cited findings. | -| `/analyze ` | Run a named recipe such as `failure`, `cost`, `tools`, or `improvement` through `agent-eval`. | -| `/compare ` | Freeze two run or branch sources, show their measured asymmetries, and create a paired comparison. | +Only the new user input is submitted because the provider session remains authoritative for its native context. -`/ask` does not append a message to the analyzed branch. +If the provider cannot prove that boundary, Braid does not submit to the native session. -`/analyze failure,cost,tools` selects multiple exact analysts, while `/analyze all` selects every available trace analyst. +Choose a fresh provider session with an explicit portable context transfer when that provider supports it. -The activity view shows each selected analyst as pending, running, completed, skipped, or failed. +The transfer lists included, omitted, and transformed parts and requires acceptance when it changes the context. -The upstream exact registry runs selected analysts in order, so Braid does not claim they execute concurrently. +`--conversation ` attaches to Braid's durable record and recorded run bindings. -Each analysis has its own run identity, source digest, analyst profile, model, budget, usage, latency, cost, completeness, and citations. +It does not take over an arbitrary native runner process. -The standard Braid install includes `uv` for `/ask`. +`/interactive ` and `/attach [run-id]` are separate native-terminal operations. -On first use, `uv` downloads a managed Python 3.12 runtime and runs the `agent-eval-rpc[dspy]` release that matches the installed `@tangle-network/agent-eval` package. +They require an interactive TUI and a retained provider session with native terminal support. -The managed runtime fails closed instead of using packages from the host Python installation. +### Conversation operations -Set `BRAID_PYTHON` only when an operator must use a preinstalled compatible environment instead. +`/branch [message]` creates a new branch at a message boundary in the same conversation. -Findings remain separate until the user explicitly sends selected findings to a branch or forks from the analysis. +It uses a new provider session and keeps the current environment shared. -In the analysis activity scope, `p` promotes a supported cited finding and `x` cancels active analysis work. +Pending interactions and queued work after the boundary are not inherited. -In the worker scope, `x` cancels and `r` refreshes. +`/clone` creates a separate conversation from the active branch tip with new conversation, branch, and execution identities. -The `s` and `a` keys explain why retry-safe steering and exact attachment are disabled by the current runtime contract. +It may retain a reference to the same workspace, but it does not copy provider process memory. -## Interactive and headless modes +`/fork` opens a provenance preview before creating a branch. -Interactive mode is the full-screen terminal experience with a multiline composer, streaming transcript, selectors, and focused overlays. +The preview shows the transcript boundary, profile, run overrides, provider session, environment, checkpoint, working-tree state, queued input, and pending interactions. -Use inline mode when preserving normal terminal scrollback matters. +The default is a conversation-only fork with a new provider session and shared environment. -```bash -braid -braid --inline -``` +`/fork --runner ` creates a cross-runner handoff with a new provider session and explicit portable context. -Headless mode is the same application core behind JSON Lines commands and state records. +Hidden process memory, runner-specific todos, opaque tool state, and opaque tool identifiers do not transfer. -```bash -braid rpc -``` +`/fork --workspace` requests a real provider checkpoint and destination environment. -Use plain mode for a readable non-interactive event stream without terminal control sequences. +It is available only when the provider reports retry-safe checkpoint and fork operations, lookup by idempotency key, and explicit cleanup. -```bash -braid --plain -``` +The source environment remains unchanged, and a failed fork does not destroy its checkpoint or source. + +The destination environment is not assumed to include external services, browser sessions, secrets, network connections, or provider process memory. + +## Interactions and secrets + +An interaction is a provider request with a stable identifier, kind, prompt, subject, timeout, allowed outcomes, and canonical `answerSpec`. + +Known kinds include questions, permissions, and plans. -The terminal and JSONL interfaces share command parsing, capability checks, operation identifiers, reducers, persistence, execution ports, and view projections. +Unknown kinds render through the generic answer specification and fail closed if Braid cannot validate a response. -Headless clients can send, queue, steer, cancel, detach, reconnect, reconcile, inspect state, inspect activity, run analysis, compare sources, and export records through the versioned protocol. +`/approve [scope]` accepts an allowed response. -Mutating headless requests carry stable operation identifiers so a retry can be recognized instead of dispatched twice. +`/reject [feedback]` declines it when the schema accepts feedback. -## Attach, resume, and sandboxes +The terminal validates text, number, boolean, select, and secret answers before dispatch. -Opening Braid with `--conversation ` attaches the interface to a durable Braid conversation and its recorded run bindings. +Permission controls expose only scopes declared by the provider. -That operation restores Braid's journal and view state; it does not claim to take over an arbitrary native runner process. +Secret answers are masked and sent only through the bounded response path. -Braid reconnects a non-terminal run from the last committed event cursor only when the selected provider can prove replay or status. +They are excluded from history, profiles, SQLite, logs, snapshots, screenshots, and trace artifacts. -If the provider cannot prove the live state, Braid displays detached, incomplete, expired, unauthorized, or unknown rather than calling the run completed. +`/automate` manages scoped non-secret response rules. -Continuing a compatible native provider session requires provider evidence that its context boundary matches Braid's recorded message boundary. +An answer specification containing a secret field cannot create or match an automation rule. -Changing runners creates a new provider session with an explicit portable-context handoff. +Concurrent interactions remain attached to their source runs and display in stable arrival order. -It does not claim to transfer hidden process memory, runner-specific todos, opaque tool state, or native session internals. +Response retries reuse the same operation identifier and never answer twice. -A Tangle sandbox connection provides an isolated remote workspace and reports only the lifecycle, replay, control, and resource capabilities that the current provider proves. +## Trace analysis -Braid shows those capabilities and their receipts through the same activity and graph surfaces. +Trace analysis reads a frozen run or branch record in a separate execution. -New Tangle Sandbox connections default to one ephemeral cloud turn and delete that environment after the turn. +It does not send a question to the active agent and does not append a message to the analyzed branch. -Retained lifecycle is an explicit connection configuration option with a bounded idle limit. +```text +/ask cited free-form question about the last eligible source +/analyze failure,cost,tools run selected named recipes +/analyze all run every available trace analyst +/compare compare two frozen sources +``` + +`/ask` uses the last completed or failed run unless a source is selected explicitly. + +Each analysis records its source digest, analyst profile, model, recipe, progress, findings, citations, completeness, usage, latency, cost, and cancellation state. + +The analysis activity scope uses `p` to promote a supported cited finding and `x` to cancel active analysis. + +Promotion creates an explicit attachment or a branch fork; it never changes the source implicitly. + +Comparisons show every measured field and asymmetry before any semantic interpretation. -Before retained execution creates a sandbox, Braid requires exact control plus provider-backed lookup for an unacknowledged dispatch. +## Runtime supervisors and workers -The current provider reports both, so a fresh Braid process can recover before or after the six-field reference commits. +`/activity` reads runtime-owned supervisor snapshots through the shared Runtime API. -Native follow-up turns remain disabled until the provider also proves that its context boundary matches Braid's recorded boundary. +It does not read `.agent/supervisor` files or infer identity from display text, timestamps, or row order. -Checkpoint, environment fork, and interaction response remain unavailable until the shared provider reports and proves those operations. +In the `workers` scope, `r` refreshes the snapshot, `s` opens a worker steering prompt, `x` requests cancellation, and `a` attaches to a running worker's retained terminal when available. -The user can inspect the requested and verified execution location, but provider-private machine details remain unavailable when they are not reported. +Worker steering sends the exact runtime worker identifier with a stable operation identifier and displays a queued or acknowledged effect. -On 2026-08-15, the default retained production cohort passed 3 of 3 Braid runs through OpenCode, GLM 5.2, and Tangle Sandbox at two-way concurrency. +Worker cancellation and supervisor cancellation use runtime-owned idempotent operations and display the acknowledged effect and terminated descendants when reported. -Each proof killed the first Braid process, reconnected once, continued in the same provider session, cancelled a later turn, replayed the same cancellation, and rejected changed input. +Worker attachment resolves the projected Braid supervisor and worker to exact Runtime identifiers, then claims the retained interactive handle for that worker. -All three exact sandboxes were confirmed deleted, and the account's active Sandbox count returned to its starting value. +It is available only in the interactive TUI when the selected worker is running and its provider exposes a retained terminal binding. -Individual proof duration was 82.3 seconds minimum, 89.0 seconds median, and 96.2 seconds maximum. +That worker action is different from `/attach [run-id]`, which targets a retained native terminal session. -Six completed turns reported 9,231 input tokens, 1,992 output tokens, and $0 provider cost; token and cost data were unavailable for three cancelled turns. +When the runtime cannot acknowledge a control, Braid leaves the result queued or unknown. + +It never displays delivered steering or cancellation without the matching runtime effect. + +## Capability-aware commands + +Braid asks the active provider and Runtime for capabilities before it enables an action. + +Unavailable commands remain searchable and explain the exact missing capability. + +Common reasons include: + +| Action | Exact reason shown when the condition applies | +| --- | --- | +| Worker steer | `There is no running supervised worker to steer` | +| Worker cancel | `There is no running supervised worker to cancel` | +| Supervisor cancel | `There is no running supervisor to cancel` | +| Worker attach without an interactive TUI | `Worker terminals require an interactive TUI` | +| Worker attach without a running worker | `There is no running supervised worker to attach` | +| Worker attach with a stale selection | `The selected worker is not running` | +| Worker attach with a missing target | `The selected worker is not present under the selected supervisor` | +| Worker attach without a retained binding | `The worker has no retained terminal binding` | +| Worker attach without provider support | `The worker provider cannot attach a terminal` | +| Worker attach without a configured provider | `Select the worker's Tangle Sandbox connection first` | +| Native terminal | `Select a retained Tangle Sandbox connection with native terminal support` | +| Native session attach | `No retained native session is available` | +| Interaction response | `Interaction response is not exposed by the current runtime adapter` | +| Provider cancellation | `The current runtime does not acknowledge provider cancellation` | +| Live steering | `The current runtime does not report steering support` | +| Queued input | `The current runtime does not report queued input support` | -The provider exposed cgroup v2 memory samples with a 2,048 MB limit and 630–633 MB peak use. +A missing capability never becomes a simulated success. -Machine identity, IP address, effective CPU and storage, placement, region, and per-sandbox cost remained unavailable because the provider did not report them. +## Tangle Sandbox lifecycle -The earlier ephemeral stress proof completed 20 of 20 Braid turns at four-way concurrency. +New Tangle Sandbox connections default to one ephemeral cloud turn and delete the environment after the turn. -All 20 remote environments were unique and confirmed deleted, while the account's active Sandbox count returned from four to four. +Retained execution is an explicit connection choice. -See the [ephemeral proof artifact](artifacts/verification/live/tangle-sandbox-braid-execution-stress-production-20260812.json) for every earlier run, token receipt, latency, environment observation, and cleanup result. +Braid requires exact retained-run control and provider-backed lookup before it creates a retained environment, so restart can recover an uncommitted dispatch. -The [verification record](docs/08-verification.md#current-core-path-observations) keeps the full results, limits, and tracked platform work. +The provider reports lifecycle, replay, control, interaction, continuation, workspace, placement, resource, and usage capabilities per run. -## Commands users reach for first +Braid shows requested, verified, sampled, estimated, and unavailable values separately. + +It never guesses machine identity, IP address, effective resources, storage, or cost when the provider does not report them. + +## Commands at a glance | Need | Command or key | | --- | --- | -| Select the agent and route | `/profile`, `/connection`, `/runner`, `/model`, `/effort` | -| Inspect execution | `/activity`, `F2`, `/export` | -| Navigate the work graph | `/graph`, `/fork`, `/branch`, `/clone` | -| Answer or automate a request | `/approve`, `/reject`, `/automate` | -| Control active work | `/queue`, `/steer`, `/cancel` | +| Select profile and route | `/profile`, `/connection`, `/runner`, `/model`, `/effort` | +| Open activity and focus a run | `/activity`, `F2`, `Enter` on a run row | +| Navigate conversation work | `/graph`, `/branch`, `/clone`, `/fork` | +| Answer an interaction | `/approve`, `/reject`, `/automate` | +| Queue, steer, or cancel a run | `/queue`, `/steer`, `/cancel` | +| Detach and recover retained work | `/detach`, `/reconnect`, `/reconcile` | +| Use a native terminal | `/interactive`, `/attach` | +| Analyze or compare work | `/ask`, `/analyze`, `/compare` | | Drive Braid from another process | `braid rpc` | -Commands remain searchable when a provider does not support them. +Run `/help [query]` for the complete command and key registry. + +The command palette uses the same capability explanations as direct invocation. + +## Headless mode + +`braid rpc` exposes JSON Lines commands over the same application core as the terminal. + +Headless clients can inspect state, send, queue, steer, cancel, detach, reconnect, reconcile, respond to interactions, manage automation, branch, clone, fork, analyze, compare, inspect activity, control workers, and export records. + +Worker terminal attachment remains an interactive-TUI action. -An unavailable command explains the missing capability instead of pretending that the operation succeeded. +Mutating requests carry stable operation identifiers, so retries can be recognized instead of dispatched twice. -## What Braid owns +Plain output and headless state contain no terminal control sequences. + +## Ownership and safety boundaries | Boundary | Owner | | --- | --- | -| Portable agent definition and compatibility facts | `agent-interface` | -| Run admission, lifecycle, normalized events, and runtime control | `agent-runtime` | +| Portable agent definition and compatibility helpers | `agent-interface` | +| Run admission, lifecycle, normalized events, replay, and runtime control | `agent-runtime` | | Local runner process and native profile materialization | CLI Bridge | -| Tangle inference and remote workspace lifecycle | Tangle provider and sandbox packages | +| Inference and remote workspace lifecycle | Tangle provider and sandbox packages | | Trace analysis and paired comparison | `agent-eval` | -| Conversation journal, branches, graph, approvals, projections, and terminal/headless interfaces | Braid | +| Conversation journal, branches, graph, interactions, projections, and interfaces | Braid | + +Components render immutable view models and emit typed intents. + +Controllers own workflows, cancellation, event reduction, and side effects through ports. -Braid adapts these contracts through narrow ports. +Untrusted terminal content is sanitized before rendering, and OSC control sequences are suppressed by default. -It does not duplicate execution, authentication, provider parsing, sandbox scheduling, trace judging, or billing logic. +No credential value, secret interaction answer, provider-private state, or raw secret-bearing trace enters a profile, SQLite record, log, snapshot, screenshot, or export. ## Development and proof @@ -318,27 +367,21 @@ pnpm check pnpm capture:visual ``` -`pnpm check` covers formatting, linting, types, dependency boundaries, attribution, licenses, automated tests, live checks, and release checks configured by the repository. +`pnpm check` runs the repository's formatting, lint, type, boundary, dependency, attribution, license, test, live, and release checks. -When a ready Pi backend is configured, `pnpm capture:visual` drives the packed CLI through a pseudo-terminal and records terminal state evidence plus a live Pi and CLI Bridge product capture. - -The checked-in W6 state captures prove rendering and keyboard paths. - -A successful product capture is the evidence for the live Pi, CLI Bridge, inference route, and sandbox run. +`pnpm capture:visual` records terminal state at 40×12, 80×24, 120×40, and 200×60 and exercises the keyboard path. The [verification plan](docs/08-verification.md) defines the required live, headless, terminal, security, installation, and release evidence. The [delivery plan](docs/09-delivery-plan.md) records dependency order and completion criteria. -The [product contract](docs/01-product-contract.md), [experience specification](docs/02-experience-specification.md), and [architecture](docs/03-architecture.md) define the user-visible and ownership boundaries. +The [product contract](docs/01-product-contract.md), [experience specification](docs/02-experience-specification.md), [runtime contracts](docs/04-runtime-contracts.md), and [conversation/fork/analysis contract](docs/06-conversations-forks-and-analysis.md) define the behavior and ownership boundaries. ## Open-source foundation Braid uses the MIT-licensed [`@earendil-works/pi-tui`](https://www.npmjs.com/package/@earendil-works/pi-tui) package for terminal rendering and input primitives. -Its interaction design takes narrow, application-level patterns from [Pi](https://github.com/earendil-works/pi), [OpenCode](https://github.com/anomalyco/opencode), and [Codex](https://github.com/openai/codex) without copying their agent loops, session stores, authentication systems, provider adapters, or model registries. - -See the [renderer decision](docs/decisions/001-pi-tui-renderer.md), [runtime boundary](docs/decisions/002-runtime-boundary.md), [upstream strategy](docs/10-upstream-strategy.md), and [third-party notices](THIRD_PARTY_NOTICES.md) for the exact reuse boundary. +See the [renderer decision](docs/decisions/001-pi-tui-renderer.md), [runtime boundary](docs/decisions/002-runtime-boundary.md), [upstream strategy](docs/10-upstream-strategy.md), and [third-party notices](THIRD_PARTY_NOTICES.md) for the reuse boundary. ## License From a2b837473d48bfdfd43d3e12d4821f1fb8b85fb2 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 14:33:41 -0600 Subject: [PATCH 035/136] feat(supervision): attach exact worker terminals --- docs/04-runtime-contracts.md | 22 ++- docs/components/supervision.md | 12 +- .../production-connection-providers.ts | 46 ++--- .../connections/production-connections.ts | 5 +- src/adapters/runtime/supervisor-control.ts | 74 ++++++++ src/adapters/tui/ui-capabilities.ts | 2 +- src/adapters/tui/ui-intelligence-dispatch.ts | 27 +-- src/app/composition.ts | 25 ++- src/app/production-composition.ts | 13 +- src/app/supervisor-projection.ts | 25 +++ src/app/supervisor-service.ts | 18 +- src/bin/native-interactive-actions.ts | 167 +++++++++++++++--- src/index.ts | 2 + .../shared/native-interactive-actions.ts | 24 +++ src/views/tui/activity-browser.ts | 14 +- src/views/tui/terminal-app.ts | 3 + src/views/tui/terminal-overlays.ts | 5 + src/views/tui/terminal-surface-overlays.ts | 36 +++- test/analysis-supervision.test.ts | 30 ++++ test/intelligence-dispatch.test.ts | 2 +- test/native-interactive-actions.test.ts | 112 ++++++++++++ test/production-composition.test.ts | 1 + 22 files changed, 563 insertions(+), 102 deletions(-) diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index 87edfc78..9b71a6a4 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -261,9 +261,9 @@ Braid adapts `loadTopSnapshot` into its own worker view, but it does not copy th The runtime kernel exports `writeWorkerSteer` for worker inbox delivery. -That function generates a new request identifier on every call and does not accept a caller operation identifier. +Braid supplies a stable operation identifier. -Braid keeps worker steering disabled until Runtime supports same-body replay and changed-body conflict for a stable operation identifier. +Runtime replays the same request body and rejects a different body for the same identifier. An explicit parent reference stays visible when no worker resolves it, and Braid does not create a replacement supervisor edge. @@ -277,9 +277,13 @@ Braid supplies the runtime state directory, exact runtime target, and caller ope An `unknown` effect means the request awaits acknowledgement and never becomes local success. -The runtime snapshot does not expose a retained interactive reference for one worker. +Runtime stores each worker's exact interactive binding outside its presentation snapshot. -Braid therefore disables worker attachment until Runtime owns a worker-to-retained-session attachment operation. +Braid passes the supervisor state directory, exact worker identifier, and selected provider source to Runtime `attachWorker`. + +Runtime reconstructs the retained process and returns an opaque handle or a named unavailable reason. + +Braid never persists the provider reference or reads Runtime files directly. The shared stream has no stable provider-native child-task lifecycle. @@ -606,17 +610,19 @@ Braid must never label the second operation as attachment. The same reference can identify an attachable Runtime worker or provider-native child only when Runtime reports a stable parent relation. -The current shared interface and Runtime package do not expose terminal input, output bytes, resize, or an attachment lifecycle. +The shared interface exposes terminal input, output events, resize, detach, close, and exact control claims. + +Runtime exposes retained interactive handles for Braid runs and exact supervised workers. + +Braid owns only terminal presentation and restores its screen after detach or remote exit. The sandbox platform already provides authenticated PTY transport, while CLI Bridge currently provides logical session continuity without a retained terminal process. [Agent SDK issue 138](https://github.com/tangle-network/agent-sdk/issues/138) owns the portable terminal-session contract. -[Runtime issue 773](https://github.com/tangle-network/agent-runtime/issues/773) owns exact execution and worker attachment. - [CLI Bridge issue 140](https://github.com/drewstone/cli-bridge/issues/140) owns retained local terminal processes. -Braid will consume the Runtime contract and will not add runner-specific attachment code. +Braid consumes the Runtime contract and contains no runner-specific attachment code. ## CLI Bridge target transport diff --git a/docs/components/supervision.md b/docs/components/supervision.md index e67d3512..5d4aa8d4 100644 --- a/docs/components/supervision.md +++ b/docs/components/supervision.md @@ -80,7 +80,15 @@ Steer appears only when the runtime reports steer support for that worker. Cancel appears only when the runtime reports cancellation support. -Attach remains unavailable until Runtime exposes an external-client attach contract. +Attach appears in the interactive TUI when at least one projected worker is running. + +Braid resolves the selected projected identifiers back to Runtime identifiers before attachment. + +Runtime rereads the exact durable worker binding and returns an opaque handle or a named unavailable reason. + +Braid claims control, suspends its own screen, forwards terminal input and resize, and restores the same screen after detach. + +The JSONL interface keeps attachment unavailable because it cannot present a native terminal. If Runtime reports that the selected provider supports terminal takeover, LIVE-11 requires a successful exact attach. @@ -116,7 +124,7 @@ Refresh uses one subscription or bounded poll per open surface. ## Proof -Tests cover hierarchy, cycles, missing parents, two supervisors, status updates, spend, steer, cancel, unavailable actions, restart, and unchanged refresh. +Tests cover hierarchy, cycles, missing parents, two supervisors, status updates, spend, steer, cancel, exact attach, unavailable actions, restart, and unchanged refresh. The deterministic supervisor fixture exercises the same public Runtime API shape without creating supervisor files. diff --git a/src/adapters/connections/production-connection-providers.ts b/src/adapters/connections/production-connection-providers.ts index 98e90730..c0cc4b97 100644 --- a/src/adapters/connections/production-connection-providers.ts +++ b/src/adapters/connections/production-connection-providers.ts @@ -1,11 +1,12 @@ -import type { - AgentEnvironment, - AgentEnvironmentCapabilities, -} from '@tangle-network/agent-interface/environment-provider' import type { AgentWorkspaceBranching, AgentWorkspaceBranchingProvider, } from '@tangle-network/agent-interface' +import type { + AgentEnvironment, + AgentEnvironmentCapabilities, + AgentEnvironmentProvider, +} from '@tangle-network/agent-interface/environment-provider' import { createCliBridgeProvider } from '@tangle-network/agent-provider-cli-bridge' import { createTangleProvider, @@ -51,6 +52,22 @@ export async function createTangleSandboxClient( return new Sandbox({ baseUrl: endpoint, apiKey }) as unknown as SandboxClientLike } +/** Construct the selected Tangle provider without creating or retaining an environment. */ +export async function createTangleEnvironmentProvider( + record: ConnectionRecord, + options: ProductionConnectionOptions, + signal?: AbortSignal, +): Promise { + const client = await createTangleSandboxClient(record, options, signal) + return createTangleProvider({ + client, + name: 'tangle-sandbox', + ...(options.tangleConfidentialAttestationVerifier === undefined + ? {} + : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), + }) +} + /** * Create a restart-safe source lookup without retaining a live environment. * @@ -66,14 +83,7 @@ export function createTangleWorkspaceBranchingProvider( sourceEnvironmentId: string, operation?: { readonly signal?: AbortSignal }, ): Promise { - const client = await createTangleSandboxClient(record, options, operation?.signal) - const provider = createTangleProvider({ - client, - name: 'tangle-sandbox', - ...(options.tangleConfidentialAttestationVerifier === undefined - ? {} - : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), - }) + const provider = await createTangleEnvironmentProvider(record, options, operation?.signal) const branching = provider.workspaceBranching if (branching === undefined) return null return branching.forEnvironment(sourceEnvironmentId, operation) @@ -88,14 +98,7 @@ export async function getTangleSandboxEnvironment( environmentId: string, signal?: AbortSignal, ): Promise { - const client = await createTangleSandboxClient(record, options, signal) - const provider = createTangleProvider({ - client, - name: 'tangle-sandbox', - ...(options.tangleConfidentialAttestationVerifier === undefined - ? {} - : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), - }) + const provider = await createTangleEnvironmentProvider(record, options, signal) if (provider.get === undefined) return null return provider.get(environmentId, signal === undefined ? undefined : { signal }) } @@ -141,8 +144,7 @@ export async function capabilitiesForConnection( ...(options.tangleConfidentialAttestationVerifier === undefined ? {} : { - confidentialAttestationVerifier: - options.tangleConfidentialAttestationVerifier, + confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier, }), }).capabilities() const environment = tangleConnectionCapabilities( diff --git a/src/adapters/connections/production-connections.ts b/src/adapters/connections/production-connections.ts index 1c95e63f..f3ce75de 100644 --- a/src/adapters/connections/production-connections.ts +++ b/src/adapters/connections/production-connections.ts @@ -15,9 +15,10 @@ export { normalizeCliBridgeRuntimeBaseUrl, } from './production-connection-endpoints.js' export { + createTangleEnvironmentProvider, createTangleSandboxClient, - getTangleSandboxEnvironment, createTangleWorkspaceBranchingProvider, + getTangleSandboxEnvironment, } from './production-connection-providers.js' export { type ConnectionCapabilityAction, @@ -31,9 +32,9 @@ export { type ProductionConnectionOptions, type SandboxClientFactory, type SandboxClientFactoryInput, + type TangleConfidentialAttestationVerifier, type TangleRetainedControlLookup, type TangleRetainedControlLookupInput, - type TangleConfidentialAttestationVerifier, } from './production-connection-types.js' export function createProductionConnectionAdapter( diff --git a/src/adapters/runtime/supervisor-control.ts b/src/adapters/runtime/supervisor-control.ts index 5eb26db7..816783d9 100644 --- a/src/adapters/runtime/supervisor-control.ts +++ b/src/adapters/runtime/supervisor-control.ts @@ -1,8 +1,12 @@ import { + attachWorker, cancelRun, cancelWorker, type RunCancellation, type WorkerCancellation, + type WorkerInteractiveProviderSource, + type WorkerInteractiveSession, + type WorkerInteractiveUnavailableReason, type WorkerSteerAcknowledgement, type WorkerSteerRequest, writeWorkerSteer, @@ -51,6 +55,27 @@ export interface SupervisorCancelResult { readonly issue?: SupervisorCapabilityIssue } +export type SupervisorWorkerAttachUnavailableReason = + | WorkerInteractiveUnavailableReason + | 'interactive-provider-not-configured' + +export type SupervisorWorkerAttachResult = + | { + readonly status: 'available' + readonly worker: string + readonly handle: Extract['handle'] + } + | { + readonly status: 'unavailable' + readonly worker: string + readonly reason: SupervisorWorkerAttachUnavailableReason + readonly issue?: SupervisorCapabilityIssue + } + +export type SupervisorWorkerProviderResolver = ( + signal?: AbortSignal, +) => Promise + function missingWorkerIssue(worker: string): SupervisorCapabilityIssue { return { capability: 'supervisor.worker.resolve', @@ -82,6 +107,8 @@ export class RuntimeSupervisorController { readonly #write: typeof writeWorkerSteer readonly #cancelWorker: typeof cancelWorker readonly #cancelRun: typeof cancelRun + readonly #attachWorker: typeof attachWorker + readonly #providers: SupervisorWorkerProviderResolver | undefined constructor( options: { @@ -89,12 +116,16 @@ export class RuntimeSupervisorController { readonly write?: typeof writeWorkerSteer readonly cancelWorker?: typeof cancelWorker readonly cancelRun?: typeof cancelRun + readonly attachWorker?: typeof attachWorker + readonly providers?: SupervisorWorkerProviderResolver } = {}, ) { this.#watcher = options.watcher ?? new RuntimeSupervisorWatcher() this.#write = options.write ?? writeWorkerSteer this.#cancelWorker = options.cancelWorker ?? cancelWorker this.#cancelRun = options.cancelRun ?? cancelRun + this.#attachWorker = options.attachWorker ?? attachWorker + this.#providers = options.providers } steerWorker( @@ -200,6 +231,49 @@ export class RuntimeSupervisorController { } } + async attachWorker( + rootDir: string, + supervisorId: string, + workerIdOrLabel: string, + signal?: AbortSignal, + ): Promise { + signal?.throwIfAborted() + const supervisor = this.#findSupervisor(rootDir, supervisorId) + if (supervisor === undefined) { + return { + status: 'unavailable', + worker: workerIdOrLabel, + reason: 'unknown-node', + issue: missingSupervisorIssue(supervisorId), + } + } + const worker = findWorker(supervisor.workers, workerIdOrLabel) + if (worker === undefined) { + return { + status: 'unavailable', + worker: workerIdOrLabel, + reason: 'unknown-node', + issue: missingWorkerIssue(workerIdOrLabel), + } + } + if (this.#providers === undefined) { + return { + status: 'unavailable', + worker: worker.id, + reason: 'interactive-provider-not-configured', + } + } + const providers = await this.#providers(signal) + signal?.throwIfAborted() + const attached = await this.#attachWorker(supervisor.stateDir, worker.id, { + providers, + ...(signal === undefined ? {} : { signal }), + }) + return attached.status === 'available' + ? { status: 'available', worker: worker.id, handle: attached.handle } + : { status: 'unavailable', worker: worker.id, reason: attached.reason } + } + #findSupervisor(rootDir: string, supervisorId: string): SupervisorView | undefined { return this.#watcher .snapshot(rootDir) diff --git a/src/adapters/tui/ui-capabilities.ts b/src/adapters/tui/ui-capabilities.ts index dc20dc7e..491e7ccb 100644 --- a/src/adapters/tui/ui-capabilities.ts +++ b/src/adapters/tui/ui-capabilities.ts @@ -19,7 +19,7 @@ export const UNSUPPORTED = Object.freeze({ 'run.interactive': 'Native terminal mode requires an interactive TUI and a supported provider', 'run.attach': 'Native terminal attachment requires an interactive TUI and a retained session', 'supervisor.worker.attach': - 'The runtime snapshot does not carry the retained interactive reference required to attach to an exact worker', + 'Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding', 'export.create': 'Redacted export is not exposed by the current storage adapter', } satisfies Readonly>) diff --git a/src/adapters/tui/ui-intelligence-dispatch.ts b/src/adapters/tui/ui-intelligence-dispatch.ts index c7a53e72..9d0d6240 100644 --- a/src/adapters/tui/ui-intelligence-dispatch.ts +++ b/src/adapters/tui/ui-intelligence-dispatch.ts @@ -5,6 +5,7 @@ import type { AnalysisRequest, AnalysisSourceRequest } from '../../app/analysis- import { AnalysisCapabilityError } from '../../app/analysis-types.js' import type { BraidApplication } from '../../app/application.js' import { AppError } from '../../app/errors.js' +import { runtimeWorkerReference } from '../../app/supervisor-projection.js' import type { BraidState } from '../../domain/state.js' import { capabilityForHeadlessCommand } from '../../views/shared/headless-commands.js' import type { BraidIntent, UiDispatchResult } from '../../views/shared/intents.js' @@ -272,30 +273,6 @@ async function dispatchSupervisorQuery( } } -function runtimeWorkerReference( - state: BraidState, - supervisorId: string, - workerId: string, -): - | { - readonly rootDir: string - readonly runtimeSupervisorId: string - readonly runtimeWorkerId: string - } - | undefined { - const supervisor = state.supervisors.find((candidate) => String(candidate.id) === supervisorId) - if (supervisor === undefined || state.workspace !== supervisor.runtimeRoot) return undefined - const worker = state.workers.find( - (candidate) => String(candidate.id) === workerId && candidate.supervisorId === supervisor.id, - ) - if (worker === undefined) return undefined - return { - rootDir: supervisor.runtimeRoot, - runtimeSupervisorId: supervisor.runtimeId, - runtimeWorkerId: worker.runtimeId, - } -} - function runtimeSupervisorReference( state: BraidState, supervisorId: string, @@ -615,7 +592,7 @@ export async function dispatchIntelligenceIntent( return dispatchSupervisorCancel(context, intent.params, intent.operationId) case 'attach_worker': return unavailable( - 'Worker attachment is unavailable: the runtime snapshot does not carry the retained interactive reference required to reconnect the exact worker', + 'Worker terminal attachment requires the interactive TUI; open runtime activity and press a on a running worker', ) default: return undefined diff --git a/src/app/composition.ts b/src/app/composition.ts index bbfbadcb..9ced4d5c 100644 --- a/src/app/composition.ts +++ b/src/app/composition.ts @@ -169,8 +169,16 @@ export function createBraidApplication(options: CompositionOptions = {}): BraidA options.journal ?? (isFixture ? createMemoryJournal(clock) : new FailClosedJournal(clock)) const effectStorage = options.effectStorage ?? (isEffectStorage(journal) ? journal : new FailClosedJournal(clock)) - const intelligence = + const configuredIntelligence: IntelligenceActionsOptions | undefined = options.intelligence ?? (isFixture ? undefined : { analyst: new UnavailableAnalyst() }) + const intelligence = + production?.supervisorController === undefined + ? configuredIntelligence + : { + ...(configuredIntelligence ?? {}), + supervisorController: + configuredIntelligence?.supervisorController ?? production.supervisorController, + } return new BraidApplication({ profile: options.profile ?? @@ -252,6 +260,17 @@ export async function createDurableBraidApplication( const scopedJournal = await StorageJournal.fromStorage(storage, clock) reportStartupStage(options.startupObserver, 'journal-restore', stageStarted) stageStarted = performance.now() + const configuredIntelligence: IntelligenceActionsOptions = options.intelligence ?? { + analyst: new UnavailableAnalyst(), + } + const intelligence = + production?.supervisorController === undefined + ? configuredIntelligence + : { + ...configuredIntelligence, + supervisorController: + configuredIntelligence.supervisorController ?? production.supervisorController, + } const app = new BraidApplication({ profile: options.profile ?? production?.profile ?? STARTER_PROFILE, execution: @@ -265,9 +284,7 @@ export async function createDurableBraidApplication( journal: scopedJournal, effectStorage: storage, conversationStorage: storage, - ...(options.intelligence === undefined - ? { intelligence: { analyst: new UnavailableAnalyst() } } - : { intelligence: options.intelligence }), + intelligence, ...(options.effectCoordinator === undefined ? {} : { effectCoordinator: options.effectCoordinator }), diff --git a/src/app/production-composition.ts b/src/app/production-composition.ts index 873bdab1..e484eaf5 100644 --- a/src/app/production-composition.ts +++ b/src/app/production-composition.ts @@ -1,9 +1,10 @@ import type { AgentProfile } from '@tangle-network/agent-interface' +import type { ProductionConnectionOptions } from '../adapters/connections/production-connections.js' import { connectionEndpoint, + createTangleEnvironmentProvider, createTangleWorkspaceBranchingProvider, } from '../adapters/connections/production-connections.js' -import type { ProductionConnectionOptions } from '../adapters/connections/production-connections.js' import { AgentRuntimeExecutionPort, type AgentTurnBackendResolver, @@ -17,6 +18,7 @@ import { resolveProductionCliBridgeConnection, resolveProductionTangleRetainedConnection, } from '../adapters/runtime/production-backend-resolver.js' +import { RuntimeSupervisorController } from '../adapters/runtime/supervisor-control.js' import { TangleRetainedExecutionPort } from '../adapters/runtime/tangle-retained-execution.js' import { TangleRetainedInteractiveExecutionPort } from '../adapters/runtime/tangle-retained-interactive-execution.js' import type { ConnectionRecord } from '../domain/entities.js' @@ -71,6 +73,7 @@ export interface ProductionComposition { readonly connection: ConnectionRecord readonly execution: ExecutionPort readonly nativeInteractive?: NativeInteractiveExecutionControl + readonly supervisorController?: RuntimeSupervisorController readonly backendResolver: AgentTurnBackendResolver } @@ -192,6 +195,13 @@ export function createProductionComposition( }), } const backendResolver = createProductionBackendResolver(resolverOptions) + const supervisorController = + connection.kind === 'tangle-sandbox' + ? new RuntimeSupervisorController({ + providers: (signal) => + createTangleEnvironmentProvider(connection, resolverOptions, signal), + }) + : undefined const workspaceBranchingProvider = connection.kind === 'tangle-sandbox' ? createTangleWorkspaceBranchingProvider(connection, resolverOptions) @@ -274,6 +284,7 @@ export function createProductionComposition( connection, execution, ...(nativeInteractive === undefined ? {} : { nativeInteractive }), + ...(supervisorController === undefined ? {} : { supervisorController }), backendResolver, }) } diff --git a/src/app/supervisor-projection.ts b/src/app/supervisor-projection.ts index 07258d4e..8c66a1e2 100644 --- a/src/app/supervisor-projection.ts +++ b/src/app/supervisor-projection.ts @@ -40,6 +40,31 @@ export interface SupervisorProjection { readonly graphEdges: readonly GraphEdgeRecord[] } +export interface RuntimeWorkerReference { + readonly rootDir: string + readonly runtimeSupervisorId: string + readonly runtimeWorkerId: string +} + +/** Resolve one projected worker back to the opaque Runtime identifiers that own its controls. */ +export function runtimeWorkerReference( + state: BraidState, + supervisorId: string, + workerId: string, +): RuntimeWorkerReference | undefined { + const supervisor = state.supervisors.find((candidate) => String(candidate.id) === supervisorId) + if (supervisor === undefined || state.workspace !== supervisor.runtimeRoot) return undefined + const worker = state.workers.find( + (candidate) => String(candidate.id) === workerId && candidate.supervisorId === supervisor.id, + ) + if (worker === undefined) return undefined + return { + rootDir: supervisor.runtimeRoot, + runtimeSupervisorId: supervisor.runtimeId, + runtimeWorkerId: worker.runtimeId, + } +} + function validIso(value: string | undefined, fallback: string): string { if (value !== undefined && Number.isFinite(Date.parse(value))) return value return fallback diff --git a/src/app/supervisor-service.ts b/src/app/supervisor-service.ts index ae675ea2..611ddacb 100644 --- a/src/app/supervisor-service.ts +++ b/src/app/supervisor-service.ts @@ -1,6 +1,7 @@ import type { RuntimeSupervisorController, SupervisorCancelResult, + SupervisorWorkerAttachResult, SupervisorWorkerCancelResult, SupervisorWorkerSteerResult, } from '../adapters/runtime/supervisor-control.js' @@ -122,6 +123,16 @@ export class SupervisorService { return controller.cancelSupervisor(rootDir, supervisorId, operationId, reason, source) } + async attachWorker( + rootDir: string, + supervisorId: string, + workerIdOrLabel: string, + signal?: AbortSignal, + ): Promise { + const controller = await this.#loadController() + return controller.attachWorker(rootDir, supervisorId, workerIdOrLabel, signal) + } + #loadWatcher(): Promise { if (this.#watcher !== undefined) return Promise.resolve(this.#watcher) if (this.#watcherLoad !== undefined) return this.#watcherLoad @@ -156,4 +167,9 @@ export type { SupervisorSnapshotRequest, SupervisorWatchRequest, } from './supervisor-projection.js' -export type { SupervisorCancelResult, SupervisorWorkerCancelResult, SupervisorWorkerSteerResult } +export type { + SupervisorCancelResult, + SupervisorWorkerAttachResult, + SupervisorWorkerCancelResult, + SupervisorWorkerSteerResult, +} diff --git a/src/bin/native-interactive-actions.ts b/src/bin/native-interactive-actions.ts index 31cfb8ef..e9fc0e4c 100644 --- a/src/bin/native-interactive-actions.ts +++ b/src/bin/native-interactive-actions.ts @@ -1,7 +1,11 @@ import type { AgentInteractiveTerminalSession } from '@tangle-network/agent-interface' -import { claimRetainedInteractiveControl } from '@tangle-network/agent-runtime/kernel' +import { + claimRetainedInteractiveControl, + type RetainedInteractiveRunHandle, +} from '@tangle-network/agent-runtime/kernel' import { createNativeTerminalTransport } from '../adapters/tui/native-terminal-transport.js' import type { BraidApplication } from '../app/application.js' +import { runtimeWorkerReference } from '../app/supervisor-projection.js' import { activeRunForBranch, type BraidRun, type BraidState } from '../domain/state.js' import type { NativeInteractiveExecutionControl } from '../ports/native-interactive-execution.js' import type { @@ -14,10 +18,13 @@ import type { NativeInteractiveCommand, NativeInteractiveCommandResult, NativeInteractiveUiActions, + NativeInteractiveWorkerCommand, + NativeInteractiveWorkerResult, } from '../views/shared/native-interactive-actions.js' interface InteractiveApplicationHandle { - readonly app: Pick + readonly app: Pick & + Partial> readonly nativeInteractive?: NativeInteractiveExecutionControl } @@ -54,10 +61,44 @@ export function createNativeInteractiveUiActions( busy = false } }, + workerAvailability: (workerId?: string) => + workerAvailability(options.current(), workerId, busy), + attachWorker: async ( + command: NativeInteractiveWorkerCommand, + ): Promise => { + if (busy) return { kind: 'unavailable', reason: 'A native terminal is already open' } + const available = workerAvailability(options.current(), command.workerId, false) + if (!available.available) { + return { kind: 'unavailable', reason: available.reason ?? 'Worker terminal unavailable' } + } + busy = true + try { + return await attachWorker(options, command) + } catch (error) { + return { kind: 'error', message: errorMessage(error) } + } finally { + busy = false + } + }, } return Object.freeze(actions) } +function workerAvailability( + current: InteractiveApplicationHandle, + workerId: string | undefined, + busy: boolean, +): NativeInteractiveAvailability { + if (busy) return { available: false, reason: 'A native terminal is already open' } + const running = current.app.state().workers.filter((worker) => worker.status === 'running') + if (workerId !== undefined && !running.some((worker) => String(worker.id) === workerId)) { + return { available: false, reason: 'The selected worker is not running' } + } + return running.length === 0 + ? { available: false, reason: 'There is no running supervised worker to attach' } + : { available: true } +} + function availability( current: InteractiveApplicationHandle, action: NativeInteractiveCommand['action'], @@ -132,34 +173,14 @@ async function present( ): Promise { void runCompletion.catch(() => undefined) const handle = await execution.waitForHandle(runId) - let terminalSession: AgentInteractiveTerminalSession + let result: NativeTerminalTransportResult try { - const control = await claimRetainedInteractiveControl({ - handle, - holderId: options.holderId, - }) - terminalSession = await handle.attach({ - control, - cols: positiveDimension(options.terminal.columns), - rows: positiveDimension(options.terminal.rows), - }) + result = await presentHandle(options, handle) } catch (error) { await detachAfterViewerFailure(current.app, runId, options.nextOperationId, error) throw error } - options.suspend() - let result: NativeTerminalTransportResult - try { - result = await createNativeTerminalTransport({ - session: terminalSession, - terminal: options.terminal, - signals: options.signals(), - }).run() - } finally { - options.resume() - } - const outcome = result.outcome if (outcome.kind === 'remote-exit') { execution.settle(runId, { @@ -191,6 +212,104 @@ async function present( } } +async function attachWorker( + options: NativeInteractiveActionsOptions, + command: NativeInteractiveWorkerCommand, +): Promise { + const current = options.current() + if (current.app.intelligence === undefined) { + return { kind: 'unavailable', reason: 'Runtime worker control is unavailable' } + } + const reference = runtimeWorkerReference( + current.app.state(), + command.supervisorId, + command.workerId, + ) + if (reference === undefined) { + return { + kind: 'unavailable', + reason: 'The selected worker is not present under the selected supervisor', + } + } + const attached = await current.app.intelligence.supervisor.attachWorker( + reference.rootDir, + reference.runtimeSupervisorId, + reference.runtimeWorkerId, + ) + if (attached.status === 'unavailable') { + return { + kind: 'unavailable', + reason: attached.issue?.reason ?? workerUnavailableReason(attached.reason), + } + } + const result = await presentHandle(options, attached.handle) + const cleanup = cleanupMessage(result) + if (cleanup !== undefined) return { kind: 'error', message: cleanup } + if (result.outcome.kind === 'remote-exit') { + return { + kind: 'returned', + operationId: command.operationId, + workerId: command.workerId, + outcome: 'exited', + } + } + if (result.outcome.kind === 'detached') { + return { + kind: 'returned', + operationId: command.operationId, + workerId: command.workerId, + outcome: 'detached', + } + } + return { + kind: 'error', + message: + result.outcome.kind === 'transport-error' + ? `Native worker terminal ${result.outcome.phase} failed: ${result.outcome.message}` + : 'Native worker terminal closed after an interrupt', + } +} + +async function presentHandle( + options: NativeInteractiveActionsOptions, + handle: RetainedInteractiveRunHandle, +): Promise { + const control = await claimRetainedInteractiveControl({ + handle, + holderId: options.holderId, + }) + const terminalSession: AgentInteractiveTerminalSession = await handle.attach({ + control, + cols: positiveDimension(options.terminal.columns), + rows: positiveDimension(options.terminal.rows), + }) + options.suspend() + try { + return await createNativeTerminalTransport({ + session: terminalSession, + terminal: options.terminal, + signals: options.signals(), + }).run() + } finally { + options.resume() + } +} + +function workerUnavailableReason(reason: string): string { + const descriptions: Readonly> = { + 'unknown-node': 'Runtime no longer reports the selected worker', + 'not-live': 'The selected worker is no longer running', + 'executor-exposes-no-interactive-session': 'The selected worker runs without a terminal', + 'provider-has-no-interactive-contract': 'The worker provider cannot attach a terminal', + 'interactive-session-not-started': 'The worker did not start an interactive terminal', + 'interactive-binding-not-found': 'The worker has no retained terminal binding', + 'interactive-binding-stale': 'The retained worker terminal is no longer available', + 'interactive-provider-not-registered': 'The worker provider is not selected in Braid', + 'interactive-provider-not-configured': "Select the worker's Tangle Sandbox connection first", + } + return descriptions[reason] ?? `Worker terminal unavailable: ${reason}` +} + async function detachAfterViewerFailure( app: InteractiveApplicationHandle['app'], runId: string, diff --git a/src/index.ts b/src/index.ts index 00aaedd8..52b61100 100644 --- a/src/index.ts +++ b/src/index.ts @@ -228,6 +228,8 @@ export type { NativeInteractiveCommand, NativeInteractiveCommandResult, NativeInteractiveUiActions, + NativeInteractiveWorkerCommand, + NativeInteractiveWorkerResult, } from './views/shared/native-interactive-actions.js' export { sanitizeClipboardText, diff --git a/src/views/shared/native-interactive-actions.ts b/src/views/shared/native-interactive-actions.ts index e78f0cc0..cdd02305 100644 --- a/src/views/shared/native-interactive-actions.ts +++ b/src/views/shared/native-interactive-actions.ts @@ -8,6 +8,12 @@ export type NativeInteractiveCommand = readonly runId?: string } +export interface NativeInteractiveWorkerCommand { + readonly operationId: string + readonly supervisorId: string + readonly workerId: string +} + export interface NativeInteractiveAvailability { readonly available: boolean readonly reason?: string @@ -28,8 +34,26 @@ export type NativeInteractiveCommandResult = readonly message: string } +export type NativeInteractiveWorkerResult = + | { + readonly kind: 'returned' + readonly operationId: string + readonly workerId: string + readonly outcome: 'detached' | 'exited' + } + | { + readonly kind: 'unavailable' + readonly reason: string + } + | { + readonly kind: 'error' + readonly message: string + } + /** Terminal-only actions. Runtime owns admission and recovery; this port only requests them. */ export interface NativeInteractiveUiActions { availability(action: NativeInteractiveCommand['action']): NativeInteractiveAvailability run(command: NativeInteractiveCommand): Promise + workerAvailability?(workerId?: string): NativeInteractiveAvailability + attachWorker?(command: NativeInteractiveWorkerCommand): Promise } diff --git a/src/views/tui/activity-browser.ts b/src/views/tui/activity-browser.ts index e4e57e1a..d687e01e 100644 --- a/src/views/tui/activity-browser.ts +++ b/src/views/tui/activity-browser.ts @@ -27,6 +27,7 @@ export interface ActivityBrowserOptions { readonly notice?: () => string | undefined readonly emptyMessage?: string readonly pinned?: string + readonly workerAttachAvailable?: () => boolean readonly onAction?: (action: ActivityBrowserAction, selectedId: string | undefined) => void } @@ -44,6 +45,7 @@ export class ActivityBrowserPanel extends EntityBrowser { options.notice?.(), options.emptyMessage, options.pinned, + options.workerAttachAvailable?.(), ), rows: options.rows, onClose: options.onClose, @@ -77,6 +79,7 @@ export function activityDocument( notice?: string, emptyMessage?: string, pinned?: string, + workerAttachAvailable?: boolean, ): EntityBrowserDocument { const details = new Map( (view.entityDetails ?? []).map((detail) => [detailKey(detail), detail] as const), @@ -89,7 +92,7 @@ export function activityDocument( return { title: scope === 'all' ? 'activity' : scope, ...(scope === 'runs' ? { context: 'Enter opens details and focuses controls' } : {}), - filterHint: activityFooter(scope, view), + filterHint: activityFooter(scope, view, workerAttachAvailable), ...(pinned === undefined ? {} : { pinned }), ...(notice === undefined ? {} : { notice }), emptyMessage: @@ -117,10 +120,15 @@ function activityAction( return undefined } -function activityFooter(scope: ActivityBrowserScope, view: BraidViewModel): string { +function activityFooter( + scope: ActivityBrowserScope, + view: BraidViewModel, + workerAttachAvailable?: boolean, +): string { if (scope === 'workers') { const steer = view.capabilities['supervisor.worker.steer']?.available === true - const attach = view.capabilities['supervisor.worker.attach']?.available === true + const attach = + workerAttachAvailable ?? view.capabilities['supervisor.worker.attach']?.available === true return steer || attach ? 's steer · x cancel · a/r' : 's/a off · x cancel · r' } if (scope === 'analyses') return 'p promote · x cancel · r' diff --git a/src/views/tui/terminal-app.ts b/src/views/tui/terminal-app.ts index e3777b7b..7caed0e5 100644 --- a/src/views/tui/terminal-app.ts +++ b/src/views/tui/terminal-app.ts @@ -150,6 +150,9 @@ export class BraidTerminalApp { ...(options.connectionLifecycle === undefined ? {} : { connectionLifecycle: options.connectionLifecycle }), + ...(options.nativeInteractive === undefined + ? {} + : { nativeInteractive: options.nativeInteractive }), dispatchCommand: (command, args) => this.#commands.dispatchCommand(command, args), requestRender: () => this.#tui.requestRender(), columns: () => this.#tui.terminal.columns, diff --git a/src/views/tui/terminal-overlays.ts b/src/views/tui/terminal-overlays.ts index c380609c..225b8433 100644 --- a/src/views/tui/terminal-overlays.ts +++ b/src/views/tui/terminal-overlays.ts @@ -4,6 +4,7 @@ import { type CommandName, commandItems } from '../shared/command-registry.js' import type { UiConnectionLifecycle } from '../shared/connection-lifecycle.js' import type { BraidUiController } from '../shared/intents.js' import type { ActivityItemView } from '../shared/models.js' +import type { NativeInteractiveUiActions } from '../shared/native-interactive-actions.js' import { sanitizeTerminalText } from '../shared/sanitize.js' import { type AutomationOverlayOpenOptions, @@ -37,6 +38,7 @@ export interface TerminalOverlayOptions { readonly requestRender: () => void readonly columns: () => number readonly rows: () => number + readonly nativeInteractive?: NativeInteractiveUiActions } export class TerminalOverlayController { @@ -68,6 +70,9 @@ export class TerminalOverlayController { controller: this.#controller, modals: this.#modals, nextOperationId: options.nextOperationId, + ...(options.nativeInteractive === undefined + ? {} + : { nativeInteractive: options.nativeInteractive }), rows: options.rows, }) this.#dispatchCommand = options.dispatchCommand diff --git a/src/views/tui/terminal-surface-overlays.ts b/src/views/tui/terminal-surface-overlays.ts index f53c9c8c..d64ec11d 100644 --- a/src/views/tui/terminal-surface-overlays.ts +++ b/src/views/tui/terminal-surface-overlays.ts @@ -2,6 +2,7 @@ import type { Component } from '@earendil-works/pi-tui' import type { AnalysisRecord } from '../../domain/entities.js' import type { BraidIntent, BraidUiController } from '../shared/intents.js' import type { ActivityItemView } from '../shared/models.js' +import type { NativeInteractiveUiActions } from '../shared/native-interactive-actions.js' import { sanitizeNotification } from '../shared/sanitize.js' import { type ActivityBrowserAction, @@ -11,14 +12,14 @@ import { import { isAnalysisComparisonResult } from './comparison.js' import { ConversationConfirmation } from './conversation-dialogs.js' import { DetailsViewPanel } from './details.js' +import type { EntityBrowserRow } from './entity-browser.js' import { GraphView } from './graph.js' import { type HelpViewOptions, HelpViewPanel } from './help.js' import type { ModalCoordinator } from './modal-coordinator.js' import { SearchableSelector } from './selector.js' -import { UnavailablePanel } from './terminal-shell.js' import { createWorkerSteerPrompt } from './supervisor-actions.js' +import { UnavailablePanel } from './terminal-shell.js' import type { BraidTheme } from './theme.js' -import type { EntityBrowserRow } from './entity-browser.js' export interface TerminalSurfaceOverlayOptions { readonly theme: BraidTheme @@ -32,6 +33,7 @@ export interface TerminalSurfaceOverlayOptions { readonly openProfile: () => void readonly openConnection: () => void readonly focusRun?: (runId: string) => void + readonly nativeInteractive?: NativeInteractiveUiActions } export interface IntelligenceProgressHandle { @@ -191,6 +193,12 @@ export class TerminalSurfaceOverlays { ...(pinned === undefined ? {} : { pinned }), onOpenSelected: (row) => this.#focusSelectedRun(row), onAction: (action, actionSelectedId) => this.#handleActivityAction(action, actionSelectedId), + ...(this.#options.nativeInteractive === undefined + ? {} + : { + workerAttachAvailable: () => + this.#options.nativeInteractive?.workerAvailability?.().available === true, + }), openSelected, }) } @@ -337,20 +345,32 @@ export class TerminalSurfaceOverlays { this.openUnavailable('attach unavailable', 'Select a runtime worker before attaching') return } - const result = await this.#options.controller.dispatch({ - type: 'headless-command', - command: 'attach_worker', + const actions = this.#options.nativeInteractive + if (actions?.workerAvailability === undefined || actions.attachWorker === undefined) { + this.openUnavailable('attach unavailable', 'Worker terminals require an interactive TUI') + return + } + const availability = actions.workerAvailability(selected.entityId) + if (!availability.available) { + this.openUnavailable( + 'attach unavailable', + availability.reason ?? 'Worker terminal unavailable', + ) + return + } + const result = await actions.attachWorker({ operationId: this.#options.nextOperationId(), - params: { supervisorId: selected.supervisorId, workerId: selected.entityId }, + supervisorId: selected.supervisorId, + workerId: selected.entityId, }) - if (result.kind !== 'accepted') { + if (result.kind !== 'returned') { this.openUnavailable( 'attach unavailable', result.kind === 'unavailable' ? result.reason : result.message, ) return } - this.openUnavailable('attach unavailable', 'The runtime returned no terminal attachment') + this.#setSupervisionStatus(`worker terminal ${result.outcome}: ${selected.title}`) } #openAnalysisPromotion(selected: ActivityItemView): void { diff --git a/test/analysis-supervision.test.ts b/test/analysis-supervision.test.ts index c841126a..fde2a754 100644 --- a/test/analysis-supervision.test.ts +++ b/test/analysis-supervision.test.ts @@ -6,6 +6,10 @@ import type { ExactAnalystRunResult, } from '@tangle-network/agent-eval' import type { AgentProfile } from '@tangle-network/agent-interface' +import type { + RetainedInteractiveRunHandle, + WorkerInteractiveProviderSource, +} from '@tangle-network/agent-runtime/kernel' import { mapAnalystFinding } from '../src/adapters/analysis/citations.js' import { AgentEvalAnalystAdapter, @@ -831,6 +835,15 @@ test('runtime supervisor adapter persists projections and routes exact cancel op | { readonly eventDir: string; readonly worker: string; readonly operationId: string } | undefined let runCancelInput: { readonly eventDir: string; readonly operationId: string } | undefined + let workerAttachInput: + | { + readonly eventDir: string + readonly worker: string + readonly providers: WorkerInteractiveProviderSource + } + | undefined + const interactiveProvider = {} as WorkerInteractiveProviderSource + const interactiveHandle = {} as RetainedInteractiveRunHandle const controller = new RuntimeSupervisorController({ watcher, write: (_rootDir, _supervisorId, workerId, options) => ({ @@ -872,6 +885,11 @@ test('runtime supervisor adapter persists projections and routes exact cancel op detail: 'runtime accepted supervisor cancellation', } }, + providers: async () => interactiveProvider, + attachWorker: async (eventDir, worker, options) => { + workerAttachInput = { eventDir, worker, providers: options.providers } + return { status: 'available', handle: interactiveHandle } + }, }) const first = history() const applicationHost = host(first.state, first.events) @@ -923,4 +941,16 @@ test('runtime supervisor adapter persists projections and routes exact cancel op eventDir: '/tmp/braid/.agent', operationId: 'op-cancel-supervisor-1', }) + const attached = await service.attachWorker( + '/tmp/braid', + 'runtime-supervisor-1', + 'runtime-worker-1', + ) + assert.equal(attached.status, 'available') + if (attached.status === 'available') assert.equal(attached.handle, interactiveHandle) + assert.deepEqual(workerAttachInput, { + eventDir: '/tmp/braid/.agent', + worker: 'runtime-worker-1', + providers: interactiveProvider, + }) }) diff --git a/test/intelligence-dispatch.test.ts b/test/intelligence-dispatch.test.ts index 6960f52a..d895d18c 100644 --- a/test/intelligence-dispatch.test.ts +++ b/test/intelligence-dispatch.test.ts @@ -463,7 +463,7 @@ test('supervisor controls resolve public ids and preserve retry-safe operation i params: { supervisorId: supervisor.id, workerId: worker.id }, }) assert.equal(attach.kind, 'unavailable') - if (attach.kind === 'unavailable') assert.match(attach.reason, /retained interactive reference/u) + if (attach.kind === 'unavailable') assert.match(attach.reason, /interactive TUI/u) writeInput = undefined const rejected = await controller.dispatch({ diff --git a/test/native-interactive-actions.test.ts b/test/native-interactive-actions.test.ts index 979ac6b8..b9c4c3f0 100644 --- a/test/native-interactive-actions.test.ts +++ b/test/native-interactive-actions.test.ts @@ -313,3 +313,115 @@ test('native terminal start only blocks an active run on the selected branch', ( assert.deepEqual(actions.availability('start'), { available: true }) }) + +test('attaches the exact projected Runtime worker and returns after terminal exit', async () => { + const terminal = new TestTerminal() + const attachedClaims: AgentInteractiveSessionControlClaimRequest[] = [] + const handle = retainedHandle(new ExitTerminalSession(), attachedClaims) + const calls: unknown[] = [] + const state = { + workspace: '/workspace', + activeRunId: null, + runs: [], + supervisors: [ + { + id: 'supervisor-braid', + runtimeId: 'supervisor-runtime', + runtimeRoot: '/workspace', + }, + ], + workers: [ + { + id: 'worker-braid', + runtimeId: 'worker-runtime', + supervisorId: 'supervisor-braid', + status: 'running', + }, + ], + } + const app = { + state: () => state, + intelligence: { + supervisor: { + attachWorker: async (rootDir: string, supervisorId: string, workerId: string) => { + calls.push({ rootDir, supervisorId, workerId }) + return { status: 'available' as const, worker: workerId, handle } + }, + }, + }, + } as unknown as BraidApplication + let suspends = 0 + let resumes = 0 + const actions = createNativeInteractiveUiActions({ + current: () => ({ app }), + terminal, + signals: () => signals, + suspend: () => { + suspends += 1 + }, + resume: () => { + resumes += 1 + }, + nextOperationId: () => 'operation-unused', + holderId: 'braid-native-actions', + }) + + assert.deepEqual(actions.workerAvailability?.('worker-braid'), { available: true }) + assert.ok(actions.attachWorker) + const result = await actions.attachWorker({ + operationId: 'operation-attach-worker', + supervisorId: 'supervisor-braid', + workerId: 'worker-braid', + }) + + assert.deepEqual(result, { + kind: 'returned', + operationId: 'operation-attach-worker', + workerId: 'worker-braid', + outcome: 'exited', + }) + assert.deepEqual(calls, [ + { + rootDir: '/workspace', + supervisorId: 'supervisor-runtime', + workerId: 'worker-runtime', + }, + ]) + assert.equal(attachedClaims[0]?.holderId, 'braid-native-actions') + assert.equal(terminal.starts, 1) + assert.equal(terminal.stops, 1) + assert.equal(suspends, 1) + assert.equal(resumes, 1) +}) + +test('worker attachment fails closed when no projected worker is running', async () => { + const app = { + state: () => ({ workspace: '/workspace', runs: [], supervisors: [], workers: [] }), + } as unknown as BraidApplication + const actions = createNativeInteractiveUiActions({ + current: () => ({ app }), + terminal: new TestTerminal(), + signals: () => signals, + suspend: () => {}, + resume: () => {}, + nextOperationId: () => 'operation-unused', + holderId: 'braid-native-actions', + }) + + assert.deepEqual(actions.workerAvailability?.(), { + available: false, + reason: 'There is no running supervised worker to attach', + }) + assert.ok(actions.attachWorker) + assert.deepEqual( + await actions.attachWorker({ + operationId: 'operation-attach-missing-worker', + supervisorId: 'supervisor-missing', + workerId: 'worker-missing', + }), + { + kind: 'unavailable', + reason: 'The selected worker is not running', + }, + ) +}) diff --git a/test/production-composition.test.ts b/test/production-composition.test.ts index 5b5be905..dc6ad0bd 100644 --- a/test/production-composition.test.ts +++ b/test/production-composition.test.ts @@ -454,6 +454,7 @@ test('retained Tangle composition exposes one native control through durable sta ) const composed = createProductionComposition(selected) assert.notEqual(composed.nativeInteractive, undefined) + assert.notEqual(composed.supervisorController, undefined) const durable = await createDurableBraidApplication({ path: join(root, 'braid.db'), From a7185b6b5fb6e97c60ed890cb8ab37e302585057 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 14:45:12 -0600 Subject: [PATCH 036/136] test(tui): cover supervised worker attachment --- src/views/tui/terminal-overlays.ts | 3 + test/intelligence-dispatch.test.ts | 308 +++++++++++++++++++++++++++++ 2 files changed, 311 insertions(+) diff --git a/src/views/tui/terminal-overlays.ts b/src/views/tui/terminal-overlays.ts index 225b8433..b9ff4205 100644 --- a/src/views/tui/terminal-overlays.ts +++ b/src/views/tui/terminal-overlays.ts @@ -98,6 +98,9 @@ export class TerminalOverlayController { rows: options.rows, requestRender: options.requestRender, nextOperationId: options.nextOperationId, + ...(options.nativeInteractive === undefined + ? {} + : { nativeInteractive: options.nativeInteractive }), ...(options.keyboardDiagnostic === undefined ? {} : { keyboardDiagnostic: options.keyboardDiagnostic }), diff --git a/test/intelligence-dispatch.test.ts b/test/intelligence-dispatch.test.ts index d895d18c..b4046108 100644 --- a/test/intelligence-dispatch.test.ts +++ b/test/intelligence-dispatch.test.ts @@ -2,6 +2,21 @@ import assert from 'node:assert/strict' import test from 'node:test' import { TuiMainScreen } from '@earendil-works/pi-tui' import type { ExactAnalystRunEvent, ExactAnalystRunResult } from '@tangle-network/agent-eval' +import type { + AgentInteractiveSessionControlClaimRequest, + AgentInteractiveSessionRef, + AgentInteractiveTerminalSession, + TerminalDetachAck, +} from '@tangle-network/agent-interface' +import { + agentExecutionPreparationReceiptSchema, + canonicalCandidateDigest, +} from '@tangle-network/agent-interface' +import type { + RetainedInteractiveRunHandle, + WorkerInteractiveProviderSource, + WorkerInteractiveSession, +} from '@tangle-network/agent-runtime/kernel' import { AgentEvalAnalystAdapter, type AnalystRegistryPort, @@ -18,12 +33,15 @@ import { freezeAnalysisSource } from '../src/app/analysis-source.js' import { BraidApplication } from '../src/app/application.js' import { createBraidApplication, DETERMINISTIC_PROFILE } from '../src/app/composition.js' import { createMemoryJournal } from '../src/app/journal.js' +import { createNativeInteractiveUiActions } from '../src/bin/native-interactive-actions.js' +import type { NativeTerminalSignalPort } from '../src/index.js' import { FixedClock } from '../src/ports/clock.js' import { SequenceIds } from '../src/ports/ids.js' import { deterministicBackend } from '../src/testing/deterministic-backend.js' import type { BraidResponse } from '../src/views/headless/protocol.js' import { runRpc } from '../src/views/headless/rpc.js' import { analysisLines } from '../src/views/shared/analysis-presentation.js' +import type { BraidIntent, BraidUiController } from '../src/views/shared/intents.js' import { queryGraph } from '../src/views/shared/semantic-graph.js' import { BraidTerminalApp } from '../src/views/tui/terminal-app.js' import { createBraidTheme } from '../src/views/tui/theme.js' @@ -181,6 +199,170 @@ function supervisionSnapshot( } as unknown as TopSnapshot } +class DetachingWorkerTerminalSession implements AgentInteractiveTerminalSession { + readonly ref = { + terminalSessionId: 'terminal-worker-attach', + parentExecutionId: 'execution-worker-attach', + name: 'worker attach test', + shell: '/bin/sh', + cwd: '/workspace', + cols: 100, + rows: 30, + createdAt: '2026-08-16T00:00:00.000Z', + lastActivityAt: '2026-08-16T00:00:00.000Z', + expiresAt: '2099-01-01T00:00:00.000Z', + isRunning: true, + attachCount: 1, + } + readonly cursors = { earliest: 0, latest: 0 } + readonly control = { + refDigest: `sha256:${'1'.repeat(64)}` as const, + generation: 1, + leaseId: 'lease-worker-attach', + holderId: 'braid-worker-attach', + expiresAt: '2099-01-01T00:00:00.000Z', + } + detachCalls = 0 + #releaseEvents: () => void = () => {} + + input(): Promise { + return Promise.resolve() + } + + resize(): Promise { + return Promise.resolve() + } + + detach(): Promise { + this.detachCalls += 1 + this.#releaseEvents() + return Promise.resolve({ + status: 'detached', + terminalSessionId: this.ref.terminalSessionId, + }) + } + + close(): Promise { + return Promise.resolve({ status: 'closed', terminalSessionId: this.ref.terminalSessionId }) + } + + async *events(): AsyncIterable<{ + readonly type: 'output' + readonly seq: number + readonly data: string + }> { + yield { type: 'output', seq: 0, data: 'native worker terminal output\r\n' } + await new Promise((resolve) => { + this.#releaseEvents = resolve + }) + } +} + +class LifecycleVirtualTerminal extends VirtualTerminal { + starts = 0 + stops = 0 + + override start(onInput: (data: string) => void, onResize: () => void): void { + this.starts += 1 + super.start(onInput, onResize) + } + + override stop(): void { + this.stops += 1 + super.stop() + } +} + +const workerInteractivePreparation = { + kind: 'agent-execution-preparation' as const, + schemaVersion: 1 as const, + preparationId: 'preparation-worker-attach', + requestDigest: `sha256:${'1'.repeat(64)}` as const, + authoredProfileDigest: `sha256:${'2'.repeat(64)}` as const, + effectiveProfileDigest: `sha256:${'2'.repeat(64)}` as const, + backend: 'test-backend', + harness: 'pi' as const, + harnessVersion: 'test-harness-1', + resolvedModel: { requested: 'test/model', resolved: 'test/model' }, + workspace: { + leaseId: 'workspace-lease-worker-attach', + provider: 'test-provider', + identityDigest: `sha256:${'3'.repeat(64)}` as const, + isolation: 'per-run' as const, + sourceSnapshotDigest: `sha256:${'4'.repeat(64)}` as const, + sourceSnapshotPolicy: { + kind: 'provider-declared' as const, + name: 'test-snapshot', + version: 1, + digest: `sha256:${'5'.repeat(64)}` as const, + }, + preparedWorkspaceDigest: `sha256:${'6'.repeat(64)}` as const, + profileActivationDigest: `sha256:${'7'.repeat(64)}` as const, + }, + axisResults: [], + executionPlanDigest: `sha256:${'8'.repeat(64)}` as const, + materializer: { name: 'test-materializer', version: '1' }, + expiresAtMs: 4_102_444_800_000, +} + +const workerInteractiveRef: AgentInteractiveSessionRef = { + run: { + provider: 'test-provider', + environmentId: 'environment-worker-attach', + sessionId: 'session-worker-attach', + executionId: 'execution-worker-attach', + runId: 'provider-run-worker-attach', + requestDigest: workerInteractivePreparation.requestDigest, + }, + preparationReceipt: agentExecutionPreparationReceiptSchema.parse({ + ...workerInteractivePreparation, + digest: canonicalCandidateDigest(workerInteractivePreparation), + }), + incarnationId: 'incarnation-worker-attach', + startedAt: '2026-08-16T00:00:00.000Z', +} + +function workerInteractiveHandle( + session: AgentInteractiveTerminalSession, + attached: AgentInteractiveSessionControlClaimRequest[], +): RetainedInteractiveRunHandle { + const ref = workerInteractiveRef + return { + ref, + capabilities: {} as RetainedInteractiveRunHandle['capabilities'], + claimControl: async (request) => ({ + operationId: request.operationId, + requestDigest: request.requestDigest, + ref, + status: 'accepted', + control: { + refDigest: canonicalCandidateDigest(ref), + generation: 1, + leaseId: 'lease-worker-attach', + holderId: request.holderId, + expiresAt: '2099-01-01T00:00:00.000Z', + }, + }), + status: async () => ({ state: 'running', ref }), + attach: async (request) => { + attached.push({ + operationId: 'attach-observation', + requestDigest: `sha256:${'2'.repeat(64)}`, + ref, + holderId: request.control.holderId, + expectedGeneration: request.control.generation, + }) + return session + }, + sendPrompt: async () => { + throw new Error('not used') + }, + stop: async () => { + throw new Error('not used') + }, + } +} + async function createCompletedRun(app: BraidApplication, text: string): Promise { app.initialize('/workspace') const receipt = app.send({ @@ -804,6 +986,132 @@ test('activity follows runtime workers while open and stops cleanly when closed' await app.close() }) +test('activity attaches a running worker through the native terminal and restores Braid', async () => { + const raw = supervisionSnapshot([{ id: 'runtime-worker-attach', label: 'worker-attach' }]) + const watcher = new RuntimeSupervisorWatcher(() => raw) + const session = new DetachingWorkerTerminalSession() + const attached: AgentInteractiveSessionControlClaimRequest[] = [] + const handle = workerInteractiveHandle(session, attached) + let attachInput: + | { readonly eventDir: string; readonly workerId: string; readonly providerCount: number } + | undefined + const runtimeController = new RuntimeSupervisorController({ + watcher, + providers: async () => ({}) as WorkerInteractiveProviderSource, + attachWorker: async (eventDir, workerId, options): Promise => { + attachInput = { + eventDir, + workerId, + providerCount: Object.keys(options.providers).length, + } + return { status: 'available', handle } + }, + }) + const app = createBraidApplication({ + fixture: 'deterministic', + intelligence: { supervisorWatcher: watcher, supervisorController: runtimeController }, + }) + const baseController = createApplicationUiController(app) + const intents: BraidIntent[] = [] + const controller: BraidUiController = { + view: () => baseController.view(), + state: () => baseController.state(), + events: () => baseController.events(), + initialize: (workspace) => baseController.initialize(workspace), + subscribe: (subscriber, options) => baseController.subscribe(subscriber, options), + dispatch: async (intent) => { + intents.push(intent) + return baseController.dispatch(intent) + }, + waitForIdle: () => baseController.waitForIdle(), + } + const initialized = await controller.initialize('/workspace') + assert.equal(initialized.kind, 'accepted') + const refreshed = await controller.dispatch({ type: 'refresh-supervision' }) + assert.equal(refreshed.kind, 'accepted') + const publicSupervisor = app.state().supervisors[0] + const publicWorker = app.state().workers[0] + assert(publicSupervisor && publicWorker) + + const terminal = new LifecycleVirtualTerminal(100, 30) + const tui = new TuiMainScreen(terminal) + const signalPort: NativeTerminalSignalPort = { takeOver: () => () => {} } + let suspends = 0 + let resumes = 0 + let operation = 0 + let view: BraidTerminalApp | undefined + const actions = createNativeInteractiveUiActions({ + current: () => ({ app }), + terminal, + signals: () => signalPort, + suspend: () => { + suspends += 1 + view?.suspend() + }, + resume: () => { + resumes += 1 + view?.resume() + }, + nextOperationId: () => `op-worker-attach-${++operation}`, + holderId: 'braid-worker-attach', + }) + view = new BraidTerminalApp({ + controller, + tui, + theme: createBraidTheme(false), + workspace: '/workspace', + nextOperationId: () => `op-worker-attach-${++operation}`, + nativeInteractive: actions, + }) + const done = view.start() + + terminal.sendInput('/activity') + terminal.sendInput('\r') + await waitUntil(() => terminal.getViewport().join('\n').includes('worker-attach')) + for (let index = 0; index < 3; index += 1) terminal.sendInput('\t') + await waitUntil(() => terminal.getViewport().join('\n').includes('workers')) + const beforeAttach = terminal.getViewport().join('\n') + assert.match(beforeAttach, /a\/r/u) + + terminal.sendInput('a') + await waitUntil(() => suspends === 1) + await waitUntil(() => + terminal.getScrollBuffer().join('\n').includes('native worker terminal output'), + ) + assert.equal(terminal.starts >= 2, true) + assert.equal(terminal.stops >= 1, true) + terminal.sendInput('\u001d') + await waitUntil(() => resumes === 1) + await waitUntil(() => terminal.getViewport().join('\n').includes('worker terminal detached')) + const restored = terminal.getViewport().join('\n') + + assert.equal(suspends, 1) + assert.equal(resumes, 1) + assert.equal(terminal.starts >= 3, true) + assert.equal(terminal.stops >= 2, true) + assert.deepEqual(attachInput, { + eventDir: '/workspace/.agent', + workerId: 'runtime-worker-attach', + providerCount: 0, + }) + assert.equal(attached[0]?.holderId, 'braid-worker-attach') + assert.equal(attached[0]?.expectedGeneration, 1) + assert.equal(session.detachCalls, 1) + assert.match(restored, /worker-attach/u) + assert.match(restored, /workers/u) + assert.doesNotMatch(restored, /native worker terminal output/u) + assert.equal(app.state().runs.length, 0) + assert.equal(app.state().messages.length, 0) + assert.equal( + intents.some((intent) => intent.type === 'headless-command'), + false, + ) + + view.stop() + await done + await app.close() +}) + test('JSONL ask and named analysis return final data and preserve progress events', async () => { const app = createTestApplication() const responses: BraidResponse[] = [] From aa41593a83cc57e9ac033ac5951abfefdbcaefa4 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 14:46:24 -0600 Subject: [PATCH 037/136] test(ui): capture supervised worker controls --- scripts/capture-visual-definitions.mjs | 26 ++++++++ scripts/capture-visual.mjs | 8 +++ src/adapters/tui/ui-fixtures.ts | 8 ++- src/bin/args.ts | 13 +++- src/bin/braid-runtime.ts | 19 +----- src/bin/fixture-application.ts | 23 +++++++ src/testing/supervision-ui-fixture.ts | 83 ++++++++++++++++++++++++++ test/cli-startup.test.ts | 5 ++ 8 files changed, 164 insertions(+), 21 deletions(-) create mode 100644 src/bin/fixture-application.ts create mode 100644 src/testing/supervision-ui-fixture.ts diff --git a/scripts/capture-visual-definitions.mjs b/scripts/capture-visual-definitions.mjs index fc2a439b..df480564 100644 --- a/scripts/capture-visual-definitions.mjs +++ b/scripts/capture-visual-definitions.mjs @@ -108,6 +108,32 @@ export function createStateDefinitions(normalized) { return { point, record, switchedFrom, targetRunId } }, }, + { + name: 'supervision', + columns: 80, + rows: 24, + uiFixture: 'supervision', + run: async (terminal) => { + terminal.input('/activity') + terminal.input('\r') + await terminal.waitFor( + () => normalized(terminal.screen()).includes('stream and replay'), + 'supervisor activity', + ) + terminal.input('\t') + await terminal.waitFor( + () => /^\s*workers\b/iu.test(terminal.screen()), + 'worker activity filter', + ) + await terminal.waitFor( + () => normalized(terminal.screen()).includes('a/r'), + 'worker attach control', + ) + const { point, record } = await terminal.captureState() + await terminal.closeNormally() + return { point, record } + }, + }, { name: 'interaction', columns: 80, diff --git a/scripts/capture-visual.mjs b/scripts/capture-visual.mjs index bf225cd4..0fb37e7b 100644 --- a/scripts/capture-visual.mjs +++ b/scripts/capture-visual.mjs @@ -482,6 +482,14 @@ try { ) } } + if (definition.name === 'supervision') { + if (result.record.view?.activity?.filter((item) => item.kind === 'worker').length !== 3) { + throw new Error('supervision capture did not contain three projected workers') + } + if (!normalized(result.point.screen).includes('a/r')) { + throw new Error('supervision capture did not expose the worker attach control') + } + } if ( result.record.capturePhase !== 'atomic-signal-frame' || result.record.state?.revision !== result.record.view?.revision diff --git a/src/adapters/tui/ui-fixtures.ts b/src/adapters/tui/ui-fixtures.ts index 80526748..e59e75a3 100644 --- a/src/adapters/tui/ui-fixtures.ts +++ b/src/adapters/tui/ui-fixtures.ts @@ -12,7 +12,13 @@ import { } from '../../domain/ids.js' import type { ForkPreviewView, InteractionView } from '../../views/shared/models.js' -export type UiFixture = 'interaction' | 'fork' | 'analysis' | 'comparison' | 'product-demo' +export type UiFixture = + | 'interaction' + | 'fork' + | 'analysis' + | 'comparison' + | 'product-demo' + | 'supervision' export const FIXTURE_INTERACTION: InteractionView = Object.freeze({ runId: 'fixture-run-1', diff --git a/src/bin/args.ts b/src/bin/args.ts index da151217..0c724933 100644 --- a/src/bin/args.ts +++ b/src/bin/args.ts @@ -2,7 +2,13 @@ export interface CliOptions { readonly mode: 'tui' | 'rpc' readonly plain: boolean readonly fixture?: 'deterministic' - readonly uiFixture?: 'interaction' | 'fork' | 'analysis' | 'comparison' | 'product-demo' + readonly uiFixture?: + | 'interaction' + | 'fork' + | 'analysis' + | 'comparison' + | 'product-demo' + | 'supervision' readonly inline: boolean readonly noColor: boolean readonly highContrast: boolean @@ -111,10 +117,11 @@ export function parseArgs(argv: readonly string[], cwd: string): CliOptions { value !== 'fork' && value !== 'analysis' && value !== 'comparison' && - value !== 'product-demo' + value !== 'product-demo' && + value !== 'supervision' ) throw new CliUsageError( - '--ui-fixture supports "interaction", "fork", "analysis", "comparison", or "product-demo"', + '--ui-fixture supports "interaction", "fork", "analysis", "comparison", "product-demo", or "supervision"', ) uiFixture = value index += 1 diff --git a/src/bin/braid-runtime.ts b/src/bin/braid-runtime.ts index 08e017e5..ff224d1e 100644 --- a/src/bin/braid-runtime.ts +++ b/src/bin/braid-runtime.ts @@ -7,8 +7,8 @@ import type { ConnectionRegistry } from '../app/connections.js' import { createMemoryJournal } from '../app/journal.js' import { SystemClock } from '../ports/clock.js' import type { StartupPreview } from '../startup/preview-runtime.js' -import { PRODUCT_DEMO_CONNECTION, PRODUCT_DEMO_PROFILE } from '../testing/product-demo-fixture.js' import type { CliOptions } from './args.js' +import { openFixtureApplication } from './fixture-application.js' import { activateProductionConnection, openProductionApplication, @@ -84,22 +84,7 @@ async function openApplication( readonly startupOptions?: ProductionStartupLoadOptions readonly profileConnectionOptions?: ProfileConnectionDispatchOptions }> { - if (options.fixture) { - const productDemo = options.uiFixture === 'product-demo' - const configured = Number(process.env.BRAID_FIXTURE_CHUNK_DELAY_MS ?? 12) - const app = createBraidApplication({ - fixture: options.fixture, - ...(productDemo ? { profile: PRODUCT_DEMO_PROFILE } : {}), - chunkDelayMs: Number.isFinite(configured) && configured >= 0 ? configured : 12, - }) - return { - app, - close: () => app.close(), - ...(productDemo - ? { profileConnectionOptions: { connections: [PRODUCT_DEMO_CONNECTION] } } - : {}), - } - } + if (options.fixture) return openFixtureApplication(options) const { startupOptions, credentialContext } = createRuntimeStartupOptions(options, workspace) try { const production = await loadProductionStartup(startupOptions) diff --git a/src/bin/fixture-application.ts b/src/bin/fixture-application.ts new file mode 100644 index 00000000..fb33154c --- /dev/null +++ b/src/bin/fixture-application.ts @@ -0,0 +1,23 @@ +import { createBraidApplication } from '../app/composition.js' +import { PRODUCT_DEMO_CONNECTION, PRODUCT_DEMO_PROFILE } from '../testing/product-demo-fixture.js' +import { createSupervisionUiFixture } from '../testing/supervision-ui-fixture.js' +import type { CliOptions } from './args.js' + +export function openFixtureApplication(options: CliOptions) { + if (options.fixture === undefined) throw new Error('Fixture application requires a fixture') + const productDemo = options.uiFixture === 'product-demo' + const configured = Number(process.env.BRAID_FIXTURE_CHUNK_DELAY_MS ?? 12) + const app = createBraidApplication({ + fixture: options.fixture, + ...(productDemo ? { profile: PRODUCT_DEMO_PROFILE } : {}), + ...(options.uiFixture === 'supervision' ? { intelligence: createSupervisionUiFixture() } : {}), + chunkDelayMs: Number.isFinite(configured) && configured >= 0 ? configured : 12, + }) + return { + app, + close: () => app.close(), + ...(productDemo + ? { profileConnectionOptions: { connections: [PRODUCT_DEMO_CONNECTION] } } + : {}), + } +} diff --git a/src/testing/supervision-ui-fixture.ts b/src/testing/supervision-ui-fixture.ts new file mode 100644 index 00000000..07033cc8 --- /dev/null +++ b/src/testing/supervision-ui-fixture.ts @@ -0,0 +1,83 @@ +import { RuntimeSupervisorController } from '../adapters/runtime/supervisor-control.js' +import { RuntimeSupervisorWatcher, type TopSnapshot } from '../adapters/runtime/supervisor-watch.js' +import type { IntelligenceActionsOptions } from '../app/intelligence-actions.js' + +const FIXTURE_TIME = Date.parse('2026-08-28T20:00:00.000Z') + +const FIXTURE_SUPERVISION_SNAPSHOT = Object.freeze({ + root: '/workspace', + generatedAt: FIXTURE_TIME, + supervisors: Object.freeze([ + Object.freeze({ + id: 'runtime-supervisor-release', + status: 'running', + task: 'prove the Braid release', + workspaceDir: '/workspace', + budget: 3, + stateDir: '/workspace/.agent', + workers: Object.freeze([ + worker('runtime-worker-stream', 'stream and replay', 1, undefined, 1_840, 0.021), + worker('runtime-worker-ui', 'terminal proof', 2, undefined, 2_310, 0.028), + worker('runtime-worker-review', 'release review', 3, 'terminal proof', 940, 0.012), + ]), + progressTail: Object.freeze([]), + journalTail: Object.freeze([]), + driverSpend: spend(3, 5_090, 0.061), + totals: Object.freeze({ + workers: 3, + running: 3, + done: 0, + down: 0, + cancelled: 0, + inFlight: 3, + settled: 0, + tokensInput: 3_054, + tokensOutput: 2_036, + tokensTotal: 5_090, + usd: 0.061, + latencyMs: 5_090, + workerLatency: Object.freeze({ n: 3, min: 940, median: 1_840, p90: 2_310, max: 2_310 }), + }), + }), + ]), +}) as unknown as TopSnapshot + +function spend(iterations: number, tokens: number, usd: number) { + return Object.freeze({ + iterations, + tokensInput: Math.ceil(tokens * 0.6), + tokensOutput: Math.floor(tokens * 0.4), + usd, + ms: tokens, + }) +} + +function worker( + id: string, + label: string, + iterations: number, + parent: string | undefined, + tokens: number, + usd: number, +) { + const measured = spend(iterations, tokens, usd) + return Object.freeze({ + id, + label, + status: 'running', + ...(parent === undefined ? {} : { parent }), + latencyMs: tokens, + spend: measured, + metered: measured, + liveTail: Object.freeze([`${label}: working`]), + }) +} + +/** Compose the normal Runtime projection path with stable data for terminal captures. */ +export function createSupervisionUiFixture(): IntelligenceActionsOptions { + const watcher = new RuntimeSupervisorWatcher(() => FIXTURE_SUPERVISION_SNAPSHOT) + return { + supervisorWatcher: watcher, + supervisorController: new RuntimeSupervisorController({ watcher }), + } +} diff --git a/test/cli-startup.test.ts b/test/cli-startup.test.ts index 4560010d..4a39fbaa 100644 --- a/test/cli-startup.test.ts +++ b/test/cli-startup.test.ts @@ -83,6 +83,11 @@ test('expected command-line mistakes remain actionable without echoing arbitrary .uiFixture, 'product-demo', ) + assert.equal( + parseArgs(['--fixture', 'deterministic', '--ui-fixture', 'supervision'], '/workspace') + .uiFixture, + 'supervision', + ) }) test('startup responsibilities stay split into bounded modules', async () => { From 4f95952e60583ec7e99fe7b5ee943518900b3ce5 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 14:49:00 -0600 Subject: [PATCH 038/136] fix(ui): keep focused run controls visible --- src/views/tui/terminal-chrome.ts | 12 ++++++------ test/terminal-responsive.test.ts | 7 +++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/views/tui/terminal-chrome.ts b/src/views/tui/terminal-chrome.ts index 907333d8..40de6a44 100644 --- a/src/views/tui/terminal-chrome.ts +++ b/src/views/tui/terminal-chrome.ts @@ -167,12 +167,12 @@ function workStripItem( `${item.interactionCount} waiting interaction${item.interactionCount === 1 ? '' : 's'}`, ) const actionText = actions.length === 0 ? '' : theme.muted(`actions ${actions}`) - return fitTerminalColumns( - [`${marker} ${branch}`, theme.muted(state), theme.muted(`${runner}/${model}`)], - [waiting, actionText], - width, - 'left', - ) + const left = [`${marker} ${branch}`, theme.muted(state), theme.muted(`${runner}/${model}`)] + const full = fitTerminalColumns(left, [waiting, actionText], width, 'left') + if (item.focused && actionText.length > 0 && !full.includes('actions ')) { + return fitTerminalColumns(left, [actionText], width, 'left') + } + return full } function compactWorkIdentity(value: string, maxWidth: number): string { diff --git a/test/terminal-responsive.test.ts b/test/terminal-responsive.test.ts index 29345694..09772c71 100644 --- a/test/terminal-responsive.test.ts +++ b/test/terminal-responsive.test.ts @@ -198,10 +198,13 @@ test('work strip is conditional and exposes branch work controls', () => { /focus branch-focused · running · pi\/fixture\/model\s+1 waiting interaction · actions switch\/ask\/steer\/cancel/u, ) assert.match(wide, /work branch-background · running · pi\/fixture\/model/u) - const standard = chrome.render(80).join('\n') + const standardLines = chrome.render(80) + const standard = standardLines.join('\n') assert.match(standard, /focus branch-focused · running/u) assert.match(standard, /1 waiting interaction/u) assert.match(standard, /actions switch\/ask\/steer\/cancel/u) + assert.match(standardLines[1] ?? '', /actions switch\/ask\/steer\/cancel/u) + assert.match(standardLines[2] ?? '', /1 waiting interaction/u) chrome.setState({ view: { @@ -222,7 +225,7 @@ test('work strip is conditional and exposes branch work controls', () => { ...state, }) const generatedIdentityRow = chrome.render(80)[1] ?? '' - assert.match(generatedIdentityRow, /focus branch-0123456789ab…345-terminal · running/u) + assert.match(generatedIdentityRow, /focus branch-0123456789…terminal · running/u) assert.match(generatedIdentityRow, /actions switch\/steer\/cancel/u) assert.doesNotMatch(generatedIdentityRow, /!ask|0123456789abcdef0123456789abcdef/u) const narrow = chrome.render(40) From 8864897c7ba6a5ba1a3fd9b42eb8d5d99c194775 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 14:53:44 -0600 Subject: [PATCH 039/136] fix(test): align supervisor fixture workspace --- src/testing/supervision-ui-fixture.ts | 76 ++++++++++++++------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/src/testing/supervision-ui-fixture.ts b/src/testing/supervision-ui-fixture.ts index 07033cc8..69492b90 100644 --- a/src/testing/supervision-ui-fixture.ts +++ b/src/testing/supervision-ui-fixture.ts @@ -4,43 +4,45 @@ import type { IntelligenceActionsOptions } from '../app/intelligence-actions.js' const FIXTURE_TIME = Date.parse('2026-08-28T20:00:00.000Z') -const FIXTURE_SUPERVISION_SNAPSHOT = Object.freeze({ - root: '/workspace', - generatedAt: FIXTURE_TIME, - supervisors: Object.freeze([ - Object.freeze({ - id: 'runtime-supervisor-release', - status: 'running', - task: 'prove the Braid release', - workspaceDir: '/workspace', - budget: 3, - stateDir: '/workspace/.agent', - workers: Object.freeze([ - worker('runtime-worker-stream', 'stream and replay', 1, undefined, 1_840, 0.021), - worker('runtime-worker-ui', 'terminal proof', 2, undefined, 2_310, 0.028), - worker('runtime-worker-review', 'release review', 3, 'terminal proof', 940, 0.012), - ]), - progressTail: Object.freeze([]), - journalTail: Object.freeze([]), - driverSpend: spend(3, 5_090, 0.061), - totals: Object.freeze({ - workers: 3, - running: 3, - done: 0, - down: 0, - cancelled: 0, - inFlight: 3, - settled: 0, - tokensInput: 3_054, - tokensOutput: 2_036, - tokensTotal: 5_090, - usd: 0.061, - latencyMs: 5_090, - workerLatency: Object.freeze({ n: 3, min: 940, median: 1_840, p90: 2_310, max: 2_310 }), +function supervisionSnapshot(rootDir: string): TopSnapshot { + return Object.freeze({ + root: rootDir, + generatedAt: FIXTURE_TIME, + supervisors: Object.freeze([ + Object.freeze({ + id: 'runtime-supervisor-release', + status: 'running', + task: 'prove the Braid release', + workspaceDir: rootDir, + budget: 3, + stateDir: `${rootDir}/.agent`, + workers: Object.freeze([ + worker('runtime-worker-stream', 'stream and replay', 1, undefined, 1_840, 0.021), + worker('runtime-worker-ui', 'terminal proof', 2, undefined, 2_310, 0.028), + worker('runtime-worker-review', 'release review', 3, 'terminal proof', 940, 0.012), + ]), + progressTail: Object.freeze([]), + journalTail: Object.freeze([]), + driverSpend: spend(3, 5_090, 0.061), + totals: Object.freeze({ + workers: 3, + running: 3, + done: 0, + down: 0, + cancelled: 0, + inFlight: 3, + settled: 0, + tokensInput: 3_054, + tokensOutput: 2_036, + tokensTotal: 5_090, + usd: 0.061, + latencyMs: 5_090, + workerLatency: Object.freeze({ n: 3, min: 940, median: 1_840, p90: 2_310, max: 2_310 }), + }), }), - }), - ]), -}) as unknown as TopSnapshot + ]), + }) as unknown as TopSnapshot +} function spend(iterations: number, tokens: number, usd: number) { return Object.freeze({ @@ -75,7 +77,7 @@ function worker( /** Compose the normal Runtime projection path with stable data for terminal captures. */ export function createSupervisionUiFixture(): IntelligenceActionsOptions { - const watcher = new RuntimeSupervisorWatcher(() => FIXTURE_SUPERVISION_SNAPSHOT) + const watcher = new RuntimeSupervisorWatcher((rootDir) => supervisionSnapshot(rootDir)) return { supervisorWatcher: watcher, supervisorController: new RuntimeSupervisorController({ watcher }), From e5522a2b3a044e76685f5b6ce957cc8aac033f31 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 15:04:01 -0600 Subject: [PATCH 040/136] refactor(test): reuse supervisor snapshot fixtures --- src/testing/supervision-fixture.ts | 217 ++++++++++++++++++++++++++ src/testing/supervision-ui-fixture.ts | 132 +++++++--------- test/intelligence-dispatch.test.ts | 197 +++++++++++++---------- 3 files changed, 389 insertions(+), 157 deletions(-) create mode 100644 src/testing/supervision-fixture.ts diff --git a/src/testing/supervision-fixture.ts b/src/testing/supervision-fixture.ts new file mode 100644 index 00000000..ca1ae851 --- /dev/null +++ b/src/testing/supervision-fixture.ts @@ -0,0 +1,217 @@ +import type { + SupervisorView, + TopSnapshot, + WorkerView, +} from '../adapters/runtime/supervisor-watch.js' + +const DEFAULT_ROOT = '/workspace' +const DEFAULT_GENERATED_AT = Date.parse('2026-08-03T20:00:00.000Z') + +type SupervisorMetadata = Partial< + Omit< + SupervisorView, + | 'id' + | 'status' + | 'task' + | 'workspaceDir' + | 'budget' + | 'stateDir' + | 'workers' + | 'progressTail' + | 'journalTail' + | 'driverSpend' + | 'totals' + > +> + +type WorkerMetadata = Partial< + Omit +> + +type SupervisorTotals = SupervisorView['totals'] + +export type SupervisionSpendOptions = Partial + +export type SupervisionWorkerOptions = Pick & + WorkerMetadata & { + readonly status?: WorkerView['status'] + readonly latencyMs?: number + readonly spend?: SupervisionSpendOptions + readonly metered?: SupervisionSpendOptions + readonly liveTail?: readonly string[] + } + +export type SupervisionSupervisorOptions = SupervisorMetadata & { + readonly id?: string + readonly status?: string + readonly task?: string + readonly workspaceDir?: string + readonly budget?: number + readonly stateDir?: string + readonly workers?: readonly SupervisionWorkerOptions[] + readonly progressTail?: readonly string[] + readonly journalTail?: ReadonlyArray + readonly driverSpend?: SupervisionSpendOptions +} + +export interface SupervisionSnapshotOptions { + readonly root?: string + readonly generatedAt?: number + readonly supervisors?: readonly SupervisionSupervisorOptions[] +} + +const DEFAULT_SPEND: WorkerView['spend'] = { + iterations: 1, + tokensInput: 2, + tokensOutput: 3, + usd: 0.01, + ms: 4, +} + +function freeze(value: T): T { + Object.freeze(value) + return value +} + +function spendStats( + options: SupervisionSpendOptions = {}, + fallback: WorkerView['spend'] = DEFAULT_SPEND, +): WorkerView['spend'] { + return freeze({ + iterations: options.iterations ?? fallback.iterations, + tokensInput: options.tokensInput ?? fallback.tokensInput, + tokensOutput: options.tokensOutput ?? fallback.tokensOutput, + usd: options.usd ?? fallback.usd, + ms: options.ms ?? fallback.ms, + }) +} + +function workerView(input: SupervisionWorkerOptions): WorkerView { + const { + id, + label, + status = 'running', + latencyMs = 4, + spend, + metered, + liveTail = [`${label} progress`], + ...metadata + } = input + const measured = spendStats(spend) + return freeze({ + ...metadata, + id, + label, + status, + latencyMs, + spend: measured, + metered: spendStats(metered, measured), + liveTail: freeze([...liveTail]), + }) +} + +function roundUsd(value: number): number { + return Number(value.toFixed(6)) +} + +function sumWorkers(workers: readonly WorkerView[]): SupervisorTotals { + const latencies = workers.map((worker) => worker.latencyMs).sort((a, b) => a - b) + const running = workers.filter((worker) => worker.status === 'running').length + const done = workers.filter((worker) => worker.status === 'done').length + const down = workers.filter((worker) => worker.status === 'down').length + const cancelled = workers.filter((worker) => worker.status === 'cancelled').length + const metered = workers.reduce( + (total, worker) => ({ + iterations: total.iterations + worker.metered.iterations, + tokensInput: total.tokensInput + worker.metered.tokensInput, + tokensOutput: total.tokensOutput + worker.metered.tokensOutput, + usd: total.usd + worker.metered.usd, + ms: total.ms + worker.metered.ms, + }), + { iterations: 0, tokensInput: 0, tokensOutput: 0, usd: 0, ms: 0 }, + ) + + return freeze({ + workers: workers.length, + running, + done, + down, + cancelled, + inFlight: running, + settled: done + down + cancelled, + tokensInput: metered.tokensInput, + tokensOutput: metered.tokensOutput, + tokensTotal: metered.tokensInput + metered.tokensOutput, + usd: roundUsd(metered.usd), + latencyMs: metered.ms, + workerLatency: freeze({ + n: latencies.length, + min: latencies[0] ?? 0, + median: + latencies.length === 0 + ? 0 + : latencies.length % 2 === 0 + ? ((latencies[latencies.length / 2 - 1] ?? 0) + + (latencies[latencies.length / 2] ?? 0)) / + 2 + : (latencies[Math.floor(latencies.length / 2)] ?? 0), + p90: latencies.length === 0 ? 0 : (latencies[Math.ceil(latencies.length * 0.9) - 1] ?? 0), + max: latencies.at(-1) ?? 0, + }), + }) +} + +function supervisorView( + root: string, + input: SupervisionSupervisorOptions, + index: number, +): SupervisorView { + const { + id = index === 0 ? 'runtime-supervisor-live' : `runtime-supervisor-${index + 1}`, + status, + task = 'build Braid', + workspaceDir = root, + budget = 1, + stateDir = `${root}/.agent`, + workers = [], + progressTail = [], + journalTail = [], + driverSpend, + ...metadata + } = input + const workerViews = workers.map(workerView) + return freeze({ + ...metadata, + id, + status: + status ?? + (workerViews.some((worker) => worker.status === 'running') ? 'running' : 'completed'), + task, + workspaceDir, + budget, + stateDir, + workers: freeze(workerViews), + progressTail: freeze([...progressTail]), + journalTail: freeze([...journalTail]), + driverSpend: spendStats(driverSpend), + totals: sumWorkers(workerViews), + }) +} + +/** Build a complete immutable Runtime supervisor view for deterministic tests and captures. */ +export function createSupervisionSnapshot(options: SupervisionSnapshotOptions = {}): TopSnapshot { + const root = options.root ?? DEFAULT_ROOT + const supervisorOptions = options.supervisors ?? [{}] + const supervisors = supervisorOptions.map((supervisor, index) => + supervisorView(root, supervisor, index), + ) + return freeze({ + root, + generatedAt: options.generatedAt ?? DEFAULT_GENERATED_AT, + supervisors: freeze(supervisors), + completeness: 'complete', + diagnostics: freeze([]), + discovered: supervisors.length, + loaded: supervisors.length, + }) +} diff --git a/src/testing/supervision-ui-fixture.ts b/src/testing/supervision-ui-fixture.ts index 69492b90..42242364 100644 --- a/src/testing/supervision-ui-fixture.ts +++ b/src/testing/supervision-ui-fixture.ts @@ -1,83 +1,69 @@ import { RuntimeSupervisorController } from '../adapters/runtime/supervisor-control.js' -import { RuntimeSupervisorWatcher, type TopSnapshot } from '../adapters/runtime/supervisor-watch.js' +import { RuntimeSupervisorWatcher } from '../adapters/runtime/supervisor-watch.js' import type { IntelligenceActionsOptions } from '../app/intelligence-actions.js' +import { createSupervisionSnapshot } from './supervision-fixture.js' const FIXTURE_TIME = Date.parse('2026-08-28T20:00:00.000Z') -function supervisionSnapshot(rootDir: string): TopSnapshot { - return Object.freeze({ - root: rootDir, - generatedAt: FIXTURE_TIME, - supervisors: Object.freeze([ - Object.freeze({ - id: 'runtime-supervisor-release', - status: 'running', - task: 'prove the Braid release', - workspaceDir: rootDir, - budget: 3, - stateDir: `${rootDir}/.agent`, - workers: Object.freeze([ - worker('runtime-worker-stream', 'stream and replay', 1, undefined, 1_840, 0.021), - worker('runtime-worker-ui', 'terminal proof', 2, undefined, 2_310, 0.028), - worker('runtime-worker-review', 'release review', 3, 'terminal proof', 940, 0.012), - ]), - progressTail: Object.freeze([]), - journalTail: Object.freeze([]), - driverSpend: spend(3, 5_090, 0.061), - totals: Object.freeze({ - workers: 3, - running: 3, - done: 0, - down: 0, - cancelled: 0, - inFlight: 3, - settled: 0, - tokensInput: 3_054, - tokensOutput: 2_036, - tokensTotal: 5_090, - usd: 0.061, - latencyMs: 5_090, - workerLatency: Object.freeze({ n: 3, min: 940, median: 1_840, p90: 2_310, max: 2_310 }), - }), - }), - ]), - }) as unknown as TopSnapshot -} - -function spend(iterations: number, tokens: number, usd: number) { - return Object.freeze({ - iterations, - tokensInput: Math.ceil(tokens * 0.6), - tokensOutput: Math.floor(tokens * 0.4), - usd, - ms: tokens, - }) -} - -function worker( - id: string, - label: string, - iterations: number, - parent: string | undefined, - tokens: number, - usd: number, -) { - const measured = spend(iterations, tokens, usd) - return Object.freeze({ - id, - label, - status: 'running', - ...(parent === undefined ? {} : { parent }), - latencyMs: tokens, - spend: measured, - metered: measured, - liveTail: Object.freeze([`${label}: working`]), - }) -} - /** Compose the normal Runtime projection path with stable data for terminal captures. */ export function createSupervisionUiFixture(): IntelligenceActionsOptions { - const watcher = new RuntimeSupervisorWatcher((rootDir) => supervisionSnapshot(rootDir)) + const watcher = new RuntimeSupervisorWatcher((rootDir) => + createSupervisionSnapshot({ + root: rootDir, + generatedAt: FIXTURE_TIME, + supervisors: [ + { + id: 'runtime-supervisor-release', + status: 'running', + task: 'prove the Braid release', + budget: 3, + workers: [ + { + id: 'runtime-worker-stream', + label: 'stream and replay', + latencyMs: 1_840, + spend: { + iterations: 1, + tokensInput: 1_104, + tokensOutput: 736, + usd: 0.021, + ms: 1_840, + }, + liveTail: ['stream and replay: working'], + }, + { + id: 'runtime-worker-ui', + label: 'terminal proof', + latencyMs: 2_310, + spend: { + iterations: 2, + tokensInput: 1_386, + tokensOutput: 924, + usd: 0.028, + ms: 2_310, + }, + liveTail: ['terminal proof: working'], + }, + { + id: 'runtime-worker-review', + label: 'release review', + parent: 'terminal proof', + latencyMs: 940, + spend: { iterations: 3, tokensInput: 564, tokensOutput: 376, usd: 0.012, ms: 940 }, + liveTail: ['release review: working'], + }, + ], + driverSpend: { + iterations: 3, + tokensInput: 3_054, + tokensOutput: 2_036, + usd: 0.061, + ms: 5_090, + }, + }, + ], + }), + ) return { supervisorWatcher: watcher, supervisorController: new RuntimeSupervisorController({ watcher }), diff --git a/test/intelligence-dispatch.test.ts b/test/intelligence-dispatch.test.ts index b4046108..74fc4fdc 100644 --- a/test/intelligence-dispatch.test.ts +++ b/test/intelligence-dispatch.test.ts @@ -38,6 +38,7 @@ import type { NativeTerminalSignalPort } from '../src/index.js' import { FixedClock } from '../src/ports/clock.js' import { SequenceIds } from '../src/ports/ids.js' import { deterministicBackend } from '../src/testing/deterministic-backend.js' +import { createSupervisionSnapshot } from '../src/testing/supervision-fixture.js' import type { BraidResponse } from '../src/views/headless/protocol.js' import { runRpc } from '../src/views/headless/rpc.js' import { analysisLines } from '../src/views/shared/analysis-presentation.js' @@ -144,60 +145,74 @@ function createTestApplication(): BraidApplication { }) } -function supervisionSnapshot( - workers: readonly { - readonly id: string - readonly label: string - readonly parent?: string - readonly status?: 'running' | 'done' - }[], - generatedAt = Date.parse(NOW), - supervisorId = 'runtime-supervisor-live', -): TopSnapshot { - const spend = { iterations: 1, tokensInput: 2, tokensOutput: 3, usd: 0.01, ms: 4 } - return { - root: '/workspace', - generatedAt, +test('supervision fixtures derive immutable counts and measurements from one snapshot', () => { + const snapshot = createSupervisionSnapshot({ + root: '/workspace/fixture', supervisors: [ { - id: supervisorId, - status: workers.every((worker) => worker.status === 'done') ? 'completed' : 'running', - task: 'build Braid', - workspaceDir: '/workspace', - budget: 1, - stateDir: '/workspace/.agent', - workers: workers.map((worker) => ({ - id: worker.id, - label: worker.label, - status: worker.status ?? 'running', - ...(worker.parent === undefined ? {} : { parent: worker.parent }), - latencyMs: 4, - spend, - metered: spend, - liveTail: [`${worker.label} progress`], - })), - progressTail: [], - journalTail: [], - driverSpend: spend, - totals: { - workers: workers.length, - running: workers.filter((worker) => worker.status !== 'done').length, - done: workers.filter((worker) => worker.status === 'done').length, - down: 0, - cancelled: 0, - inFlight: workers.filter((worker) => worker.status !== 'done').length, - settled: workers.filter((worker) => worker.status === 'done').length, - tokensInput: workers.length * 2, - tokensOutput: workers.length * 3, - tokensTotal: workers.length * 5, - usd: workers.length * 0.01, - latencyMs: workers.length * 4, - workerLatency: { n: workers.length, min: 4, median: 4, p90: 4, max: 4 }, - }, + id: 'runtime-supervisor-measured', + task: 'measure workers', + budget: 4, + workers: [ + { + id: 'runtime-worker-running', + label: 'running worker', + latencyMs: 40, + spend: { tokensInput: 10, tokensOutput: 4, usd: 0.1, ms: 40 }, + }, + { + id: 'runtime-worker-done', + label: 'done worker', + status: 'done', + latencyMs: 20, + spend: { tokensInput: 8, tokensOutput: 2, usd: 0.08, ms: 20 }, + }, + { + id: 'runtime-worker-down', + label: 'down worker', + status: 'down', + latencyMs: 50, + spend: { tokensInput: 6, tokensOutput: 1, usd: 0.06, ms: 50 }, + }, + { + id: 'runtime-worker-cancelled', + label: 'cancelled worker', + status: 'cancelled', + latencyMs: 30, + spend: { tokensInput: 4, tokensOutput: 3, usd: 0.04, ms: 30 }, + }, + ], }, + { id: 'runtime-supervisor-empty', workers: [] }, ], - } as unknown as TopSnapshot -} + }) + const supervisor = snapshot.supervisors[0] + const emptySupervisor = snapshot.supervisors[1] + assert(supervisor && emptySupervisor) + assert.equal(snapshot.discovered, 2) + assert.equal(snapshot.loaded, 2) + assert.equal(supervisor.status, 'running') + assert.deepEqual(supervisor.totals, { + workers: 4, + running: 1, + done: 1, + down: 1, + cancelled: 1, + inFlight: 1, + settled: 3, + tokensInput: 28, + tokensOutput: 10, + tokensTotal: 38, + usd: 0.28, + latencyMs: 140, + workerLatency: { n: 4, min: 20, median: 35, p90: 50, max: 50 }, + }) + assert.equal(emptySupervisor.status, 'completed') + assert.equal(Object.isFrozen(snapshot), true) + assert.equal(Object.isFrozen(snapshot.supervisors), true) + assert.equal(Object.isFrozen(supervisor.workers), true) + assert.equal(Object.isFrozen(supervisor.totals.workerLatency), true) +}) class DetachingWorkerTerminalSession implements AgentInteractiveTerminalSession { readonly ref = { @@ -430,23 +445,23 @@ test('Braid exposes analysis actions through the TUI controller without creating }) test('runtime supervisors stay unbound until each runtime id is explicitly assigned to a run', async () => { - const firstSnapshot = supervisionSnapshot( - [{ id: 'runtime-worker-one', label: 'worker-one' }], - Date.parse(NOW), - 'runtime-supervisor-one', - ) - const secondSnapshot = supervisionSnapshot( - [{ id: 'runtime-worker-two', label: 'worker-two' }], - Date.parse(NOW), - 'runtime-supervisor-two', - ) - const firstSupervisor = firstSnapshot.supervisors[0] - const secondSupervisor = secondSnapshot.supervisors[0] + const snapshot = createSupervisionSnapshot({ + generatedAt: Date.parse(NOW), + supervisors: [ + { + id: 'runtime-supervisor-one', + workers: [{ id: 'runtime-worker-one', label: 'worker-one' }], + }, + { + id: 'runtime-supervisor-two', + workers: [{ id: 'runtime-worker-two', label: 'worker-two' }], + }, + ], + }) + const firstSupervisor = snapshot.supervisors[0] + const secondSupervisor = snapshot.supervisors[1] assert(firstSupervisor && secondSupervisor) - let raw: TopSnapshot = { - ...firstSnapshot, - supervisors: [firstSupervisor, secondSupervisor], - } + let raw: TopSnapshot = snapshot const watcher = new RuntimeSupervisorWatcher(() => raw) const app = createBraidApplication({ fixture: 'deterministic', @@ -498,7 +513,9 @@ test('runtime supervisors stay unbound until each runtime id is explicitly assig }) test('supervisor controls resolve public ids and preserve retry-safe operation ids', async () => { - const raw = supervisionSnapshot([{ id: 'runtime-worker-control', label: 'worker-control' }]) + const raw = createSupervisionSnapshot({ + supervisors: [{ workers: [{ id: 'runtime-worker-control', label: 'worker-control' }] }], + }) const watcher = new RuntimeSupervisorWatcher(() => raw) let writeInput: | { @@ -664,7 +681,7 @@ test('supervisor controls resolve public ids and preserve retry-safe operation i }) test('an empty live supervisor snapshot is normal before any worker activity exists', async () => { - const raw = { ...supervisionSnapshot([]), supervisors: [] } + const raw = createSupervisionSnapshot({ supervisors: [] }) const watcher = new RuntimeSupervisorWatcher(() => raw) const app = createBraidApplication({ fixture: 'deterministic', @@ -846,7 +863,9 @@ test('saved analysis results present status-aware next actions', () => { }) test('activity follows runtime workers while open and stops cleanly when closed', async () => { - let raw = supervisionSnapshot([{ id: 'runtime-worker-1', label: 'worker-one' }]) + let raw = createSupervisionSnapshot({ + supervisors: [{ workers: [{ id: 'runtime-worker-1', label: 'worker-one' }] }], + }) let snapshotCalls = 0 const watcher = new RuntimeSupervisorWatcher(() => { snapshotCalls += 1 @@ -907,13 +926,17 @@ test('activity follows runtime workers while open and stops cleanly when closed' assert.ok(snapshotCalls >= 3) assert.equal(app.state().revision, unchangedRevision) - raw = supervisionSnapshot( - [ - { id: 'runtime-worker-1', label: 'worker-one' }, - { id: 'runtime-worker-2', label: 'worker-two', parent: 'worker-one' }, + raw = createSupervisionSnapshot({ + generatedAt: Date.parse(NOW) + 1_000, + supervisors: [ + { + workers: [ + { id: 'runtime-worker-1', label: 'worker-one' }, + { id: 'runtime-worker-2', label: 'worker-two', parent: 'worker-one' }, + ], + }, ], - Date.parse(NOW) + 1_000, - ) + }) await waitUntil(() => app.state().workers.length === 2) await terminal.waitForRender() const workerScreen = terminal.getViewport().join('\n') @@ -929,14 +952,18 @@ test('activity follows runtime workers while open and stops cleanly when closed' assert.equal(childActivity?.parentId, parent.id) assert.equal(childActivity?.depth, (parentActivity?.depth ?? 0) + 1) - raw = supervisionSnapshot( - [ - { id: 'runtime-worker-1', label: 'worker-one' }, - { id: 'runtime-worker-2', label: 'worker-two', parent: 'worker-one' }, - { id: 'runtime-worker-3', label: 'worker-orphan', parent: 'missing-parent' }, + raw = createSupervisionSnapshot({ + generatedAt: Date.parse(NOW) + 2_000, + supervisors: [ + { + workers: [ + { id: 'runtime-worker-1', label: 'worker-one' }, + { id: 'runtime-worker-2', label: 'worker-two', parent: 'worker-one' }, + { id: 'runtime-worker-3', label: 'worker-orphan', parent: 'missing-parent' }, + ], + }, ], - Date.parse(NOW) + 2_000, - ) + }) await waitUntil(() => app.state().workers.length === 3) const orphan = app.state().workers.find((worker) => worker.title === 'worker-orphan') assert(orphan) @@ -967,7 +994,7 @@ test('activity follows runtime workers while open and stops cleanly when closed' await new Promise((resolve) => setTimeout(resolve, 400)) assert.equal(snapshotCalls, callsAfterClose) - raw = { ...supervisionSnapshot([]), supervisors: [] } + raw = createSupervisionSnapshot({ supervisors: [] }) terminal.sendInput('/activity') terminal.sendInput('\r') await waitUntil(() => snapshotCalls > callsAfterClose) @@ -987,7 +1014,9 @@ test('activity follows runtime workers while open and stops cleanly when closed' }) test('activity attaches a running worker through the native terminal and restores Braid', async () => { - const raw = supervisionSnapshot([{ id: 'runtime-worker-attach', label: 'worker-attach' }]) + const raw = createSupervisionSnapshot({ + supervisors: [{ workers: [{ id: 'runtime-worker-attach', label: 'worker-attach' }] }], + }) const watcher = new RuntimeSupervisorWatcher(() => raw) const session = new DetachingWorkerTerminalSession() const attached: AgentInteractiveSessionControlClaimRequest[] = [] From 35643d430d21931907ef5a157ac0d104890a6f05 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 15:24:43 -0600 Subject: [PATCH 041/136] fix(process): track escaped descendants before cleanup --- scripts/live-bridge/process-tree.mjs | 369 ++++++++++++++++-- scripts/live-bridge/process.mjs | 12 +- scripts/live-bridge/process.test.mjs | 97 +++++ .../tangle-sandbox-braid-interactive.mjs | 23 +- .../tangle-sandbox-braid-multirun.mjs | 11 +- 5 files changed, 467 insertions(+), 45 deletions(-) diff --git a/scripts/live-bridge/process-tree.mjs b/scripts/live-bridge/process-tree.mjs index 85d8c374..26a7e33d 100644 --- a/scripts/live-bridge/process-tree.mjs +++ b/scripts/live-bridge/process-tree.mjs @@ -1,41 +1,357 @@ +import { randomUUID } from 'node:crypto' +import { readdirSync, readFileSync } from 'node:fs' + import { releaseWindowsJob, terminateWindowsJob, windowsJobStatus } from './windows-job-host.mjs' const pollMs = 25 +const procRoot = '/proc' +const processTreeToken = 'BRAID_PROCESS_TREE_TOKEN' +const processTreeTrackers = new WeakMap() function childHasExited(child) { return child.exitCode !== null || child.signalCode !== null } -function processGroupPresent(pid) { - if (!Number.isInteger(pid) || pid <= 0) return undefined +function errorMessage(error) { + return error instanceof Error ? error.message : String(error) +} + +function unsupported(reason) { + return { + supported: false, + gone: false, + mechanism: 'posix-descendant-tracker', + reason, + } +} + +function numericPid(value) { + return Number.isInteger(value) && value > 0 ? value : undefined +} + +function procFile(pid, name) { + return `${procRoot}/${pid}/${name}` +} + +function processStat(pid) { + const normalizedPid = numericPid(pid) + if (normalizedPid === undefined) return undefined try { - process.kill(-pid, 0) + const value = readFileSync(procFile(normalizedPid, 'stat'), 'utf8') + const closingParenthesis = value.lastIndexOf(') ') + if (closingParenthesis < 0) throw new Error('Linux process stat has no command terminator') + const fields = value + .slice(closingParenthesis + 2) + .trim() + .split(/\s+/u) + const ppid = Number(fields[1]) + const processGroup = Number(fields[2]) + const startTime = fields[19] + if ( + !Number.isInteger(ppid) || + ppid < 0 || + !Number.isInteger(processGroup) || + processGroup < 0 || + typeof startTime !== 'string' || + startTime.length === 0 + ) { + throw new Error(`Linux process stat for ${normalizedPid} is incomplete`) + } + return { + pid: normalizedPid, + ppid, + processGroup, + startTime, + } + } catch (error) { + if (error?.code === 'ENOENT' || error?.code === 'ESRCH') return undefined + throw error + } +} + +function processTable(token) { + let names + try { + names = readdirSync(procRoot) + } catch (error) { + return { error: `The POSIX process table could not be read: ${errorMessage(error)}` } + } + const records = new Map() + const marked = [] + for (const name of names) { + if (!/^\d+$/u.test(name)) continue + let record + try { + record = processStat(Number(name)) + } catch (error) { + return { error: `The POSIX process table could not be inspected: ${errorMessage(error)}` } + } + if (record === undefined) continue + records.set(record.pid, record) + try { + if (readOwnershipMarker(record.pid, token) === true) marked.push(record) + } catch (error) { + if (error?.code !== 'EACCES') + return { + error: `The POSIX process ownership could not be inspected: ${errorMessage(error)}`, + } + } + } + return { records, marked } +} + +function processExists(pid) { + try { + process.kill(pid, 0) return true } catch (error) { if (error?.code === 'ESRCH') return false - if (error?.code === 'EPERM') return true return undefined } } +function readOwnershipMarker(pid, token) { + try { + const environment = readFileSync(procFile(pid, 'environ'), 'utf8') + return environment.split('\0').includes(`${processTreeToken}=${token}`) + } catch (error) { + if (error?.code === 'ENOENT' || error?.code === 'ESRCH') return undefined + throw error + } +} + +function descendants(records, roots) { + const childrenByParent = new Map() + for (const record of records.values()) { + const children = childrenByParent.get(record.ppid) ?? [] + children.push(record) + childrenByParent.set(record.ppid, children) + } + const result = new Map() + const pending = [...roots] + while (pending.length > 0) { + const root = pending.shift() + if (root === undefined || result.has(root.pid)) continue + result.set(root.pid, root) + for (const child of childrenByParent.get(root.pid) ?? []) pending.push(child) + } + return result +} + +function currentIdentity(pid, expectedStartTime) { + const identity = processStat(pid) + if (identity === undefined) { + const present = processExists(pid) + if (present === undefined) return { inaccessible: true } + return present ? { inaccessible: true } : { gone: true } + } + if (expectedStartTime !== undefined && identity.startTime !== expectedStartTime) + return { reused: true, identity } + return { identity } +} + +function sortDeepestFirst(entries) { + return [...entries].sort((left, right) => { + if (left.depth !== right.depth) return right.depth - left.depth + return right.pid - left.pid + }) +} + +class PosixProcessTreeTracker { + constructor(child, token) { + this.child = child + this.token = token + this.entries = new Map() + this.rootPid = numericPid(child.pid) + this.rootObserved = false + this.rootStartTime = undefined + this.released = false + this.failure = undefined + this.refresh() + this.monitor = setInterval(() => this.refresh(), pollMs) + this.monitor.unref() + } + + refresh() { + if (this.released || this.failure !== undefined) return + if (this.rootPid === undefined) { + this.failure = 'The POSIX process has no valid owner PID' + return + } + const table = processTable(this.token) + if (table.error !== undefined) { + this.failure = table.error + return + } + const root = table.records.get(this.rootPid) + if (!this.rootObserved) { + if (root === undefined) { + this.failure = 'The POSIX process exited before ownership was observed' + return + } + let marker + try { + marker = readOwnershipMarker(this.rootPid, this.token) + } catch (error) { + this.failure = `The POSIX process ownership marker could not be read: ${errorMessage(error)}` + return + } + if (marker !== true) { + this.failure = 'The POSIX process did not retain its ownership marker' + return + } + this.rootObserved = true + this.rootStartTime = root.startTime + } else if (root !== undefined && root.startTime !== this.rootStartTime) { + this.failure = 'The POSIX owner PID was reused before cleanup completed' + return + } + + const roots = [...table.marked] + if (root !== undefined && root.startTime === this.rootStartTime) roots.push(root) + for (const entry of this.entries.values()) { + const record = table.records.get(entry.pid) + if (record !== undefined && record.startTime === entry.startTime) roots.push(record) + } + const discovered = descendants(table.records, roots) + for (const record of discovered.values()) { + const existing = this.entries.get(record.pid) + if (existing !== undefined && existing.startTime !== record.startTime) { + this.failure = `The POSIX process identity for ${record.pid} changed during tracking` + return + } + if (existing === undefined) { + this.entries.set(record.pid, { + ...record, + depth: this.depthFor(record, discovered), + }) + } else { + existing.ppid = record.ppid + existing.processGroup = record.processGroup + existing.depth = this.depthFor(record, discovered) + } + } + } + + depthFor(record, discovered) { + let depth = 0 + let parent = record.ppid + const seen = new Set([record.pid]) + while (parent !== 0 && !seen.has(parent)) { + const parentRecord = discovered.get(parent) + if (parentRecord === undefined) break + seen.add(parent) + depth += 1 + parent = parentRecord.ppid + } + return depth + } + + status() { + this.refresh() + if (this.failure !== undefined) return unsupported(this.failure) + const active = [] + for (const entry of this.entries.values()) { + const current = currentIdentity(entry.pid, entry.startTime) + if (current.inaccessible) + return unsupported(`The POSIX process ${entry.pid} could not be inspected`) + if (current.reused || current.gone) this.entries.delete(entry.pid) + else if (current.identity !== undefined) active.push(entry) + } + const root = currentIdentity(this.rootPid, this.rootStartTime) + if (root.inaccessible) + return unsupported(`The POSIX owner process ${this.rootPid} could not be inspected`) + const rootActive = root.identity !== undefined + if (root.reused) this.failure = 'The POSIX owner PID was reused before cleanup completed' + if (this.failure !== undefined) return unsupported(this.failure) + return { + supported: true, + gone: !rootActive && active.length === 0, + present: rootActive || active.length > 0, + pids: active.map(({ pid }) => pid), + roots: rootActive ? [this.rootPid] : [], + version: rootActive || active.length > 0 ? 0 : 1, + mechanism: 'posix-descendant-tracker', + ownership: 'pid-start-time-and-descendant-lineage', + observed: this.rootObserved, + escaped: !rootActive && active.some(({ ppid }) => ppid !== this.rootPid), + } + } + + signal(signal) { + const status = this.status() + if (!status.supported) return { method: 'unavailable', sent: false, reason: status.reason } + if (status.gone) return { method: 'already-exited', sent: false } + let sent = false + let groupSent = false + const root = this.entries.get(this.rootPid) + if (root !== undefined && root.processGroup === this.rootPid) { + try { + process.kill(-this.rootPid, signal) + groupSent = true + sent = true + } catch (error) { + if (error?.code !== 'ESRCH' && error?.code !== 'EPERM') + return { method: 'failed', sent, error: errorMessage(error) } + } + } + for (const entry of sortDeepestFirst(this.entries.values())) { + const current = currentIdentity(entry.pid, entry.startTime) + if (current.identity === undefined) continue + try { + process.kill(entry.pid, signal) + sent = true + } catch (error) { + if (error?.code !== 'ESRCH') return { method: 'failed', sent, error: errorMessage(error) } + } + } + return { + method: groupSent ? 'process-group' : sent ? 'owned-processes' : 'already-exited', + sent, + } + } + + release() { + this.released = true + clearInterval(this.monitor) + } +} + +export function processTreeEnvironment(environment = process.env) { + if (process.platform === 'win32') return { environment, token: undefined } + const token = randomUUID() + return { + environment: { ...environment, [processTreeToken]: token }, + token, + } +} + +export function trackProcessTree(child, token) { + if (process.platform === 'win32' || token === undefined) return undefined + if (child === null || typeof child !== 'object') + throw new TypeError('A child process is required') + const tracker = new PosixProcessTreeTracker(child, token) + processTreeTrackers.set(child, tracker) + return tracker +} + export function releaseProcessTree(child) { + const tracker = processTreeTrackers.get(child) + if (tracker?.status().gone) tracker.release() if (process.platform === 'win32') releaseWindowsJob(child) } export function processTreeStatus(child) { if (process.platform === 'win32') return windowsJobStatus(child, childHasExited(child)) - const present = processGroupPresent(child.pid) - if (present === undefined) - return { - supported: false, - gone: false, - reason: 'The POSIX process group could not be inspected', - } - return { supported: true, gone: !present, present } + const tracker = processTreeTrackers.get(child) + if (tracker === undefined) + return unsupported('The POSIX process was not started by a lifecycle tracker') + return tracker.status() } export async function waitForTreeGone(child, timeoutMs) { - const deadline = Date.now() + timeoutMs + const boundedTimeout = Number.isFinite(timeoutMs) ? Math.max(0, timeoutMs) : 0 + const deadline = Date.now() + boundedTimeout while (true) { const status = processTreeStatus(child) if (!status.supported) return status @@ -47,25 +363,12 @@ export async function waitForTreeGone(child, timeoutMs) { export async function sendTreeSignal(child, signal) { if (process.platform === 'win32') return await terminateWindowsJob(child) - if (!Number.isInteger(child.pid) || child.pid <= 0) return { method: 'unavailable', sent: false } - try { - process.kill(-child.pid, signal) - return { method: 'process-group', sent: true } - } catch (error) { - if (error?.code === 'ESRCH') - return { - method: childHasExited(child) ? 'already-exited' : 'process-group-gone', - sent: false, - } - try { - child.kill(signal) - return { method: 'child-fallback', sent: true } - } catch (fallbackError) { - return { - method: 'failed', - sent: false, - error: fallbackError instanceof Error ? fallbackError.message : String(fallbackError), - } + const tracker = processTreeTrackers.get(child) + if (tracker === undefined) + return { + method: 'unavailable', + sent: false, + reason: 'The POSIX process was not started by a lifecycle tracker', } - } + return tracker.signal(signal) } diff --git a/scripts/live-bridge/process.mjs b/scripts/live-bridge/process.mjs index 5336b8d2..d1da0613 100644 --- a/scripts/live-bridge/process.mjs +++ b/scripts/live-bridge/process.mjs @@ -5,9 +5,11 @@ import { StreamingRedactor } from './capture.mjs' import { exitCodes } from './constants.mjs' import { LiveBridgeError } from './errors.mjs' import { + processTreeEnvironment, processTreeStatus, releaseProcessTree, sendTreeSignal, + trackProcessTree, waitForTreeGone, } from './process-tree.mjs' import { secretValues } from './redaction.mjs' @@ -24,8 +26,14 @@ export function sleep(ms) { } export async function managedSpawn(command, args, options) { - if (process.platform === 'win32') return await spawnWindowsJob(command, args, options) - return spawn(command, args, { ...options, detached: true }) + const prepared = processTreeEnvironment(options.env) + const spawnOptions = { ...options, env: prepared.environment } + const child = + process.platform === 'win32' + ? await spawnWindowsJob(command, args, spawnOptions) + : spawn(command, args, { ...spawnOptions, detached: true }) + trackProcessTree(child, prepared.token) + return child } function hasExited(child) { diff --git a/scripts/live-bridge/process.test.mjs b/scripts/live-bridge/process.test.mjs index 3def5184..9b77daa8 100644 --- a/scripts/live-bridge/process.test.mjs +++ b/scripts/live-bridge/process.test.mjs @@ -1,12 +1,30 @@ import assert from 'node:assert/strict' +import { mkdtemp, readFile, rm } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' import test from 'node:test' +import { runCommand } from './command.mjs' import { managedSpawn, terminateProcess } from './process.mjs' +import { processTreeStatus, sendTreeSignal, waitForTreeGone } from './process-tree.mjs' function waitForClose(child) { if (child.exitCode !== null || child.signalCode !== null) return Promise.resolve() return new Promise((resolve) => child.once('close', resolve)) } +async function waitForFile(path, timeoutMs = 2_000) { + const deadline = Date.now() + timeoutMs + while (Date.now() < deadline) { + try { + return await readFile(path, 'utf8') + } catch (error) { + if (error?.code !== 'ENOENT') throw error + await new Promise((resolve) => setTimeout(resolve, 10)) + } + } + throw new Error(`Timed out waiting for ${path}`) +} + test('termination evidence marks a naturally exited process as unsignalled', async () => { const child = await managedSpawn(process.execPath, ['-e', 'process.exit(0)'], { stdio: 'ignore', @@ -37,3 +55,82 @@ test('termination evidence records signal-driven process-tree cleanup', async () assert.equal(result.descendantsVerified, true) assert.notEqual(result.cleanupStatus, 'already-exited') }) + +test('timeout cleanup terminates a tracked descendant set', async () => { + const result = await runCommand(process.execPath, ['-e', 'setInterval(() => {}, 1000)'], { + cwd: process.cwd(), + timeoutMs: 50, + }) + + assert.equal(result.timedOut, true) + assert.equal(result.cleanupOk, true, JSON.stringify(result.termination)) + assert.equal(result.termination.descendantsExited, true) + assert.equal(result.termination.descendantsVerified, true) +}) + +test('missing POSIX owner identity refuses cleanup', async () => { + const child = { pid: undefined } + const status = processTreeStatus(child) + + assert.equal(status.supported, false) + assert.equal(status.gone, false) + assert.match( + status.reason, + /lifecycle tracker|valid owner PID|Windows Job Object host process id/u, + ) + assert.deepEqual(await waitForTreeGone(child, 0), status) + const signal = await sendTreeSignal(child, 'SIGTERM') + assert.equal(signal.sent, false) + assert.equal( + signal.method, + process.platform === 'win32' ? 'windows-job-object-unavailable' : 'unavailable', + ) +}) + +test('detached descendants stay owned after their parent exits', { + skip: process.platform !== 'linux', +}, async () => { + const root = await mkdtemp(join(tmpdir(), 'braid-process-tree-')) + const pidPath = join(root, 'detached.pid') + let descendantPid + try { + const child = await managedSpawn( + process.execPath, + [ + '-e', + [ + "import { spawn } from 'node:child_process'", + "import { writeFileSync } from 'node:fs'", + "const detached = spawn(process.execPath, ['-e', \"process.on('SIGTERM', () => {}); setInterval(() => {}, 1000)\"], { detached: true, stdio: 'ignore' })", + 'detached.unref()', + 'writeFileSync(process.env.PID_PATH, String(detached.pid))', + 'setTimeout(() => process.exit(0), 200)', + ].join(';'), + ], + { cwd: root, env: { PID_PATH: pidPath }, stdio: 'ignore' }, + ) + descendantPid = Number(await waitForFile(pidPath)) + assert.ok(Number.isInteger(descendantPid) && descendantPid > 0) + await waitForClose(child) + + const observed = processTreeStatus(child) + assert.equal(observed.supported, true, JSON.stringify(observed)) + assert.equal(observed.gone, false, JSON.stringify(observed)) + assert.equal(observed.escaped, true, JSON.stringify(observed)) + const stillRunning = await waitForTreeGone(child, 100) + assert.equal(stillRunning.supported, true) + assert.equal(stillRunning.gone, false) + + const termination = await terminateProcess(child, { termTimeoutMs: 100, killTimeoutMs: 1_000 }) + assert.equal(termination.descendantsExited, true, JSON.stringify(termination)) + assert.equal(termination.descendantsVerified, true, JSON.stringify(termination)) + assert.equal(await waitForTreeGone(child, 1_000).then((status) => status.gone), true) + } finally { + if (descendantPid !== undefined) { + try { + process.kill(descendantPid, 'SIGKILL') + } catch {} + } + await rm(root, { recursive: true, force: true }) + } +}) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index a1a8891d..e9533ea5 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -11,7 +11,12 @@ import { Sandbox } from '@tangle-network/sandbox' import xterm from '@xterm/headless' import * as pty from 'node-pty' import { sleep } from '../live-bridge/process.mjs' -import { waitForTreeGone } from '../live-bridge/process-tree.mjs' +import { + processTreeEnvironment, + sendTreeSignal, + trackProcessTree, + waitForTreeGone, +} from '../live-bridge/process-tree.mjs' import { runFromState, stateForRun } from '../live-bridge/protocol.mjs' import { installPackedBraid } from '../packed-binary.mjs' import { connectionConfiguration } from './configuration.mjs' @@ -191,18 +196,20 @@ async function waitFor(label, predicate, timeoutMs) { function createPty(binary, config, statePath, exitTimeoutMs) { const terminal = new xterm.Terminal({ cols: 120, rows: 36, allowProposedApi: true }) + const environment = processTreeEnvironment({ + ...config.environment, + BRAID_SHUTDOWN_MODE: 'detach', + NO_COLOR: '1', + NODE_NO_WARNINGS: '1', + }) const child = pty.spawn(process.execPath, [binary, '--inline', '--record-state', statePath], { cwd: config.workspace, - env: { - ...config.environment, - BRAID_SHUTDOWN_MODE: 'detach', - NO_COLOR: '1', - NODE_NO_WARNINGS: '1', - }, + env: environment.environment, name: 'xterm-256color', cols: 120, rows: 36, }) + trackProcessTree(child, environment.token) let output = '' let exited = false let exitResult @@ -256,7 +263,7 @@ function createPty(binary, config, statePath, exitTimeoutMs) { return { ...result, processCleanup: await waitForProcessCleanup() } }, async forceClose() { - if (!exited) child.kill() + if (!exited) await sendTreeSignal(child, 'SIGKILL') const result = await waitFor( 'forced Braid terminal exit', () => exited && exitResult, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 58415325..f1e7436b 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -9,7 +9,12 @@ import { Sandbox } from '@tangle-network/sandbox' import xterm from '@xterm/headless' import * as pty from 'node-pty' -import { sendTreeSignal, waitForTreeGone } from '../live-bridge/process-tree.mjs' +import { + processTreeEnvironment, + sendTreeSignal, + trackProcessTree, + waitForTreeGone, +} from '../live-bridge/process-tree.mjs' import { pause } from '../live-demo/terminal.mjs' import { connectionConfiguration } from './configuration.mjs' import { safeJson, safeMessage } from './contracts.mjs' @@ -157,13 +162,15 @@ function createTerminal( NODE_NO_WARNINGS: '1', } for (const name of SECRET_ENVIRONMENT_NAMES) delete environment[name] + const tracked = processTreeEnvironment(environment) const child = pty.spawn(process.execPath, [binary, '--inline', '--record-state', recordPath], { cwd: config.workspace, - env: environment, + env: tracked.environment, name: 'xterm-256color', cols: columns, rows, }) + trackProcessTree(child, tracked.token) let output = '' let exited = false let exitResult From 1dca6db491f9a03f898a0437394d5903598c7434 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 15:28:19 -0600 Subject: [PATCH 042/136] fix(ui): separate execution identity from decision copy --- .../live-required/tangle-workspace-proof.mjs | 3 +- src/adapters/tui/ui-conversation-dispatch.ts | 6 ++-- src/adapters/tui/ui-fixtures.ts | 14 +++------ src/eval/product-path.ts | 6 ++-- src/views/shared/analysis-presentation.ts | 15 ++++++---- src/views/shared/models.ts | 5 ++++ src/views/tui/conversation-overlay-helpers.ts | 11 ++----- test/tui-core-workflows.test.ts | 29 +++++-------------- 8 files changed, 37 insertions(+), 52 deletions(-) diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index e20c1320..744f664a 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -8,6 +8,7 @@ import { workspaceCheckpointRequestDigest, workspaceForkRequestDigest, } from '@tangle-network/agent-interface' +import { generateAttestationNonce } from '@tangle-network/sandbox' import { connectionConfiguration } from './configuration.mjs' import { @@ -630,7 +631,7 @@ async function runWorkspaceProof({ ? { confidential: { requested: true, - nonce: `braid-live-${proofId}`, + nonce: generateAttestationNonce(), policy: 'tangle-confidential-v1', profileDigest: `sha256:${opened.modules.profiles.canonicalAgentProfileDigestHex(opened.app.state().profile)}`, }, diff --git a/src/adapters/tui/ui-conversation-dispatch.ts b/src/adapters/tui/ui-conversation-dispatch.ts index 9f192ff0..b7c8e259 100644 --- a/src/adapters/tui/ui-conversation-dispatch.ts +++ b/src/adapters/tui/ui-conversation-dispatch.ts @@ -339,9 +339,11 @@ function forkPreview(plan: ForkPlan): ForkPreviewView { source: `${plan.sourceConversationId} / ${plan.sourceBranchId}`, destination: `${plan.sourceConversationId} / ${plan.destinationBranchId}`, kind: plan.kind, + execution: { + operationId: plan.operationId, + planDigest: plan.digest, + }, fields: [ - { label: 'operation id', source: plan.operationId, destination: plan.operationId }, - { label: 'plan digest', source: plan.digest, destination: plan.digest }, { label: 'conversation context', source: plan.context.sourceBoundary, diff --git a/src/adapters/tui/ui-fixtures.ts b/src/adapters/tui/ui-fixtures.ts index e59e75a3..911ab2d2 100644 --- a/src/adapters/tui/ui-fixtures.ts +++ b/src/adapters/tui/ui-fixtures.ts @@ -47,6 +47,10 @@ export const FIXTURE_FORK: ForkPreviewView = Object.freeze({ kind: 'workspace', source: 'workspace:/workspace', destination: 'workspace:/workspace-fork', + execution: Object.freeze({ + operationId: 'operation-fixture-fork', + planDigest: 'digest:fixture-fork-plan', + }), fields: Object.freeze([ { label: 'conversation context', @@ -63,16 +67,6 @@ export const FIXTURE_FORK: ForkPreviewView = Object.freeze({ source: 'checkpoint:fixture-1', destination: 'checkpoint:fixture-1', }, - { - label: 'operation id', - source: 'operation-fixture-fork', - destination: 'operation-fixture-fork', - }, - { - label: 'plan digest', - source: 'digest:fixture-fork-plan', - destination: 'digest:fixture-fork-plan', - }, ]), allowed: true, }) diff --git a/src/eval/product-path.ts b/src/eval/product-path.ts index d998c8c2..20251e11 100644 --- a/src/eval/product-path.ts +++ b/src/eval/product-path.ts @@ -139,9 +139,11 @@ function forkPreview(plan: ForkPlan): ForkPreviewView { source: `${plan.sourceConversationId} / ${plan.sourceBranchId}`, destination: `${plan.sourceConversationId} / ${plan.destinationBranchId}`, kind: plan.kind, + execution: { + operationId: plan.operationId, + planDigest: plan.digest, + }, fields: [ - { label: 'operation id', source: plan.operationId, destination: plan.operationId }, - { label: 'plan digest', source: plan.digest, destination: plan.digest }, { label: 'conversation context', source: plan.context.sourceBoundary, diff --git a/src/views/shared/analysis-presentation.ts b/src/views/shared/analysis-presentation.ts index 44c85195..a3e0bf39 100644 --- a/src/views/shared/analysis-presentation.ts +++ b/src/views/shared/analysis-presentation.ts @@ -176,19 +176,22 @@ export function analysisDocument(analysis: AnalysisView): AnalysisDocument { referenced.add(citationId) const citation = citations.get(citationId) const number = citationNumbers.get(citationId) ?? '?' - details.push( - citation === undefined - ? `! evidence [${number}] unavailable · citation ${shortDigest(citationId)}` - : `↳ [${number}] ${sanitizeTerminalText(citation.text)} · event ${shortDigest(citation.eventId)}`, - ) + if (citation === undefined) { + details.push(`! evidence [${number}] unavailable`) + details.push(` source: ${shortDigest(citationId)}`) + } else { + details.push(`↳ [${number}] ${sanitizeTerminalText(citation.text)}`) + details.push(` source: ${shortDigest(citation.eventId)}`) + } } } if (analysis.findings.length === 0) details.push('No findings were returned.') for (const citation of analysis.citations) { if (referenced.has(citation.id)) continue details.push( - `↳ [${citationNumbers.get(citation.id) ?? '?'}] ${sanitizeTerminalText(citation.text)} · event ${shortDigest(citation.eventId)}`, + `↳ [${citationNumbers.get(citation.id) ?? '?'}] ${sanitizeTerminalText(citation.text)}`, ) + details.push(` source: ${shortDigest(citation.eventId)}`) } const nextAction = analysisNextAction(analysis, mode) diff --git a/src/views/shared/models.ts b/src/views/shared/models.ts index 09c8d8f1..f46321f3 100644 --- a/src/views/shared/models.ts +++ b/src/views/shared/models.ts @@ -555,6 +555,11 @@ export interface ForkPreviewView { readonly source: string readonly destination: string readonly kind: 'conversation' | 'workspace' | 'cross-runner' + /** Exact retry-safe identity consumed by the controller, never rendered as decision copy. */ + readonly execution?: { + readonly operationId: string + readonly planDigest: string + } readonly fields: readonly { readonly label: string readonly source: string diff --git a/src/views/tui/conversation-overlay-helpers.ts b/src/views/tui/conversation-overlay-helpers.ts index 4800b1b7..00438530 100644 --- a/src/views/tui/conversation-overlay-helpers.ts +++ b/src/views/tui/conversation-overlay-helpers.ts @@ -65,19 +65,12 @@ export function findConversation( } } -export function fieldValue( - preview: BraidViewModel['forkPreview'], - label: string, -): string | undefined { - return preview?.fields.find((field) => field.label === label)?.source -} - export function forkExecutionIdentity( preview: BraidViewModel['forkPreview'], ): { readonly operationId: string; readonly planDigest: string } | undefined { if (!preview?.allowed) return undefined - const operationId = fieldValue(preview, 'operation id') - const planDigest = fieldValue(preview, 'plan digest') + const operationId = preview.execution?.operationId + const planDigest = preview.execution?.planDigest return operationId === undefined || planDigest === undefined ? undefined : { operationId, planDigest } diff --git a/test/tui-core-workflows.test.ts b/test/tui-core-workflows.test.ts index 7f5436cb..e6caa605 100644 --- a/test/tui-core-workflows.test.ts +++ b/test/tui-core-workflows.test.ts @@ -74,6 +74,10 @@ function forkView(): BraidViewModel { kind: 'conversation', source: 'conversation:source / branch:main', destination: 'conversation:copy / branch:fork', + execution: { + operationId: 'operation-fork-preview', + planDigest: 'digest:fork-preview', + }, fields: [ { label: 'transcript boundary', @@ -90,16 +94,6 @@ function forkView(): BraidViewModel { source: 'checkpoint:source', destination: 'checkpoint:copy', }, - { - label: 'operation id', - source: 'operation-fork-preview', - destination: 'operation-fork-preview', - }, - { - label: 'plan digest', - source: 'digest:fork-preview', - destination: 'digest:fork-preview', - }, ], allowed: true, }, @@ -214,12 +208,7 @@ test('core workflow overlays keep mode, consequence, and controls visible at 40x assert.match(forkScreen.join('\n'), /source: conversation:source/u) assert.match(forkScreen.join('\n'), /destination: conversation:copy/u) assert.match(forkScreen.join('\n'), /boundary: message:42/u) - assert.match(forkScreen.join('\n'), /operation id:/u) - assert.match(forkScreen.join('\n'), /plan digest:/u) - if (columns === 80) { - assert.match(forkScreen.join('\n'), /operation id: operation-fork-preview/u) - assert.match(forkScreen.join('\n'), /plan digest: digest:fork-preview/u) - } + assert.doesNotMatch(forkScreen.join('\n'), /operation-fork-preview|digest:fork-preview/u) assert.match(forkScreen.join('\n'), /enter\/y create(?: fork)? .*←\/esc/u) const graphScreen = await renderOverlay(graph, columns, rows) @@ -998,14 +987,10 @@ test('fork and confirmation dialogs expose only short, actionable keys', () => { const completeFork = forkView() const completePreview = completeFork.forkPreview assert.ok(completePreview) + const { execution: _execution, ...incompletePreview } = completePreview panel.setView({ ...completeFork, - forkPreview: { - ...completePreview, - fields: completePreview.fields.filter( - (field) => field.label !== 'operation id' && field.label !== 'plan digest', - ), - }, + forkPreview: incompletePreview, }) const incomplete = panel.render(80).join('\n') assert.match(incomplete, /missing execution data/u) From 7a3e568f0cab12ceca131eec9b328ad030e7a9a3 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 15:40:34 -0600 Subject: [PATCH 043/136] fix(supervision): pass explicit Runtime provision inputs --- docs/components/supervision.md | 17 ++-- scripts/live-required.test.mjs | 102 ++++++++++++++++++++++-- scripts/live-required/supervisor.mjs | 114 +++++++++++++++++++++------ 3 files changed, 195 insertions(+), 38 deletions(-) diff --git a/docs/components/supervision.md b/docs/components/supervision.md index 5d4aa8d4..b127ce2d 100644 --- a/docs/components/supervision.md +++ b/docs/components/supervision.md @@ -143,22 +143,27 @@ The proof records configured external runs as `not-owned` and records the owner- Runtime provisioner contract: ```text -provisionSupervisor({ invocationId, environment, workspaceDir, timeoutMs, pollMs, profile?, connection? }) +provisionSupervisor({ invocationId, task, profile, workerEnvironment?, workspaceDir?, + timeoutMs, pollMs, connection }) -> { rootDir, supervisorId, workerId, providers?, terminalTakeover, cleanup() } cleanup() -> { status: "completed", rootDir, supervisorId, workerId, supervisorStatus, workerStatus, resourcesReleased: true, remainingResources: [] } ``` -The environment argument contains only supervisor selectors, endpoints, model and runner preferences, workspace, and opaque credential references. +The Braid LIVE-11 caller resolves its task, canonical profile, and provider connection before it calls Runtime. -The optional profile is the canonical `AgentProfile` supplied by the caller. +The task is the initial worker assignment and remains caller-owned. -The optional connection is the caller's connection record. +The profile is the canonical `AgentProfile` supplied by the caller. -The Runtime creates its canonical default profile and connection when those optional values are absent. +The connection is either a provider or client object, or an explicit endpoint and API key. -The environment argument is never written into the proof receipt. +`workerEnvironment` carries generic provider create fields such as workspace, name, and metadata. + +Runtime does not receive Braid environment keys or resolve Braid credentials and endpoints. + +The Braid caller may use `https://sandbox.tangle.tools` as its endpoint default, but it passes the resolved endpoint and credential to Runtime explicitly. The Runtime owns all supervisor files and provider resources created by this contract. diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index 3c351b57..4a39076a 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -30,7 +30,10 @@ import { import { createSupervisorProofFixture, runSupervisorFlow, + supervisorConnection, supervisorProfile, + supervisorTask, + supervisorWorkerEnvironment, } from './live-required/supervisor.mjs' import { runMatrixAdapter, runSandbox } from './live-required/tangle.mjs' import { executionLatencyDistribution } from './live-required/tangle-sandbox-braid-execution-soak.mjs' @@ -115,8 +118,21 @@ function protectedEnvironment() { 'BRAID_SUPERVISOR_ID', 'BRAID_SUPERVISOR_WORKER', 'BRAID_SUPERVISOR_WORKSPACE', + 'BRAID_SUPERVISOR_ENDPOINT', + 'BRAID_SUPERVISOR_CONNECTION_ID', + 'BRAID_SUPERVISOR_CONNECTION_KIND', + 'BRAID_SUPERVISOR_CREDENTIAL_CONFIGURED', 'BRAID_SUPERVISOR_CREDENTIAL_REF', + 'BRAID_SUPERVISOR_API_KEY', + 'BRAID_SUPERVISOR_AUTH', + 'BRAID_SUPERVISOR_BEARER', + 'BRAID_SUPERVISOR_MODEL', + 'BRAID_SUPERVISOR_MODEL_PROVIDER', + 'BRAID_SUPERVISOR_RUNNER', + 'BRAID_SUPERVISOR_TASK', + 'BRAID_SUPERVISOR_WORKER_NAME', 'BRAID_SUPERVISOR_LIVE_ADAPTER', + 'TANGLE_API_KEY', ]) delete environment[name] return environment @@ -435,6 +451,62 @@ test('LIVE-11 composes a complete canonical profile by default', () => { ) }) +test('LIVE-11 resolves caller-owned task, connection, and generic worker input', () => { + const environment = { + BRAID_SUPERVISOR_TASK: 'Inspect the retained worker workspace', + BRAID_SUPERVISOR_ENDPOINT: 'https://sandbox.example/v1', + BRAID_SUPERVISOR_API_KEY: 'supervisor-api-key-fixture', + BRAID_SUPERVISOR_CONNECTION_KIND: 'tangle-sandbox', + BRAID_SUPERVISOR_CREDENTIAL_REF: 'cred:v1:supervisor-fixture', + BRAID_SUPERVISOR_WORKSPACE: '/tmp/supervisor-fixture-workspace', + BRAID_SUPERVISOR_WORKER_NAME: 'retained-worker-fixture', + } + assert.equal(supervisorTask(environment), 'Inspect the retained worker workspace') + assert.deepEqual(supervisorConnection(environment), { + endpoint: 'https://sandbox.example/v1', + apiKey: 'supervisor-api-key-fixture', + kind: 'tangle-sandbox', + credentialRef: 'cred:v1:supervisor-fixture', + }) + assert.deepEqual(supervisorWorkerEnvironment(environment, 'invocation-fixture'), { + workspace: { cwd: '/tmp/supervisor-fixture-workspace' }, + name: 'retained-worker-fixture', + metadata: { + owner: 'braid-live-supervisor', + proof: 'LIVE-11', + invocationId: 'invocation-fixture', + }, + }) +}) + +test('LIVE-11 requires a caller-owned provider credential for a new run', () => { + assert.throws( + () => supervisorConnection({}), + (error) => { + assert.equal(error.unavailable, true) + assert.equal(error.code, 'PROTECTED_CREDENTIAL_REQUIRED') + assert.match(error.message, /BRAID_SUPERVISOR_API_KEY/u) + return true + }, + ) +}) + +function supervisorProvisionInputs(invocationId) { + return { + task: `fixture supervisor task ${invocationId}`, + profile: supervisorProfile({}), + connection: { + endpoint: 'https://sandbox.example/v1', + apiKey: 'fixture-supervisor-api-key', + kind: 'tangle-sandbox', + }, + workerEnvironment: { + name: `fixture-supervisor-${invocationId}`, + metadata: { owner: 'braid-live-supervisor-test', invocationId }, + }, + } +} + test('only explicit protected configuration failures remain unavailable', () => { const unavailable = normalizeExternalFailure( protectedUnavailable('PROTECTED_CREDENTIAL_REQUIRED', 'credential is missing'), @@ -1057,6 +1129,7 @@ test('supervisor proof provisions an owned Runtime run and validates cleanup', a BRAID_SUPERVISOR_ENDPOINT: 'https://router.example/v1', BRAID_SUPERVISOR_CREDENTIAL_REF: 'cred:v1:supervisor-proof', BRAID_SUPERVISOR_WORKSPACE: '/tmp/supervisor-proof-workspace', + BRAID_SUPERVISOR_TASK: 'Inspect the provisioned worker', BRAID_SUPERVISOR_API_KEY: 'must-not-cross-the-provision-boundary', BRAID_SUPERVISOR_AUTH: 'must-not-cross-the-provision-boundary', BRAID_SUPERVISOR_TIMEOUT_MS: '1000', @@ -1101,15 +1174,28 @@ test('supervisor proof provisions an owned Runtime run and validates cleanup', a assert.equal(result.cleanup.status, 'completed') assert.equal(cleanupCalls, 1) assert.equal(provisionRequest.invocationId, 'live-required-supervisor-provisioned') + assert.equal(provisionRequest.task, 'Inspect the provisioned worker') assert.equal(provisionRequest.timeoutMs, 1000) assert.equal(provisionRequest.pollMs, 1) - assert.deepEqual(provisionRequest.environment, { - BRAID_SUPERVISOR_ENDPOINT: 'https://router.example/v1', - BRAID_SUPERVISOR_CREDENTIAL_REF: 'cred:v1:supervisor-proof', - BRAID_SUPERVISOR_WORKSPACE: '/tmp/supervisor-proof-workspace', + assert.equal(provisionRequest.workspaceDir, '/tmp/supervisor-proof-workspace') + assert.deepEqual(provisionRequest.profile, supervisorProfile(environment)) + assert.deepEqual(provisionRequest.connection, { + endpoint: 'https://router.example/v1', + apiKey: 'must-not-cross-the-provision-boundary', + kind: 'tangle-sandbox', + credentialRef: 'cred:v1:supervisor-proof', + }) + assert.deepEqual(provisionRequest.workerEnvironment, { + workspace: { cwd: '/tmp/supervisor-proof-workspace' }, + name: 'braid-live-supervisor-live-required-supervisor-provisioned', + metadata: { + owner: 'braid-live-supervisor', + proof: 'LIVE-11', + invocationId: 'live-required-supervisor-provisioned', + }, }) - assert.equal(provisionRequest.profile, undefined) - assert.equal(provisionRequest.connection, undefined) + assert.equal('environment' in provisionRequest, false) + assert.equal('BRAID_SUPERVISOR_API_KEY' in provisionRequest.workerEnvironment, false) assert.deepEqual(result.proof.run.ids, [fixture.supervisorId, fixture.workerId]) assert.equal(result.proof.facts.provisioned, true) assert.equal(result.proof.facts.cleanupVerified, true) @@ -1130,6 +1216,7 @@ test('supervisor proof cleans an owned Runtime run after an observation failure' }, invocationId: 'live-required-supervisor-cleanup-on-failure', runtime: fixture.api, + ...supervisorProvisionInputs('live-required-supervisor-cleanup-on-failure'), provision: async () => ({ rootDir: fixture.rootDir, supervisorId: fixture.supervisorId, @@ -1168,6 +1255,7 @@ test('supervisor proof rejects a supported terminal takeover without a real atta }, invocationId: 'live-required-supervisor-required-attach', runtime: fixture.api, + ...supervisorProvisionInputs('live-required-supervisor-required-attach'), provision: async () => ({ rootDir: fixture.rootDir, supervisorId: fixture.supervisorId, @@ -1207,6 +1295,7 @@ test('supervisor proof refuses an incomplete owned cleanup receipt', async () => }, invocationId: 'live-required-supervisor-incomplete-cleanup', runtime: fixture.api, + ...supervisorProvisionInputs('live-required-supervisor-incomplete-cleanup'), provision: async () => ({ rootDir: fixture.rootDir, supervisorId: fixture.supervisorId, @@ -1268,6 +1357,7 @@ test('supervisor provisioning failures retain the provider cause', async () => { throw new Error('SESSION_DELETING') }, }, + ...supervisorProvisionInputs('fixture-provisioning-failure'), }), (error) => { assert.match( diff --git a/scripts/live-required/supervisor.mjs b/scripts/live-required/supervisor.mjs index 3dd4e751..4e881ab0 100644 --- a/scripts/live-required/supervisor.mjs +++ b/scripts/live-required/supervisor.mjs @@ -23,6 +23,10 @@ const DEFAULT_POLL_INTERVAL_MS = 100 const DEFAULT_SUPERVISOR_RUNNER = 'opencode' const DEFAULT_SUPERVISOR_MODEL = 'tangle-router/glm-5.3' const DEFAULT_SUPERVISOR_MODEL_PROVIDER = 'tangle-router' +const DEFAULT_SANDBOX_ENDPOINT = 'https://sandbox.tangle.tools' +const DEFAULT_SUPERVISOR_CONNECTION_KIND = 'tangle-sandbox' +const DEFAULT_SUPERVISOR_TASK = + 'Start the assigned interactive worker and remain available for supervision.' const SPEND_FIELDS = Object.freeze(['iterations', 'tokensInput', 'tokensOutput', 'usd', 'ms']) const TOTAL_FIELDS = Object.freeze([ 'tokensInput', @@ -31,17 +35,6 @@ const TOTAL_FIELDS = Object.freeze([ 'usd', 'latencyMs', ]) -const PROVISION_ENVIRONMENT_KEYS = Object.freeze([ - 'BRAID_SUPERVISOR_ENDPOINT', - 'BRAID_SUPERVISOR_CONNECTION_ID', - 'BRAID_SUPERVISOR_CONNECTION_KIND', - 'BRAID_SUPERVISOR_CREDENTIAL_CONFIGURED', - 'BRAID_SUPERVISOR_CREDENTIAL_REF', - 'BRAID_SUPERVISOR_MODEL', - 'BRAID_SUPERVISOR_RUNNER', - 'BRAID_SUPERVISOR_WORKSPACE', -]) - function requiredText(value, name) { if (typeof value !== 'string' || value.trim().length === 0) throw new Error(`${name} must be a non-empty string`) @@ -326,6 +319,59 @@ export function supervisorProfile(environment) { } } +export function supervisorTask(environment) { + return requiredText( + environment.BRAID_SUPERVISOR_TASK?.trim() || DEFAULT_SUPERVISOR_TASK, + 'BRAID_SUPERVISOR_TASK', + ) +} + +function firstConfigured(environment, names) { + return names + .map((name) => environment[name]) + .find((value) => typeof value === 'string' && value.trim().length > 0) + ?.trim() +} + +export function supervisorConnection(environment) { + const endpoint = environment.BRAID_SUPERVISOR_ENDPOINT?.trim() || DEFAULT_SANDBOX_ENDPOINT + const apiKey = firstConfigured(environment, [ + 'BRAID_SUPERVISOR_API_KEY', + 'BRAID_SUPERVISOR_AUTH', + 'BRAID_SUPERVISOR_BEARER', + 'TANGLE_API_KEY', + ]) + if (apiKey === undefined) + throw protectedUnavailable( + 'PROTECTED_CREDENTIAL_REQUIRED', + 'LIVE-11 supervisor requires BRAID_SUPERVISOR_API_KEY, BRAID_SUPERVISOR_AUTH, BRAID_SUPERVISOR_BEARER, or TANGLE_API_KEY', + ) + const credentialRef = firstConfigured(environment, ['BRAID_SUPERVISOR_CREDENTIAL_REF']) + const kind = + environment.BRAID_SUPERVISOR_CONNECTION_KIND?.trim() || DEFAULT_SUPERVISOR_CONNECTION_KIND + return { + endpoint, + apiKey, + kind, + ...(credentialRef === undefined ? {} : { credentialRef }), + } +} + +export function supervisorWorkerEnvironment(environment, invocationId) { + const workspaceDir = environment.BRAID_SUPERVISOR_WORKSPACE?.trim() + const name = + environment.BRAID_SUPERVISOR_WORKER_NAME?.trim() || `braid-live-supervisor-${invocationId}` + return { + ...(workspaceDir === undefined ? {} : { workspace: { cwd: workspaceDir } }), + name, + metadata: { + owner: 'braid-live-supervisor', + proof: 'LIVE-11', + invocationId, + }, + } +} + /** * Prove one Runtime supervisor through its published read and control APIs. * @@ -359,25 +405,25 @@ function supervisorConfiguration(environment) { } } -function provisionEnvironment(environment) { - return Object.fromEntries( - PROVISION_ENVIRONMENT_KEYS.flatMap((name) => { - const value = environment[name] - return typeof value === 'string' && value.trim().length > 0 ? [[name, value.trim()]] : [] - }), - ) -} - -function provisionRequest(environment, invocationId, timeoutMs, pollMs, profile, connection) { - const workspaceDir = environment.BRAID_SUPERVISOR_WORKSPACE?.trim() +function provisionRequest({ + invocationId, + task, + timeoutMs, + pollMs, + profile, + connection, + workerEnvironment, + workspaceDir, +}) { return { invocationId, - environment: provisionEnvironment(environment), + task, + profile, + connection, + ...(workerEnvironment === undefined ? {} : { workerEnvironment }), workspaceDir: workspaceDir || undefined, timeoutMs, pollMs, - ...(profile === undefined ? {} : { profile }), - ...(connection === undefined ? {} : { connection }), } } @@ -412,8 +458,10 @@ async function acquireSupervisor({ timeoutMs, pollMs, provision, + task, profile, connection, + workerEnvironment, }) { const configured = supervisorConfiguration(environment) if (configured !== undefined) return configured @@ -425,7 +473,17 @@ async function acquireSupervisor({ ) try { const receipt = await provisioner( - provisionRequest(environment, invocationId, timeoutMs, pollMs, profile, connection), + provisionRequest({ + invocationId, + task: task ?? supervisorTask(environment), + profile: profile ?? supervisorProfile(environment), + connection: connection ?? supervisorConnection(environment), + workerEnvironment: + workerEnvironment ?? supervisorWorkerEnvironment(environment, invocationId), + workspaceDir: environment.BRAID_SUPERVISOR_WORKSPACE?.trim(), + timeoutMs, + pollMs, + }), ) return validateProvisionedSupervisor(receipt) } catch (error) { @@ -502,8 +560,10 @@ export async function runSupervisorFlow({ runtime, providers, provision, + task, profile, connection, + workerEnvironment, } = {}) { const startedAt = new Date().toISOString() const timeoutMs = configuredDuration( @@ -533,8 +593,10 @@ export async function runSupervisorFlow({ timeoutMs, pollMs, provision, + task, profile, connection, + workerEnvironment, }) const { rootDir, supervisorId, workerId } = binding const providerSource = providers ?? binding.providers From 967190752a06b70b73597c8df40f4735f68c5ae8 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 15:41:35 -0600 Subject: [PATCH 044/136] fix(live): harden provider-bound cloud proofs --- docs/components/README.md | 1 + docs/components/cloud-proof-observations.md | 61 ++++ scripts/live-required/contracts.mjs | 52 ++- .../tangle-sandbox-braid-interactive.mjs | 331 ++++++++++++++++-- .../tangle-sandbox-braid-soak.mjs | 5 +- .../tangle-sandbox-braid-stress.mjs | 131 ++++++- test/tangle-live07-wiring.test.mjs | 103 +++++- .../tangle-sandbox-braid-soak-script.test.mjs | 25 +- 8 files changed, 672 insertions(+), 37 deletions(-) create mode 100644 docs/components/cloud-proof-observations.md diff --git a/docs/components/README.md b/docs/components/README.md index 99ea5926..7b7b7ada 100644 --- a/docs/components/README.md +++ b/docs/components/README.md @@ -55,6 +55,7 @@ It proves keyboard behavior and terminal output at 40×12, 80×24, 120×40, and | Retained run lifecycle | [retained-run-lifecycle.md](retained-run-lifecycle.md) | Reconnect, replay, detach, cancel, and recover one exact provider run. | | Native continuation | [native-continuation.md](native-continuation.md) | Continue the exact provider session at a verified branch boundary. | | Run stream sanitizer | [run-stream-sanitizer.md](run-stream-sanitizer.md) | Make split provider output safe before durable storage and rendering. | +| Cloud proof observations | [cloud-proof-observations.md](cloud-proof-observations.md) | Prove provider-bound input, execution uniqueness, telemetry, identity, and cleanup. | | Selectors and commands | [selectors-and-commands.md](selectors-and-commands.md) | Find an action or entity through one keyboard contract. | | Modal coordination | [modal-coordination.md](modal-coordination.md) | Present one bounded decision surface with reliable focus restoration. | | Conversation navigation | [conversation-navigation.md](conversation-navigation.md) | Create, rename, archive, switch, branch, and clone through explicit identities. | diff --git a/docs/components/cloud-proof-observations.md b/docs/components/cloud-proof-observations.md new file mode 100644 index 00000000..178863ce --- /dev/null +++ b/docs/components/cloud-proof-observations.md @@ -0,0 +1,61 @@ +# Cloud proof observations + +## Purpose + +The cloud proof observations component proves that Braid controls the provider resource it reports. + +It covers LIVE-07 retained runs and LIVE-08 native interactive runs. + +## Ownership + +The Braid proof scripts own evidence collection and receipt validation. + +The Sandbox provider owns workspace files, terminal state, resource usage, and account identity. + +Braid does not infer provider execution from assistant text or local terminal echo. + +## Best simple implementation + +The proof collects provider readback through the authenticated Sandbox client and validates it before receipt creation. + +## Inputs and outputs + +The proof receives one authenticated Sandbox client, one Braid control reference, and generated workspace paths. + +The provider readback returns a resource identity, file bytes, terminal metadata, usage samples, and account identity. + +The public receipt contains digests, statuses, counts, paths, and timings without credential values or secret-designated content. + +## State and invariants + +The execution-attempt ledger is append-only and must contain exactly one expected line after replay and reconnect. + +Input and reconnect checks pass only after the provider workspace contains the expected bytes. + +Cleanup enumerates every Braid-owned retained resource for the exact provider session and rejects duplicate ownership. + +The account identity must remain stable before execution and after cleanup. + +The active-resource delta must be observed and must equal zero after cleanup. + +Telemetry and spend fields must be observed or explicitly unavailable, and missing fields fail the proof. + +## Performance + +Workspace reads use one exact resource lookup per polling attempt and bounded proof paths. + +Cleanup uses paginated provider listing and bounded deletion retries for each owned resource. + +Provider-bound mutation evidence stores digests instead of raw file bytes, and diagnostics remain bounded. + +## Tests + +Focused tests reject local-only input, duplicate owned resources, duplicate execution lines, and missing telemetry. + +The complete local verification command covers receipt validation, replay, cancellation, terminal behavior, and projections. + +## Non-goals + +This component does not implement a runner, terminal protocol, provider session store, or billing system. + +This component does not claim provider behavior when public observation or cleanup evidence is unavailable. diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index 0336cc48..ac360d43 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -52,6 +52,15 @@ const PROOF_OPERATION_CHECKS = Object.freeze({ 'exact-resource-cleanup', 'process-exited-before-cleanup', 'process-group-exited-before-cleanup', + 'provider-bound-input', + 'provider-bound-reconnect', + 'single-provider-execution-attempt', + 'exact-owned-resource-set-cleanup', + 'account-identity-stable', + 'active-resource-delta', + 'telemetry-complete', + 'spend-disclosed', + 'latency-observed', ]), [PROOF_OPERATIONS.tangleWorkspaceFork]: Object.freeze([ 'configuration', @@ -114,6 +123,15 @@ const PROOF_OPERATION_FACT_KEYS = Object.freeze({ 'processExitedBeforeWorkspaceCleanup', 'terminalResize', 'processGroupExitedBeforeWorkspaceCleanup', + 'providerInput', + 'providerReconnect', + 'singleProviderExecutionAttempt', + 'exactOwnedResourceSetCleanup', + 'accountIdentityStable', + 'activeResourceDelta', + 'telemetryComplete', + 'spendDisclosed', + 'latencyObserved', ]), [PROOF_OPERATIONS.tangleWorkspaceFork]: Object.freeze([ 'sourceProviderEnvironmentId', @@ -455,7 +473,15 @@ function validateProofFacts(operation, status, facts) { key === 'wrongMeasurementRejected' || key === 'processExitedBeforeWorkspaceCleanup' || key === 'terminalResize' || - key === 'processGroupExitedBeforeWorkspaceCleanup' + key === 'processGroupExitedBeforeWorkspaceCleanup' || + key === 'providerInput' || + key === 'providerReconnect' || + key === 'singleProviderExecutionAttempt' || + key === 'exactOwnedResourceSetCleanup' || + key === 'accountIdentityStable' || + key === 'telemetryComplete' || + key === 'spendDisclosed' || + key === 'latencyObserved' ) { if (typeof value !== 'boolean') throw new Error(`Live proof ${key} must be boolean`) continue @@ -645,6 +671,21 @@ function validatePassedTangleSandboxInteractiveReceipt(receipt) { throw new Error('Passed Tangle interactive proof requires terminal resize evidence') if (receipt.facts.processGroupExitedBeforeWorkspaceCleanup !== true) throw new Error('Passed Tangle interactive proof requires process-group exit before cleanup') + for (const field of [ + 'providerInput', + 'providerReconnect', + 'singleProviderExecutionAttempt', + 'exactOwnedResourceSetCleanup', + 'accountIdentityStable', + 'telemetryComplete', + 'spendDisclosed', + 'latencyObserved', + ]) { + if (receipt.facts[field] !== true) + throw new Error(`Passed Tangle interactive proof requires ${field}=true`) + } + if (receipt.facts.activeResourceDelta !== 0) + throw new Error('Passed Tangle interactive proof requires activeResourceDelta=0') if (!record(receipt.observations) || Object.keys(receipt.observations).length === 0) throw new Error('Passed Tangle interactive proof requires redacted observations') for (const field of [ @@ -654,6 +695,15 @@ function validatePassedTangleSandboxInteractiveReceipt(receipt) { 'sandbox', 'identityContinuity', 'processCleanup', + 'providerEvidence', + 'executionAttempt', + 'usage', + 'accountIdentities', + 'accountIdentityConsistency', + 'usageDelta', + 'telemetry', + 'spend', + 'timing', ]) { if (!record(receipt.observations[field])) throw new Error(`Passed Tangle interactive proof requires observations.${field}`) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index e9533ea5..f2cf9101 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -40,9 +40,20 @@ import { } from './headless.mjs' import { assertVerifiedProcessCleanup, - cleanupRetainedResourceByControlRef, + assertSingleExecutionAttemptLedger, + assertStableAccountIdentity, + cleanupOwnedRetainedResources, + accountIdentity, + executionAttemptLedgerPath, observeRetainedResource, + publicAccountIdentityEvidence, + providerWorkspaceReadbackEvidence, + readRetainedWorkspaceFile, + singleRunSpendDisclosure, + telemetryDisclosure, + usage, } from './tangle-sandbox-braid-stress.mjs' +import { resourceDelta } from './tangle-sandbox-braid-stress-support.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') @@ -74,6 +85,15 @@ const INTERACTIVE_PROOF_CHECKS = Object.freeze([ 'exact-resource-cleanup', 'process-exited-before-cleanup', 'process-group-exited-before-cleanup', + 'provider-bound-input', + 'provider-bound-reconnect', + 'single-provider-execution-attempt', + 'exact-owned-resource-set-cleanup', + 'account-identity-stable', + 'active-resource-delta', + 'telemetry-complete', + 'spend-disclosed', + 'latency-observed', ]) const SECRET_ENVIRONMENT_NAMES = [ 'BRAID_TANGLE_SANDBOX_AUTH', @@ -130,13 +150,18 @@ export function sandboxConfiguration(environment) { export function interactiveProofCommandSequence(markers) { const input = markers.input ?? markers.inputSeed?.toUpperCase() const reconnect = markers.reconnect ?? markers.reconnectSeed?.toUpperCase() + const proofId = markers.proofId ?? `interactive-${markers.outputSeed ?? 'proof'}` + const inputPath = markers.inputPath ?? `.braid-live/${proofId}/native-input.txt` + const reconnectPath = markers.reconnectPath ?? `.braid-live/${proofId}/native-reconnect.txt` + const attemptPath = markers.attemptPath ?? executionAttemptLedgerPath(proofId) + const attempt = markers.executionAttempt ?? `ATTEMPT_${proofId.replaceAll(/[^A-Za-z0-9]/gu, '_')}` return [ - `/interactive Reply with exactly the uppercase version of ${markers.outputSeed}.`, - input, + `/interactive Use a shell command with append redirection (>>) in the current Tangle Sandbox workspace to write exactly ${attempt} followed by a newline to ${attemptPath}; never overwrite this file. Then reply with exactly the uppercase version of ${markers.outputSeed}.`, + `Use a shell command in the current Tangle Sandbox workspace to write exactly ${input} followed by a newline to ${inputPath}. Read it back and reply with exactly ${input}.`, DETACH, '/help', '/attach', - reconnect, + `Use a shell command in the current Tangle Sandbox workspace to write exactly ${reconnect} followed by a newline to ${reconnectPath}. Read it back and reply with exactly ${reconnect}.`, DETACH, '/help', ] @@ -155,6 +180,113 @@ function occurrences(value, marker) { return count } +export function assertProviderBoundEvidence(evidence, label = 'provider-bound mutation') { + assert.ok(evidence && typeof evidence === 'object', `${label} evidence is missing`) + assert.equal(evidence.provider, 'tangle-sandbox', `${label} was not observed by the provider`) + assert.equal(evidence.source, 'sandbox-workspace-read', `${label} lacks provider readback`) + assert.equal( + evidence.providerObserved ?? evidence.matched, + true, + `${label} was not provider-bound; local terminal echo is insufficient`, + ) + assert.equal(evidence.localEchoOnly, false, `${label} relied on local terminal echo`) + return evidence +} + +export function assertInteractiveTelemetry(telemetry, spend, timing) { + assert.equal( + telemetry?.completeDisclosure, + true, + 'interactive telemetry disclosure is incomplete', + ) + const fields = telemetry.fields ?? {} + const missingTelemetry = Object.entries(fields) + .filter(([, field]) => field?.status === 'missing' || field?.status === 'in-flight') + .map(([name]) => name) + assert.deepEqual(missingTelemetry, [], 'interactive telemetry contains missing fields') + const rows = Array.isArray(spend?.rows) ? spend.rows : [] + assert.equal(rows.length, 1, 'interactive spend disclosure must contain one run') + const missingSpend = rows.flatMap((row) => + ['tokens', 'cost', 'duration'] + .filter((name) => row?.[name]?.status === 'missing') + .map((name) => `${row.label ?? 'run'}.${name}`), + ) + assert.deepEqual(missingSpend, [], 'interactive spend disclosure contains missing fields') + assert.equal(timing?.status, 'observed', 'interactive latency was not observed') + assert.ok( + Number.isFinite(timing?.milliseconds) && timing.milliseconds >= 0, + 'interactive latency is not a finite measurement', + ) + return { complete: true } +} + +export function assertInteractiveOwnedResourceCleanup(cleanup, expectedEnvironmentId) { + assert.equal(cleanup?.confirmed, true, 'owned Sandbox cleanup was not confirmed') + assert.ok( + Array.isArray(cleanup?.removedIds) && cleanup.removedIds.includes(expectedEnvironmentId), + 'owned Sandbox cleanup omitted the exact resource', + ) + assert.equal(cleanup?.remainingIds?.length, 0, 'owned Sandbox cleanup left a resource behind') + assert.equal( + cleanup?.matchedCount, + 1, + `owned Sandbox cleanup found ${cleanup?.matchedCount ?? 'an unknown number of'} resources; expected one`, + ) + return cleanup +} + +async function waitForProviderReadback(client, controlRef, path, expectedValue, timeoutMs, label) { + const observation = await waitFor( + `${label} provider readback`, + () => + readRetainedWorkspaceFile(client, controlRef, path, { label, allowMissing: true }).then( + (value) => (value?.value === expectedValue ? value : undefined), + ), + timeoutMs, + ) + return assertProviderBoundEvidence( + providerWorkspaceReadbackEvidence(observation, expectedValue, `provider-bound ${label}`), + label, + ) +} + +async function waitForExecutionAttempt(client, controlRef, path, expectedAttempt, timeoutMs) { + const expectedValue = `${expectedAttempt}\n` + let previousValue + let stableReads = 0 + const observation = await waitFor( + 'single provider execution attempt', + async () => { + const value = await readRetainedWorkspaceFile(client, controlRef, path, { + label: 'Execution-attempt ledger', + allowMissing: true, + }) + if (value?.value === undefined) return undefined + assertSingleExecutionAttemptLedger(value.value, expectedAttempt) + if (value.value === previousValue) stableReads += 1 + else { + previousValue = value.value + stableReads = 1 + } + return stableReads >= 3 ? value : undefined + }, + timeoutMs, + ) + const ledger = assertSingleExecutionAttemptLedger(observation.value, expectedAttempt) + return { + ...assertProviderBoundEvidence( + providerWorkspaceReadbackEvidence( + observation, + expectedValue, + 'provider-bound execution attempt', + ), + 'execution attempt', + ), + path: observation.path, + ...ledger, + } +} + function terminalText(terminal) { let text = '' for (let row = 0; row < terminal.rows; row += 1) { @@ -456,9 +588,27 @@ async function observeSandbox(client, controlRef, timeoutMs, expectedRunning, ex ) assert.equal(terminal?.rows, expectedGeometry.rows, 'Sandbox terminal rows were not retained') } + let resourceSample + let resourceSampleError + try { + if (typeof box.resourceUsage !== 'function') { + resourceSample = undefined + } else { + resourceSample = await box.resourceUsage() + } + } catch (error) { + resourceSampleError = safeMessage(error) + } return { resource, terminal, + resourceSample: + resourceSample === undefined + ? { status: 'missing' } + : resourceSample === null + ? { status: 'unavailable', value: null } + : { status: 'observed', value: resourceSample }, + ...(resourceSampleError === undefined ? {} : { resourceSampleError }), ...(terminal === null ? {} : { geometry: { cols: terminal.cols ?? null, rows: terminal.rows ?? null } }), @@ -468,10 +618,12 @@ async function observeSandbox(client, controlRef, timeoutMs, expectedRunning, ex async function cleanupExactSandbox(client, identity) { const observed = await observeRetainedResource(client, identity.controlRef) - const cleanup = await cleanupRetainedResourceByControlRef(client, identity.controlRef) - assert.equal(cleanup.id, observed.id, 'Sandbox cleanup changed the exact Braid resource') - assert.equal(cleanup.id, identity.controlRef.environmentId) - return cleanup + const cleanup = await cleanupOwnedRetainedResources(client, { + controlRef: identity.controlRef, + firstRunId: identity.run.id, + operationId: identity.run.operationId ?? identity.admission?.interactiveIdempotencyKey, + }) + return assertInteractiveOwnedResourceCleanup(cleanup, observed.id) } function cleanupFailure(label, error) { @@ -628,11 +780,14 @@ export async function finalizeInteractiveProof({ ) if (deleted.ok) { cleanup = deleted.value - if ( - cleanup?.confirmed !== true || - cleanup.id !== resolvedIdentity.controlRef.environmentId - ) - errors.push(new Error('exact Sandbox deletion did not return confirmed identity')) + try { + assertInteractiveOwnedResourceCleanup( + cleanup, + resolvedIdentity.controlRef.environmentId, + ) + } catch (error) { + errors.push(error) + } } } } @@ -774,6 +929,10 @@ async function runProof({ let proofError let runObserved = false let stopped = false + const proofStartedAt = performance.now() + const usageRecords = [] + const identityRecords = [] + let metrics try { packed = await installPackedBraid(targetRepository) config = await prepareProductionWorkspace({ @@ -789,20 +948,27 @@ async function runProof({ credentialValue: values.credentialValue, }) client = new Sandbox({ baseUrl: values.endpoint, apiKey: values.credentialValue }) + usageRecords.push(await usage(client, 'before')) + identityRecords.push(await accountIdentity(client, 'before')) recordPath = join(config.root, 'interactive-state.json') runtime = createPty(packed.binary, config, recordPath, exitTimeoutMs) await waitFor('packed Braid TUI startup', () => /Braid/iu.test(runtime.screen), timeoutMs) const markers = { + proofId: `braid-live-interactive-${randomUUID().replaceAll('-', '')}`, outputSeed: `braid_interactive_output_${randomUUID().replaceAll('-', '')}`, inputSeed: `braid_interactive_input_${randomUUID().replaceAll('-', '')}`, reconnectSeed: `braid_interactive_reconnect_${randomUUID().replaceAll('-', '')}`, + executionAttempt: `ATTEMPT_${randomUUID().replaceAll('-', '')}`, } markers.output = markers.outputSeed.toUpperCase() markers.input = markers.inputSeed.toUpperCase() markers.reconnect = markers.reconnectSeed.toUpperCase() + markers.inputPath = `.braid-live/${markers.proofId}/native-input.txt` + markers.reconnectPath = `.braid-live/${markers.proofId}/native-reconnect.txt` + markers.attemptPath = executionAttemptLedgerPath(markers.proofId) - const [interactiveCommand, inputMarker, detach, , attach, reconnectMarker] = + const [interactiveCommand, inputPrompt, detach, , attach, reconnectPrompt] = interactiveProofCommandSequence(markers) const promptCount = occurrences(runtime.output, markers.output) runtime.write(`${interactiveCommand}\r`) @@ -829,12 +995,14 @@ async function runProof({ true, { cols: 120, rows: 36 }, ) - const inputCount = occurrences(runtime.output, markers.input) - runtime.write(`${inputMarker}\r`) - await waitFor( - 'native interactive input', - () => occurrences(runtime.output, markers.input) > inputCount, + runtime.write(`${inputPrompt}\r`) + const inputEvidence = await waitForProviderReadback( + client, + initialIdentity.controlRef, + markers.inputPath, + `${markers.input}\n`, timeoutMs, + 'interactive input', ) runtime.write(detach) @@ -859,11 +1027,20 @@ async function runProof({ reconnectedIdentity.controlRef, 'native reconnect provider control reference', ) - const reconnectCount = occurrences(runtime.output, markers.reconnect) - runtime.write(`${reconnectMarker}\r`) - await waitFor( - 'native interactive reconnect input', - () => occurrences(runtime.output, markers.reconnect) > reconnectCount, + runtime.write(`${reconnectPrompt}\r`) + const reconnectEvidence = await waitForProviderReadback( + client, + initialIdentity.controlRef, + markers.reconnectPath, + `${markers.reconnect}\n`, + timeoutMs, + 'interactive reconnect input', + ) + const executionAttempt = await waitForExecutionAttempt( + client, + initialIdentity.controlRef, + markers.attemptPath, + markers.executionAttempt, timeoutMs, ) runtime.write(detach) @@ -903,6 +1080,10 @@ async function runProof({ resized, beforeStop, stop, + recordState: record.state, + inputEvidence, + reconnectEvidence, + executionAttempt, sameLocalRun, sameProviderControlRef, identityContinuity: { @@ -956,6 +1137,75 @@ async function runProof({ cleanupError = error } + if (client !== undefined) { + usageRecords.push(await usage(client, 'after')) + identityRecords.push(await accountIdentity(client, 'after')) + } + if (proofError === undefined && cleanupError === undefined) { + try { + const beforeUsage = usageRecords.find((entry) => entry.phase === 'before') + const afterUsage = usageRecords.find((entry) => entry.phase === 'after') + const usageDelta = resourceDelta(afterUsage?.value, beforeUsage?.value) + const usageObservationComplete = + beforeUsage?.error === undefined && + beforeUsage?.value !== undefined && + beforeUsage?.value !== null && + afterUsage?.error === undefined && + afterUsage?.value !== undefined && + afterUsage?.value !== null && + usageDelta.activeSandboxes !== null + assert.equal(usageObservationComplete, true, 'interactive usage telemetry was unavailable') + assert.equal( + usageDelta.activeSandboxes, + 0, + 'interactive resource cleanup changed active usage', + ) + const accountIdentityConsistency = assertStableAccountIdentity(identityRecords) + const telemetry = telemetryDisclosure( + proofData.stop.run, + proofData.recordState, + proofData.beforeStop, + { identityDigest: accountIdentityConsistency.identityDigest }, + ) + const spend = singleRunSpendDisclosure(proofData.stop.run) + const timing = { + status: 'observed', + milliseconds: performance.now() - proofStartedAt, + } + assertInteractiveTelemetry(telemetry, spend, timing) + metrics = { + usage: usageRecords.map((entry) => ({ + phase: entry.phase, + status: + entry.error !== undefined + ? 'unavailable' + : entry.value === undefined + ? 'missing' + : entry.value === null + ? 'unavailable' + : 'observed', + ...(entry.value === undefined ? {} : { value: entry.value }), + ...(entry.error ? { error: entry.error } : {}), + })), + accountIdentities: identityRecords.map((entry) => ({ + phase: entry.phase, + status: entry.error ? 'unavailable' : entry.value === undefined ? 'missing' : 'observed', + ...(entry.value === undefined + ? {} + : { value: publicAccountIdentityEvidence(entry.value) }), + ...(entry.error ? { error: entry.error } : {}), + })), + accountIdentityConsistency, + usageDelta, + telemetry, + spend, + timing, + } + } catch (error) { + proofError = new AggregateError([error], 'Braid interactive telemetry proof failed') + } + } + if (proofError !== undefined && cleanupError !== undefined) throw new AggregateError( [proofError, cleanupError], @@ -971,9 +1221,12 @@ async function runProof({ checks: { packedBinary: true, interactiveCommand: true, - input: true, + input: proofData.inputEvidence?.matched === true, detach: true, reconnect: true, + providerBoundInput: proofData.inputEvidence?.matched === true, + providerBoundReconnect: proofData.reconnectEvidence?.matched === true, + singleProviderExecutionAttempt: proofData.executionAttempt?.lineCount === 1, terminalResize: proofData.resized.geometry?.cols === 100 && proofData.resized.geometry?.rows === 30, sameLocalRun: proofData.sameLocalRun === true, @@ -982,6 +1235,13 @@ async function runProof({ stopThroughBraid: RUN_STATUS_AFTER_STOP.has(proofData.stop.run.status), sandboxObservedStopped: cleanup.afterStop?.stopped === true, exactSandboxCleanup: cleanup.cleanup?.confirmed === true, + exactOwnedResourceSetCleanup: + cleanup.cleanup?.confirmed === true && cleanup.cleanup?.matchedCount === 1, + accountIdentityStable: metrics.accountIdentityConsistency?.stable === true, + activeResourceDelta: metrics.usageDelta?.activeSandboxes === 0, + telemetryComplete: metrics.telemetry?.completeDisclosure === true, + spendDisclosed: metrics.spend?.rows?.length === 1, + latencyObserved: metrics.timing?.status === 'observed', processExitedBeforeWorkspaceCleanup: cleanup.processExited === true, processGroupExitedBeforeWorkspaceCleanup: cleanup.processGroupExited === true, }, @@ -1002,6 +1262,18 @@ async function runProof({ }, identityContinuity: proofData.identityContinuity, processCleanup: cleanup.processCleanup, + providerEvidence: { + input: proofData.inputEvidence, + reconnect: proofData.reconnectEvidence, + }, + executionAttempt: proofData.executionAttempt, + usage: metrics.usage, + accountIdentities: metrics.accountIdentities, + accountIdentityConsistency: metrics.accountIdentityConsistency, + usageDelta: metrics.usageDelta, + telemetry: metrics.telemetry, + spend: metrics.spend, + timing: metrics.timing, markers: proofData.markers, } } @@ -1031,6 +1303,15 @@ export async function runInteractiveProof({ terminalResize: proof.checks.terminalResize, processGroupExitedBeforeWorkspaceCleanup: proof.checks.processGroupExitedBeforeWorkspaceCleanup, + providerInput: proof.checks.providerBoundInput, + providerReconnect: proof.checks.providerBoundReconnect, + singleProviderExecutionAttempt: proof.checks.singleProviderExecutionAttempt, + exactOwnedResourceSetCleanup: proof.checks.exactOwnedResourceSetCleanup, + accountIdentityStable: proof.checks.accountIdentityStable, + activeResourceDelta: proof.usageDelta.activeSandboxes, + telemetryComplete: proof.checks.telemetryComplete, + spendDisclosed: proof.checks.spendDisclosed, + latencyObserved: proof.checks.latencyObserved, }, checks: INTERACTIVE_PROOF_CHECKS, observations: proof, diff --git a/scripts/live-required/tangle-sandbox-braid-soak.mjs b/scripts/live-required/tangle-sandbox-braid-soak.mjs index 58eb77f5..f3d973db 100644 --- a/scripts/live-required/tangle-sandbox-braid-soak.mjs +++ b/scripts/live-required/tangle-sandbox-braid-soak.mjs @@ -525,11 +525,14 @@ export function proofFailures(proof, { maxConcurrentRuns = 1 } = {}) { workspace?.readMatched !== true || workspace?.continuity?.matched !== true || workspace?.git?.exitCode !== 0 || + workspace?.executionAttempt?.matched !== true || + workspace?.executionAttempt?.lineCount !== 1 || + !nonEmptyString(workspace?.executionAttempt?.path) || continuity?.matched !== true || !Number.isSafeInteger(proof.followUpEvidence?.visibleProviderEvents) || proof.followUpEvidence.visibleProviderEvents < 1 ) { - failures.push('retained workspace continuity proof was incomplete') + failures.push('retained workspace continuity or exactly-once proof was incomplete') } const resourceIdentity = proof.resourceIdentity diff --git a/scripts/live-required/tangle-sandbox-braid-stress.mjs b/scripts/live-required/tangle-sandbox-braid-stress.mjs index 738353d3..fb9949b9 100644 --- a/scripts/live-required/tangle-sandbox-braid-stress.mjs +++ b/scripts/live-required/tangle-sandbox-braid-stress.mjs @@ -116,6 +116,13 @@ function continuityResponsePath(coordinates) { return `.braid-live/${coordinates.proofId}/continuity-response.txt` } +export function executionAttemptLedgerPath(proofId) { + if (typeof proofId !== 'string' || proofId.length === 0) { + throw new Error('Execution-attempt ledger paths require a proof ID') + } + return `.braid-live/${proofId}/execution-attempts.log` +} + export function sandboxWorkspaceRelativePath(path) { const normalized = path.startsWith('./') ? path.slice(2) : path const segments = normalized.split('/') @@ -134,6 +141,30 @@ function sha256(value) { return createHash('sha256').update(value).digest('hex') } +export function assertSingleExecutionAttemptLedger(value, expectedAttempt) { + assert.equal(typeof value, 'string', 'Execution-attempt ledger was not readable') + assert.equal(typeof expectedAttempt, 'string', 'Execution-attempt ledger has no expected attempt') + const normalized = value.replaceAll('\r\n', '\n') + assert.equal( + normalized.endsWith('\n'), + true, + 'Execution-attempt ledger did not end with a newline', + ) + const lines = normalized.slice(0, -1).split('\n') + assert.equal( + lines.length, + 1, + `Execution-attempt ledger recorded ${lines.length} attempts; expected exactly one`, + ) + assert.equal(lines[0], expectedAttempt, 'Execution-attempt ledger recorded the wrong attempt') + return { + lineCount: lines.length, + expectedDigest: `sha256:${sha256(`${expectedAttempt}\n`)}`, + observedDigest: `sha256:${sha256(normalized)}`, + matched: true, + } +} + export function continuityDigestMatches(value, expectedDigest) { return value === expectedDigest || value === `${expectedDigest}\n` } @@ -146,11 +177,13 @@ function proofPrompts(coordinates, holdMs) { const path = workspaceMarkerPath(coordinates) const challengePath = continuityChallengePath(coordinates) const responsePath = continuityResponsePath(coordinates) + const attemptPath = executionAttemptLedgerPath(coordinates.proofId) const holdSeconds = Math.max(5, Math.ceil(holdMs / 1000)) return { first: [ 'Use the current Tangle Sandbox working directory for every command in this turn.', `Create ${path} and write exactly ${coordinates.marker} followed by a newline.`, + `Run a shell command with append redirection (>>) that writes exactly ${coordinates.executionAttempt} followed by a newline to ${attemptPath}; never overwrite this file.`, `Read ${path}, print its contents, and prove the workspace is usable with a shell command.`, 'Run git -C . rev-parse --is-inside-work-tree. If it fails, run git -C . init.', 'Then run git -C . rev-parse --is-inside-work-tree again and print its result.', @@ -187,6 +220,47 @@ async function retainedBox(client, controlRef, label) { return box } +export async function readRetainedWorkspaceFile( + client, + controlRef, + path, + { label = 'Workspace file read', allowMissing = false } = {}, +) { + const box = await retainedBox(client, controlRef, label) + const relativePath = sandboxWorkspaceRelativePath(path) + let value + try { + value = await box.read(relativePath) + } catch (error) { + if (allowMissing) return undefined + throw error + } + return { environmentId: box.id, path: relativePath, value } +} + +export function providerWorkspaceReadbackEvidence( + observation, + expectedValue, + label = 'provider-bound readback', +) { + assert.ok(observation && typeof observation === 'object', `${label} observation is missing`) + assert.equal(typeof observation.environmentId, 'string', `${label} omitted environment identity`) + assert.equal(typeof observation.path, 'string', `${label} omitted workspace path`) + assert.equal(typeof observation.value, 'string', `${label} did not return file bytes`) + assert.equal(observation.value, expectedValue, `${label} did not match the expected remote bytes`) + return { + provider: 'tangle-sandbox', + source: 'sandbox-workspace-read', + environmentId: observation.environmentId, + path: observation.path, + expectedDigest: `sha256:${sha256(expectedValue)}`, + observedDigest: `sha256:${sha256(observation.value)}`, + bytes: Buffer.byteLength(observation.value), + matched: true, + localEchoOnly: false, + } +} + async function prepareContinuityChallenge(client, controlRef, coordinates) { const box = await retainedBox(client, controlRef, 'Continuity challenge setup') const challenge = randomBytes(32).toString('hex') @@ -226,11 +300,17 @@ async function listAllSandboxes(client) { async function verifyRetainedWorkspace(client, controlRef, coordinates, continuity) { const box = await retainedBox(client, controlRef, 'Workspace verification') const markerPath = workspaceMarkerPath(coordinates) + const attemptPath = executionAttemptLedgerPath(coordinates.proofId) const expectedMarker = `${coordinates.marker}\n` - const [readValue, continuityResponse] = await Promise.all([ + const [readValue, continuityResponse, attemptValue] = await Promise.all([ box.read(sandboxWorkspaceRelativePath(markerPath)), box.read(sandboxWorkspaceRelativePath(continuity.responsePath)), + box.read(sandboxWorkspaceRelativePath(attemptPath)), ]) + const executionAttempt = assertSingleExecutionAttemptLedger( + attemptValue, + coordinates.executionAttempt, + ) const git = await box.exec( `set -eu; test "$(cat -- ${shellQuote(markerPath)})" = ${shellQuote(coordinates.marker)}; test "$(cat -- ${shellQuote(continuity.responsePath)})" = ${shellQuote(continuity.expectedDigest)}; test "$(git -C . rev-parse --is-inside-work-tree)" = true; git -C . status --short --untracked-files=no`, ) @@ -257,6 +337,10 @@ async function verifyRetainedWorkspace(client, controlRef, coordinates, continui markerPath, readValue, readMatched: readValue === expectedMarker, + executionAttempt: { + path: attemptPath, + ...executionAttempt, + }, continuity: { challengePath: continuity.path, responsePath: continuity.responsePath, @@ -565,14 +649,18 @@ async function deleteOwnedResource(client, box, predicate) { return { id: box.id, attempts, confirmed: false } } -async function cleanupOwnedRetainedResources(client, { controlRef, firstRunId, operationId }) { +export async function cleanupOwnedRetainedResources( + client, + { controlRef, firstRunId, operationId } = {}, +) { if (!client) { throw new MissingIntegrationError('Retained Sandbox cleanup has no authenticated client', { required: 'the execution Sandbox credential', }) } const expectedSessionId = - typeof firstRunId === 'string' ? `session-braid-${safeExecutionId(firstRunId)}` : undefined + controlRef?.sessionId ?? + (typeof firstRunId === 'string' ? `session-braid-${safeExecutionId(firstRunId)}` : undefined) const predicate = (box) => (controlRef !== undefined && retainedResourceIdentity(box, controlRef)) || (expectedSessionId !== undefined && @@ -613,7 +701,7 @@ async function cleanupOwnedRetainedResources(client, { controlRef, firstRunId, o } } -async function usage(client, phase) { +export async function usage(client, phase) { if (!client) return { phase, value: undefined, error: undefined } try { return { phase, value: await client.usage(), error: undefined } @@ -640,7 +728,7 @@ function accountIdentityDigest(value) { return createHash('sha256').update(`${value.customerId}:${value.billingOwnerId}`).digest('hex') } -function publicAccountIdentityEvidence(value) { +export function publicAccountIdentityEvidence(value) { return { identityDigest: accountIdentityDigest(value), ...(typeof value.billingDelegationAuthorized === 'boolean' @@ -649,7 +737,7 @@ function publicAccountIdentityEvidence(value) { } } -async function accountIdentity(client, phase) { +export async function accountIdentity(client, phase) { if (!client) return { phase, value: undefined, error: undefined } try { return { phase, value: publicAccountIdentity(await client.getIdentity()), error: undefined } @@ -658,7 +746,7 @@ async function accountIdentity(client, phase) { } } -function assertStableAccountIdentity(records) { +export function assertStableAccountIdentity(records) { const before = records.find((entry) => entry.phase === 'before') const after = records.find((entry) => entry.phase === 'after') if (!before?.value?.customerId || !before.value.billingOwnerId) { @@ -873,6 +961,29 @@ export function spendDisclosure(runs) { } } +export function singleRunSpendDisclosure(run, label = 'interactive-run') { + const row = runSpend(run, label) + return { + scope: 'the unique local run in this cloud proof', + rows: [row], + totals: { + tokens: { + observedRuns: row.tokens.status === 'observed' ? 1 : 0, + unavailableRuns: row.tokens.status === 'unavailable' ? 1 : 0, + missingRuns: row.tokens.status === 'missing' ? 1 : 0, + input: row.tokens.status === 'observed' ? row.tokens.input : 0, + output: row.tokens.status === 'observed' ? row.tokens.output : 0, + }, + cost: { + observedRuns: row.cost.status === 'observed' ? 1 : 0, + unavailableRuns: row.cost.status === 'unavailable' ? 1 : 0, + missingRuns: row.cost.status === 'missing' ? 1 : 0, + usd: row.cost.status === 'observed' ? row.cost.usd : 0, + }, + }, + } +} + export function telemetryDisclosure( run, state, @@ -1072,7 +1183,11 @@ export async function runBraidSandboxStress({ requireZeroActiveResourceDelta = false, } = {}) { const startedAt = performance.now() - const coordinates = proofCoordinates() + const baseCoordinates = proofCoordinates() + const coordinates = { + ...baseCoordinates, + executionAttempt: `ATTEMPT_${baseCoordinates.proofId.replaceAll(/[^A-Za-z0-9]/gu, '_')}`, + } const ids = operationIds(coordinates.proofId) const holdMs = numberEnvironment( environment, diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 618cfd7f..9bdce9bc 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -5,10 +5,17 @@ import { PROOF_OPERATIONS, proofReceipt } from '../scripts/live-required/contrac import { MULTIRUN_REQUIRED_PHASES } from '../scripts/live-required/multirun-contract.mjs' import { runSandbox, runTangleFlows } from '../scripts/live-required/tangle.mjs' import { + assertInteractiveOwnedResourceCleanup, + assertProviderBoundEvidence, + assertInteractiveTelemetry, finalizeInteractiveProof, interactiveFailureMessages, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' -import { cleanupRetainedResourceByRunId } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' +import { + assertSingleExecutionAttemptLedger, + cleanupOwnedRetainedResources, + cleanupRetainedResourceByRunId, +} from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' const repository = resolve(new URL('../', import.meta.url).pathname) @@ -191,6 +198,15 @@ function passedInteractiveProof( sandbox: {}, identityContinuity: {}, processCleanup: {}, + providerEvidence: {}, + executionAttempt: {}, + usage: {}, + accountIdentities: {}, + accountIdentityConsistency: {}, + usageDelta: {}, + telemetry: {}, + spend: {}, + timing: {}, }, } = {}, ) { @@ -229,6 +245,15 @@ function passedInteractiveProof( processExitedBeforeWorkspaceCleanup: true, terminalResize: true, processGroupExitedBeforeWorkspaceCleanup: true, + providerInput: true, + providerReconnect: true, + singleProviderExecutionAttempt: true, + exactOwnedResourceSetCleanup: true, + accountIdentityStable: true, + activeResourceDelta: 0, + telemetryComplete: true, + spendDisclosed: true, + latencyObserved: true, }, checks: [ 'packed-binary', @@ -245,6 +270,15 @@ function passedInteractiveProof( 'exact-resource-cleanup', 'process-exited-before-cleanup', 'process-group-exited-before-cleanup', + 'provider-bound-input', + 'provider-bound-reconnect', + 'single-provider-execution-attempt', + 'exact-owned-resource-set-cleanup', + 'account-identity-stable', + 'active-resource-delta', + 'telemetry-complete', + 'spend-disclosed', + 'latency-observed', ], observations, }), @@ -372,6 +406,73 @@ test('LIVE-08 rejects status-only observations from a passed receipt', () => { ) }) +test('LIVE-08 rejects input evidence that only observed local terminal echo', () => { + assert.throws( + () => + assertProviderBoundEvidence( + { + provider: 'tangle-sandbox', + source: 'sandbox-workspace-read', + providerObserved: false, + localEchoOnly: true, + }, + 'interactive input', + ), + /provider-bound/u, + ) +}) + +test('LIVE-08 rejects missing telemetry and latency status', () => { + assert.throws( + () => + assertInteractiveTelemetry( + { completeDisclosure: true, fields: { environment: { status: 'missing' } } }, + undefined, + undefined, + ), + /missing fields/u, + ) +}) + +test('LIVE-07 and LIVE-08 reject duplicate provider execution attempts', () => { + assert.throws( + () => assertSingleExecutionAttemptLedger('attempt-1\nattempt-1\n', 'attempt-1'), + /exactly one/u, + ) +}) + +test('LIVE-08 cleanup census finds and reports duplicate owned resources', async () => { + const controlRef = { sessionId: 'session-duplicate', environmentId: 'sandbox-primary' } + const boxes = ['sandbox-primary', 'sandbox-duplicate'].map((id) => ({ + id, + name: 'braid-session-duplicate', + metadata: { + owner: 'braid', + lifecycle: 'retained', + providerSessionId: 'session-duplicate', + }, + deleted: false, + async delete() { + this.deleted = true + }, + })) + const client = { + async list() { + return boxes.filter((box) => !box.deleted) + }, + async get(id) { + return boxes.find((box) => box.id === id && !box.deleted) ?? null + }, + } + const cleanup = await cleanupOwnedRetainedResources(client, { controlRef }) + assert.equal(cleanup.confirmed, true) + assert.equal(cleanup.matchedCount, 2) + assert.throws( + () => assertInteractiveOwnedResourceCleanup(cleanup, controlRef.environmentId), + /expected one/u, + ) +}) + test('LIVE-08 reports sanitized nested proof and cleanup failures', () => { const secret = 'live-interactive-secret' const failure = new AggregateError( diff --git a/test/tangle-sandbox-braid-soak-script.test.mjs b/test/tangle-sandbox-braid-soak-script.test.mjs index d90f7978..02d851d0 100644 --- a/test/tangle-sandbox-braid-soak-script.test.mjs +++ b/test/tangle-sandbox-braid-soak-script.test.mjs @@ -1,7 +1,10 @@ import assert from 'node:assert/strict' import test from 'node:test' import { setTimeout as delay } from 'node:timers/promises' -import { runBraidSandboxSoak } from '../scripts/live-required/tangle-sandbox-braid-soak.mjs' +import { + proofFailures, + runBraidSandboxSoak, +} from '../scripts/live-required/tangle-sandbox-braid-soak.mjs' function mergeRecords(base, override) { if ( @@ -269,6 +272,11 @@ function passedProof(index, overrides = {}) { readMatched: true, continuity: { matched: true }, git: { exitCode: 0 }, + executionAttempt: { + path: `.braid-live/proof-${index}/execution-attempts.log`, + lineCount: 1, + matched: true, + }, resourceSample: { status: 'observed', value: { activeSandboxes: 0 } }, }, followUpEvidence: { @@ -469,6 +477,21 @@ test('sandbox soak rejects a passed proof with missing durable retained fields', assert.ok(result.failures.some((failure) => /replay\.resumeFromCursor/u.test(failure))) }) +test('sandbox soak rejects a provider execution-attempt ledger with two lines', () => { + const failures = proofFailures( + mergeRecords(passedProof(0), { + workspaceVerification: { + executionAttempt: { + path: '.braid-live/proof-0/execution-attempts.log', + lineCount: 2, + matched: false, + }, + }, + }), + ) + assert.ok(failures.some((failure) => /exactly-once/u.test(failure))) +}) + test('sandbox soak does not attribute shared account churn to exact owned resources', async () => { const result = await runBraidSandboxSoak({ runs: 3, From 60d3e3ee11fd7b12a23e821968f8dd6321d41b47 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 15:44:09 -0600 Subject: [PATCH 045/136] style(live): normalize proof imports --- scripts/live-required/tangle-sandbox-braid-interactive.mjs | 6 +++--- test/tangle-live07-wiring.test.mjs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index f2cf9101..d1007a82 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -39,15 +39,15 @@ import { rpcState, } from './headless.mjs' import { - assertVerifiedProcessCleanup, + accountIdentity, assertSingleExecutionAttemptLedger, assertStableAccountIdentity, + assertVerifiedProcessCleanup, cleanupOwnedRetainedResources, - accountIdentity, executionAttemptLedgerPath, observeRetainedResource, - publicAccountIdentityEvidence, providerWorkspaceReadbackEvidence, + publicAccountIdentityEvidence, readRetainedWorkspaceFile, singleRunSpendDisclosure, telemetryDisclosure, diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 9bdce9bc..e6a49a5d 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -6,8 +6,8 @@ import { MULTIRUN_REQUIRED_PHASES } from '../scripts/live-required/multirun-cont import { runSandbox, runTangleFlows } from '../scripts/live-required/tangle.mjs' import { assertInteractiveOwnedResourceCleanup, - assertProviderBoundEvidence, assertInteractiveTelemetry, + assertProviderBoundEvidence, finalizeInteractiveProof, interactiveFailureMessages, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' From ff6904ff54f4df8191d2f7e3027da96c71eed4a2 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 15:54:05 -0600 Subject: [PATCH 046/136] fix(supervision): drop inert credential reference --- scripts/live-required.test.mjs | 5 ----- scripts/live-required/supervisor.mjs | 2 -- 2 files changed, 7 deletions(-) diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index 4a39076a..e927a058 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -122,7 +122,6 @@ function protectedEnvironment() { 'BRAID_SUPERVISOR_CONNECTION_ID', 'BRAID_SUPERVISOR_CONNECTION_KIND', 'BRAID_SUPERVISOR_CREDENTIAL_CONFIGURED', - 'BRAID_SUPERVISOR_CREDENTIAL_REF', 'BRAID_SUPERVISOR_API_KEY', 'BRAID_SUPERVISOR_AUTH', 'BRAID_SUPERVISOR_BEARER', @@ -457,7 +456,6 @@ test('LIVE-11 resolves caller-owned task, connection, and generic worker input', BRAID_SUPERVISOR_ENDPOINT: 'https://sandbox.example/v1', BRAID_SUPERVISOR_API_KEY: 'supervisor-api-key-fixture', BRAID_SUPERVISOR_CONNECTION_KIND: 'tangle-sandbox', - BRAID_SUPERVISOR_CREDENTIAL_REF: 'cred:v1:supervisor-fixture', BRAID_SUPERVISOR_WORKSPACE: '/tmp/supervisor-fixture-workspace', BRAID_SUPERVISOR_WORKER_NAME: 'retained-worker-fixture', } @@ -466,7 +464,6 @@ test('LIVE-11 resolves caller-owned task, connection, and generic worker input', endpoint: 'https://sandbox.example/v1', apiKey: 'supervisor-api-key-fixture', kind: 'tangle-sandbox', - credentialRef: 'cred:v1:supervisor-fixture', }) assert.deepEqual(supervisorWorkerEnvironment(environment, 'invocation-fixture'), { workspace: { cwd: '/tmp/supervisor-fixture-workspace' }, @@ -1127,7 +1124,6 @@ test('supervisor proof provisions an owned Runtime run and validates cleanup', a const environment = { ...protectedEnvironment(), BRAID_SUPERVISOR_ENDPOINT: 'https://router.example/v1', - BRAID_SUPERVISOR_CREDENTIAL_REF: 'cred:v1:supervisor-proof', BRAID_SUPERVISOR_WORKSPACE: '/tmp/supervisor-proof-workspace', BRAID_SUPERVISOR_TASK: 'Inspect the provisioned worker', BRAID_SUPERVISOR_API_KEY: 'must-not-cross-the-provision-boundary', @@ -1183,7 +1179,6 @@ test('supervisor proof provisions an owned Runtime run and validates cleanup', a endpoint: 'https://router.example/v1', apiKey: 'must-not-cross-the-provision-boundary', kind: 'tangle-sandbox', - credentialRef: 'cred:v1:supervisor-proof', }) assert.deepEqual(provisionRequest.workerEnvironment, { workspace: { cwd: '/tmp/supervisor-proof-workspace' }, diff --git a/scripts/live-required/supervisor.mjs b/scripts/live-required/supervisor.mjs index 4e881ab0..5d11583c 100644 --- a/scripts/live-required/supervisor.mjs +++ b/scripts/live-required/supervisor.mjs @@ -346,14 +346,12 @@ export function supervisorConnection(environment) { 'PROTECTED_CREDENTIAL_REQUIRED', 'LIVE-11 supervisor requires BRAID_SUPERVISOR_API_KEY, BRAID_SUPERVISOR_AUTH, BRAID_SUPERVISOR_BEARER, or TANGLE_API_KEY', ) - const credentialRef = firstConfigured(environment, ['BRAID_SUPERVISOR_CREDENTIAL_REF']) const kind = environment.BRAID_SUPERVISOR_CONNECTION_KIND?.trim() || DEFAULT_SUPERVISOR_CONNECTION_KIND return { endpoint, apiKey, kind, - ...(credentialRef === undefined ? {} : { credentialRef }), } } From f0a03fdabaa6815686d39db735d459826b5fbe73 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 16:54:05 -0600 Subject: [PATCH 047/136] feat(confidential-attestation): verify Nitro trust policy --- THIRD_PARTY_NOTICES.md | 1 + docs/components/workspace-branching.md | 44 +- package.json | 17 +- pnpm-workspace.yaml | 14 +- scripts/live-required/contracts.mjs | 2 +- scripts/live-required/headless.mjs | 2 + .../live-required/tangle-workspace-proof.mjs | 231 +++++----- scripts/run-tests.mjs | 3 + src/adapters/connections/aws-nitro-root-g1.ts | 25 ++ .../nitro-confidential-attestation.ts | 375 ++++++++++++++++ .../production-connection-providers.ts | 11 +- .../production-connection-types.ts | 5 + .../connections/production-connections.ts | 9 + .../production-tangle-sandbox-backend.ts | 11 +- src/app/connections.ts | 18 + src/app/production-composition.ts | 13 +- src/domain/entities-core.ts | 15 + src/domain/invariants-profile.ts | 59 ++- src/index.ts | 9 + test/fixtures/aws-nitro-document.cbor | Bin 0 -> 4461 bytes test/nitro-confidential-attestation.test.ts | 399 ++++++++++++++++++ test/tangle-workspace-proof.test.mjs | 77 +++- 22 files changed, 1200 insertions(+), 140 deletions(-) create mode 100644 src/adapters/connections/aws-nitro-root-g1.ts create mode 100644 src/adapters/connections/nitro-confidential-attestation.ts create mode 100644 test/fixtures/aws-nitro-document.cbor create mode 100644 test/nitro-confidential-attestation.test.ts diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index b9592002..ad152a4d 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -25,6 +25,7 @@ Before copied or substantially adapted code is committed, add one row below with | `test/support/virtual-terminal.ts` | [`earendil-works/pi`, `packages/tui/test/virtual-terminal.ts`](https://github.com/earendil-works/pi/blob/a6f7317dfca61e357aee65faafe012a1be6c3734/packages/tui/test/virtual-terminal.ts) | `a6f7317dfca61e357aee65faafe012a1be6c3734` | MIT, Copyright (c) 2025 Mario Zechner | Changed imports to the published Pi TUI package and applied Braid formatting; production code does not include this file. | | `src/views/tui/selector.ts` | [`earendil-works/pi`, `packages/tui/src/components/select-list.ts`](https://github.com/earendil-works/pi/blob/a6f7317dfca61e357aee65faafe012a1be6c3734/packages/tui/src/components/select-list.ts) | `a6f7317dfca61e357aee65faafe012a1be6c3734` | MIT, Copyright (c) 2025 Mario Zechner | Reuses Pi's pinned column-width and truncation calculations to mark description overflow while preserving the shared selector behavior. | | `scripts/live-bridge/windows-job-host-source.mjs` | [`dotnet/aspire`, `src/Aspire.Cli/Processes/WindowsConsoleProcessJob.cs` and `WindowsProcessInterop.cs`](https://github.com/dotnet/aspire/tree/be77aa36daf995fae0e72091141410c7082fcba3/src/Aspire.Cli/Processes) | `be77aa36daf995fae0e72091141410c7082fcba3` | MIT, Copyright (c) .NET Foundation and contributors | Adapted atomic Job Object attachment, kill-on-close containment, and active-process drain checks for Braid's Windows release proof. | +| `test/fixtures/aws-nitro-document.cbor` | [`anchorageoss/awsnitroverifier`, `testdata/aws_nitro_document.cbor`](https://github.com/anchorageoss/awsnitroverifier/blob/2605f002296b40eadfee3c832c4826237147fa29/testdata/aws_nitro_document.cbor) | `2605f002296b40eadfee3c832c4826237147fa29` | Apache-2.0 (the upstream repository's full license text applies; it publishes no additional NOTICE file) | Public AWS Nitro COSE_Sign1 fixture used for deterministic adapter verification and mutation tests. | The original copyright and license notice must remain with every substantial copied portion. diff --git a/docs/components/workspace-branching.md b/docs/components/workspace-branching.md index ac7bbd45..ac4dde27 100644 --- a/docs/components/workspace-branching.md +++ b/docs/components/workspace-branching.md @@ -40,11 +40,31 @@ The request records `requested` placement separately from provider evidence. The Tangle adapter calls `getTeeAttestation` on the forked Sandbox child. -An operator-supplied verifier must validate the raw provider quote, provider key, nonce, and measurement. +The selected `tangle-sandbox` connection carries an immutable, public Nitro trust policy. -The adapter rejects a missing key, a copied quote, an invalid nonce, or an untrusted measurement. +The policy requires non-empty SHA-256 measurement and policy identifier allowlists. -Braid marks `confidentialVerified` only after the canonical external verifier accepts the complete attestation. +The policy also sets a bounded maximum age for signed and provider timestamps. + +The startup configuration persists this policy with the connection record. + +Credentials, quotes, certificates, and executable module paths never enter that record. + +The adapter pins the AWS Nitro Enclaves Root-G1 certificate and checks its SHA-256 fingerprint at construction. + +The adapter parses the provider report and the CBOR/COSE document through the published Tangle attestation package. + +The adapter verifies the certificate chain, COSE signature, exact nonce, raw measurement, signed-document age, and bindings. + +The adapter derives `providerKeyId` from the verified leaf certificate fingerprint. + +The adapter derives `providerSignature` from the verified COSE signature bytes. + +The canonical replay path decodes the persisted quote and repeats every check. + +Replay also requires the persisted provider key and signature to match the derived identities. + +Braid marks `confidentialVerified` only after this canonical verifier accepts the complete attestation. The request and attestation remain unverified when either verifier or attestation evidence is absent. @@ -64,19 +84,25 @@ The request and attestation remain unverified when either verifier or attestatio `LIVE-09` requires source materialization, checkpoint lookup, fork lookup, restart replay, independent destination mutation, unchanged source content, and exact cleanup. -`LIVE-10` requires a configured external verifier, a valid attestation, missing-attestation rejection, wrong-nonce rejection, wrong-measurement rejection, and exact cleanup. +`LIVE-10` requires the typed Nitro policy, a valid attestation, missing-attestation rejection, wrong-nonce rejection, wrong-measurement rejection, and exact cleanup. The built-in proofs run through Braid application and connection adapters. They do not import the Sandbox SDK or call Sandbox methods directly. -Set `BRAID_TANGLE_TEE_VERIFIER_MODULE` to an absolute or repository-relative module for `LIVE-10`. +Set `BRAID_TANGLE_CONFIDENTIAL_MEASUREMENTS` to the accepted canonical `sha256:` measurements. + +Set `BRAID_TANGLE_CONFIDENTIAL_POLICY_IDS` to the accepted policy identifiers. -That module must export `verifyTeeAttestation(input)` and `verifyConfidentialAttestation(attestation, expected)`. +Set `BRAID_TANGLE_CONFIDENTIAL_POLICY_ID` to the selected identifier from that allowlist. -The first function returns `{ providerKeyId, providerSignature, measurement? }` only after raw quote verification. +Set `BRAID_TANGLE_CONFIDENTIAL_MAX_AGE_SECONDS` to the bounded freshness limit. -The second function returns `true` only after canonical nonce, measurement, policy, and provider-key checks. +LIVE-10 persists these values as the selected connection's typed trust policy. + +The production composition constructs the same Nitro verifier factory for provider admission and replay. + +No arbitrary verifier module is loaded or executed. Missing credentials, deployment capability, or verifier configuration returns typed unavailable evidence. @@ -88,6 +114,8 @@ Configured provider failures remain failed and never become simulated passes. `test/tangle-workspace-proof.test.mjs` proves the confidential negative checks reject nonce, measurement, and self-echo mutations. +`test/nitro-confidential-attestation.test.ts` proves COSE verification, identity derivation, mutation rejection, freshness, persistence, migration, replay, and secret-free snapshots. + The protected live matrix validates both receipts against the public evidence schema. ## Non-goals diff --git a/package.json b/package.json index c14c6110..1704d701 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@tangle-network/braid", - "version": "0.2.2", + "version": "0.3.0", "description": "A universal terminal interface for portable agent profiles", "type": "module", "bin": { @@ -99,14 +99,15 @@ }, "dependencies": { "@dataiku/uv": "0.12.0", - "@earendil-works/pi-tui": "0.84.2", + "@earendil-works/pi-tui": "0.84.3", "@napi-rs/keyring": "1.3.0", - "@tangle-network/agent-eval": "0.163.2", - "@tangle-network/agent-interface": "1.4.0", - "@tangle-network/agent-provider-cli-bridge": "0.9.5", - "@tangle-network/agent-provider-tangle": "0.13.1", - "@tangle-network/agent-runtime": "0.153.2", - "@tangle-network/sandbox": "0.31.0", + "@tangle-network/agent-eval": "0.170.0", + "@tangle-network/agent-interface": "1.7.1", + "@tangle-network/agent-provider-cli-bridge": "0.9.6", + "@tangle-network/agent-provider-tangle": "0.14.1", + "@tangle-network/agent-runtime": "0.177.0", + "@tangle-network/sandbox": "0.34.0", + "@tangle-network/tcloud-attestation": "0.1.1", "better-sqlite3-multiple-ciphers": "13.0.3", "chalk": "6.0.0", "koffi": "3.1.4" diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8af75be9..708f90b3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -9,14 +9,14 @@ allowBuilds: node-pty: true ignoreScripts: false minimumReleaseAgeExclude: - - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2' - - '@tangle-network/agent-eval@0.143.0 || 0.144.0 || 0.144.1 || 0.144.3 || 0.144.4 || 0.144.6 || 0.144.8 || 0.144.10 || 0.144.11 || 0.144.13 || 0.145.0 || 0.145.1 || 0.145.2 || 0.145.3 || 0.145.9 || 0.145.10 || 0.145.11 || 0.145.14 || 0.145.15 || 0.145.21 || 0.149.0 || 0.163.2' - - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0' + - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0' + - '@tangle-network/agent-eval@0.143.0 || 0.144.0 || 0.144.1 || 0.144.3 || 0.144.4 || 0.144.6 || 0.144.8 || 0.144.10 || 0.144.11 || 0.144.13 || 0.145.0 || 0.145.1 || 0.145.2 || 0.145.3 || 0.145.9 || 0.145.10 || 0.145.11 || 0.145.14 || 0.145.15 || 0.145.21 || 0.149.0 || 0.163.2 || 0.170.0' + - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0 || 1.7.0 || 1.7.1' - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0' - '@tangle-network/agent-profile-materialize@0.10.2 || 0.13.1 || 0.14.0 || 0.14.2 || 0.15.1 || 0.15.2 || 0.17.1' - - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5' - - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1' - - '@tangle-network/sandbox@0.30.1 || 0.31.0' + - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6' + - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1' + - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0' - hono@4.13.0 - '@esbuild/aix-ppc64@0.28.2' - '@esbuild/android-arm64@0.28.2' @@ -46,4 +46,4 @@ minimumReleaseAgeExclude: - '@esbuild/win32-x64@0.28.2' - esbuild@0.28.2 - '@tangle-network/agent-core@0.5.4 || 0.6.0 || 0.6.1 || 0.7.1 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.4' - - '@earendil-works/pi-tui@0.84.2' + - '@earendil-works/pi-tui@0.84.2 || 0.84.3' diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index ac360d43..c03e2e93 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -76,7 +76,7 @@ const PROOF_OPERATION_CHECKS = Object.freeze({ ]), [PROOF_OPERATIONS.tangleConfidential]: Object.freeze([ 'configuration', - 'external-verifier', + 'nitro-attestation', 'requested-unverified-binding', 'missing-attestation', 'valid-attestation', diff --git a/scripts/live-required/headless.mjs b/scripts/live-required/headless.mjs index 3068094b..7b3760b1 100644 --- a/scripts/live-required/headless.mjs +++ b/scripts/live-required/headless.mjs @@ -249,6 +249,7 @@ export async function prepareProductionWorkspace({ provider, connectionName, providerOptions = {}, + confidentialAttestationPolicy, credentialRef, credentialValue, credentialContextFactory, @@ -280,6 +281,7 @@ export async function prepareProductionWorkspace({ name: connectionName ?? `Live ${kind}`, endpoint, ...(selectedCredentialId === undefined ? {} : { credentialRef: selectedCredentialId }), + ...(confidentialAttestationPolicy === undefined ? {} : { confidentialAttestationPolicy }), providerOptions: { ...providerOptions, transport: 'https' }, createdAt: now, updatedAt: now, diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index 744f664a..9c17d6c5 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -1,5 +1,5 @@ import { createHash, randomUUID } from 'node:crypto' -import { dirname, isAbsolute, join, resolve } from 'node:path' +import { dirname, join, resolve } from 'node:path' import { fileURLToPath, pathToFileURL } from 'node:url' import { @@ -64,6 +64,95 @@ function idleTtlSeconds(environment) { return candidate } +const MAX_CONFIDENTIAL_POLICY_ITEMS = 256 +const MAX_CONFIDENTIAL_ATTESTATION_AGE_SECONDS = 86_400 +const SHA256_DIGEST_PATTERN = /^sha256:[0-9a-f]{64}$/u +const POLICY_ID_PATTERN = /^[A-Za-z][A-Za-z0-9._:-]{0,255}$/u + +function configuredList(environment, name) { + const value = environment[name] + if (typeof value !== 'string' || value.trim().length === 0) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_TRUST_POLICY_REQUIRED', + `LIVE-10 requires ${name} as a comma-separated non-secret allowlist`, + ) + } + const values = value.split(',').map((entry) => entry.trim()) + if ( + values.length === 0 || + values.length > MAX_CONFIDENTIAL_POLICY_ITEMS || + values.some((entry) => entry.length === 0) + ) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_TRUST_POLICY_INVALID', + `${name} must contain one to ${MAX_CONFIDENTIAL_POLICY_ITEMS} values`, + ) + } + return values +} + +export function parseConfidentialTrustPolicy(environment) { + const acceptedMeasurements = configuredList(environment, 'BRAID_TANGLE_CONFIDENTIAL_MEASUREMENTS') + if (acceptedMeasurements.some((entry) => !SHA256_DIGEST_PATTERN.test(entry))) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_TRUST_POLICY_INVALID', + 'BRAID_TANGLE_CONFIDENTIAL_MEASUREMENTS must contain canonical sha256 digests', + ) + } + if (new Set(acceptedMeasurements).size !== acceptedMeasurements.length) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_TRUST_POLICY_INVALID', + 'BRAID_TANGLE_CONFIDENTIAL_MEASUREMENTS must not contain duplicates', + ) + } + const acceptedPolicyIds = configuredList(environment, 'BRAID_TANGLE_CONFIDENTIAL_POLICY_IDS') + if (acceptedPolicyIds.some((entry) => !POLICY_ID_PATTERN.test(entry))) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_TRUST_POLICY_INVALID', + 'BRAID_TANGLE_CONFIDENTIAL_POLICY_IDS must contain canonical policy identifiers', + ) + } + if (new Set(acceptedPolicyIds).size !== acceptedPolicyIds.length) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_TRUST_POLICY_INVALID', + 'BRAID_TANGLE_CONFIDENTIAL_POLICY_IDS must not contain duplicates', + ) + } + const selectedPolicyId = + typeof environment.BRAID_TANGLE_CONFIDENTIAL_POLICY_ID === 'string' + ? environment.BRAID_TANGLE_CONFIDENTIAL_POLICY_ID.trim() + : environment.BRAID_TANGLE_CONFIDENTIAL_POLICY_ID + if ( + typeof selectedPolicyId !== 'string' || + !POLICY_ID_PATTERN.test(selectedPolicyId) || + !acceptedPolicyIds.includes(selectedPolicyId) + ) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_TRUST_POLICY_INVALID', + 'BRAID_TANGLE_CONFIDENTIAL_POLICY_ID must name an accepted policy id', + ) + } + const maxAgeSeconds = Number(environment.BRAID_TANGLE_CONFIDENTIAL_MAX_AGE_SECONDS) + if ( + !Number.isSafeInteger(maxAgeSeconds) || + maxAgeSeconds < 1 || + maxAgeSeconds > MAX_CONFIDENTIAL_ATTESTATION_AGE_SECONDS + ) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_TRUST_POLICY_INVALID', + `BRAID_TANGLE_CONFIDENTIAL_MAX_AGE_SECONDS must be an integer from 1 to ${MAX_CONFIDENTIAL_ATTESTATION_AGE_SECONDS}`, + ) + } + return Object.freeze({ + policy: Object.freeze({ + acceptedMeasurements: Object.freeze(acceptedMeasurements), + acceptedPolicyIds: Object.freeze(acceptedPolicyIds), + maxAgeSeconds, + }), + selectedPolicyId, + }) +} + function shellQuote(value) { return `'${String(value).replaceAll("'", "'\\''")}'` } @@ -127,93 +216,7 @@ async function runtimeModules(repository) { return { startup, application, credentials, connections, profiles } } -function verifierExports(moduleNamespace) { - const defaultExport = - moduleNamespace.default !== null && typeof moduleNamespace.default === 'object' - ? moduleNamespace.default - : undefined - return { ...(defaultExport ?? {}), ...moduleNamespace } -} - -/** - * Load the deployment's trust decision without inventing a local TEE verdict. - * - * The module must export `verifyTeeAttestation` and `verifyConfidentialAttestation`. - * The first checks the raw provider quote and returns provider key evidence. - * The second checks the canonical attestation against the deployment policy. - */ -export async function loadConfidentialVerifier(environment, repository = DEFAULT_REPOSITORY) { - const configured = - environment.BRAID_TANGLE_TEE_VERIFIER_MODULE ?? - environment.BRAID_TANGLE_CONFIDENTIAL_VERIFIER_MODULE - if (typeof configured !== 'string' || configured.trim().length === 0) { - throw unavailable( - 'PROTECTED_CONFIDENTIAL_VERIFIER_REQUIRED', - 'LIVE-10 requires BRAID_TANGLE_TEE_VERIFIER_MODULE with trusted provider-key and measurement checks', - ) - } - const modulePath = isAbsolute(configured) ? configured : resolve(repository, configured) - let loaded - try { - loaded = await import(pathToFileURL(modulePath).href) - } catch (error) { - throw unavailable( - 'PROTECTED_CONFIDENTIAL_VERIFIER_UNAVAILABLE', - `LIVE-10 could not load its configured confidential verifier module: ${modulePath}`, - error, - ) - } - const exports = verifierExports(loaded) - const raw = exports.verifyTeeAttestation - const canonical = exports.verifyConfidentialAttestation - if (typeof raw !== 'function' || typeof canonical !== 'function') { - throw unavailable( - 'PROTECTED_CONFIDENTIAL_VERIFIER_INVALID', - 'LIVE-10 verifier module must export verifyTeeAttestation and verifyConfidentialAttestation', - ) - } - return Object.freeze({ - raw: async (input) => { - const result = await raw(input) - if (result === null) return null - if (result === undefined || typeof result !== 'object' || Array.isArray(result)) return null - if ( - typeof result.providerKeyId !== 'string' || - result.providerKeyId.length === 0 || - result.providerKeyId === 'unverified' || - typeof result.providerSignature !== 'string' || - result.providerSignature.length === 0 || - result.providerSignature === 'unverified' - ) { - return null - } - return { - providerKeyId: result.providerKeyId, - providerSignature: result.providerSignature, - ...(result.measurement === undefined ? {} : { measurement: result.measurement }), - } - }, - canonical: (attestation, expected) => { - if ( - attestation === null || - typeof attestation !== 'object' || - Array.isArray(attestation) || - attestation.providerKeyId === 'unverified' || - attestation.providerSignature === 'unverified' || - attestation.providerSignature === attestation.quote - ) { - return false - } - try { - return canonical(attestation, expected) === true - } catch { - return false - } - }, - }) -} - -async function openProofApplication({ repository, config, verifier }) { +async function openProofApplication({ repository, config }) { const modules = await runtimeModules(repository) let context try { @@ -244,12 +247,6 @@ async function openProofApplication({ repository, config, verifier }) { const connectionOptions = { ...(startup.connectionOptions ?? {}), credentials: context.store, - ...(verifier?.raw === undefined - ? {} - : { tangleConfidentialAttestationVerifier: verifier.raw }), - ...(verifier?.canonical === undefined - ? {} - : { confidentialAttestationVerifier: verifier.canonical }), } const production = { ...startup, @@ -272,11 +269,18 @@ async function openProofApplication({ repository, config, verifier }) { await opened.close().catch(() => undefined) throw error } + const confidentialVerifiers = + connection.confidentialAttestationPolicy === undefined + ? undefined + : modules.connections.createNitroConfidentialAttestationVerifiers( + connection.confidentialAttestationPolicy, + ) return Object.freeze({ ...opened, startup, production, connection, + ...(confidentialVerifiers === undefined ? {} : { confidentialVerifiers }), modules, }) } catch (error) { @@ -285,6 +289,16 @@ async function openProofApplication({ repository, config, verifier }) { } } +function confidentialVerifiersFor(opened) { + if (opened.confidentialVerifiers === undefined) { + throw unavailable( + 'PROTECTED_CONFIDENTIAL_TRUST_POLICY_REQUIRED', + 'LIVE-10 selected a connection without a persisted Nitro trust policy', + ) + } + return opened.confidentialVerifiers +} + function providerAdapters(opened) { const { createTangleWorkspaceBranchingProvider, getTangleSandboxEnvironment } = opened.modules.connections @@ -575,9 +589,7 @@ async function runWorkspaceProof({ }) { const proofId = `${Date.now()}-${randomUUID().replaceAll('-', '')}` const startedAt = new Date().toISOString() - const verifier = confidential - ? await loadConfidentialVerifier(environment, repository) - : undefined + const trust = confidential ? parseConfidentialTrustPolicy(environment) : undefined const values = sandboxConfiguration(environment) const config = await prepareProductionWorkspace({ repository, @@ -594,6 +606,7 @@ async function runWorkspaceProof({ lifecycle: 'retained', idleTtlSeconds: idleTtlSeconds(environment), }, + ...(trust === undefined ? {} : { confidentialAttestationPolicy: trust.policy }), }) let opened let restarted @@ -612,7 +625,16 @@ async function runWorkspaceProof({ let completedResult let cleanupFailure try { - opened = await openProofApplication({ repository, config, verifier }) + opened = await openProofApplication({ repository, config }) + const verifier = confidential ? confidentialVerifiersFor(opened) : undefined + if (trust !== undefined) { + assertCondition( + opened.connection.confidentialAttestationPolicy?.acceptedPolicyIds.includes( + trust.selectedPolicyId, + ) === true, + 'LIVE-10 did not retain the selected policy id in the connection trust policy', + ) + } const adapters = providerAdapters(opened) source = await sendSource(opened.app, proofId) sourceBefore = await readWorkspace(adapters, source.providerId, source.path, 'source') @@ -632,7 +654,7 @@ async function runWorkspaceProof({ confidential: { requested: true, nonce: generateAttestationNonce(), - policy: 'tangle-confidential-v1', + policy: trust.selectedPolicyId, profileDigest: `sha256:${opened.modules.profiles.canonicalAgentProfileDigestHex(opened.app.state().profile)}`, }, } @@ -712,7 +734,8 @@ async function runWorkspaceProof({ await opened.close() opened = undefined - restarted = await openProofApplication({ repository, config, verifier }) + restarted = await openProofApplication({ repository, config }) + const restartedVerifier = confidential ? confidentialVerifiersFor(restarted) : undefined const restartedAdapters = providerAdapters(restarted) const replayBranch = await restarted.app.conversations.branches.execute({ ...planInput, @@ -745,7 +768,7 @@ async function runWorkspaceProof({ forkedEnvironmentConfidentialityVerified( resources.forkRequest, lookedUp.fork.environment, - verifier.canonical, + restartedVerifier.canonical, ), 'Canonical confidential attestation verification failed for the valid fork', ) @@ -753,7 +776,7 @@ async function runWorkspaceProof({ request: resources.forkRequest.confidential, environment: expected, attestation, - verifyProviderAttestation: verifier.canonical, + verifyProviderAttestation: restartedVerifier.canonical, }) assertCondition( negatives.missingAttestationRejected, @@ -862,7 +885,7 @@ async function runWorkspaceProof({ checks: confidential ? [ 'configuration', - 'external-verifier', + 'nitro-attestation', 'requested-unverified-binding', 'missing-attestation', 'valid-attestation', @@ -927,7 +950,7 @@ async function runWorkspaceProof({ if (source !== undefined) { if (cleanupOwner === undefined) { try { - cleanupOwner = await openProofApplication({ repository, config, verifier }) + cleanupOwner = await openProofApplication({ repository, config }) rescueOwner = true } catch (error) { cleanupError ??= error diff --git a/scripts/run-tests.mjs b/scripts/run-tests.mjs index ae0a4e64..8121154c 100644 --- a/scripts/run-tests.mjs +++ b/scripts/run-tests.mjs @@ -52,6 +52,7 @@ const scopeFiles = { 'eval.test.js', 'native-interactive-actions.test.js', 'native-interactive-run-broker.test.js', + 'nitro-confidential-attestation.test.js', 'observability.test.js', 'plain-accessibility.test.js', 'property.test.js', @@ -81,6 +82,7 @@ const scopeFiles = { 'reducer.test.js', 'scripts.test.js', 'tangle-retained-lifecycle.test.js', + 'nitro-confidential-attestation.test.js', 'usage-projection.test.js', 'w6-contract.test.js', ], @@ -138,6 +140,7 @@ const scopeFiles = { 'plain-accessibility.test.js', 'profile-connection-actions.test.js', 'profile-save-recovery.test.js', + 'nitro-confidential-attestation.test.js', 'run-event-mapper-stream-safety.test.js', 'sanitize.test.js', 'security.test.js', diff --git a/src/adapters/connections/aws-nitro-root-g1.ts b/src/adapters/connections/aws-nitro-root-g1.ts new file mode 100644 index 00000000..c4dec4e4 --- /dev/null +++ b/src/adapters/connections/aws-nitro-root-g1.ts @@ -0,0 +1,25 @@ +/** + * Official AWS Nitro Enclaves Root-G1 certificate. + * + * AWS publishes this certificate at + * https://aws-nitro-enclaves.amazonaws.com/AWS_NitroEnclaves_Root-G1.zip. + * The adapter checks the documented SHA-256 fingerprint before trusting it. + */ +export const AWS_NITRO_ENCLAVES_ROOT_G1_PEM = `-----BEGIN CERTIFICATE----- +MIICETCCAZagAwIBAgIRAPkxdWgbkK/hHUbMtOTn+FYwCgYIKoZIzj0EAwMwSTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoMBkFtYXpvbjEMMAoGA1UECwwDQVdTMRswGQYD +VQQDDBJhd3Mubml0cm8tZW5jbGF2ZXMwHhcNMTkxMDI4MTMyODA1WhcNNDkxMDI4 +MTQyODA1WjBJMQswCQYDVQQGEwJVUzEPMA0GA1UECgwGQW1hem9uMQwwCgYDVQQL +DANBV1MxGzAZBgNVBAMMEmF3cy5uaXRyby1lbmNsYXZlczB2MBAGByqGSM49AgEG +BSuBBAAiA2IABPwCVOumCMHzaHDimtqQvkY4MpJzbolL//Zy2YlES1BR5TSksfbb +48C8WBoyt7F2Bw7eEtaaP+ohG2bnUs990d0JX28TcPQXCEPZ3BABIeTPYwEoCWZE +h8l5YoQwTcU/9KNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUkCW1DdkF +R+eWw5b6cp3PmanfS5YwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYC +MQCjfy+Rocm9Xue4YnwWmNJVA44fA0P5W2OpYow9OYCVRaEevL8uO1XYru5xtMPW +rfMCMQCi85sWBbJwKKXdS6BptQFuZbT73o/gBh1qUxl/nNr12UO8Yfwr6wPLb+6N +IwLz3/Y= +-----END CERTIFICATE-----` + +/** SHA-256 fingerprint documented by AWS for the Root-G1 certificate. */ +export const AWS_NITRO_ENCLAVES_ROOT_G1_SHA256 = + 'sha256:641a0321a3e244efe456463195d606317ed7cdcc3c1756e09893f3c68f79bb5b' diff --git a/src/adapters/connections/nitro-confidential-attestation.ts b/src/adapters/connections/nitro-confidential-attestation.ts new file mode 100644 index 00000000..8765694c --- /dev/null +++ b/src/adapters/connections/nitro-confidential-attestation.ts @@ -0,0 +1,375 @@ +import { createHash, X509Certificate } from 'node:crypto' +import type { + ConfidentialAttestation, + ConfidentialAttestationVerifier, + ConfidentialExecutionEnvironment, + Sha256Digest, +} from '@tangle-network/agent-interface' +import { confidentialExecutionVerified, sha256Bytes } from '@tangle-network/agent-interface' +import type { + SandboxTeeAttestationReportLike, + TangleConfidentialAttestationVerification, + TangleConfidentialAttestationVerifier, +} from '@tangle-network/agent-provider-tangle' +import { + decodeTangleConfidentialAttestationQuote, + encodeTangleConfidentialAttestationQuote, +} from '@tangle-network/agent-provider-tangle' +import { + createNitroHardwareVerifier, + normalizeTeeType, + parseNitroAttestationDocument, + toHex, + verifyAttestation, +} from '@tangle-network/tcloud-attestation' +import type { ConfidentialAttestationTrustPolicy, ConnectionRecord } from '../../domain/entities.js' +import { + MAX_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS, + MIN_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS, +} from '../../domain/entities-core.js' +import { + AWS_NITRO_ENCLAVES_ROOT_G1_PEM, + AWS_NITRO_ENCLAVES_ROOT_G1_SHA256, +} from './aws-nitro-root-g1.js' + +const MAX_MEASUREMENT_BYTES = 48 +const MIN_NONCE_HEX_CHARS = 64 +const MAX_NONCE_HEX_CHARS = 128 +const MAX_NITRO_TIMESTAMP_SKEW_SECONDS = 60 +const POLICY_ID_PATTERN = /^[A-Za-z][A-Za-z0-9._:-]{0,255}$/u +const SHA256_DIGEST_PATTERN = /^sha256:[0-9a-f]{64}$/u +/** The trust policy is public and contains no credential or executable state. */ +export type NitroConfidentialAttestationTrustPolicy = ConfidentialAttestationTrustPolicy + +export interface NitroConfidentialAttestationVerifierOptions { + /** Unix seconds clock used by freshness and certificate checks. */ + readonly now?: () => number +} + +export interface NitroConfidentialAttestationVerifiers { + readonly policy: NitroConfidentialAttestationTrustPolicy + readonly tangle: TangleConfidentialAttestationVerifier + readonly canonical: ConfidentialAttestationVerifier +} + +interface ConfiguredConfidentialAttestationVerifiers { + readonly policy?: NitroConfidentialAttestationTrustPolicy + readonly tangle?: TangleConfidentialAttestationVerifier + readonly canonical?: ConfidentialAttestationVerifier +} + +interface RawNitroReport { + readonly tee_type: string + readonly evidence: readonly number[] + readonly measurement: readonly number[] + readonly timestamp: number +} + +interface VerifiedNitroEvidence { + readonly measurement: Sha256Digest + readonly providerKeyId: string + readonly providerSignature: string +} + +/** + * Build the one Nitro trust path used for provider admission and replay. + * + * The root is pinned before any verifier callback is returned. The callback + * never accepts a missing policy, an unverified quote, or a copied signature. + */ +export function createNitroConfidentialAttestationVerifiers( + policy: NitroConfidentialAttestationTrustPolicy, + options: NitroConfidentialAttestationVerifierOptions = {}, +): NitroConfidentialAttestationVerifiers { + const normalizedPolicy = normalizeNitroConfidentialAttestationTrustPolicy(policy) + const root = assertOfficialNitroRoot() + const nowSeconds = options.now ?? (() => Math.floor(Date.now() / 1000)) + + const verifyEvidence = ( + report: RawNitroReport, + attestation: ConfidentialAttestation, + expected: ConfidentialExecutionEnvironment, + ): VerifiedNitroEvidence | null => { + if (!canonicalBindingsMatch(attestation, expected)) return null + if (!normalizedPolicy.acceptedPolicyIds.includes(attestation.policy)) return null + if (!isCanonicalNonce(attestation.nonce)) return null + + const measurement = sha256Bytes(Uint8Array.from(report.measurement)) + if ( + measurement !== attestation.measurement || + !normalizedPolicy.acceptedMeasurements.includes(measurement) + ) { + return null + } + if (attestation.verifiedAt !== verifiedAtFor(report.timestamp)) return null + + let document: ReturnType + try { + document = parseNitroAttestationDocument(Uint8Array.from(report.evidence)) + } catch { + return null + } + if ( + document.nonce === undefined || + toHex(document.nonce) !== attestation.nonce || + document.certificate.length === 0 || + document.signature.length === 0 + ) { + return null + } + + const now = nowSeconds() + if (!Number.isSafeInteger(now) || now < 0) return null + const signedTimestamp = Math.floor(document.timestamp / 1000) + const signedMaxAge = normalizedPolicy.maxAgeSeconds + const signedMaxFutureSkew = MAX_NITRO_TIMESTAMP_SKEW_SECONDS + if ( + !Number.isSafeInteger(signedTimestamp) || + signedTimestamp > now + signedMaxFutureSkew || + now - signedTimestamp > signedMaxAge + ) { + return null + } + const result = verifyAttestation( + { + tee_type: report.tee_type, + evidence: [...report.evidence], + measurement: [...report.measurement], + timestamp: report.timestamp, + }, + { + acceptedTeeTypes: ['nitro'], + acceptedMeasurements: [toHex(Uint8Array.from(report.measurement))], + maxAgeSeconds: normalizedPolicy.maxAgeSeconds, + now, + // Do not pass expectedNonce. tcloud-attestation pads string nonces to + // 64 bytes, while AWS Nitro preserves the caller's 32-byte nonce. + hardwareVerifier: createNitroHardwareVerifier({ + trustedRootCertificates: [root.raw], + nowMs: now * 1000, + maxTimestampSkewSeconds: signedMaxFutureSkew, + }), + }, + ) + if (!result.valid || result.attestation?.teeType !== 'nitro') return null + + const leaf = leafCertificate(document.certificate) + if (leaf === null || equalBytes(leaf.raw, root.raw)) return null + return { + measurement, + providerKeyId: digestBytes(leaf.raw), + providerSignature: digestBytes(document.signature), + } + } + + const tangle: TangleConfidentialAttestationVerifier = async ({ + report, + expected, + attestation, + }): Promise => { + try { + const parsed = parseRawNitroReport(report) + if (!quoteMatchesReport(attestation.quote, parsed)) return null + const verified = verifyEvidence(parsed, attestation, expected) + if (verified === null) return null + return verified + } catch { + return null + } + } + + const canonical: ConfidentialAttestationVerifier = (attestation, expected): boolean => { + try { + const report = decodeNitroQuote(attestation.quote) + const verified = verifyEvidence(report, attestation, expected) + return ( + verified !== null && + attestation.providerKeyId === verified.providerKeyId && + attestation.providerSignature === verified.providerSignature + ) + } catch { + return false + } + } + + return Object.freeze({ + policy: normalizedPolicy, + tangle, + canonical, + }) +} + +/** Resolve a policy on the selected connection, then fall back to test hooks. */ +export function nitroVerifiersForConnection( + record: ConnectionRecord, + options: { + readonly tangleConfidentialAttestationPolicy?: NitroConfidentialAttestationTrustPolicy + readonly tangleConfidentialAttestationVerifier?: TangleConfidentialAttestationVerifier + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier + }, +): ConfiguredConfidentialAttestationVerifiers | undefined { + if ( + options.tangleConfidentialAttestationVerifier !== undefined || + options.confidentialAttestationVerifier !== undefined + ) { + return Object.freeze({ + ...(options.tangleConfidentialAttestationVerifier === undefined + ? {} + : { tangle: options.tangleConfidentialAttestationVerifier }), + ...(options.confidentialAttestationVerifier === undefined + ? {} + : { canonical: options.confidentialAttestationVerifier }), + }) + } + const policy = options.tangleConfidentialAttestationPolicy ?? record.confidentialAttestationPolicy + return policy === undefined ? undefined : createNitroConfidentialAttestationVerifiers(policy) +} + +/** Validate and freeze a startup trust policy before it reaches provider code. */ +export function normalizeNitroConfidentialAttestationTrustPolicy( + policy: NitroConfidentialAttestationTrustPolicy, +): NitroConfidentialAttestationTrustPolicy { + if (policy === null || typeof policy !== 'object' || Array.isArray(policy)) { + throw new TypeError('Nitro confidential attestation policy must be an object') + } + const keys = Object.keys(policy) + if ( + keys.some( + (key) => + key !== 'acceptedMeasurements' && key !== 'acceptedPolicyIds' && key !== 'maxAgeSeconds', + ) + ) { + throw new TypeError('Nitro confidential attestation policy contains an unsupported field') + } + const acceptedMeasurements = policy.acceptedMeasurements + const acceptedPolicyIds = policy.acceptedPolicyIds + if ( + !Array.isArray(acceptedMeasurements) || + acceptedMeasurements.length === 0 || + acceptedMeasurements.length > 256 || + acceptedMeasurements.some((measurement) => !SHA256_DIGEST_PATTERN.test(measurement)) + ) { + throw new TypeError( + 'Nitro confidential attestation policy requires one to 256 canonical SHA-256 measurements', + ) + } + if (new Set(acceptedMeasurements).size !== acceptedMeasurements.length) { + throw new TypeError('Nitro confidential attestation policy measurements must be unique') + } + if ( + !Array.isArray(acceptedPolicyIds) || + acceptedPolicyIds.length === 0 || + acceptedPolicyIds.length > 256 || + acceptedPolicyIds.some((value) => !POLICY_ID_PATTERN.test(value)) + ) { + throw new TypeError( + 'Nitro confidential attestation policy requires one to 256 canonical policy ids', + ) + } + if (new Set(acceptedPolicyIds).size !== acceptedPolicyIds.length) { + throw new TypeError('Nitro confidential attestation policy ids must be unique') + } + if ( + !Number.isSafeInteger(policy.maxAgeSeconds) || + policy.maxAgeSeconds < MIN_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS || + policy.maxAgeSeconds > MAX_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS + ) { + throw new TypeError( + `Nitro confidential attestation maxAgeSeconds must be an integer from ${MIN_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS} to ${MAX_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS}`, + ) + } + const normalized = { + acceptedMeasurements: Object.freeze([...acceptedMeasurements]), + acceptedPolicyIds: Object.freeze([...acceptedPolicyIds]), + maxAgeSeconds: policy.maxAgeSeconds, + } + return Object.freeze(normalized) +} + +function canonicalBindingsMatch( + attestation: ConfidentialAttestation, + expected: ConfidentialExecutionEnvironment, +): boolean { + return confidentialExecutionVerified({ + request: { + requested: true, + nonce: attestation.nonce, + policy: attestation.policy, + profileDigest: attestation.profileDigest, + }, + environment: expected, + attestation, + verifyProviderAttestation: () => true, + }) +} + +function parseRawNitroReport(value: SandboxTeeAttestationReportLike): RawNitroReport { + const quote = encodeTangleConfidentialAttestationQuote(value) + if (quote === undefined) + throw new TypeError('Nitro attestation report is outside the provider bounds') + const report = decodeTangleConfidentialAttestationQuote(quote) + if (report === undefined || normalizeTeeType(report.tee_type) !== 'nitro') { + throw new TypeError('Nitro attestation report must declare tee_type=nitro') + } + if (report.measurement.length !== MAX_MEASUREMENT_BYTES) { + throw new TypeError('Nitro attestation measurement must be 48 bytes') + } + return report +} + +function quoteMatchesReport(quote: string, report: RawNitroReport): boolean { + try { + const decoded = decodeTangleConfidentialAttestationQuote(quote) + return decoded !== undefined && JSON.stringify(report) === JSON.stringify(decoded) + } catch { + return false + } +} + +function decodeNitroQuote(quote: string): RawNitroReport { + const report = decodeTangleConfidentialAttestationQuote(quote) + if (report === undefined) throw new TypeError('Nitro quote is not a canonical Tangle TEE quote') + return parseRawNitroReport(report) +} + +function isCanonicalNonce(value: string): boolean { + return ( + (value.length === MIN_NONCE_HEX_CHARS || value.length === MAX_NONCE_HEX_CHARS) && + /^[0-9a-f]+$/u.test(value) + ) +} + +function verifiedAtFor(timestamp: number): string { + const date = new Date(timestamp * 1000) + if (!Number.isFinite(date.getTime())) + throw new TypeError('Nitro timestamp is outside date bounds') + return date.toISOString() +} + +function leafCertificate(bytes: Uint8Array): X509Certificate | null { + try { + return new X509Certificate(bytes) + } catch { + return null + } +} + +function assertOfficialNitroRoot(): X509Certificate { + const root = new X509Certificate(AWS_NITRO_ENCLAVES_ROOT_G1_PEM) + const fingerprint = digestBytes(root.raw) + if (fingerprint !== AWS_NITRO_ENCLAVES_ROOT_G1_SHA256) { + throw new Error('The bundled AWS Nitro Root-G1 certificate fingerprint does not match AWS') + } + if (!root.verify(root.publicKey)) { + throw new Error('The bundled AWS Nitro Root-G1 certificate is not self-signed') + } + return root +} + +function digestBytes(value: Uint8Array): Sha256Digest { + return `sha256:${createHash('sha256').update(value).digest('hex')}` +} + +function equalBytes(left: Uint8Array, right: Uint8Array): boolean { + return left.length === right.length && left.every((byte, index) => byte === right[index]) +} diff --git a/src/adapters/connections/production-connection-providers.ts b/src/adapters/connections/production-connection-providers.ts index c0cc4b97..28d043a5 100644 --- a/src/adapters/connections/production-connection-providers.ts +++ b/src/adapters/connections/production-connection-providers.ts @@ -17,6 +17,7 @@ import { Sandbox } from '@tangle-network/sandbox' import { ConnectionError } from '../../app/connection-errors.js' import type { ConnectionRecord } from '../../domain/entities.js' import { environmentSupportsInteractionResponse } from '../../ports/execution.js' +import { nitroVerifiersForConnection } from './nitro-confidential-attestation.js' import { readConnectionCredential } from './production-connection-credentials.js' import { connectionEndpoint } from './production-connection-endpoints.js' import type { @@ -59,12 +60,13 @@ export async function createTangleEnvironmentProvider( signal?: AbortSignal, ): Promise { const client = await createTangleSandboxClient(record, options, signal) + const confidential = nitroVerifiersForConnection(record, options) return createTangleProvider({ client, name: 'tangle-sandbox', - ...(options.tangleConfidentialAttestationVerifier === undefined + ...(confidential?.tangle === undefined ? {} - : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), + : { confidentialAttestationVerifier: confidential.tangle }), }) } @@ -126,6 +128,7 @@ export async function capabilitiesForConnection( list: false, }) case 'tangle-sandbox': { + const confidential = nitroVerifiersForConnection(record, options) const reported = options.sandboxClient === undefined ? { @@ -141,10 +144,10 @@ export async function capabilitiesForConnection( } : await createTangleProvider({ client: options.sandboxClient, - ...(options.tangleConfidentialAttestationVerifier === undefined + ...(confidential?.tangle === undefined ? {} : { - confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier, + confidentialAttestationVerifier: confidential.tangle, }), }).capabilities() const environment = tangleConnectionCapabilities( diff --git a/src/adapters/connections/production-connection-types.ts b/src/adapters/connections/production-connection-types.ts index 0375294f..879bc2b6 100644 --- a/src/adapters/connections/production-connection-types.ts +++ b/src/adapters/connections/production-connection-types.ts @@ -8,12 +8,15 @@ import type { SandboxClientLike, TangleConfidentialAttestationVerifier, } from '@tangle-network/agent-provider-tangle' + export type { TangleConfidentialAttestationVerifier } from '@tangle-network/agent-provider-tangle' + import type { BridgeModelCredential, RouterTransportConfig, } from '@tangle-network/agent-runtime/kernel' import type { + ConfidentialAttestationTrustPolicy, ConnectionHealth, ConnectionKind, ConnectionModelVerification, @@ -116,6 +119,8 @@ export interface ProductionConnectionOptions { readonly sandboxClient?: SandboxClientLike readonly sandboxClientFactory?: SandboxClientFactory readonly tangleRetainedControlLookup?: TangleRetainedControlLookup + /** Persisted, non-secret Nitro trust policy for the selected Tangle connection. */ + readonly tangleConfidentialAttestationPolicy?: ConfidentialAttestationTrustPolicy /** Trusted provider-key and measurement verification for confidential forks. */ readonly tangleConfidentialAttestationVerifier?: TangleConfidentialAttestationVerifier /** Canonical Braid-side attestation verifier for returned fork evidence. */ diff --git a/src/adapters/connections/production-connections.ts b/src/adapters/connections/production-connections.ts index f3ce75de..e9d00d33 100644 --- a/src/adapters/connections/production-connections.ts +++ b/src/adapters/connections/production-connections.ts @@ -8,6 +8,15 @@ import type { ProductionConnectionOptions, } from './production-connection-types.js' +export type { + NitroConfidentialAttestationTrustPolicy, + NitroConfidentialAttestationVerifierOptions, + NitroConfidentialAttestationVerifiers, +} from './nitro-confidential-attestation.js' +export { + createNitroConfidentialAttestationVerifiers, + normalizeNitroConfidentialAttestationTrustPolicy, +} from './nitro-confidential-attestation.js' export { readConnectionCredential } from './production-connection-credentials.js' export { connectionEndpoint, diff --git a/src/adapters/runtime/production-tangle-sandbox-backend.ts b/src/adapters/runtime/production-tangle-sandbox-backend.ts index c11360d5..c2e1aae7 100644 --- a/src/adapters/runtime/production-tangle-sandbox-backend.ts +++ b/src/adapters/runtime/production-tangle-sandbox-backend.ts @@ -11,6 +11,7 @@ import { canonicalDigest } from '../../domain/canonical.js' import type { ConnectionId } from '../../domain/ids.js' import type { ExecuteTurnInput } from '../../ports/execution.js' import { harnessSupportsModel, snapHarnessToModel } from '../agent-interface/harness-runtime.js' +import { nitroVerifiersForConnection } from '../connections/nitro-confidential-attestation.js' import { createTangleRetainedControlLookup, supportsTangleRetainedControlLookup, @@ -75,13 +76,14 @@ export async function resolveTangleSandboxBackend( }) const rawClient = await createTangleSandboxClient(record, options, input.signal) const observedClient = observeSandboxClient(rawClient, lifecycle) + const confidential = nitroVerifiersForConnection(record, options) const sdkProvider = createTangleProvider({ client: observedClient.client, defaultBackend: runner, name: 'tangle-sandbox', - ...(options.tangleConfidentialAttestationVerifier === undefined + ...(confidential?.tangle === undefined ? {} - : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), + : { confidentialAttestationVerifier: confidential.tangle }), }) const capabilities = capabilitiesForLifecycle(await sdkProvider.capabilities(), lifecycle) const providerSessionId = providerSessionFor(input, capabilities) @@ -196,13 +198,14 @@ export async function resolveTangleSandboxRetainedConnection( const observedClient = observeSandboxClient(boundedClient, lifecycle) const retainedControlLookup = options.tangleRetainedControlLookup ?? createTangleRetainedControlLookup(observedClient.client) + const confidential = nitroVerifiersForConnection(record, options) const provider = createTangleProvider({ client: observedClient.client, defaultBackend: runner, name: 'tangle-sandbox', - ...(options.tangleConfidentialAttestationVerifier === undefined + ...(confidential?.tangle === undefined ? {} - : { confidentialAttestationVerifier: options.tangleConfidentialAttestationVerifier }), + : { confidentialAttestationVerifier: confidential.tangle }), }) const reportedCapabilities = await provider.capabilities() const retained = reportedCapabilities.retainedControl diff --git a/src/app/connections.ts b/src/app/connections.ts index c381502a..aa681ad6 100644 --- a/src/app/connections.ts +++ b/src/app/connections.ts @@ -112,6 +112,8 @@ export function mergeConnectionTelemetry( saved.workspaceId !== observed.workspaceId || saved.endpoint !== observed.endpoint || saved.credentialRef !== observed.credentialRef || + canonicalDigest(saved.confidentialAttestationPolicy ?? null) !== + canonicalDigest(observed.confidentialAttestationPolicy ?? null) || canonicalDigest(saved.providerOptions) !== canonicalDigest(observed.providerOptions) ) { return saved @@ -164,6 +166,7 @@ function assertSecretFree(record: ConnectionRecord): void { 'name', 'endpoint', 'credentialRef', + 'confidentialAttestationPolicy', 'providerOptions', 'createdAt', 'updatedAt', @@ -217,6 +220,8 @@ function assertSecretFree(record: ConnectionRecord): void { record.providerOptions.account, record.providerOptions.lifecycle, ...(record.providerOptions.capabilityHints ?? []), + ...(record.confidentialAttestationPolicy?.acceptedMeasurements ?? []), + ...(record.confidentialAttestationPolicy?.acceptedPolicyIds ?? []), ...('message' in record.lastHealth ? [record.lastHealth.message] : []), ...(record.lastModelVerification === undefined ? [] @@ -256,8 +261,21 @@ function freezeConnectionRecord(record: ConnectionRecord): ConnectionRecord { record.lastModelVerification === undefined ? undefined : Object.freeze({ ...record.lastModelVerification }) + const confidentialAttestationPolicy = + record.confidentialAttestationPolicy === undefined + ? undefined + : Object.freeze({ + ...record.confidentialAttestationPolicy, + acceptedMeasurements: Object.freeze([ + ...record.confidentialAttestationPolicy.acceptedMeasurements, + ]), + acceptedPolicyIds: Object.freeze([ + ...record.confidentialAttestationPolicy.acceptedPolicyIds, + ]), + }) return Object.freeze({ ...record, + ...(confidentialAttestationPolicy === undefined ? {} : { confidentialAttestationPolicy }), providerOptions, lastHealth, ...(lastModelVerification === undefined ? {} : { lastModelVerification }), diff --git a/src/app/production-composition.ts b/src/app/production-composition.ts index e484eaf5..9647f3cd 100644 --- a/src/app/production-composition.ts +++ b/src/app/production-composition.ts @@ -1,4 +1,5 @@ import type { AgentProfile } from '@tangle-network/agent-interface' +import { nitroVerifiersForConnection } from '../adapters/connections/nitro-confidential-attestation.js' import type { ProductionConnectionOptions } from '../adapters/connections/production-connections.js' import { connectionEndpoint, @@ -182,7 +183,7 @@ export function createProductionComposition( ) } - const resolverOptions: ProductionBackendResolverOptions = { + const resolverOptionsBase: ProductionBackendResolverOptions = { ...(config.connectionOptions ?? {}), connections, ...(config.workspaceRoot === undefined ? {} : { workspaceCwd: config.workspaceRoot }), @@ -194,6 +195,16 @@ export function createProductionComposition( }, }), } + const confidential = nitroVerifiersForConnection(connection, resolverOptionsBase) + const resolverOptions: ProductionBackendResolverOptions = { + ...resolverOptionsBase, + ...(confidential?.tangle === undefined + ? {} + : { tangleConfidentialAttestationVerifier: confidential.tangle }), + ...(confidential?.canonical === undefined + ? {} + : { confidentialAttestationVerifier: confidential.canonical }), + } const backendResolver = createProductionBackendResolver(resolverOptions) const supervisorController = connection.kind === 'tangle-sandbox' diff --git a/src/domain/entities-core.ts b/src/domain/entities-core.ts index c7be4cae..86884353 100644 --- a/src/domain/entities-core.ts +++ b/src/domain/entities-core.ts @@ -90,6 +90,18 @@ export interface ProfileSnapshotRecord { export type ConnectionKind = 'cli-bridge' | 'tangle-inference' | 'tangle-sandbox' +/** + * Non-secret trust constraints for a confidential Tangle connection. + * + * The selected connection owns this policy so startup and restart use the + * same explicit allowlists without loading executable verifier modules. + */ +export interface ConfidentialAttestationTrustPolicy { + readonly acceptedMeasurements: readonly `sha256:${string}`[] + readonly acceptedPolicyIds: readonly string[] + readonly maxAgeSeconds: number +} + export type ConnectionHealth = | { readonly status: 'unknown' } | { readonly status: 'healthy'; readonly checkedAt: IsoDateTime; readonly message?: string } @@ -135,6 +147,7 @@ export interface ConnectionRecord { readonly name: string readonly endpoint?: string readonly credentialRef?: CredentialRefId + readonly confidentialAttestationPolicy?: ConfidentialAttestationTrustPolicy readonly providerOptions: ConnectionTransportOptions readonly createdAt: IsoDateTime readonly updatedAt: IsoDateTime @@ -145,6 +158,8 @@ export interface ConnectionRecord { export const DEFAULT_RETAINED_IDLE_TTL_SECONDS = 1_800 export const MIN_RETAINED_IDLE_TTL_SECONDS = 60 export const MAX_RETAINED_IDLE_TTL_SECONDS = 604_800 +export const MIN_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS = 1 +export const MAX_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS = 86_400 /** * Braid stores only transport metadata and capability hints here. diff --git a/src/domain/invariants-profile.ts b/src/domain/invariants-profile.ts index 1cc37dc5..b72ebb5b 100644 --- a/src/domain/invariants-profile.ts +++ b/src/domain/invariants-profile.ts @@ -10,7 +10,12 @@ import type { ProfileSnapshotRecord, WorkspaceRecord, } from './entities.js' -import { MAX_RETAINED_IDLE_TTL_SECONDS, MIN_RETAINED_IDLE_TTL_SECONDS } from './entities-core.js' +import { + MAX_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS, + MAX_RETAINED_IDLE_TTL_SECONDS, + MIN_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS, + MIN_RETAINED_IDLE_TTL_SECONDS, +} from './entities-core.js' import { assertDate, assertDigest, @@ -148,4 +153,56 @@ export function assertConnectionRecord(record: ConnectionRecord): void { assertDate(record.updatedAt, 'connection.updatedAt') if (record.credentialRef !== undefined) assertEntityId('credentialRef', record.credentialRef, 'connection.credentialRef') + if (record.confidentialAttestationPolicy !== undefined) { + if (record.kind !== 'tangle-sandbox') { + fail('connection.confidentialAttestationPolicy is available only for tangle-sandbox') + } + const policy = record.confidentialAttestationPolicy + const keys = Object.keys(policy) + if ( + keys.some( + (key) => + key !== 'acceptedMeasurements' && key !== 'acceptedPolicyIds' && key !== 'maxAgeSeconds', + ) + ) { + fail('connection.confidentialAttestationPolicy contains an unsupported field') + } + if ( + !Array.isArray(policy.acceptedMeasurements) || + policy.acceptedMeasurements.length === 0 || + policy.acceptedMeasurements.length > 256 || + policy.acceptedMeasurements.some((measurement) => !/^sha256:[0-9a-f]{64}$/u.test(measurement)) + ) { + fail( + 'connection.confidentialAttestationPolicy.acceptedMeasurements must contain one to 256 canonical SHA-256 digests', + ) + } + if (new Set(policy.acceptedMeasurements).size !== policy.acceptedMeasurements.length) { + fail( + 'connection.confidentialAttestationPolicy.acceptedMeasurements must not contain duplicates', + ) + } + if ( + !Array.isArray(policy.acceptedPolicyIds) || + policy.acceptedPolicyIds.length === 0 || + policy.acceptedPolicyIds.length > 256 || + policy.acceptedPolicyIds.some((value) => !/^[A-Za-z][A-Za-z0-9._:-]{0,255}$/u.test(value)) + ) { + fail( + 'connection.confidentialAttestationPolicy.acceptedPolicyIds must contain one to 256 canonical ids', + ) + } + if (new Set(policy.acceptedPolicyIds).size !== policy.acceptedPolicyIds.length) { + fail('connection.confidentialAttestationPolicy.acceptedPolicyIds must not contain duplicates') + } + if ( + !Number.isSafeInteger(policy.maxAgeSeconds) || + policy.maxAgeSeconds < MIN_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS || + policy.maxAgeSeconds > MAX_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS + ) { + fail( + `connection.confidentialAttestationPolicy.maxAgeSeconds must be an integer from ${MIN_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS} to ${MAX_CONFIDENTIAL_ATTESTATION_MAX_AGE_SECONDS}`, + ) + } + } } diff --git a/src/index.ts b/src/index.ts index 52b61100..23b53bc4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,12 @@ +export type { + NitroConfidentialAttestationTrustPolicy, + NitroConfidentialAttestationVerifierOptions, + NitroConfidentialAttestationVerifiers, +} from './adapters/connections/production-connections.js' +export { + createNitroConfidentialAttestationVerifiers, + normalizeNitroConfidentialAttestationTrustPolicy, +} from './adapters/connections/production-connections.js' export { closeHeadlessKeyFile, openHeadlessKeyFile, diff --git a/test/fixtures/aws-nitro-document.cbor b/test/fixtures/aws-nitro-document.cbor new file mode 100644 index 0000000000000000000000000000000000000000..614525d65b8f9de31f7994113149350007929d07 GIT binary patch literal 4461 zcmd6qc~lek7RQsx!WMQxB(f_aHsLqfNEAg>aKWu25~NC#$wVR{EC~n|1frlQs8vA$ z<$*wzXGKw{+FGD>1F3*Qt$~7|MMO{wR1vG#iKvB&@12~}_fB&%f81Z@J99Jl^S$>s zTju5Ax%RpK#`q#hNT?`MiUvwV(NiQez!HmKjw|*R2?U6kDWst?1i)Mt8|Ar*fRKp_ zS*TbfS%=CMVxI*bOfE~Jkc427AS8^6!{N8A-LK+`!jK60NgN;854Kk?v`s5qdy<;{ zuc}>JJ(q3x+SFZN$@-69X~C@lxsZO0d9l2_hyhxh=uZ`M)&afS~S?NHz^ zmJd&FO?c3O2D|4BmY%$4Y`Prwo!30;MH4CFW9@-y&LtiL1WcmghsXz>D~S%gdwDI- zs}7xM;yYNanxN%6l{J@n;#c1}S>-*!xX{FsL&i}!s`B$^Nlq}Cr1@RQnoG1amuPD) z(a~I@tGPr^a|uOriN59%1I;CdnoEKaG(sT}OAvtq^@rkt655Cz_*?>nhae-hv+7TG zFI9t!NL`G8E?L_-c|q+=B7p!Bcfxu=hfMG#l1(9BAJ`Nas{?I{uAe|2B$2ICgvwwe zV4z;qqG0bNVFY+nJ9r1a0 z;(lwW>1``;q4Mfsr|B728gMpUFMBu6&$j|pK*2J%GR5Ox5g~vBdg{oKNF+ey%8`{O z1mOS*fu*j!`6P zk()={2towHNSR2AZt;iAFb<7@5}z^5qA_j|jtrviKGAOF^+V||ozGT{Oc5*`UE2Qw z85K+zu9?Z$7{NRkFt{+2!3As#Bi3-pdL90qxB5WsUqCCnztH}!KPc=@R@3fsFD_$` zT$bYf>S=^3WuEu)k2_ceB~P30R-WfuGR~AlX&JPd+{|)+U`G{quBeN<-l7v2Y8v+2 zc(X`*=oJdg!qF^PgHZy3tmj?Ce(yJN^^kvZ$I^iE?`_#V29^hF79G86Ciekk9t)zmm!U-_b{Eg!by9QBwlEe=dVVx{Xi}5zt{r=_=B_jd+GI^?k7wOI zLK1Tv9{0Rzn7)^6vl%`+-<8%XxAXhSny?`XTDu^?jF!Ex?a~4hz3N}DqX`t#@xp(z zZ58>6KZ3*?z~mh?+JKC)fK3Ttqh50$S^)EevB~)ptU}cDin4%O8xp+NruOK|OvUPQ z-}k_hs;_55L;(T>xq-QBk^_Piim>S}E|^zoqgy@=iICFeOuFFpBvE@A2@P?<7F`5F z7LNlEgyt&ZFlj7?P(d=YTZ*D(`!9N}Zk#8U51M zaf)-BLDacSeVaP(%H?;23*>1eV^&r{<`Y2$YE*Ca zleh0G3)()pb!1}yC$!!I&I3F)4`#fbpX}EmjLpv!*bPh{rk2U&!VE5xi|yH&Y(y;N z(y>u4kp4$@|1#;{>(Qfj6K?`-3gqYU{x0G}Q?qc*&yA{cGkgN*%R61>(XHK8x~6Rv zsgoRQ_R8#so*yi$Mx=Yx5Nft^4u5psIj}xy|8pVeaaGc=fbZ)>C&%t<4?2h zs-HE`ZIpyFnb^?uIIU}c!?hbTA5}Rq@)I9`#Lh8nfFEUpF**O!1`+Xt;;iFa@0A$y z3p!qX)~Jk+a(~YTi3!6#hyfcwWUf3nJUR4@4=`+L?>0iT_g$fO#Jk_e@CK9P%7z&t zlqM8n?^-ODm_rjV5fKfrnJgdxJRwKSe9s%}a6klsIc^_w>K?S{7M8IWkDo$Uh1WNnZT9BahqVp*LrTmRo3Mj4Yz;HquNDK%6C2%Qp5$!m z4$Zi9DH>_Pjk3o-3CwpUVgMFkFyER8yb1q#yXFrJl%WNS>yOzU*DYG%WRX>LV20b> zid_$IQ~TlK@?{Tae{FexV9l|VIenf93oG+3Y;j@VvMX*_RGD>skF?UmKGrs?tMcIH z%l)mzch>H|s5IZz%8wMB&kf(Uhr0C1G5ex*s(eQMC#kMtZiq3bMyA&++tW>IE(adzF7t}Zylki)iSJt<7AcfUkicLx z=BXr7jz$EE1PTG)HrCZBA?Eb`{E+Q2VXamn%X+=64cIE**d@`2p0xRiZBbdM3_{g#c7SrpVY)e+9{eHlKXgN5@s@R=X`AjAB>h0(sV)6P$j;&l#BaM9v7*{$8^PA}VM*bVftm>BV(Xe% h_5ot#4vTn8ox7~&8|eksZC$l{LuOhUN+pqve*nkB42}Q* literal 0 HcmV?d00001 diff --git a/test/nitro-confidential-attestation.test.ts b/test/nitro-confidential-attestation.test.ts new file mode 100644 index 00000000..1688fcc0 --- /dev/null +++ b/test/nitro-confidential-attestation.test.ts @@ -0,0 +1,399 @@ +import assert from 'node:assert/strict' +import { createHash, X509Certificate } from 'node:crypto' +import { readFileSync } from 'node:fs' +import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { dirname, join, resolve } from 'node:path' +import test from 'node:test' +import { fileURLToPath } from 'node:url' +import type { + AgentExactRunControlRef, + ConfidentialAttestation, + ConfidentialExecutionEnvironment, +} from '@tangle-network/agent-interface' +import { canonicalAgentProfileDigest, defineAgentProfile } from '@tangle-network/agent-interface' +import type { SandboxTeeAttestationReportLike } from '@tangle-network/agent-provider-tangle' +import { encodeTangleConfidentialAttestationQuote } from '@tangle-network/agent-provider-tangle' +import { + createNitroHardwareVerifier, + parseNitroAttestationDocument, + toHex, + verifyAttestation, +} from '@tangle-network/tcloud-attestation' +import { AWS_NITRO_ENCLAVES_ROOT_G1_PEM } from '../src/adapters/connections/aws-nitro-root-g1.js' +import { + createNitroConfidentialAttestationVerifiers, + normalizeNitroConfidentialAttestationTrustPolicy, +} from '../src/adapters/connections/nitro-confidential-attestation.js' +import { ConnectionRegistry, mergeConnectionTelemetry } from '../src/app/connections.js' +import { createProfileRecord } from '../src/app/profiles.js' +import { + persistProductionStartupSelection, + saveProductionStartupSelection, +} from '../src/bin/production-setup-persistence.js' +import { loadProductionStartup } from '../src/bin/production-startup.js' +import type { + ConfidentialAttestationTrustPolicy, + ConnectionRecord, +} from '../src/domain/entities.js' +import { createConnectionId } from '../src/domain/ids.js' + +const fixturePath = resolve( + dirname(fileURLToPath(import.meta.url)), + '../../test/fixtures/aws-nitro-document.cbor', +) +const fixtureEvidence = Uint8Array.from(readFileSync(fixturePath)) +const fixtureDocument = parseNitroAttestationDocument(fixtureEvidence) +const fixtureTimestamp = Math.floor(fixtureDocument.timestamp / 1000) +const fixtureMeasurement = fixtureDocument.pcrs.get(0) +const fixtureNonce = fixtureDocument.nonce +if (fixtureMeasurement === undefined || fixtureNonce === undefined) { + throw new Error('The AWS Nitro fixture is incomplete') +} +const fixtureMeasurementBytes: Uint8Array = fixtureMeasurement +const fixtureNonceBytes: Uint8Array = fixtureNonce +const fixtureMeasurementDigest = + `sha256:${createHash('sha256').update(fixtureMeasurementBytes).digest('hex')}` as const + +const policy: ConfidentialAttestationTrustPolicy = Object.freeze({ + acceptedMeasurements: Object.freeze([fixtureMeasurementDigest]), + acceptedPolicyIds: Object.freeze(['tangle-confidential-v1']), + maxAgeSeconds: 300, +}) + +const source: AgentExactRunControlRef = { + runId: 'run-nitro-adapter', + provider: 'tangle-sandbox', + environmentId: 'environment-source', + sessionId: 'session-nitro-adapter', + executionId: 'execution-nitro-adapter', + requestDigest: `sha256:${'1'.repeat(64)}`, +} + +const expected: ConfidentialExecutionEnvironment = { + provider: 'tangle-sandbox', + environmentId: 'environment-destination', + source, + requestDigest: `sha256:${'2'.repeat(64)}`, + confidentialRequested: true, +} + +function report(): SandboxTeeAttestationReportLike { + return { + tee_type: 'nitro', + evidence: [...fixtureEvidence], + measurement: [...fixtureMeasurementBytes], + timestamp: fixtureTimestamp, + } +} + +function quote() { + const encoded = encodeTangleConfidentialAttestationQuote(report()) + if (encoded === undefined) + throw new Error('The AWS Nitro fixture quote is outside provider bounds') + return encoded +} + +function pendingAttestation(): ConfidentialAttestation { + return { + provider: expected.provider, + requested: true as const, + nonce: toHex(fixtureNonceBytes), + measurement: fixtureMeasurementDigest, + environmentId: expected.environmentId, + source, + requestDigest: expected.requestDigest, + profileDigest: `sha256:${'3'.repeat(64)}`, + policy: 'tangle-confidential-v1', + quote: quote(), + providerKeyId: 'unverified', + providerSignature: 'unverified', + verifiedAt: new Date(fixtureTimestamp * 1000).toISOString(), + } +} + +function connection( + id: string, + confidentialAttestationPolicy?: ConfidentialAttestationTrustPolicy, +): ConnectionRecord { + return { + id: createConnectionId(`connection-${id}`), + kind: 'tangle-sandbox', + name: `Tangle Sandbox ${id}`, + endpoint: 'https://sandbox.tangle.tools', + ...(confidentialAttestationPolicy === undefined ? {} : { confidentialAttestationPolicy }), + providerOptions: { transport: 'https', lifecycle: 'retained', idleTtlSeconds: 300 }, + createdAt: '2026-08-28T00:00:00.000Z', + updatedAt: '2026-08-28T00:00:00.000Z', + lastHealth: { status: 'unknown' }, + } +} + +test('Nitro adapter verifies the real COSE quote and derives stable provider identity', async () => { + const verifiers = createNitroConfidentialAttestationVerifiers(policy, { + now: () => fixtureTimestamp, + }) + const attestation = pendingAttestation() + const first = await verifiers.tangle({ report: report(), expected, attestation }) + const second = await verifiers.tangle({ report: report(), expected, attestation }) + assert.deepEqual(first, second) + assert.ok(first) + assert.match(first.providerKeyId, /^sha256:[0-9a-f]{64}$/u) + assert.match(first.providerSignature, /^sha256:[0-9a-f]{64}$/u) + assert.equal(first.measurement, fixtureMeasurementDigest) + + const persisted = { ...attestation, ...first } + assert.equal(verifiers.canonical(structuredClone(persisted), structuredClone(expected)), true) + assert.equal(verifiers.canonical(JSON.parse(JSON.stringify(persisted)), expected), true) + assert.equal( + verifiers.canonical({ ...persisted, providerKeyId: `sha256:${'0'.repeat(64)}` }, expected), + false, + ) + assert.equal( + verifiers.canonical({ ...persisted, providerSignature: `sha256:${'0'.repeat(64)}` }, expected), + false, + ) +}) + +test('Nitro adapter rejects every mutated trust input and binding', async () => { + const verifiers = createNitroConfidentialAttestationVerifiers(policy, { + now: () => fixtureTimestamp, + }) + const attestation = pendingAttestation() + const verify = ( + candidate = attestation, + candidateExpected = expected, + candidateReport = report(), + ) => + verifiers.tangle({ + report: candidateReport, + expected: candidateExpected, + attestation: candidate, + }) + + assert.equal((await verify({ ...attestation, nonce: '0'.repeat(64) })) ?? null, null) + assert.equal( + (await verify({ ...attestation, measurement: `sha256:${'f'.repeat(64)}` })) ?? null, + null, + ) + assert.equal( + (await verify(attestation, expected, { + ...report(), + evidence: [...fixtureEvidence.slice(0, -1), 0], + })) ?? null, + null, + ) + const rootBytes = new X509Certificate(AWS_NITRO_ENCLAVES_ROOT_G1_PEM).raw + const rootOffset = Buffer.from(fixtureEvidence).indexOf(Buffer.from(rootBytes)) + if (rootOffset < 0) throw new Error('The AWS Nitro fixture does not contain the pinned root') + const wrongRootEvidence = [...fixtureEvidence] + const rootByte = wrongRootEvidence[rootOffset] + if (rootByte === undefined) throw new Error('The AWS Nitro fixture root index is invalid') + wrongRootEvidence[rootOffset] = (rootByte + 1) % 256 + assert.equal( + (await verify(attestation, expected, { ...report(), evidence: wrongRootEvidence })) ?? null, + null, + ) + assert.equal( + (await verify(attestation, expected, { ...report(), timestamp: fixtureTimestamp - 301 })) ?? + null, + null, + ) + assert.equal( + (await verify(attestation, { ...expected, provider: 'other-provider' })) ?? null, + null, + ) + assert.equal( + (await verify(attestation, { ...expected, environmentId: 'environment-other' })) ?? null, + null, + ) + assert.equal( + (await verify(attestation, { ...expected, requestDigest: `sha256:${'4'.repeat(64)}` })) ?? null, + null, + ) + assert.equal( + (await verify(attestation, { + ...expected, + source: { ...source, executionId: 'execution-other' }, + })) ?? null, + null, + ) + assert.equal((await verify({ ...attestation, policy: 'policy-not-allowed' })) ?? null, null) + assert.equal( + (await verify({ ...attestation, quote: `${attestation.quote.slice(0, -1)}A` })) ?? null, + null, + ) + const persisted = { + ...attestation, + ...(await verifiers.tangle({ report: report(), expected, attestation })), + } + assert.equal( + verifiers.canonical({ ...persisted, quote: `${persisted.quote.slice(0, -1)}A` }, expected), + false, + ) + + const staleVerifiers = createNitroConfidentialAttestationVerifiers(policy, { + now: () => fixtureTimestamp + 301, + }) + assert.equal(await staleVerifiers.tangle({ report: report(), expected, attestation }), null) + + const shortFreshnessPolicy: ConfidentialAttestationTrustPolicy = { + ...policy, + maxAgeSeconds: 60, + } + const forgedTimestamp = fixtureTimestamp + 61 + const forgedReport: SandboxTeeAttestationReportLike = { + ...report(), + timestamp: forgedTimestamp, + } + const forgedAttestation: ConfidentialAttestation = { + ...attestation, + quote: (() => { + const encoded = encodeTangleConfidentialAttestationQuote(forgedReport) + if (encoded === undefined) throw new Error('The forged quote is outside provider bounds') + return encoded + })(), + verifiedAt: new Date(forgedTimestamp * 1000).toISOString(), + } + const signedQuoteStillVerifies = verifyAttestation(forgedReport, { + acceptedTeeTypes: ['nitro'], + acceptedMeasurements: [toHex(fixtureMeasurementBytes)], + maxAgeSeconds: 60, + now: forgedTimestamp, + hardwareVerifier: createNitroHardwareVerifier({ + trustedRootCertificates: [new X509Certificate(AWS_NITRO_ENCLAVES_ROOT_G1_PEM).raw], + nowMs: forgedTimestamp * 1000, + maxTimestampSkewSeconds: 300, + }), + }) + assert.equal(signedQuoteStillVerifies.valid, true) + const shortFreshnessVerifiers = createNitroConfidentialAttestationVerifiers( + shortFreshnessPolicy, + { now: () => forgedTimestamp }, + ) + assert.equal( + await shortFreshnessVerifiers.tangle({ + report: forgedReport, + expected, + attestation: forgedAttestation, + }), + null, + ) +}) + +test('Nitro policy requires explicit bounded allowlists and has no unverified path', () => { + assert.throws( + () => + normalizeNitroConfidentialAttestationTrustPolicy({ + acceptedMeasurements: [], + acceptedPolicyIds: ['tangle-confidential-v1'], + maxAgeSeconds: 300, + }), + /requires one to 256 canonical SHA-256 measurements/u, + ) + assert.throws( + () => + normalizeNitroConfidentialAttestationTrustPolicy({ + acceptedMeasurements: [`sha256:${'a'.repeat(64)}`], + acceptedPolicyIds: [], + maxAgeSeconds: 300, + }), + /requires one to 256 canonical policy ids/u, + ) + assert.throws( + () => + normalizeNitroConfidentialAttestationTrustPolicy({ + acceptedMeasurements: [`sha256:${'a'.repeat(64)}`], + acceptedPolicyIds: ['tangle-confidential-v1'], + maxAgeSeconds: 86_401, + }), + /maxAgeSeconds/u, + ) + const normalized = normalizeNitroConfidentialAttestationTrustPolicy(policy) + assert.equal(Object.isFrozen(normalized), true) + assert.equal(Object.isFrozen(normalized.acceptedMeasurements), true) + assert.equal(Object.isFrozen(normalized.acceptedPolicyIds), true) +}) + +test('connection policy is secret-free, immutable, and telemetry-safe when omitted or changed', () => { + const configured = connection('policy', policy) + const registry = new ConnectionRegistry([configured]) + const selected = registry.get(configured.id) + assert.ok(selected) + assert.deepEqual(selected.confidentialAttestationPolicy, policy) + assert.equal(Object.isFrozen(selected.confidentialAttestationPolicy), true) + assert.equal(Object.isFrozen(selected.confidentialAttestationPolicy.acceptedMeasurements), true) + assert.equal(Object.isFrozen(selected.confidentialAttestationPolicy.acceptedPolicyIds), true) + + const ordinary = connection('ordinary') + assert.doesNotThrow(() => mergeConnectionTelemetry(ordinary, ordinary)) + assert.equal(mergeConnectionTelemetry(ordinary, ordinary).id, ordinary.id) + const changed = connection('policy', { + ...policy, + acceptedPolicyIds: ['tangle-confidential-v2'], + }) + assert.equal(mergeConnectionTelemetry(configured, changed).confidentialAttestationPolicy, policy) +}) + +test('connection policy survives persisted startup selection and restart unchanged', async () => { + const workspace = await mkdtemp(join(tmpdir(), 'braid-nitro-policy-')) + try { + const configPath = resolve(workspace, '.braid', 'config.json') + const selected = connection('persisted', policy) + const profile = defineAgentProfile({ + name: 'Nitro persistence test', + description: 'A profile used for startup policy persistence', + harness: 'pi', + model: { default: 'openai/gpt-5', provider: 'openai' }, + }) + const profileRecord = createProfileRecord( + { + kind: 'inline', + reference: 'nitro-test', + label: 'Nitro test profile', + writable: false, + trusted: true, + }, + profile, + ) + const selection = { + profile: profileRecord, + connection: selected, + profileDigest: canonicalAgentProfileDigest(profile), + connectionDigest: `sha256:${'5'.repeat(64)}`, + } as const + await saveProductionStartupSelection(configPath, selection, { connections: [selected] }) + const serialized = await readFile(configPath, 'utf8') + assert.match(serialized, /tangle-confidential-v1/u) + assert.match(serialized, /sha256:[0-9a-f]{64}/u) + assert.doesNotMatch( + serialized, + /BEGIN CERTIFICATE|BEGIN [A-Z ]*PRIVATE KEY|secret-canary|quote/iu, + ) + const loaded = await loadProductionStartup({ workspace, configPath }) + assert.deepEqual(loaded.connections[0]?.confidentialAttestationPolicy, policy) + + const oldDocument = JSON.parse(serialized) as { + schemaVersion: number + connections: Array> + } + oldDocument.schemaVersion = 1 + delete oldDocument.connections[0]?.confidentialAttestationPolicy + await writeFile(configPath, `${JSON.stringify(oldDocument)}\n`, 'utf8') + const migrated = await loadProductionStartup({ workspace, configPath }) + assert.equal(migrated.connections[0]?.confidentialAttestationPolicy, undefined) + + const persisted = await persistProductionStartupSelection(configPath, selection, { + connections: [selected], + }) + try { + const restarted = await loadProductionStartup({ workspace, configPath }) + assert.deepEqual(restarted.connections[0], selected) + assert.deepEqual(restarted.connections[0]?.confidentialAttestationPolicy, policy) + } finally { + await persisted.rollback() + } + } finally { + await rm(workspace, { recursive: true, force: true }) + } +}) diff --git a/test/tangle-workspace-proof.test.mjs b/test/tangle-workspace-proof.test.mjs index 185dff0a..2e34d942 100644 --- a/test/tangle-workspace-proof.test.mjs +++ b/test/tangle-workspace-proof.test.mjs @@ -1,5 +1,7 @@ import assert from 'node:assert/strict' +import { readFileSync } from 'node:fs' import test from 'node:test' +import { fileURLToPath } from 'node:url' import { workspaceCheckpointRequestDigest, @@ -11,9 +13,23 @@ import { PROOF_OPERATIONS, proofReceipt, } from '../scripts/live-required/contracts.mjs' -import { confidentialNegativeChecks } from '../scripts/live-required/tangle-workspace-proof.mjs' +import { + confidentialNegativeChecks, + parseConfidentialTrustPolicy, +} from '../scripts/live-required/tangle-workspace-proof.mjs' const DIGEST = `sha256:${'1'.repeat(64)}` +const SECOND_DIGEST = `sha256:${'2'.repeat(64)}` + +function policyEnvironment(overrides = {}) { + return { + BRAID_TANGLE_CONFIDENTIAL_MEASUREMENTS: `${DIGEST},${SECOND_DIGEST}`, + BRAID_TANGLE_CONFIDENTIAL_POLICY_IDS: 'tangle-confidential-v1,tangle-confidential-v2', + BRAID_TANGLE_CONFIDENTIAL_POLICY_ID: 'tangle-confidential-v1', + BRAID_TANGLE_CONFIDENTIAL_MAX_AGE_SECONDS: '300', + ...overrides, + } +} function confidentialFixture() { const source = { @@ -99,6 +115,63 @@ test('LIVE-10 negative checks reject nonce, measurement, and self-echo mutations }) }) +test('LIVE-10 policy parsing is typed, bounded, and immutable', () => { + const parsed = parseConfidentialTrustPolicy(policyEnvironment()) + assert.deepEqual(parsed, { + policy: { + acceptedMeasurements: [DIGEST, SECOND_DIGEST], + acceptedPolicyIds: ['tangle-confidential-v1', 'tangle-confidential-v2'], + maxAgeSeconds: 300, + }, + selectedPolicyId: 'tangle-confidential-v1', + }) + assert.equal(Object.isFrozen(parsed), true) + assert.equal(Object.isFrozen(parsed.policy), true) + assert.equal(Object.isFrozen(parsed.policy.acceptedMeasurements), true) + assert.equal(Object.isFrozen(parsed.policy.acceptedPolicyIds), true) +}) + +const invalidPolicyCases = [ + ['missing measurements', { BRAID_TANGLE_CONFIDENTIAL_MEASUREMENTS: undefined }], + ['malformed measurement', { BRAID_TANGLE_CONFIDENTIAL_MEASUREMENTS: 'not-a-digest' }], + ['duplicate measurement', { BRAID_TANGLE_CONFIDENTIAL_MEASUREMENTS: `${DIGEST},${DIGEST}` }], + ['malformed policy id', { BRAID_TANGLE_CONFIDENTIAL_POLICY_IDS: 'not a policy' }], + [ + 'duplicate policy id', + { BRAID_TANGLE_CONFIDENTIAL_POLICY_IDS: 'tangle-confidential-v1,tangle-confidential-v1' }, + ], + [ + 'selected id is not allowlisted', + { BRAID_TANGLE_CONFIDENTIAL_POLICY_ID: 'tangle-confidential-v3' }, + ], + ['age below bound', { BRAID_TANGLE_CONFIDENTIAL_MAX_AGE_SECONDS: '0' }], + ['age above bound', { BRAID_TANGLE_CONFIDENTIAL_MAX_AGE_SECONDS: '86401' }], + ['age is not an integer', { BRAID_TANGLE_CONFIDENTIAL_MAX_AGE_SECONDS: '60.5' }], +] + +for (const [label, overrides] of invalidPolicyCases) { + test(`LIVE-10 rejects ${label}`, () => { + assert.throws(() => parseConfidentialTrustPolicy(policyEnvironment(overrides))) + }) +} + +test('LIVE-10 rejects the legacy executable module without a typed policy', () => { + assert.throws(() => + parseConfidentialTrustPolicy({ + BRAID_TANGLE_TEE_VERIFIER_MODULE: './untrusted-verifier.mjs', + }), + ) +}) + +test('LIVE-10 has no executable verifier module hook', () => { + const source = readFileSync( + fileURLToPath(new URL('../scripts/live-required/tangle-workspace-proof.mjs', import.meta.url)), + 'utf8', + ) + assert.doesNotMatch(source, /BRAID_TANGLE_(?:TEE|CONFIDENTIAL)_VERIFIER_MODULE/u) + assert.doesNotMatch(source, /import\(pathToFileURL\(modulePath\)/u) +}) + test('LIVE-10 passed receipts require external verification and every negative check', () => { const receipt = proofReceipt({ invocationId: 'live-required-confidential-receipt', @@ -128,7 +201,7 @@ test('LIVE-10 passed receipts require external verification and every negative c }, checks: [ 'configuration', - 'external-verifier', + 'nitro-attestation', 'requested-unverified-binding', 'missing-attestation', 'valid-attestation', From 360853425d1dfc4891c1f5f2a6c4a121abd14b78 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 17:32:25 -0600 Subject: [PATCH 048/136] fix(ui): wait for supervision activity scope redraw --- artifacts/verification/w6/120x40-plain.txt | 4 +- artifacts/verification/w6/120x40.png | Bin 22570 -> 22570 bytes artifacts/verification/w6/200x60-plain.txt | 4 +- artifacts/verification/w6/200x60.png | Bin 10412 -> 10412 bytes artifacts/verification/w6/40x12-plain.txt | 4 +- artifacts/verification/w6/40x12.png | Bin 14275 -> 14275 bytes .../verification/w6/80x24-automation.gif | Bin 14866 -> 22889 bytes artifacts/verification/w6/80x24-plain.txt | 4 +- .../w6/80x24-transcript-keyboard.gif | Bin 370867 -> 370867 bytes artifacts/verification/w6/80x24.png | Bin 18510 -> 18510 bytes .../verification/w6/capture-manifest.json | 276 +++- .../w6/raw/transcript-keyboard.cast | 138 +- .../w6/states/active-streaming.json | 69 +- .../w6/states/active-streaming.png | Bin 15309 -> 15309 bytes .../verification/w6/states/analysis.json | 54 +- artifacts/verification/w6/states/analysis.png | Bin 60446 -> 58389 bytes artifacts/verification/w6/states/analysis.txt | 12 +- .../verification/w6/states/automation.json | 45 +- .../verification/w6/states/automation.png | Bin 4156 -> 4156 bytes .../w6/states/command-palette-120.json | 47 +- .../w6/states/command-palette-120.png | Bin 36518 -> 36822 bytes .../w6/states/command-palette-120.txt | 2 +- .../w6/states/command-palette-40.json | 45 +- .../w6/states/command-palette-40.png | Bin 9482 -> 9482 bytes .../w6/states/command-palette-80.json | 47 +- .../w6/states/command-palette-80.png | Bin 35226 -> 35276 bytes .../w6/states/command-palette-80.txt | 2 +- .../verification/w6/states/comparison.json | 47 +- .../verification/w6/states/comparison.png | Bin 65619 -> 64782 bytes .../verification/w6/states/comparison.txt | 2 +- artifacts/verification/w6/states/empty.json | 45 +- artifacts/verification/w6/states/empty.png | Bin 5782 -> 5782 bytes .../w6/states/failure-or-reconnect.json | 83 +- .../w6/states/failure-or-reconnect.png | Bin 18786 -> 18786 bytes .../verification/w6/states/fork-preview.json | 61 +- .../verification/w6/states/fork-preview.png | Bin 11548 -> 9878 bytes .../verification/w6/states/fork-preview.txt | 4 +- .../w6/states/graph-or-analysis.json | 45 +- .../w6/states/graph-or-analysis.png | Bin 20641 -> 20641 bytes .../verification/w6/states/interaction.json | 45 +- .../verification/w6/states/interaction.png | Bin 28820 -> 28820 bytes .../verification/w6/states/multi-run.json | 1322 +++++++++++++++++ .../verification/w6/states/multi-run.png | Bin 0 -> 24852 bytes .../verification/w6/states/multi-run.txt | 24 + artifacts/verification/w6/states/narrow.json | 45 +- artifacts/verification/w6/states/narrow.png | Bin 9639 -> 9639 bytes artifacts/verification/w6/states/profile.json | 45 +- artifacts/verification/w6/states/profile.png | Bin 6355 -> 6355 bytes .../verification/w6/states/supervision.json | 842 +++++++++++ .../verification/w6/states/supervision.png | Bin 0 -> 25615 bytes .../verification/w6/states/supervision.txt | 24 + scripts/capture-visual-definitions.mjs | 11 +- test/scripts.test.ts | 36 + 53 files changed, 3103 insertions(+), 331 deletions(-) create mode 100644 artifacts/verification/w6/states/multi-run.json create mode 100644 artifacts/verification/w6/states/multi-run.png create mode 100644 artifacts/verification/w6/states/multi-run.txt create mode 100644 artifacts/verification/w6/states/supervision.json create mode 100644 artifacts/verification/w6/states/supervision.png create mode 100644 artifacts/verification/w6/states/supervision.txt diff --git a/artifacts/verification/w6/120x40-plain.txt b/artifacts/verification/w6/120x40-plain.txt index 5d1e7c3c..daaddb7b 100644 --- a/artifacts/verification/w6/120x40-plain.txt +++ b/artifacts/verification/w6/120x40-plain.txt @@ -1,4 +1,4 @@ -Braid ready — /home/drew/code/.worktrees/braid-10-multirun +Braid ready — /home/drew/code/.worktrees/braid-10-complete status: ready for a message conversation: New conversation; branch: branch-1 profile: Braid starter; runner: pi; connection: deterministic fixture @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-65b7ec82-3f0c-4571-a6d7-23e45d0c536c","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"c458bedd-8754-443c-a63d-c265d6734ab9","backend":"executor","status":"active","createdAt":"2026-08-28T10:35:21.598Z","updatedAt":"2026-08-28T10:35:21.598Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-606b068d-d6f6-4216-ad63-1be74dc80a37","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"2479430b-264d-409f-be78-d3d185addaba","backend":"executor","status":"active","createdAt":"2026-08-28T23:29:10.911Z","updatedAt":"2026-08-28T23:29:10.911Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/120x40.png b/artifacts/verification/w6/120x40.png index dcc89b7193221675fdb89293140d296a327014c1..57d3f93709ee7ce9048839cb150a7c6934237682 100644 GIT binary patch delta 20 ccmZ3rfpOIa#tGT%;i_aHoLg2z$&&M`WuS^%>hYL2Q2^q delta 18 ZcmX?{e>i_aHanNHbjEwGpBsw;%>hgg2ebeH diff --git a/artifacts/verification/w6/80x24-automation.gif b/artifacts/verification/w6/80x24-automation.gif index 1a46cadf11a3c808d4a39e4e0f9525e4de32d5d9..1d32c2e88a1227329c8824fee175aca690b02da9 100644 GIT binary patch delta 20516 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 +#>?uj0nKxU{U-uorR7Jv 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 delta 12676 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 FF97gRI`9Ah delta 165 zcmdmdQEc-?u?b3yDjSviSQ%M1Z(_Y;%E-RC-&$URkz@1v;7Rd}?2{*ck=Y!#IaY>| z6UY?aeE$4I`^k=*MYfmlGxn-Xf84+%KHcCBGyisV6UGDgC%bloxf0vOM3~OzOn>3Q zBEJ1s1Cwa^bVd_K+3h+%nDTNNxuzG+Wt7>zJ(W4BjFBD05!((lV@D3yxb6QvSZvA} MIkwvzU@3nA08?B()c^nh diff --git a/artifacts/verification/w6/80x24.png b/artifacts/verification/w6/80x24.png index 1352ba333084cf6cd1d277d1825271fbcdfb81a2..70f97368bba3d16fd4a390f2a8f8e7726eef5951 100644 GIT binary patch delta 20 ccmX>%f$`h~#tGT%;%f$`h~#tGT%T*|VIJ?qbGEV|7u\u001b[?u\u001b[c\u001b[?1049h\u001b[2J\u001b[H"] -[0.359684,"o","\u001b[?25l"] -[0.369026,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.369067,"o","\u001b[3A\u001b[2G\u001b[?25l"] -[0.401374,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-multirun\u0007"] -[0.404864,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.404895,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.423356,"i","keyboard-flow-01"] -[0.423433,"i","\r"] -[0.432413,"o","\u001b[15G\u001b[?25l"] -[0.458198,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.526708,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.52675,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.604678,"i","keyboard-flow-02"] -[0.604762,"i","\r"] -[0.60934,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.611076,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.627079,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.62712,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[0.679498,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.766543,"i","keyboard-flow-03"] -[0.766612,"i","\r"] -[0.768636,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] -[0.768666,"o","\u001b[?25l"] -[0.771017,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.786747,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G"] -[0.786856,"o","\u001b[?25l"] -[0.84247,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.92843,"i","keyboard-flow-04"] -[0.928505,"i","\r"] -[0.930457,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.933637,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.933679,"o","\u001b[15G\u001b[?25l"] -[0.949722,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.949761,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[1.006608,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.089576,"i","keyboard-flow-05"] -[1.089652,"i","\r"] -[1.092091,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-05\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.094497,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.094527,"o","\u001b[15G\u001b[?25l"] -[1.110336,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.110375,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[1.170994,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] -[1.171037,"o","\u001b[?25l"] -[1.250963,"i","keyboard-flow-06"] -[1.251039,"i","\r"] -[1.252832,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.254982,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.254994,"o","\u001b[15G\u001b[?25l"] -[1.27436,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.335318,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] -[1.33536,"o","\u001b[?25l"] -[1.41122,"i","keyboard-flow-07"] -[1.41129,"i","\r"] -[1.41532,"o","\u001b[15G\u001b[?25l"] -[1.43168,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.494447,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.494487,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[1.573282,"i","keyboard-flow-08"] -[1.573364,"i","\r"] -[1.577303,"o","\u001b[15G\u001b[?25l"] -[1.593586,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G"] -[1.593672,"o","\u001b[?25l"] -[1.659887,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.735706,"i","\u001b[5~"] -[1.73578,"i","\u001b[1;3H"] -[1.739117,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.816108,"i","\u001b[6~"] -[1.816184,"i","\u001b[1;3F"] -[1.819043,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n"] -[1.819088,"o","\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.829088,"o","\u001b[0m"] +{"version":2,"width":80,"height":24,"timestamp":1787959790,"duration":1.825351,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} +[0.320897,"o","\u001b[?2004h"] +[0.320988,"o","\u001b[>7u\u001b[?u\u001b[c\u001b[?1049h\u001b[2J\u001b[H"] +[0.321008,"o","\u001b[?25l"] +[0.332226,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.332275,"o","\u001b[3A\u001b[2G\u001b[?25l"] +[0.351184,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] +[0.354647,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.354667,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.36202,"i","keyboard-flow-01"] +[0.362075,"i","\r"] +[0.366564,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-01\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.36764,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.405762,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.462212,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.54403,"i","keyboard-flow-02"] +[0.544117,"i","\r"] +[0.549183,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.551249,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.56813,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.623498,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.705244,"i","keyboard-flow-03"] +[0.705317,"i","\r"] +[0.709034,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.711199,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.727868,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.787604,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.866472,"i","keyboard-flow-04"] +[0.866546,"i","\r"] +[0.869661,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.872198,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.888421,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.952827,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.046881,"i","keyboard-flow-05"] +[1.04694,"i","\r"] +[1.051673,"o","\u001b[15G\u001b[?25l"] +[1.068093,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.130418,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.20737,"i","keyboard-flow-06"] +[1.207449,"i","\r"] +[1.210871,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.213368,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.230251,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.292664,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.368684,"i","keyboard-flow-07"] +[1.368771,"i","\r"] +[1.371163,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-07\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.373713,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.393254,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.455546,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.549502,"i","keyboard-flow-08"] +[1.549615,"i","\r"] +[1.552955,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.556006,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.574564,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.640419,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.731376,"i","\u001b[5~"] +[1.731459,"i","\u001b[1;3H"] +[1.734862,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.811805,"i","\u001b[6~"] +[1.811879,"i","\u001b[1;3F"] +[1.815351,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.825351,"o","\u001b[0m"] diff --git a/artifacts/verification/w6/states/active-streaming.json b/artifacts/verification/w6/states/active-streaming.json index f0f53152..d4c97c65 100644 --- a/artifacts/verification/w6/states/active-streaming.json +++ b/artifacts/verification/w6/states/active-streaming.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 5, "sequence": 5, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -171,7 +171,7 @@ }, "view": { "revision": 5, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -320,7 +320,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-28T10:35:41.123Z", + "occurredAt": "2026-08-28T23:29:28.917Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -466,10 +466,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -502,6 +512,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -556,7 +585,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } }, @@ -668,10 +697,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-f42480eb9f3f2a5b76208330", + "id": "effect-op-terminal-000002-21a5cfb954eabf6c97d3d061", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "f42480eb9f3f2a5b762083305eb8bb56efed4b6ab20ceeeed6492a4f63f304a8", + "requestDigest": "21a5cfb954eabf6c97d3d06170a1bae5789f7c6759f3f7d8e6a16440358b6805", "kind": "send", "status": "pending", "attempt": 1, @@ -690,13 +719,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-28T10:35:41.123Z", + "occurredAt": "2026-08-28T23:29:28.917Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-b161f084-e508-413f-b58d-99baa80dcf40", + "id": "turn-233466b8-b149-46a5-a7d6-eb418bf44422", "intent": "W6 active streaming", "metadata": { "identity": { @@ -706,11 +735,11 @@ } }, "session": { - "id": "1da25da7-5cbb-47b4-9627-3d60db3295a1", + "id": "982719fe-28b6-4b2f-acf8-910c6927fbae", "backend": "executor", "status": "active", - "createdAt": "2026-08-28T10:35:41.123Z", - "updatedAt": "2026-08-28T10:35:41.123Z", + "createdAt": "2026-08-28T23:29:28.917Z", + "updatedAt": "2026-08-28T23:29:28.917Z", "metadata": "[unavailable]" }, "backend": "router", @@ -732,16 +761,16 @@ }, "execution": { "kind": "request", - "id": "turn-b161f084-e508-413f-b58d-99baa80dcf40" + "id": "turn-233466b8-b149-46a5-a7d6-eb418bf44422" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-b161f084-e508-413f-b58d-99baa80dcf40:attempt:c1ead8eb-8ad4-42e4-aaa2-559a02eee1f4", - "materializationReceiptDigest": "sha256:7292070a64fb6aeb7726ce1020c30453a846ee0db9322d1b4c436900e1aa556a", - "bindingDigest": "sha256:bc2cfc07b970a1f007a96c7f8099a9b84f0dab440550b39cd8e61b8f54af8654", + "attemptId": "turn-233466b8-b149-46a5-a7d6-eb418bf44422:attempt:7600ea2e-d7fe-48fd-9436-bd05cc341094", + "materializationReceiptDigest": "sha256:3c34ecf4d56c81b3581a736aedc85c682a865fc5867031bd20cf99bf925a4742", + "bindingDigest": "sha256:71f5702ace44c44d5db0970b3a6b7603d9194b65c5f7893a6fc9f3fc5678551d", "descriptor": { "kind": "router-request", "transport": "http", @@ -753,10 +782,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-28T10:35:41.121Z" + "startedAt": "2026-08-28T23:29:28.915Z" } }, - "timestamp": "2026-08-28T10:35:41.123Z" + "timestamp": "2026-08-28T23:29:28.917Z" } } } diff --git a/artifacts/verification/w6/states/active-streaming.png b/artifacts/verification/w6/states/active-streaming.png index f7c7b867806875c60ff3a697091694f6bec5548a..95d02a004ca135215d5900cf1bbc046ab073dc83 100644 GIT binary patch delta 18 ZcmX?Geztr against another\n frozen run\n ── run receipt\n source complete: yes\n findings: 2\n analysis cost: $0.0048\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ previous/next · PgUp/PgDn page · ←/esc back · page 1/2 · tab: analyses\n", + "frame": " analyses › /ask · frozen question\n────────────────────────────────────────────────────────────────────────────────\n source: da8ae2345b2c17a…7c9190eb · frozen\n analyst: profile-trace-reviewer · completed\n recipe: ask\n ── question\n Where did this run waste time, and what should change?\n ── findings\n 1. [1] Profile inspection and route resolution ran serially although their\n inputs were independent. · medium · confidence 0.94\n ↳ [1] profile.inspect completed before runtime.route started\n source: event-runtime-r…te-start\n 2. [2] The answer claimed success before the packaged terminal check completed.\n · high · confidence 0.88\n ↳ [2] package check started; no terminal result was recorded\n source: event-package-c…ck-start\n ── next\n next: ask a narrower question, or use /compare against another\n frozen run\n ── run receipt\n source complete: yes\n findings: 2\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ · Pg · ←/esc back · page 1/2 · p promote · x cancel · r\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -240,13 +240,16 @@ "lines": [ "source: da8ae2345b2c17a…7c9190eb · frozen", "analyst: profile-trace-reviewer · completed", + "recipe: ask", "── question", "Where did this run waste time, and what should change?", "── findings", "1. [1] Profile inspection and route resolution ran serially although their inputs were independent. · medium · confidence 0.94", - "↳ [1] profile.inspect completed before runtime.route started · event event-runtime-r…te-start", + "↳ [1] profile.inspect completed before runtime.route started", + " source: event-runtime-r…te-start", "2. [2] The answer claimed success before the packaged terminal check completed. · high · confidence 0.88", - "↳ [2] package check started; no terminal result was recorded · event event-package-c…ck-start", + "↳ [2] package check started; no terminal result was recorded", + " source: event-package-c…ck-start", "── next", "next: ask a narrower question, or use /compare against another frozen run", "── run receipt", @@ -331,10 +334,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -367,6 +380,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -398,12 +430,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -423,7 +455,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } } diff --git a/artifacts/verification/w6/states/analysis.png b/artifacts/verification/w6/states/analysis.png index 15b075f21628b43323b7b074ba6d9e22203e7b05..c5412a6d6b34b95c0d9a80b5e3aae6827fa61aad 100644 GIT binary patch literal 58389 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%0Dbar_o+)4S_G%VN-B-EbjUH`(O5)uRCpybp9fY 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

    6Wfy?T-e${m2x#)b-$^{T?;@Yw>KiZ?o}`ywMU^ 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 E17j#=Q2+n{ literal 60446 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 diff --git a/artifacts/verification/w6/states/analysis.txt b/artifacts/verification/w6/states/analysis.txt index 5f7445b7..bab96073 100644 --- a/artifacts/verification/w6/states/analysis.txt +++ b/artifacts/verification/w6/states/analysis.txt @@ -2,23 +2,23 @@ ──────────────────────────────────────────────────────────────────────────────── source: da8ae2345b2c17a…7c9190eb · frozen analyst: profile-trace-reviewer · completed + recipe: ask ── question Where did this run waste time, and what should change? ── findings 1. [1] Profile inspection and route resolution ran serially although their inputs were independent. · medium · confidence 0.94 - ↳ [1] profile.inspect completed before runtime.route started · event - event-runtime-r…te-start + ↳ [1] profile.inspect completed before runtime.route started + source: event-runtime-r…te-start 2. [2] The answer claimed success before the packaged terminal check completed. · high · confidence 0.88 - ↳ [2] package check started; no terminal result was recorded · event - event-package-c…ck-start + ↳ [2] package check started; no terminal result was recorded + source: event-package-c…ck-start ── next next: ask a narrower question, or use /compare against another frozen run ── run receipt source complete: yes findings: 2 - analysis cost: $0.0048 ──────────────────────────────────────────────────────────────────────────────── - ↑↓ previous/next · PgUp/PgDn page · ←/esc back · page 1/2 · tab: analyses + ↑↓ · Pg · ←/esc back · page 1/2 · p promote · x cancel · r diff --git a/artifacts/verification/w6/states/automation.json b/artifacts/verification/w6/states/automation.json index 4f652a4f..ad5268d2 100644 --- a/artifacts/verification/w6/states/automation.json +++ b/artifacts/verification/w6/states/automation.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -288,10 +288,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -324,6 +334,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -355,12 +384,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -380,7 +409,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } } diff --git a/artifacts/verification/w6/states/automation.png b/artifacts/verification/w6/states/automation.png index 5c000375a2a5a34c1f4f711851d8dcffc4d4ba01..db26ee082d504a7d9d9c3347f28b6d1a7b473d91 100644 GIT binary patch delta 20 ccmdm^ut#CTHb!=FS(WZhJhL|MWvu4|08lRnU;qFB delta 20 ccmdm^ut#CTHb!eW^Ak4jWvu4|08s1)dH?_b diff --git a/artifacts/verification/w6/states/command-palette-120.json b/artifacts/verification/w6/states/command-palette-120.json index 7580acde..de1547f5 100644 --- a/artifacts/verification/w6/states/command-palette-120.json +++ b/artifacts/verification/w6/states/command-palette-120.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 120, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 1, - "frame": " Commands\n────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n>\n→ /new Create an empty conversation\n /open Search and open conversations\n /profile Inspect, select, import, or edit a profile\n /connection Inspect and manage connections\n /runner Set the runner for this branch\n /model Set the model for this branch\n /effort Set reasoning effort for this branch\n /branch Create a branch at a message boundary\n (1/31)\n────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n type to filter · enter to choose · ←/esc close\n", + "frame": " Commands\n────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n>\n→ /new Create an empty conversation\n /open Search and open conversations\n /profile Inspect, select, import, or edit a profile\n /connection Inspect and manage connections\n /runner Set the runner for this branch\n /model Set the model for this branch\n /effort Set reasoning effort for this branch\n /branch Create and open a branch at a message boundary\n (1/31)\n────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n type to filter · enter to choose · ←/esc close\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -288,10 +288,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -324,6 +334,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -355,12 +384,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -379,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } } diff --git a/artifacts/verification/w6/states/command-palette-120.png b/artifacts/verification/w6/states/command-palette-120.png index 8d25f574d65e4318940684ab890deed51588928b..fd11ac83052960d7d34ed956e886df2b117a8022 100644 GIT binary patch literal 36822 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 JS?83{1OUSLSFr#9 diff --git a/artifacts/verification/w6/states/comparison.txt b/artifacts/verification/w6/states/comparison.txt index 25029e85..df0be220 100644 --- a/artifacts/verification/w6/states/comparison.txt +++ b/artifacts/verification/w6/states/comparison.txt @@ -21,4 +21,4 @@ paired.correctness.b10: 0 paired.correctness.mcnemar.b: 0 ──────────────────────────────────────────────────────────────────────────────── - ↑↓ previous/next · PgUp/PgDn page · ←/esc back · page 1/4 · tab: analyses + ↑↓ · Pg · ←/esc back · page 1/4 · p promote · x cancel · r diff --git a/artifacts/verification/w6/states/empty.json b/artifacts/verification/w6/states/empty.json index 2fcf1652..cdd87606 100644 --- a/artifacts/verification/w6/states/empty.json +++ b/artifacts/verification/w6/states/empty.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -288,10 +288,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -324,6 +334,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -355,12 +384,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -379,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } } diff --git a/artifacts/verification/w6/states/empty.png b/artifacts/verification/w6/states/empty.png index b02c779d135d467a51f6cdde0b150436d3972b46..bd6d11fe513d7eadec25f9172feed2f9c951fea0 100644 GIT binary patch delta 20 ccmbQHJ56^(5i`5EtjyvKTUa(%GRq1B07yaxZ2$lO delta 20 bcmbQHJ56^(5i>iNvc`4$?Dv~1nPr6mN-qZ2 diff --git a/artifacts/verification/w6/states/failure-or-reconnect.json b/artifacts/verification/w6/states/failure-or-reconnect.json index 2f49408a..7caf9e41 100644 --- a/artifacts/verification/w6/states/failure-or-reconnect.json +++ b/artifacts/verification/w6/states/failure-or-reconnect.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 8, "sequence": 8, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -176,7 +176,7 @@ }, "view": { "revision": 8, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -336,7 +336,7 @@ "title": "event backend_start", "status": "failed", "detail": "sequence 1", - "occurredAt": "2026-08-28T10:35:56.730Z", + "occurredAt": "2026-08-28T23:29:47.355Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -348,7 +348,7 @@ "title": "error", "status": "failed", "detail": "RUNTIME_BACKEND_ERROR", - "occurredAt": "2026-08-28T10:35:56.734Z", + "occurredAt": "2026-08-28T23:29:47.361Z", "sourceEventId": "run-000001:runtime:2", "runId": "run-000001", "entityType": "run", @@ -493,10 +493,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -529,6 +539,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -560,12 +589,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -584,7 +613,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } }, @@ -696,10 +725,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-d7dc712a90ee86b137737a94", + "id": "effect-op-terminal-000002-2af333447995b080ba597cd3", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "d7dc712a90ee86b137737a9406364043b494f6b542d21903f0255e8bc261f33a", + "requestDigest": "2af333447995b080ba597cd3e8554c498d83dd433017a3bc6a7917e9ad7a705f", "kind": "send", "status": "pending", "attempt": 1, @@ -718,13 +747,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-28T10:35:56.730Z", + "occurredAt": "2026-08-28T23:29:47.355Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-39c7f04e-c5b5-493e-a19a-479afd6437e0", + "id": "turn-c2a1629b-efaf-449e-a76e-098919894407", "intent": "W6 failure state", "metadata": { "identity": { @@ -734,11 +763,11 @@ } }, "session": { - "id": "ba4b0d60-27f7-4969-8f01-5f391b0b95ea", + "id": "9295b0e0-bf2d-46fa-8a6a-f33255abff95", "backend": "executor", "status": "active", - "createdAt": "2026-08-28T10:35:56.730Z", - "updatedAt": "2026-08-28T10:35:56.730Z", + "createdAt": "2026-08-28T23:29:47.355Z", + "updatedAt": "2026-08-28T23:29:47.355Z", "metadata": "[unavailable]" }, "backend": "router", @@ -760,16 +789,16 @@ }, "execution": { "kind": "request", - "id": "turn-39c7f04e-c5b5-493e-a19a-479afd6437e0" + "id": "turn-c2a1629b-efaf-449e-a76e-098919894407" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-39c7f04e-c5b5-493e-a19a-479afd6437e0:attempt:5113858d-7bb7-43ff-9392-41991f112478", - "materializationReceiptDigest": "sha256:333ed8c12c25f175c402eafa13d90dbb2a8fa426cd9e93b6abf84c99f0b76157", - "bindingDigest": "sha256:40a6aaabbcc8e4662898213b908aa7ed4c5db5289428cb8dd198a2ef5b41d782", + "attemptId": "turn-c2a1629b-efaf-449e-a76e-098919894407:attempt:564e9b25-1802-4f52-b8ef-49a13c359798", + "materializationReceiptDigest": "sha256:30fc6237bb9437013c6934721b3c510eaa645d9e66ef72337311588774d00aed", + "bindingDigest": "sha256:54f44b56afcc77f5cd8ea6370bec3f0dff165f7c48edd7b2bc5b79a5993c3473", "descriptor": { "kind": "router-request", "transport": "http", @@ -781,10 +810,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-28T10:35:56.728Z" + "startedAt": "2026-08-28T23:29:47.352Z" } }, - "timestamp": "2026-08-28T10:35:56.730Z" + "timestamp": "2026-08-28T23:29:47.355Z" } } }, @@ -797,7 +826,7 @@ "source": { "eventId": "run-000001:runtime:2", "providerSequence": 2, - "occurredAt": "2026-08-28T10:35:56.734Z", + "occurredAt": "2026-08-28T23:29:47.361Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "error": { @@ -816,7 +845,7 @@ "source": { "eventId": "run-000001:runtime:3", "providerSequence": 3, - "occurredAt": "2026-08-28T10:35:56.737Z", + "occurredAt": "2026-08-28T23:29:47.365Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "status": "failed", @@ -840,10 +869,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-d7dc712a90ee86b137737a94", + "id": "effect-op-terminal-000002-2af333447995b080ba597cd3", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "d7dc712a90ee86b137737a9406364043b494f6b542d21903f0255e8bc261f33a", + "requestDigest": "2af333447995b080ba597cd3e8554c498d83dd433017a3bc6a7917e9ad7a705f", "kind": "send", "status": "failed", "attempt": 1, diff --git a/artifacts/verification/w6/states/failure-or-reconnect.png b/artifacts/verification/w6/states/failure-or-reconnect.png index acb463243419a6b873d69c72312668a937037aca..34b2199e4130c0c9d79cfdf97cfdc200269cb9d2 100644 GIT binary patch delta 20 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 I#`Mkq0j{3~CjbBd literal 11548 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 delta 20 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 literal 0 HcmV?d00001 diff --git a/artifacts/verification/w6/states/multi-run.txt b/artifacts/verification/w6/states/multi-run.txt new file mode 100644 index 00000000..9977b608 --- /dev/null +++ b/artifacts/verification/w6/states/multi-run.txt @@ -0,0 +1,24 @@ + › parallel run B + + working… + + + + + + + + + + + + + +──────────────────────────────────────────────────────────────────────────────── +› queue #1 + + +─────────────────── type / for commands · Alt+Enter · paste ──────────────────── +profile Braid starter · pi · via not connected Ctrl+C cancel +focus branch-1 · running · pi/fixture/deterministic actions switch/cancel +work branch-623aa83c34…af629727 · running actions switch/cancel diff --git a/artifacts/verification/w6/states/narrow.json b/artifacts/verification/w6/states/narrow.json index fd112c0f..ea5fd7f5 100644 --- a/artifacts/verification/w6/states/narrow.json +++ b/artifacts/verification/w6/states/narrow.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 40, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -288,10 +288,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -324,6 +334,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -355,12 +384,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -379,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } } diff --git a/artifacts/verification/w6/states/narrow.png b/artifacts/verification/w6/states/narrow.png index 911e13c2efe9671cedaa365e30ccdb9e9a180cac..53f8e9fbebdabe561816c7b06a03f9cf0757c6e5 100644 GIT binary patch delta 18 ZcmZ4Pz1(|3HoLg2UUvG^mW@TGssKa82LS*8 delta 18 ZcmZ4Pz1(|3HanNH#i@?!?u|vJssKe%2O$6e diff --git a/artifacts/verification/w6/states/profile.json b/artifacts/verification/w6/states/profile.json index f7b3ecc3..8b419c1c 100644 --- a/artifacts/verification/w6/states/profile.json +++ b/artifacts/verification/w6/states/profile.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -288,10 +288,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -324,6 +334,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -355,12 +384,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -379,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } } diff --git a/artifacts/verification/w6/states/profile.png b/artifacts/verification/w6/states/profile.png index 806d74e1e0179d9172ba928e5a95f0c193a1107f..9d3b2489756e05a9d5a0251de41dd3fe747175b1 100644 GIT binary patch delta 20 ccmca?c-e4+6%)I-tnR10Eq0q7nI?$=08vo~O#lD@ delta 20 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 normalized(terminal.screen()).includes('stream and replay'), 'supervisor activity', ) - terminal.input('\t') + // Activity starts on the all scope. Cycle until the worker scope is visible. + for (let attempt = 0; attempt < 4; attempt += 1) { + if (/^\s*workers\b/iu.test(terminal.screen())) break + const previousHeading = terminal.screen().split('\n', 1)[0] + terminal.input('\t') + await terminal.waitFor( + () => terminal.screen().split('\n', 1)[0] !== previousHeading, + `worker activity scope ${attempt + 1}`, + ) + } await terminal.waitFor( () => /^\s*workers\b/iu.test(terminal.screen()), 'worker activity filter', diff --git a/test/scripts.test.ts b/test/scripts.test.ts index 7f3b9b5f..64fc0767 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -132,6 +132,42 @@ test('active streaming capture waits for a terminal run state before exiting', a assert.equal(closed, true) }) +test('supervision capture reaches the worker Activity scope from the default scope', async () => { + const definition = createStateDefinitions((value: string) => value).find( + (candidate: { readonly name: string }) => candidate.name === 'supervision', + ) + assert.ok(definition) + + let screen = 'activity · 4\nstream and replay' + const inputs: string[] = [] + let closed = false + await definition.run({ + input(data: string) { + inputs.push(data) + const tabCount = inputs.filter((item) => item === '\t').length + if (tabCount > 0 && tabCount < 3) screen = `${['runs', 'analyses'][tabCount - 1]} · 0` + if (tabCount === 3) screen = 'workers · 3\na/r' + }, + screen: () => screen, + async waitFor(predicate: () => boolean, label: string) { + assert.equal(predicate(), true, label) + }, + async waitForStable() {}, + async captureState() { + return { + point: { screen }, + record: { view: { activity: [{ kind: 'worker' }] } }, + } + }, + async closeNormally() { + closed = true + }, + }) + + assert.deepEqual(inputs, ['/activity', '\r', '\t', '\t', '\t']) + assert.equal(closed, true) +}) + test('multi-run capture recognizes responsive Work Strip rows without requiring lower-priority fields', () => { assert.equal( isRunningWorkStripRow( From da27d22d647d862fdbd0425d27657fd5ffd47cda Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 17:55:21 -0600 Subject: [PATCH 049/136] perf(startup): defer cli bridge provider loading --- src/adapters/runtime/lazy-execution.ts | 137 ++++++++++++++++ src/startup/durable-runtime.ts | 217 ++++++++++++++++++++++++- test/cli-startup.test.ts | 31 ++++ 3 files changed, 384 insertions(+), 1 deletion(-) create mode 100644 src/adapters/runtime/lazy-execution.ts diff --git a/src/adapters/runtime/lazy-execution.ts b/src/adapters/runtime/lazy-execution.ts new file mode 100644 index 00000000..7d50fd1a --- /dev/null +++ b/src/adapters/runtime/lazy-execution.ts @@ -0,0 +1,137 @@ +import type { + AgentEnvironmentCapabilities, + NativeContextBoundaryProof, +} from '@tangle-network/agent-interface' +import type { BraidRuntimeEvent, RuntimeEventEnvelope } from '../../domain/runtime-events.js' +import { + type CancelRunInput, + type ControlAcknowledgement, + type ExecuteTurnInput, + type ExecutionAdmission, + type ExecutionPort, + type ProviderRunSnapshot, + type RetainedExecutionRecoveryContext, + type RunCapabilities, + UNKNOWN_RUN_CAPABILITIES, +} from '../../ports/execution.js' + +type StatusInput = Parameters>[0] +type ReconnectInput = Parameters>[0] +type ReconnectEvent = + Awaited>> extends AsyncIterable + ? Event + : never +type DetachInput = Parameters>[0] +type SteerInput = Parameters>[0] +type NativeBoundaryInput = Parameters>[0] + +export interface LazyExecutionOptions { + readonly load: () => Promise +} + +/** + * Defers provider construction until a run needs it. + * + * Terminal startup can restore local state without loading provider packages. + * The first provider operation still uses the exact production port. + */ +export class LazyExecutionPort implements ExecutionPort { + readonly admissionMode = 'async' as const + readonly #loadPort: () => Promise + #portPromise: Promise | undefined + + constructor(options: LazyExecutionOptions) { + this.#loadPort = options.load + } + + readonly capabilities = (input: ExecuteTurnInput): RunCapabilities | Promise => + this.#load().then((port) => { + const capabilities = port.capabilities + if (capabilities === undefined) return UNKNOWN_RUN_CAPABILITIES + if (typeof capabilities === 'function') return capabilities(input) + return { + ...UNKNOWN_RUN_CAPABILITIES, + controls: { ...UNKNOWN_RUN_CAPABILITIES.controls, cancel: capabilities.cancel }, + } + }) + + async admit(input: ExecuteTurnInput): Promise { + const port = await this.#load() + if (port.admit === undefined) + throw new Error('The selected execution port does not support admission') + return port.admit(input) + } + + async *streamTurn( + input: ExecuteTurnInput, + ): AsyncGenerator { + const port = await this.#load() + yield* port.streamTurn(input) + } + + async cancelRun( + input: CancelRunInput & { readonly reason?: string; readonly signal?: AbortSignal }, + ): Promise { + const port = await this.#load() + if (port.cancelRun === undefined) + throw new Error('The selected execution port does not support cancellation') + return port.cancelRun(input) + } + + async detachRun(input: DetachInput): Promise { + const port = await this.#load() + if (port.detachRun === undefined) + throw new Error('The selected execution port does not support detachment') + return port.detachRun(input) + } + + async steerRun(input: SteerInput): Promise { + const port = await this.#load() + if (port.steerRun === undefined) + throw new Error('The selected execution port does not support steering') + return port.steerRun(input) + } + + async status(input: StatusInput): Promise { + const port = await this.#load() + if (port.status === undefined) + throw new Error('The selected execution port does not support status') + return port.status(input) + } + + async respondInteraction(input: { + readonly command: import('@tangle-network/agent-interface').InteractionResponseCommand + readonly signal?: AbortSignal + readonly recovery?: RetainedExecutionRecoveryContext + }): Promise { + const port = await this.#load() + if (port.respondInteraction === undefined) + throw new Error('The selected execution port does not support interaction responses') + return port.respondInteraction(input) + } + + async *reconnect(input: ReconnectInput): AsyncGenerator { + const port = await this.#load() + if (port.reconnect === undefined) + throw new Error('The selected execution port does not support reconnection') + yield* port.reconnect(input) + } + + async nativeBoundary(input: NativeBoundaryInput): Promise { + const port = await this.#load() + if (port.nativeBoundary === undefined) return null + return port.nativeBoundary(input) + } + + async environmentCapabilities(): Promise { + const port = await this.#load() + if (port.environmentCapabilities === undefined) + throw new Error('The selected execution port does not publish environment capabilities') + return port.environmentCapabilities() + } + + #load(): Promise { + this.#portPromise ??= this.#loadPort() + return this.#portPromise + } +} diff --git a/src/startup/durable-runtime.ts b/src/startup/durable-runtime.ts index 888b8d37..bd2bef5f 100644 --- a/src/startup/durable-runtime.ts +++ b/src/startup/durable-runtime.ts @@ -1 +1,216 @@ -export { createDurableBraidApplication } from '../app/composition.js' +import { performance } from 'node:perf_hooks' +import type { HeadlessKeySource } from '../adapters/credentials/headless-key.js' +import { createOperatingSystemCredentialStore } from '../adapters/credentials/os.js' +import { + AgentRuntimeExecutionPort, + type AgentTurnBackendResolver, +} from '../adapters/runtime/agent-runtime-execution.js' +import { LazyExecutionPort } from '../adapters/runtime/lazy-execution.js' +import { UnavailableExecutionPort } from '../adapters/runtime/unavailable-execution.js' +import { + openSqliteStorage, + type SqliteStartupStage, + type SqliteStorage, +} from '../adapters/storage/sqlite.js' +import { BraidApplication } from '../app/application.js' +import type { CompositionOptions } from '../app/composition.js' +import type { ConnectionRegistry } from '../app/connections.js' +import { STARTER_PROFILE } from '../app/default-profiles.js' +import type { IntelligenceActionsOptions } from '../app/intelligence-actions.js' +import type { ProductionCompositionConfig } from '../app/production-composition.js' +import { StorageJournal } from '../app/storage-journal.js' +import { UnavailableAnalyst } from '../app/unavailable-analyst.js' +import { type Clock, SystemClock } from '../ports/clock.js' +import { type CredentialPort, credentialRef } from '../ports/credentials.js' +import type { ExecutionPort } from '../ports/execution.js' +import { RandomIds } from '../ports/ids.js' +import type { NativeInteractiveExecutionControl } from '../ports/native-interactive-execution.js' + +export interface DurableCompositionOptions + extends Omit { + readonly path: string + /** Directory that may contain Braid's encrypted database and backups. */ + readonly storageRoot?: string + /** Project directory materialized for agent execution. */ + readonly workspaceRoot?: string + readonly credentialStore?: CredentialPort + readonly databaseKeyRef?: import('../ports/credentials.js').CredentialRef + readonly databaseKeySource?: HeadlessKeySource + readonly backupDirectory?: string + readonly execution?: ExecutionPort + readonly backendResolver?: AgentTurnBackendResolver + /** Mutable catalog shared with the product connection service. */ + readonly connectionRegistry?: ConnectionRegistry + readonly startupObserver?: (stage: DurableStartupStage) => void +} + +export interface DurableStartupStage { + readonly name: + | 'production-composition' + | 'storage-open' + | `storage.${SqliteStartupStage['name']}` + | 'journal-restore' + | 'application-create' + readonly durationMs: number +} + +export interface DurableBraidApplication { + readonly app: BraidApplication + readonly storage: SqliteStorage + readonly nativeInteractive?: NativeInteractiveExecutionControl +} + +function withProductionCredentialOptions( + config: ProductionCompositionConfig, + credentialStore: CredentialPort, +): ProductionCompositionConfig { + const connectionOptions = config.connectionOptions ?? {} + return { + ...config, + connectionOptions: { + ...connectionOptions, + credentials: connectionOptions.credentials ?? credentialStore, + credentialRefResolver: + connectionOptions.credentialRefResolver ?? ((ref) => credentialRef(`cred:v1:${ref}`)), + }, + } +} + +/** Open durable local state without loading provider adapters until a connection needs them. */ +export async function createDurableBraidApplication( + options: DurableCompositionOptions, +): Promise { + const clock: Clock = options.clock ?? new SystemClock() + const credentialStore = options.credentialStore ?? createOperatingSystemCredentialStore() + const productionConfig = + options.production === undefined + ? undefined + : withProductionCredentialOptions( + { + ...options.production, + ...(options.workspaceRoot === undefined + ? {} + : { workspaceRoot: options.workspaceRoot }), + }, + credentialStore, + ) + const selectedConnection = productionConfig?.connections.find( + (connection) => connection.id === productionConfig.connectionId, + ) + const deferProductionComposition = selectedConnection?.kind === 'cli-bridge' + let stageStarted = performance.now() + const production = + productionConfig === undefined || deferProductionComposition + ? undefined + : (await import('../app/production-composition.js')).createProductionComposition( + productionConfig, + options.connectionRegistry, + ) + reportStartupStage(options.startupObserver, 'production-composition', stageStarted) + stageStarted = performance.now() + const storage = await openSqliteStorage({ + path: options.path, + credentialStore, + ...(options.storageRoot === undefined && options.workspaceRoot === undefined + ? {} + : { workspaceRoot: options.storageRoot ?? options.workspaceRoot }), + ...(options.databaseKeyRef === undefined ? {} : { databaseKeyRef: options.databaseKeyRef }), + ...(options.databaseKeySource === undefined + ? {} + : { databaseKeySource: options.databaseKeySource }), + ...(options.backupDirectory === undefined ? {} : { backupDirectory: options.backupDirectory }), + startupObserver: (stage) => + reportObservedStartupStage( + options.startupObserver, + `storage.${stage.name}`, + stage.durationMs, + ), + }) + reportStartupStage(options.startupObserver, 'storage-open', stageStarted) + try { + stageStarted = performance.now() + const scopedJournal = await StorageJournal.fromStorage(storage, clock) + reportStartupStage(options.startupObserver, 'journal-restore', stageStarted) + stageStarted = performance.now() + const configuredIntelligence: IntelligenceActionsOptions = options.intelligence ?? { + analyst: new UnavailableAnalyst(), + } + const intelligence = + production?.supervisorController === undefined + ? configuredIntelligence + : { + ...configuredIntelligence, + supervisorController: + configuredIntelligence.supervisorController ?? production.supervisorController, + } + const app = new BraidApplication({ + profile: options.profile ?? productionConfig?.profile ?? STARTER_PROFILE, + execution: + options.execution ?? + production?.execution ?? + (productionConfig === undefined + ? options.backendResolver + ? new AgentRuntimeExecutionPort(options.backendResolver) + : new UnavailableExecutionPort() + : new LazyExecutionPort({ + load: async () => { + const loaded = await import('../app/production-composition.js') + return loaded.createProductionComposition( + productionConfig, + options.connectionRegistry, + ).execution + }, + })), + clock, + ids: options.ids ?? new RandomIds(), + journal: scopedJournal, + effectStorage: storage, + conversationStorage: storage, + intelligence, + ...(options.effectCoordinator === undefined + ? {} + : { effectCoordinator: options.effectCoordinator }), + ...(options.cancelTimeoutMs === undefined + ? {} + : { cancelTimeoutMs: options.cancelTimeoutMs }), + ...(options.interactionResponseTimeoutMs === undefined + ? {} + : { interactionResponseTimeoutMs: options.interactionResponseTimeoutMs }), + }) + reportStartupStage(options.startupObserver, 'application-create', stageStarted) + return { + app, + storage, + ...(production?.nativeInteractive === undefined + ? {} + : { nativeInteractive: production.nativeInteractive }), + } + } catch (error) { + await storage.close().catch(() => undefined) + throw error + } +} + +function reportObservedStartupStage( + observer: DurableCompositionOptions['startupObserver'], + name: DurableStartupStage['name'], + durationMs: number, +): void { + try { + observer?.({ name, durationMs }) + } catch { + // Diagnostics cannot change application startup. + } +} + +function reportStartupStage( + observer: DurableCompositionOptions['startupObserver'], + name: DurableStartupStage['name'], + startedAt: number, +): void { + try { + observer?.({ name, durationMs: performance.now() - startedAt }) + } catch { + // Diagnostics cannot change application startup. + } +} diff --git a/test/cli-startup.test.ts b/test/cli-startup.test.ts index 4a39fbaa..da0e313d 100644 --- a/test/cli-startup.test.ts +++ b/test/cli-startup.test.ts @@ -3,10 +3,12 @@ import { access, mkdtemp, readFile, rm } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import test from 'node:test' +import { LazyExecutionPort } from '../src/adapters/runtime/lazy-execution.js' import { createApplicationUiController } from '../src/adapters/tui/application-ui-controller.js' import { createBraidApplication } from '../src/app/composition.js' import { CliUsageError, parseArgs } from '../src/bin/args.js' import { createInterfaceSignalLifecycle } from '../src/bin/interface-signal-lifecycle.js' +import type { ExecuteTurnInput, ExecutionPort } from '../src/ports/execution.js' import { createStartupPreview } from '../src/startup/preview-runtime.js' import { BRAID_VERSION } from '../src/version.js' import type { BraidUiController } from '../src/views/shared/intents.js' @@ -128,6 +130,35 @@ test('startup responsibilities stay split into bounded modules', async () => { assert.match(startupBuild, /['"]koffi['"]/u) }) +test('lazy execution defers provider loading and reuses the loaded port', async () => { + let loads = 0 + let streamCalls = 0 + const admission = { provider: 'test-provider' } + const execution = new LazyExecutionPort({ + load: async () => { + loads += 1 + return { + admit: async () => admission, + async *streamTurn() { + streamCalls += 1 + yield* [] + }, + } satisfies ExecutionPort + }, + }) + const input = {} as ExecuteTurnInput + + assert.equal(loads, 0) + assert.deepEqual(await execution.admit(input), admission) + assert.equal(loads, 1) + for await (const _event of execution.streamTurn(input)) { + // The test provider emits no events. + } + assert.equal(streamCalls, 1) + assert.deepEqual(await execution.admit(input), admission) + assert.equal(loads, 1) +}) + test('repeated verification signals capture frames during streaming', async () => { const root = await mkdtemp(join(tmpdir(), 'braid-signal-frames-')) const recordPath = join(root, 'state.json') From 7b75c48643a305fbd7797c4dffdc8d003c128cd1 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 18:13:05 -0600 Subject: [PATCH 050/136] perf(evidence): refresh public cohort matrix --- .../performance/release-measurements.json | 160 +-- artifacts/verification/performance/smoke.json | 1202 ++++++++--------- scripts/performance/reporting.mjs | 23 +- 3 files changed, 701 insertions(+), 684 deletions(-) diff --git a/artifacts/verification/performance/release-measurements.json b/artifacts/verification/performance/release-measurements.json index 153f655b..c41345f4 100644 --- a/artifacts/verification/performance/release-measurements.json +++ b/artifacts/verification/performance/release-measurements.json @@ -6,12 +6,12 @@ "name": "PERF-01", "unit": "ms", "n": 20, - "minimum": 128.5467520000093, - "median": 134.52279899999849, - "p90": 137.93009399999573, - "p95": 139.9279600000009, - "p99": 146.11429899999348, - "maximum": 146.11429899999348, + "minimum": 164.54032099999313, + "median": 176.76786799999536, + "p90": 185.9409539999906, + "p95": 186.4503529999929, + "p99": 187.6756630000018, + "maximum": 187.6756630000018, "target": { "metric": "process-start-to-first-visible-frame", "percentile": "p95", @@ -20,9 +20,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "warm-10000-event-encrypted-sqlite", "eventCount": 10000 @@ -35,12 +35,12 @@ "name": "PERF-02", "unit": "ms", "n": 20, - "minimum": 152.1218050000025, - "median": 168.79698400000052, - "p90": 184.84830299999157, - "p95": 198.06498500000453, - "p99": 202.07973899999342, - "maximum": 202.07973899999342, + "minimum": 202.9691979999916, + "median": 210.62579299999925, + "p90": 220.14702899999975, + "p95": 226.78305099999125, + "p99": 236.83298900000227, + "maximum": 236.83298900000227, "target": { "metric": "process-start-to-first-visible-frame", "percentile": "p95", @@ -49,9 +49,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "cold-100000-event-encrypted-sqlite", "eventCount": 100000 @@ -64,12 +64,12 @@ "name": "PERF-03", "unit": "ms", "n": 1000, - "minimum": 1.572889999995823, - "median": 3.8978009999991627, - "p90": 4.429468000002089, - "p95": 4.630062999989605, - "p99": 5.886098999995738, - "maximum": 67.48604000000341, + "minimum": 1.5796439999976428, + "median": 3.8928199999936623, + "p90": 4.518037999994704, + "p95": 4.760824999990291, + "p99": 5.690161999998963, + "maximum": 11.747043000010308, "target": { "metric": "idle-key-to-updated-frame", "percentile": "p95", @@ -78,9 +78,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "warm-10000-event-encrypted-sqlite", "eventCount": 10000 @@ -93,12 +93,12 @@ "name": "PERF-04", "unit": "ms", "n": 10000, - "minimum": 3.924732000014046, - "median": 21.236068000027444, - "p90": 30.873592999996617, - "p95": 32.554675000021234, - "p99": 34.78197299997555, - "maximum": 43.15914599999087, + "minimum": 3.119621999998344, + "median": 20.9435339999618, + "p90": 30.599323000002187, + "p95": 32.16745499998797, + "p99": 34.54940700001316, + "maximum": 43.03097700001672, "target": { "metric": "runtime-event-to-updated-frame", "percentile": "p95", @@ -107,9 +107,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "@xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "@xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "memory-journal-runtime-frame-path", "eventCount": 10000 @@ -122,12 +122,12 @@ "name": "PERF-05", "unit": "ms", "n": 20, - "minimum": 749.9611370000057, - "median": 803.2254679999896, - "p90": 837.0514050000347, - "p95": 872.9583330000169, - "p99": 910.5310999999638, - "maximum": 910.5310999999638, + "minimum": 1413.2583909999812, + "median": 1462.2683589999797, + "p90": 1523.1327039999887, + "p95": 1527.1304489999893, + "p99": 1564.041367000027, + "maximum": 1564.041367000027, "target": { "metric": "replay-reduce-10000-events", "percentile": "p95", @@ -136,8 +136,8 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "terminal": "none; production StorageJournal + reducer", "dimensions": "none", "database": "warm-10000-event-encrypted-sqlite", @@ -151,12 +151,12 @@ "name": "PERF-06", "unit": "ms", "n": 20, - "minimum": 11.109155000012834, - "median": 12.112230999977328, - "p90": 15.245353000005707, - "p95": 15.764255000045523, - "p99": 15.87886100000469, - "maximum": 15.87886100000469, + "minimum": 10.917339000036009, + "median": 11.479974999965634, + "p90": 12.449731000000611, + "p95": 13.447253000049386, + "p99": 19.73856899997918, + "maximum": 19.73856899997918, "target": { "metric": "open-100000-event-conversation", "percentile": "p95", @@ -165,9 +165,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "cold-100000-event-encrypted-sqlite", "eventCount": 100000 @@ -180,12 +180,12 @@ "name": "PERF-07", "unit": "ms", "n": 1000, - "minimum": 9.40662500000326, - "median": 16.065145999993547, - "p90": 18.11038600000029, - "p95": 18.98701299999084, - "p99": 19.99051000000327, - "maximum": 21.398293999998714, + "minimum": 10.428272000004654, + "median": 16.018557000003057, + "p90": 18.029467999993358, + "p95": 18.728513000009116, + "p99": 20.557576999999583, + "maximum": 27.003654000000097, "target": { "metric": "resize-during-stream-frame", "percentile": "p95", @@ -194,12 +194,12 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "40x12,80x24,120x40,200x60", "database": "packed headless 100-events-per-second stream", - "eventCount": 2004 + "eventCount": 2008 }, "state": "warm", "repetitions": 1000 @@ -211,10 +211,10 @@ "n": 2, "minimum": 0, "median": 0, - "p90": 0.01666437090266441, - "p95": 0.01666437090266441, - "p99": 0.01666437090266441, - "maximum": 0.01666437090266441, + "p90": 0, + "p95": 0, + "p99": 0, + "maximum": 0, "target": { "metric": "idle-cpu", "percentile": "median", @@ -223,9 +223,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "deterministic-offline-fixture-idle", "eventCount": 0 @@ -238,12 +238,12 @@ "name": "PERF-09", "unit": "MiB RSS", "n": 20, - "minimum": 86.10546875, - "median": 87.21484375, - "p90": 87.56640625, - "p95": 87.73828125, - "p99": 88.0703125, - "maximum": 88.0703125, + "minimum": 104.59765625, + "median": 110.671875, + "p90": 112.43359375, + "p95": 112.66796875, + "p99": 113.984375, + "maximum": 113.984375, "target": { "metric": "resident-memory-10000-event-conversation", "percentile": "p95", @@ -252,8 +252,8 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "terminal": "packed production view model; child process RSS", "dimensions": "80x24", "database": "warm-10000-event-encrypted-sqlite", @@ -281,8 +281,8 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "terminal": "none; packed production encrypted SQLite artifacts", "dimensions": "none", "database": "cold-10000-event-encrypted-sqlite", diff --git a/artifacts/verification/performance/smoke.json b/artifacts/verification/performance/smoke.json index e5f2068c..2632a655 100644 --- a/artifacts/verification/performance/smoke.json +++ b/artifacts/verification/performance/smoke.json @@ -3,7 +3,7 @@ "kind": "braid-performance-proof", "mode": "smoke", "status": "passed", - "generatedAt": "2026-08-10T19:07:26.279Z", + "generatedAt": "2026-08-29T00:05:05.171Z", "command": "pnpm run test:performance", "thresholds": { "PERF-01": { @@ -72,21 +72,21 @@ "reason": "smoke report has no release validation" }, "provenance": { - "repository": "/home/drew/code/braid-unified-activity-wt", - "revision": "fa375f9ef14ecead34d287f294465d46f54bc8f4", + "repository": "/home/drew/code/.worktrees/braid-10-complete", + "revision": "da27d22d647d862fdbd0425d27657fd5ffd47cda", "packages": { - "braid": "0.1.0", - "piTui": "0.84.1", + "braid": "0.3.0", + "piTui": "0.84.3", "nodePty": "1.1.0", "xtermHeadless": "6.0.0", "sqlite": "13.0.3" }, "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "arch": "x64", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a", + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325", "packedCandidate": { "status": "ready" }, @@ -115,12 +115,12 @@ "name": "PERF-01", "unit": "ms", "n": 1, - "minimum": 128.22121699999843, - "median": 128.22121699999843, - "p90": 128.22121699999843, - "p95": 128.22121699999843, - "p99": 128.22121699999843, - "maximum": 128.22121699999843, + "minimum": 172.10708100000193, + "median": 172.10708100000193, + "p90": 172.10708100000193, + "p95": 172.10708100000193, + "p99": 172.10708100000193, + "maximum": 172.10708100000193, "target": { "metric": "process-start-to-first-visible-frame", "percentile": "p95", @@ -129,9 +129,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "warm-10000-event-encrypted-sqlite", "eventCount": 10000 @@ -139,7 +139,7 @@ "state": "warm", "repetitions": 1, "rawSamples": [ - 128.22121699999843 + 172.10708100000193 ], "command": "pnpm run test:performance [PERF-01; smoke]", "passed": true, @@ -165,88 +165,88 @@ ], "startupStages": [ { - "spawnMs": 18.168, - "scriptMs": 15.133, - "compileCacheMs": 0.015, - "applicationImportsMs": 56.456, - "previewImportsMs": 36.588, - "startupImportsMs": 56.456, - "applicationOpenMs": 26.951, + "spawnMs": 20.758, + "scriptMs": 16.033, + "compileCacheMs": 0.011, + "applicationImportsMs": 101.694, + "previewImportsMs": 76.09, + "startupImportsMs": 101.694, + "applicationOpenMs": 21.306, "applicationStages": [ { "name": "production-composition", - "durationMs": 4.4343780000000095 + "durationMs": 0.00818600000000913 }, { "name": "storage.path-validation", - "durationMs": 1.5914159999999953 + "durationMs": 0.569619000000003 }, { "name": "storage.lock-acquire", - "durationMs": 0.7996259999999893 + "durationMs": 0.5767330000000044 }, { "name": "storage.recovery-check", - "durationMs": 0.2423780000000022 + "durationMs": 0.16932299999999145 }, { "name": "storage.initialization-marker", - "durationMs": 0.11408500000000288 + "durationMs": 0.10243099999999572 }, { "name": "storage.path-lock", - "durationMs": 2.773715999999993 + "durationMs": 1.4366930000000053 }, { "name": "storage.credential", - "durationMs": 3.790790000000001 + "durationMs": 2.6082649999999887 }, { "name": "storage.cipher-open", - "durationMs": 4.671616999999998 + "durationMs": 4.743910999999997 }, { "name": "storage.schema", - "durationMs": 0.03271399999999858 + "durationMs": 0.025830999999996607 }, { "name": "storage.content-keys", - "durationMs": 0.12290299999999377 + "durationMs": 0.12230099999999311 }, { "name": "storage.snapshot-maintenance", - "durationMs": 0.34834699999998975 + "durationMs": 0.3548770000000019 }, { "name": "storage.projection", - "durationMs": 1.2222879999999918 + "durationMs": 1.7102500000000163 }, { "name": "storage.configuration", - "durationMs": 0.09647999999999968 + "durationMs": 0.09689000000000192 }, { "name": "storage.artifact-permissions", - "durationMs": 2.1415700000000015 + "durationMs": 0.22424000000000888 }, { "name": "storage-open", - "durationMs": 15.76612 + "durationMs": 11.751620000000003 }, { "name": "journal-restore", - "durationMs": 4.933380999999997 + "durationMs": 7.581556000000006 }, { "name": "application-create", - "durationMs": 1.6147920000000084 + "durationMs": 1.7232960000000048 } ], - "previewRenderMs": 11.499, - "terminalImportsMs": 10.046, - "terminalMs": 0.049, - "initializeMs": 0.248, - "interactivePreparationMs": 10.343 + "previewRenderMs": 12.304, + "terminalImportsMs": 3.003, + "terminalMs": 0.042, + "initializeMs": 0.224, + "interactivePreparationMs": 3.269 } ] }, @@ -257,8 +257,8 @@ "readyMarker": "Completed Braid performance conversation (10000 committed events)", "frameReadiness": "unique seeded final-content marker plus braid shell and no startup error", "compileCache": "primed exact packed startup modules; one shared cache across repeat launches", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } }, { @@ -266,12 +266,12 @@ "name": "PERF-02", "unit": "ms", "n": 1, - "minimum": 162.42808499999956, - "median": 162.42808499999956, - "p90": 162.42808499999956, - "p95": 162.42808499999956, - "p99": 162.42808499999956, - "maximum": 162.42808499999956, + "minimum": 216.79717000000528, + "median": 216.79717000000528, + "p90": 216.79717000000528, + "p95": 216.79717000000528, + "p99": 216.79717000000528, + "maximum": 216.79717000000528, "target": { "metric": "process-start-to-first-visible-frame", "percentile": "p95", @@ -280,9 +280,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "cold-100000-event-encrypted-sqlite", "eventCount": 100000 @@ -290,7 +290,7 @@ "state": "cold", "repetitions": 1, "rawSamples": [ - 162.42808499999956 + 216.79717000000528 ], "command": "pnpm run test:performance [PERF-02; smoke]", "passed": true, @@ -316,88 +316,88 @@ ], "startupStages": [ { - "spawnMs": 17.876, - "scriptMs": 18.002, - "compileCacheMs": 0.025, - "applicationImportsMs": 80.07, - "previewImportsMs": 58.123, - "startupImportsMs": 80.07, - "applicationOpenMs": 35.462, + "spawnMs": 20.336, + "scriptMs": 16.49, + "compileCacheMs": 0.012, + "applicationImportsMs": 138.852, + "previewImportsMs": 111.523, + "startupImportsMs": 138.852, + "applicationOpenMs": 29.365, "applicationStages": [ { "name": "production-composition", - "durationMs": 4.047676999999993 + "durationMs": 0.008046000000007325 }, { "name": "storage.path-validation", - "durationMs": 1.0723430000000036 + "durationMs": 0.529720999999995 }, { "name": "storage.lock-acquire", - "durationMs": 0.7193079999999981 + "durationMs": 0.6002590000000225 }, { "name": "storage.recovery-check", - "durationMs": 0.19650699999999688 + "durationMs": 0.1656459999999811 }, { "name": "storage.initialization-marker", - "durationMs": 0.11744099999999946 + "durationMs": 0.09951499999999669 }, { "name": "storage.path-lock", - "durationMs": 2.127182000000005 + "durationMs": 1.4127459999999985 }, { "name": "storage.credential", - "durationMs": 3.4794669999999996 + "durationMs": 2.5259029999999996 }, { "name": "storage.cipher-open", - "durationMs": 4.884205000000009 + "durationMs": 4.875901000000027 }, { "name": "storage.schema", - "durationMs": 0.030679999999989604 + "durationMs": 0.03569000000001665 }, { "name": "storage.content-keys", - "durationMs": 0.1828000000000003 + "durationMs": 0.13914300000001845 }, { "name": "storage.snapshot-maintenance", - "durationMs": 0.32879799999999193 + "durationMs": 0.3468610000000183 }, { "name": "storage.projection", - "durationMs": 9.082188000000002 + "durationMs": 8.941617999999977 }, { "name": "storage.configuration", - "durationMs": 0.1778200000000112 + "durationMs": 0.11520699999999806 }, { "name": "storage.artifact-permissions", - "durationMs": 3.071222000000006 + "durationMs": 0.2810219999999788 }, { "name": "storage-open", - "durationMs": 23.914146000000002 + "durationMs": 19.12029799999999 }, { "name": "journal-restore", - "durationMs": 5.671656999999996 + "durationMs": 8.123241000000007 }, { "name": "application-create", - "durationMs": 1.627646999999996 + "durationMs": 1.8886710000000164 } ], - "previewRenderMs": 10.993, - "terminalImportsMs": 16.151, - "terminalMs": 0.042, - "initializeMs": 0.25, - "interactivePreparationMs": 16.443 + "previewRenderMs": 11.741, + "terminalImportsMs": 8.482, + "terminalMs": 0.052, + "initializeMs": 0.256, + "interactivePreparationMs": 8.79 } ] }, @@ -408,8 +408,8 @@ "readyMarker": "Completed Braid performance conversation (100000 committed events)", "frameReadiness": "unique seeded final-content marker plus braid shell and no startup error", "compileCache": "fresh empty directory for every launch; no compiled startup modules reused", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } }, { @@ -417,12 +417,12 @@ "name": "PERF-03", "unit": "ms", "n": 1, - "minimum": 7.092285999999149, - "median": 7.092285999999149, - "p90": 7.092285999999149, - "p95": 7.092285999999149, - "p99": 7.092285999999149, - "maximum": 7.092285999999149, + "minimum": 8.998489999998128, + "median": 8.998489999998128, + "p90": 8.998489999998128, + "p95": 8.998489999998128, + "p99": 8.998489999998128, + "maximum": 8.998489999998128, "target": { "metric": "idle-key-to-updated-frame", "percentile": "p95", @@ -431,9 +431,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "warm-10000-event-encrypted-sqlite", "eventCount": 10000 @@ -441,7 +441,7 @@ "state": "warm", "repetitions": 1, "rawSamples": [ - 7.092285999999149 + 8.998489999998128 ], "command": "pnpm run test:performance [PERF-03; smoke]", "passed": true, @@ -462,11 +462,10 @@ { "index": 1, "token": "perf-key-00001", - "keyFrameVersion": 6, - "eraseFrameVersion": 7, + "keyFrameVersion": 8, + "eraseFrameVersion": 9, "keyFrame": [ - "braid cwd braid-performance-10000-0KnuXR · session New conversation", - " Performance seed conversation with normalized text events. ", + " › Performance seed conversation with normalized text events. ", " ", " Completed Braid performance conversation (10000 committed events); recent ", " event 9997. ", @@ -485,14 +484,14 @@ " ", " ", "────────────────────────────────────────────────────────────────────────────────", - " perf-key-00001 ", - "────────────────────────────────────────────────────────────────────────────────", - "completed model automatic", - "AgentProfile Braid performance profile · runner pi Ctrl+P commands" + "› send unavailable perf-key-00001 ", + " ", + " ", + "─────────────────── type / for commands · Alt+Enter · paste ────────────────────", + "profile Braid performance profile · pi / automatic · via not connected" ], "eraseFrame": [ - "braid cwd braid-performance-10000-0KnuXR · session New conversation", - " Performance seed conversation with normalized text events. ", + " › Performance seed conversation with normalized text events. ", " ", " Completed Braid performance conversation (10000 committed events); recent ", " event 9997. ", @@ -511,10 +510,11 @@ " ", " ", "────────────────────────────────────────────────────────────────────────────────", + "› send unavailable ", " ", - "────────────────────────────────────────────────────────────────────────────────", - "completed model automatic", - "AgentProfile Braid performance profile · runner pi Ctrl+P commands" + " ", + "─────────────────── type / for commands · Alt+Enter · paste ────────────────────", + "profile Braid performance profile · pi / automatic · via not connected" ] } ] @@ -525,8 +525,8 @@ "seed": "10000-event-encrypted-sqlite-headless-production", "inputBinding": "unique perf-key-N text accepted by the real PTY composer", "eraseBinding": "Ctrl-U followed by a later frame with no perf-key-N token", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } }, { @@ -534,12 +534,12 @@ "name": "PERF-04", "unit": "ms", "n": 100, - "minimum": 3.0803200000009383, - "median": 11.934157999996387, - "p90": 18.613400000002002, - "p95": 19.67704600000434, - "p99": 20.905907000000298, - "maximum": 21.15657099999953, + "minimum": 3.89497300000221, + "median": 12.317813000001479, + "p90": 19.751868999999715, + "p95": 20.503766000001633, + "p99": 21.001294000001508, + "maximum": 21.90387799999735, "target": { "metric": "runtime-event-to-updated-frame", "percentile": "p95", @@ -548,9 +548,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "@xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "@xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "memory-journal-runtime-frame-path", "eventCount": 100 @@ -558,106 +558,106 @@ "state": "warm", "repetitions": 100, "rawSamples": [ - 6.454660000003059, - 16.549813000005088, - 11.832728000001225, - 6.287530000001425, - 17.19137700000283, - 12.261462000002211, - 6.659191999999166, - 16.772663000003377, - 10.966470999999729, - 6.3028400000039255, - 15.875083999999333, - 10.125082999998995, - 5.524816999997711, - 15.829192999997758, - 10.960760000001756, - 5.312809999995807, - 14.543369999999413, - 9.800713999997242, - 3.0804510000016307, - 16.69696400000248, - 5.2541740000015125, - 16.59304799999518, - 10.781004999997094, - 6.176330999995116, - 15.819092999998247, - 10.003914000000805, - 5.099849999998696, - 16.62251600000309, - 10.881473000001279, - 5.254765000005136, - 15.378344999997353, - 9.710244999994757, - 19.67704600000434, - 14.139913999999408, - 9.448339000002306, - 4.904033999999228, - 15.678255999999237, - 10.02050700000109, - 5.128415999999561, - 15.907628000000841, - 10.177125000001979, - 5.60923300000286, - 16.50764099999651, - 11.815233999994234, - 6.278302999999141, - 16.965582999997423, - 12.13177700000233, - 6.979343999999401, - 18.364589000004344, - 13.234759999999369, - 7.690124000000651, - 18.613400000002002, - 13.381079000006139, - 8.517145000005257, - 21.15657099999953, - 15.730579000002763, - 10.980647999997018, - 19.275854999999865, - 13.94953899999382, - 8.83517999999458, - 18.005521999999473, - 13.319147000001976, - 8.624595000001136, - 3.0803200000009383, - 15.28435900000477, - 10.3037850000037, - 5.550478000004659, - 17.499504999999772, - 12.561674999997194, - 7.191371999993862, - 19.66910999999527, - 14.947826999996323, - 9.856283000000985, - 20.23484499999904, - 14.942515999995521, - 9.677429999996093, - 20.905907000000298, - 16.102811999997357, - 11.037119999993593, - 6.2722499999945285, - 17.300171999995655, - 11.555131000000983, - 7.0652029999982915, - 17.013928000000305, - 11.934157999996387, - 7.01134699999966, - 18.50094900000113, - 12.844281999998202, - 7.960767999997188, - 18.64710599999671, - 12.871894999996584, - 8.15243499999633, - 19.420530000003055, - 14.509561999999278, - 9.828237000001536, - 20.713067999997293, - 15.39007799999672, - 10.315066999995906, - 20.479667999999947, - 14.52245799999946 + 7.059621000000334, + 16.800740999999107, + 11.73555800000031, + 6.796032999998715, + 17.740506999994977, + 12.652108999995107, + 7.8920169999983045, + 20.503766000001633, + 15.814984000004188, + 11.01070400000026, + 21.001294000001508, + 16.662067999997817, + 11.720958999998402, + 5.96070100000361, + 15.751177999998617, + 10.655295999997179, + 5.790296999999555, + 15.445808000004035, + 9.591776000001119, + 3.89497300000221, + 15.258099999999104, + 10.55609099999856, + 5.722434000002977, + 16.079653999993752, + 11.247699999999895, + 5.517971999994188, + 16.66302999999607, + 11.879831999998714, + 7.0392809999975725, + 16.547853999996732, + 11.648246999997355, + 6.942931999998109, + 17.70450599999458, + 12.774330000000191, + 7.523692999995546, + 21.90387799999735, + 17.163002000001143, + 11.565844999997353, + 20.986364999997022, + 15.726260000003094, + 10.741065000001981, + 5.89284900000348, + 16.242773999998462, + 11.380600999997114, + 6.420554999996966, + 17.18330199999764, + 12.3057789999948, + 6.389875000000757, + 17.42015800000081, + 12.317813000001479, + 7.151260999999067, + 19.674556999998458, + 15.078506999998353, + 9.35756599999877, + 20.389963000001444, + 15.627586000002339, + 9.914922000003571, + 19.751868999999715, + 15.15252199999668, + 10.08097799999814, + 4.232405999995535, + 13.97037999999884, + 8.949814999999944, + 3.9782369999957155, + 15.813780999997107, + 11.11580099999992, + 6.100796999999147, + 16.787374999999884, + 11.905142000003252, + 7.060151999998197, + 17.96714200000133, + 12.93153799999709, + 8.135234000001219, + 19.90530099999887, + 14.945705999998609, + 10.026089999999385, + 19.895531000001938, + 14.708870000002207, + 9.64746500000183, + 19.68968699999823, + 14.529297000000952, + 9.430158000002848, + 20.666174999998475, + 15.71941599999991, + 10.81752399999823, + 5.894591999996919, + 16.487605000002077, + 11.49041600000055, + 5.666042000004381, + 19.694155999997747, + 14.455253000000084, + 10.169311999998172, + 19.669456999996328, + 14.735101999998733, + 9.762610999998287, + 20.309776000001875, + 15.627927000001364, + 10.208598999997776, + 20.589355000003707, + 14.995914999999513 ], "command": "pnpm run test:performance [PERF-04; smoke]", "passed": true, @@ -679,10 +679,10 @@ "reason": "Every provider event identifier was unique" }, "acceptedEvents": 100, - "frameWrites": 35, - "producerElapsedMs": 539.2695650000023, + "frameWrites": 34, + "producerElapsedMs": 531.9705969999995, "achievedEventsPerSecond": { - "value": 185.4360165866204, + "value": 187.98031425785754, "reason": "The final event frame completed within the required 100 events/s interval" }, "finalFrameCompleted": { @@ -692,9 +692,9 @@ "eventFrameBindings": "Pi TUI doRender completion + xterm flush + each exact visible event marker" }, "details": { - "achievedEventsPerSecond": 185.4360165866204, + "achievedEventsPerSecond": 187.98031425785754, "minimumEventsPerSecond": 100, - "elapsedMs": 539.2695650000023, + "elapsedMs": 531.9705969999995, "finalFrameCompleted": true, "accepted": 100, "renderedEvents": 100, @@ -702,74 +702,74 @@ "stageTimings": { "applicationCommitMs": { "n": 100, - "total": 73.15521199999057, - "mean": 0.7315521199999057, - "minimum": 0.40847499999654246, - "median": 0.6313340000051539, - "p90": 1.2071090000026743, - "p95": 1.3283769999979995, - "p99": 1.4515099999989616, - "maximum": 1.6061859999972512 + "total": 83.06254499997885, + "mean": 0.8306254499997885, + "minimum": 0.48821999999927357, + "median": 0.7614470000044093, + "p90": 1.1624140000058105, + "p95": 1.332709000002069, + "p99": 1.423928000003798, + "maximum": 1.508153000002494 }, "frameQueueMs": { - "n": 45, - "total": 427.40602700002637, - "mean": 9.497911711111698, - "minimum": 0.0006310000026132911, - "median": 12.221364000004542, - "p90": 14.952425000003132, - "p95": 15.081951000000117, - "p99": 15.605131999996956, - "maximum": 15.605131999996956 + "n": 44, + "total": 416.5177410000033, + "mean": 9.466312295454621, + "minimum": 0.0006110000031185336, + "median": 11.882167000003392, + "p90": 15.257127999997465, + "p95": 15.600010999994993, + "p99": 15.727953000001435, + "maximum": 15.727953000001435 }, "viewProjectionMs": { - "n": 45, - "total": 16.870583000003535, - "mean": 0.374901844444523, - "minimum": 0.1546950000047218, - "median": 0.3461719999977504, - "p90": 0.5355649999983143, - "p95": 0.5768570000000182, - "p99": 0.759888000000501, - "maximum": 0.759888000000501 + "n": 44, + "total": 20.202193999983137, + "mean": 0.45914077272688947, + "minimum": 0.19354000000021188, + "median": 0.4329710000019986, + "p90": 0.6576419999983045, + "p95": 0.7043139999950654, + "p99": 0.8498499999986961, + "maximum": 0.8498499999986961 }, "terminalViewApplyMs": { - "n": 45, - "total": 4.973408999991079, - "mean": 0.11052019999980177, - "minimum": 0.017595000004803296, - "median": 0.10347399999591289, - "p90": 0.16720899999927497, - "p95": 0.175134999997681, - "p99": 0.21890200000052573, - "maximum": 0.21890200000052573 + "n": 44, + "total": 4.151127000026463, + "mean": 0.09434379545514689, + "minimum": 0.017864999994344544, + "median": 0.09782200000336161, + "p90": 0.11878399999841349, + "p95": 0.1327309999978752, + "p99": 0.2081689999977243, + "maximum": 0.2081689999977243 }, "piRenderMs": { - "n": 35, - "total": 21.488010000015493, - "mean": 0.6139431428575856, - "minimum": 0.42848500000400236, - "median": 0.5992110000006505, - "p90": 0.7961290000021108, - "p95": 0.8950239999976475, - "p99": 1.018776999997499, - "maximum": 1.018776999997499 + "n": 34, + "total": 24.894895000012184, + "mean": 0.7322027941180054, + "minimum": 0.5394299999970826, + "median": 0.6762390000003506, + "p90": 0.9561089999988326, + "p95": 1.2518399999971734, + "p99": 1.2670190000062576, + "maximum": 1.2670190000062576 }, "terminalFlushMs": { - "n": 35, - "total": 50.134050999971805, - "mean": 1.4324014571420516, - "minimum": 0.6333480000030249, - "median": 1.2352539999992587, - "p90": 1.7943659999946249, - "p95": 2.018607999998494, - "p99": 2.507229999995616, - "maximum": 2.507229999995616 + "n": 34, + "total": 53.00856399995973, + "mean": 1.5590754117635215, + "minimum": 1.1209729999973206, + "median": 1.416983999995864, + "p90": 1.993135999997321, + "p95": 2.312573999995948, + "p99": 2.641580999996222, + "maximum": 2.641580999996222 }, "combinedUpdatesPerFrame": { - "n": 45, + "n": 44, "total": 111, - "mean": 2.466666666666667, + "mean": 2.522727272727273, "minimum": 1, "median": 3, "p90": 3, @@ -781,12 +781,12 @@ }, "failureReasons": [], "provenance": { - "packageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", + "packageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", "frameBinding": "Pi TUI doRender completion + xterm flush + each exact visible event marker", "unrelatedWritesExcluded": true, "rateInterval": "producer start through the final event matching Pi frame completion", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } }, { @@ -794,12 +794,12 @@ "name": "PERF-05", "unit": "ms", "n": 1, - "minimum": 898.5598299999983, - "median": 898.5598299999983, - "p90": 898.5598299999983, - "p95": 898.5598299999983, - "p99": 898.5598299999983, - "maximum": 898.5598299999983, + "minimum": 1560.6777469999943, + "median": 1560.6777469999943, + "p90": 1560.6777469999943, + "p95": 1560.6777469999943, + "p99": 1560.6777469999943, + "maximum": 1560.6777469999943, "target": { "metric": "replay-reduce-10000-events", "percentile": "p95", @@ -808,8 +808,8 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "terminal": "none; production StorageJournal + reducer", "dimensions": "none", "database": "warm-10000-event-encrypted-sqlite", @@ -818,7 +818,7 @@ "state": "warm", "repetitions": 1, "rawSamples": [ - 898.5598299999983 + 1560.6777469999943 ], "command": "pnpm run test:performance [PERF-05; smoke]", "passed": true, @@ -827,64 +827,64 @@ "value": 10000, "reason": "Every committed event was replayed" }, - "projectionChecksum": "1a0f209cfc5665cba4bf7a96cf734ae8c871eb3ac1e5708c20931d8d9c56cddb" + "projectionChecksum": "4193c7c3a05dd8a87a9d58100ec74e4acf106162434158c7eeaebaa395c8b382" }, "details": { "stageTimings": { "storageOpenMs": { "n": 1, - "total": 4.877962999998999, - "mean": 4.877962999998999, - "minimum": 4.877962999998999, - "median": 4.877962999998999, - "p90": 4.877962999998999, - "p95": 4.877962999998999, - "p99": 4.877962999998999, - "maximum": 4.877962999998999, + "total": 3.693396999995457, + "mean": 3.693396999995457, + "minimum": 3.693396999995457, + "median": 3.693396999995457, + "p90": 3.693396999995457, + "p95": 3.693396999995457, + "p99": 3.693396999995457, + "maximum": 3.693396999995457, "rawSamples": [ - 4.877962999998999 + 3.693396999995457 ] }, "storageReadDecryptMs": { "n": 1, - "total": 155.03340000000026, - "mean": 155.03340000000026, - "minimum": 155.03340000000026, - "median": 155.03340000000026, - "p90": 155.03340000000026, - "p95": 155.03340000000026, - "p99": 155.03340000000026, - "maximum": 155.03340000000026, + "total": 284.20510099999956, + "mean": 284.20510099999956, + "minimum": 284.20510099999956, + "median": 284.20510099999956, + "p90": 284.20510099999956, + "p95": 284.20510099999956, + "p99": 284.20510099999956, + "maximum": 284.20510099999956, "rawSamples": [ - 155.03340000000026 + 284.20510099999956 ] }, "envelopeDecodeMs": { "n": 1, - "total": 2.1512089999960153, - "mean": 2.1512089999960153, - "minimum": 2.1512089999960153, - "median": 2.1512089999960153, - "p90": 2.1512089999960153, - "p95": 2.1512089999960153, - "p99": 2.1512089999960153, - "maximum": 2.1512089999960153, + "total": 1.4565920000022743, + "mean": 1.4565920000022743, + "minimum": 1.4565920000022743, + "median": 1.4565920000022743, + "p90": 1.4565920000022743, + "p95": 1.4565920000022743, + "p99": 1.4565920000022743, + "maximum": 1.4565920000022743, "rawSamples": [ - 2.1512089999960153 + 1.4565920000022743 ] }, "reducerMs": { "n": 1, - "total": 736.4972580000031, - "mean": 736.4972580000031, - "minimum": 736.4972580000031, - "median": 736.4972580000031, - "p90": 736.4972580000031, - "p95": 736.4972580000031, - "p99": 736.4972580000031, - "maximum": 736.4972580000031, + "total": 1271.322656999997, + "mean": 1271.322656999997, + "minimum": 1271.322656999997, + "median": 1271.322656999997, + "p90": 1271.322656999997, + "p95": 1271.322656999997, + "p99": 1271.322656999997, + "maximum": 1271.322656999997, "rawSamples": [ - 736.4972580000031 + 1271.322656999997 ] } } @@ -892,8 +892,8 @@ "failureReasons": [], "provenance": { "seed": "packed encrypted SQLite production storage; complete receipt-backed run", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } }, { @@ -901,12 +901,12 @@ "name": "PERF-06", "unit": "ms", "n": 1, - "minimum": 28.890989999999874, - "median": 28.890989999999874, - "p90": 28.890989999999874, - "p95": 28.890989999999874, - "p99": 28.890989999999874, - "maximum": 28.890989999999874, + "minimum": 20.259799999999814, + "median": 20.259799999999814, + "p90": 20.259799999999814, + "p95": 20.259799999999814, + "p99": 20.259799999999814, + "maximum": 20.259799999999814, "target": { "metric": "open-100000-event-conversation", "percentile": "p95", @@ -915,9 +915,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "cold-100000-event-encrypted-sqlite", "eventCount": 100000 @@ -925,7 +925,7 @@ "state": "cold", "repetitions": 1, "rawSamples": [ - 28.890989999999874 + 20.259799999999814 ], "command": "pnpm run test:performance [PERF-06; smoke]", "passed": true, @@ -946,8 +946,8 @@ "failureReasons": [], "provenance": { "seed": "packed encrypted SQLite production storage; recent useful content asserted", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } }, { @@ -955,12 +955,12 @@ "name": "PERF-07", "unit": "ms", "n": 10, - "minimum": 12.3392359999998, - "median": 15.613979000001564, - "p90": 16.98489100000006, - "p95": 18.307356999997864, - "p99": 18.307356999997864, - "maximum": 18.307356999997864, + "minimum": 12.842043000004196, + "median": 14.890056000003824, + "p90": 17.089618999998493, + "p95": 20.777404000000388, + "p99": 20.777404000000388, + "maximum": 20.777404000000388, "target": { "metric": "resize-during-stream-frame", "percentile": "p95", @@ -969,9 +969,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "40x12,80x24,120x40,200x60", "database": "packed headless 100-events-per-second stream", "eventCount": 42 @@ -989,10 +989,10 @@ "columns": 40, "rows": 12 }, - "elapsedMs": 12.969578000003821, - "resizeCallMs": 0.5130110000027344, + "elapsedMs": 20.777404000000388, + "resizeCallMs": 0.4712359999975888, "frameCompletions": 2, - "frameCompletedAt": 42179.929756, + "frameCompletedAt": 49425.264996, "acceptedEvents": 7, "active": true, "invalidCells": 0 @@ -1007,11 +1007,11 @@ "columns": 80, "rows": 24 }, - "elapsedMs": 18.307356999997864, - "resizeCallMs": 0.2516459999969811, + "elapsedMs": 12.842043000004196, + "resizeCallMs": 0.22769800000241958, "frameCompletions": 3, - "frameCompletedAt": 42199.342741, - "acceptedEvents": 12, + "frameCompletedAt": 49437.325894, + "acceptedEvents": 11, "active": true, "invalidCells": 0 }, @@ -1025,11 +1025,11 @@ "columns": 120, "rows": 40 }, - "elapsedMs": 16.285311999999976, - "resizeCallMs": 0.18229900000005728, + "elapsedMs": 14.221553000003041, + "resizeCallMs": 0.15378200000122888, "frameCompletions": 4, - "frameCompletedAt": 42215.492757, - "acceptedEvents": 16, + "frameCompletedAt": 49452.212874, + "acceptedEvents": 14, "active": true, "invalidCells": 0 }, @@ -1043,10 +1043,10 @@ "columns": 200, "rows": 60 }, - "elapsedMs": 15.401460000000952, - "resizeCallMs": 0.22603499999968335, + "elapsedMs": 17.084649000003992, + "resizeCallMs": 0.2139210000023013, "frameCompletions": 5, - "frameCompletedAt": 42230.178016, + "frameCompletedAt": 49468.411021, "acceptedEvents": 19, "active": true, "invalidCells": 0 @@ -1061,11 +1061,11 @@ "columns": 40, "rows": 12 }, - "elapsedMs": 15.858570999997028, - "resizeCallMs": 0.9493809999985388, + "elapsedMs": 14.22854599999846, + "resizeCallMs": 1.3229890000002342, "frameCompletions": 6, - "frameCompletedAt": 42246.119581, - "acceptedEvents": 24, + "frameCompletedAt": 49483.728517, + "acceptedEvents": 22, "active": true, "invalidCells": 0 }, @@ -1079,11 +1079,11 @@ "columns": 80, "rows": 24 }, - "elapsedMs": 14.364588000004005, - "resizeCallMs": 0.0730939999994007, + "elapsedMs": 14.184450000000652, + "resizeCallMs": 0.07295300000259886, "frameCompletions": 7, - "frameCompletedAt": 42260.956399, - "acceptedEvents": 27, + "frameCompletedAt": 49497.301004, + "acceptedEvents": 26, "active": true, "invalidCells": 0 }, @@ -1097,11 +1097,11 @@ "columns": 120, "rows": 40 }, - "elapsedMs": 16.981434000001173, - "resizeCallMs": 0.09575799999583978, + "elapsedMs": 15.426189999998314, + "resizeCallMs": 0.11767099999997299, "frameCompletions": 8, - "frameCompletedAt": 42276.841242, - "acceptedEvents": 31, + "frameCompletedAt": 49513.797337, + "acceptedEvents": 30, "active": true, "invalidCells": 0 }, @@ -1115,11 +1115,11 @@ "columns": 200, "rows": 60 }, - "elapsedMs": 15.613979000001564, - "resizeCallMs": 0.34791600000608014, + "elapsedMs": 17.089618999998493, + "resizeCallMs": 0.200102999995579, "frameCompletions": 9, - "frameCompletedAt": 42293.381717, - "acceptedEvents": 35, + "frameCompletedAt": 49530.698255, + "acceptedEvents": 34, "active": true, "invalidCells": 0 }, @@ -1133,11 +1133,11 @@ "columns": 40, "rows": 12 }, - "elapsedMs": 16.98489100000006, - "resizeCallMs": 0.6030590000009397, + "elapsedMs": 15.652734999996028, + "resizeCallMs": 0.44141700000182027, "frameCompletions": 10, - "frameCompletedAt": 42309.334594, - "acceptedEvents": 39, + "frameCompletedAt": 49545.514306, + "acceptedEvents": 38, "active": true, "invalidCells": 0 }, @@ -1151,10 +1151,10 @@ "columns": 80, "rows": 24 }, - "elapsedMs": 12.3392359999998, - "resizeCallMs": 0.19236900000396417, + "elapsedMs": 14.890056000003824, + "resizeCallMs": 0.07782299999962561, "frameCompletions": 11, - "frameCompletedAt": 42322.905688, + "frameCompletedAt": 49561.394898, "acceptedEvents": 42, "active": true, "invalidCells": 0 @@ -1180,23 +1180,23 @@ "reason": "Every resize received a completed Pi render" }, "elapsedMs": { - "value": 166.2990839999984, + "value": 162.8107549999986, "reason": "The interval starts at the first generated event and ends after the final resize-bound frame" }, "offeredEventsPerSecond": { - "value": 252.55701348301113, + "value": 257.9682159203817, "reason": "Offered rate uses generated events over the measured stream interval" }, "acceptedEventsPerSecond": { - "value": 252.55701348301113, + "value": 257.9682159203817, "reason": "Accepted rate met the required 100 events/s" }, "observedEventsPerSecond": { - "value": 252.55701348301113, + "value": 257.9682159203817, "reason": "The pass rate is the accepted stream rate through the final resize-bound frame" }, "producerEventsPerSecond": { - "value": 256.18339022180874, + "value": 257.9009031622087, "reason": "Producer cadence uses the first through last generated event timestamps" }, "minimumEventsPerSecond": { @@ -1250,10 +1250,10 @@ "columns": 40, "rows": 12 }, - "elapsedMs": 12.969578000003821, - "resizeCallMs": 0.5130110000027344, + "elapsedMs": 20.777404000000388, + "resizeCallMs": 0.4712359999975888, "frameCompletions": 2, - "frameCompletedAt": 42179.929756, + "frameCompletedAt": 49425.264996, "acceptedEvents": 7, "active": true, "invalidCells": 0 @@ -1268,11 +1268,11 @@ "columns": 80, "rows": 24 }, - "elapsedMs": 18.307356999997864, - "resizeCallMs": 0.2516459999969811, + "elapsedMs": 12.842043000004196, + "resizeCallMs": 0.22769800000241958, "frameCompletions": 3, - "frameCompletedAt": 42199.342741, - "acceptedEvents": 12, + "frameCompletedAt": 49437.325894, + "acceptedEvents": 11, "active": true, "invalidCells": 0 }, @@ -1286,11 +1286,11 @@ "columns": 120, "rows": 40 }, - "elapsedMs": 16.285311999999976, - "resizeCallMs": 0.18229900000005728, + "elapsedMs": 14.221553000003041, + "resizeCallMs": 0.15378200000122888, "frameCompletions": 4, - "frameCompletedAt": 42215.492757, - "acceptedEvents": 16, + "frameCompletedAt": 49452.212874, + "acceptedEvents": 14, "active": true, "invalidCells": 0 }, @@ -1304,10 +1304,10 @@ "columns": 200, "rows": 60 }, - "elapsedMs": 15.401460000000952, - "resizeCallMs": 0.22603499999968335, + "elapsedMs": 17.084649000003992, + "resizeCallMs": 0.2139210000023013, "frameCompletions": 5, - "frameCompletedAt": 42230.178016, + "frameCompletedAt": 49468.411021, "acceptedEvents": 19, "active": true, "invalidCells": 0 @@ -1322,11 +1322,11 @@ "columns": 40, "rows": 12 }, - "elapsedMs": 15.858570999997028, - "resizeCallMs": 0.9493809999985388, + "elapsedMs": 14.22854599999846, + "resizeCallMs": 1.3229890000002342, "frameCompletions": 6, - "frameCompletedAt": 42246.119581, - "acceptedEvents": 24, + "frameCompletedAt": 49483.728517, + "acceptedEvents": 22, "active": true, "invalidCells": 0 }, @@ -1340,11 +1340,11 @@ "columns": 80, "rows": 24 }, - "elapsedMs": 14.364588000004005, - "resizeCallMs": 0.0730939999994007, + "elapsedMs": 14.184450000000652, + "resizeCallMs": 0.07295300000259886, "frameCompletions": 7, - "frameCompletedAt": 42260.956399, - "acceptedEvents": 27, + "frameCompletedAt": 49497.301004, + "acceptedEvents": 26, "active": true, "invalidCells": 0 }, @@ -1358,11 +1358,11 @@ "columns": 120, "rows": 40 }, - "elapsedMs": 16.981434000001173, - "resizeCallMs": 0.09575799999583978, + "elapsedMs": 15.426189999998314, + "resizeCallMs": 0.11767099999997299, "frameCompletions": 8, - "frameCompletedAt": 42276.841242, - "acceptedEvents": 31, + "frameCompletedAt": 49513.797337, + "acceptedEvents": 30, "active": true, "invalidCells": 0 }, @@ -1376,11 +1376,11 @@ "columns": 200, "rows": 60 }, - "elapsedMs": 15.613979000001564, - "resizeCallMs": 0.34791600000608014, + "elapsedMs": 17.089618999998493, + "resizeCallMs": 0.200102999995579, "frameCompletions": 9, - "frameCompletedAt": 42293.381717, - "acceptedEvents": 35, + "frameCompletedAt": 49530.698255, + "acceptedEvents": 34, "active": true, "invalidCells": 0 }, @@ -1394,11 +1394,11 @@ "columns": 40, "rows": 12 }, - "elapsedMs": 16.98489100000006, - "resizeCallMs": 0.6030590000009397, + "elapsedMs": 15.652734999996028, + "resizeCallMs": 0.44141700000182027, "frameCompletions": 10, - "frameCompletedAt": 42309.334594, - "acceptedEvents": 39, + "frameCompletedAt": 49545.514306, + "acceptedEvents": 38, "active": true, "invalidCells": 0 }, @@ -1412,10 +1412,10 @@ "columns": 80, "rows": 24 }, - "elapsedMs": 12.3392359999998, - "resizeCallMs": 0.19236900000396417, + "elapsedMs": 14.890056000003824, + "resizeCallMs": 0.07782299999962561, "frameCompletions": 11, - "frameCompletedAt": 42322.905688, + "frameCompletedAt": 49561.394898, "acceptedEvents": 42, "active": true, "invalidCells": 0 @@ -1423,95 +1423,95 @@ ] }, "details": { - "streamElapsedMs": 166.2990839999984, - "firstGeneratedAt": 42156.606604, - "lastGeneratedAt": 42320.551659, - "finalResizeFrameCompletedAt": 42322.905688, + "streamElapsedMs": 162.8107549999986, + "firstGeneratedAt": 49398.584143, + "lastGeneratedAt": 49561.437392, + "finalResizeFrameCompletedAt": 49561.394898, "intendedEventsPerSecond": 250, - "producerEventsPerSecond": 256.18339022180874, - "offeredEventsPerSecond": 252.55701348301113, - "acceptedEventsPerSecond": 252.55701348301113, - "observedEventsPerSecond": 252.55701348301113, + "producerEventsPerSecond": 257.9009031622087, + "offeredEventsPerSecond": 257.9682159203817, + "acceptedEventsPerSecond": 257.9682159203817, + "observedEventsPerSecond": 257.9682159203817, "minimumEventsPerSecond": 100, "minimumExpectedEvents": 17, "ratePassed": true, "stageTimings": { "resizeCallMs": { "n": 10, - "total": 3.4345680000042194, - "mean": 0.34345680000042195, - "minimum": 0.0730939999994007, - "median": 0.22603499999968335, - "p90": 0.6030590000009397, - "p95": 0.9493809999985388, - "p99": 0.9493809999985388, - "maximum": 0.9493809999985388 + "total": 3.2995930000033695, + "mean": 0.32995930000033696, + "minimum": 0.07295300000259886, + "median": 0.200102999995579, + "p90": 0.4712359999975888, + "p95": 1.3229890000002342, + "p99": 1.3229890000002342, + "maximum": 1.3229890000002342 }, "frameQueueMs": { "n": 14, - "total": 138.4991999999911, - "mean": 9.892799999999365, - "minimum": 0.001242999998794403, - "median": 14.23957099999825, - "p90": 14.907837999999174, - "p95": 15.14892300000065, - "p99": 15.14892300000065, - "maximum": 15.14892300000065 + "total": 142.44359800001257, + "mean": 10.174542714286613, + "minimum": 0.0013120000003254972, + "median": 13.518481999999494, + "p90": 15.194734999997308, + "p95": 15.713694999998552, + "p99": 15.713694999998552, + "maximum": 15.713694999998552 }, "viewProjectionMs": { "n": 14, - "total": 8.934876000028453, - "mean": 0.638205428573461, - "minimum": 0.31203500000265194, - "median": 0.49801100000331644, - "p90": 1.1277620000037132, - "p95": 1.855956999999762, - "p99": 1.855956999999762, - "maximum": 1.855956999999762 + "total": 8.25729599998158, + "mean": 0.5898068571415414, + "minimum": 0.39167999999335734, + "median": 0.4997319999965839, + "p90": 1.1402610000004643, + "p95": 1.1427159999948344, + "p99": 1.1427159999948344, + "maximum": 1.1427159999948344 }, "terminalViewApplyMs": { "n": 14, - "total": 2.4669229999781237, - "mean": 0.1762087857127231, - "minimum": 0.04196199999569217, - "median": 0.11891499999910593, - "p90": 0.26189599999634083, - "p95": 0.8661670000001322, - "p99": 0.8661670000001322, - "maximum": 0.8661670000001322 + "total": 1.4402380000028643, + "mean": 0.10287414285734744, + "minimum": 0.043075000001408625, + "median": 0.08050799999909941, + "p90": 0.19380000000091968, + "p95": 0.21734700000524754, + "p99": 0.21734700000524754, + "maximum": 0.21734700000524754 }, "piRenderMs": { "n": 11, - "total": 21.360153000016, - "mean": 1.9418320909105453, - "minimum": 0.48844200000166893, - "median": 0.9067960000029416, - "p90": 3.4039080000002286, - "p95": 10.477738000001409, - "p99": 10.477738000001409, - "maximum": 10.477738000001409 + "total": 21.135429000009026, + "mean": 1.921402636364457, + "minimum": 0.7156659999964177, + "median": 0.9320110000044224, + "p90": 4.6986329999999725, + "p95": 6.592172999997274, + "p99": 6.592172999997274, + "maximum": 6.592172999997274 }, "terminalFlushMs": { "n": 11, - "total": 20.286355999996886, - "mean": 1.8442141818178988, - "minimum": 1.0552089999982854, - "median": 1.7018039999966277, - "p90": 2.3222359999999753, - "p95": 3.691705000004731, - "p99": 3.691705000004731, - "maximum": 3.691705000004731 + "total": 22.234148000003188, + "mean": 2.0212861818184717, + "minimum": 1.203194000001531, + "median": 1.9084900000016205, + "p90": 2.7484199999962584, + "p95": 3.660953000005975, + "p99": 3.660953000005975, + "maximum": 3.660953000005975 }, "resizeToVisibleMs": { "n": 10, - "total": 155.10640600000625, - "mean": 15.510640600000624, - "minimum": 12.3392359999998, - "median": 15.613979000001564, - "p90": 16.98489100000006, - "p95": 18.307356999997864, - "p99": 18.307356999997864, - "maximum": 18.307356999997864 + "total": 156.3972450000074, + "mean": 15.639724500000739, + "minimum": 12.842043000004196, + "median": 14.890056000003824, + "p90": 17.089618999998493, + "p95": 20.777404000000388, + "p99": 20.777404000000388, + "maximum": 20.777404000000388 }, "combinedUpdatesPerFrame": { "n": 14, @@ -1528,7 +1528,7 @@ }, "failureReasons": [], "provenance": { - "packageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", + "packageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", "stream": "packed Braid application + packed Pi terminal headless path", "eventReceipt": "application committed uniquely marked run.text.delta events", "resizeReceipt": "Pi doRender completion followed by xterm flush at each reference size and resize epoch", @@ -1539,8 +1539,8 @@ "120x40", "200x60" ], - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } }, { @@ -1562,9 +1562,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "deterministic-offline-fixture-idle", "eventCount": 0 @@ -1578,7 +1578,7 @@ "passed": true, "observations": { "durationSeconds": [ - 2.0026646649999966 + 2.003161355000004 ], "cpuSeconds": [ 0 @@ -1592,8 +1592,8 @@ "measuredSeconds": 2, "cpuMeter": "/proc//stat", "commandPath": "packed deterministic Braid process", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } }, { @@ -1601,12 +1601,12 @@ "name": "PERF-09", "unit": "MiB RSS", "n": 1, - "minimum": 86.765625, - "median": 86.765625, - "p90": 86.765625, - "p95": 86.765625, - "p99": 86.765625, - "maximum": 86.765625, + "minimum": 111.84375, + "median": 111.84375, + "p90": 111.84375, + "p95": 111.84375, + "p99": 111.84375, + "maximum": 111.84375, "target": { "metric": "resident-memory-10000-event-conversation", "percentile": "p95", @@ -1615,8 +1615,8 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "terminal": "packed production view model; child process RSS", "dimensions": "80x24", "database": "warm-10000-event-encrypted-sqlite", @@ -1625,15 +1625,15 @@ "state": "warm", "repetitions": 1, "rawSamples": [ - 86.765625 + 111.84375 ], "command": "pnpm run test:performance [PERF-09; smoke]", "passed": true, "observations": { "residentMemory": [ { - "baselineRssMiB": 80.546875, - "openedRssMiB": 86.765625, + "baselineRssMiB": 106.546875, + "openedRssMiB": 111.84375, "loadedTailEventCount": 0, "renderedRows": 4 } @@ -1647,8 +1647,8 @@ "failureReasons": [], "provenance": { "seed": "packed encrypted SQLite production storage; one fresh child per repetition", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } }, { @@ -1670,8 +1670,8 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "terminal": "none; packed production encrypted SQLite artifacts", "dimensions": "none", "database": "cold-10000-event-encrypted-sqlite", @@ -1703,8 +1703,8 @@ "provenance": { "bytes": "database + WAL + shared-memory SQLite artifacts only", "providerArtifacts": "reported separately and excluded from samples", - "packedPackageRoot": "/tmp/braid-install-VYfGzP/node_modules/@tangle-network/braid", - "packedTarballSha256": "644bc390f1ea9ef69429f6ab8a6a583d5798157c7dd4601501ab797d886e151a" + "packedPackageRoot": "/tmp/braid-install-6NpOSH/node_modules/@tangle-network/braid", + "packedTarballSha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325" } } ], @@ -1714,12 +1714,12 @@ "name": "PERF-01", "unit": "ms", "n": 1, - "minimum": 128.22121699999843, - "median": 128.22121699999843, - "p90": 128.22121699999843, - "p95": 128.22121699999843, - "p99": 128.22121699999843, - "maximum": 128.22121699999843, + "minimum": 172.10708100000193, + "median": 172.10708100000193, + "p90": 172.10708100000193, + "p95": 172.10708100000193, + "p99": 172.10708100000193, + "maximum": 172.10708100000193, "target": { "metric": "process-start-to-first-visible-frame", "percentile": "p95", @@ -1728,9 +1728,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "warm-10000-event-encrypted-sqlite", "eventCount": 10000 @@ -1743,12 +1743,12 @@ "name": "PERF-02", "unit": "ms", "n": 1, - "minimum": 162.42808499999956, - "median": 162.42808499999956, - "p90": 162.42808499999956, - "p95": 162.42808499999956, - "p99": 162.42808499999956, - "maximum": 162.42808499999956, + "minimum": 216.79717000000528, + "median": 216.79717000000528, + "p90": 216.79717000000528, + "p95": 216.79717000000528, + "p99": 216.79717000000528, + "maximum": 216.79717000000528, "target": { "metric": "process-start-to-first-visible-frame", "percentile": "p95", @@ -1757,9 +1757,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "cold-100000-event-encrypted-sqlite", "eventCount": 100000 @@ -1772,12 +1772,12 @@ "name": "PERF-03", "unit": "ms", "n": 1, - "minimum": 7.092285999999149, - "median": 7.092285999999149, - "p90": 7.092285999999149, - "p95": 7.092285999999149, - "p99": 7.092285999999149, - "maximum": 7.092285999999149, + "minimum": 8.998489999998128, + "median": 8.998489999998128, + "p90": 8.998489999998128, + "p95": 8.998489999998128, + "p99": 8.998489999998128, + "maximum": 8.998489999998128, "target": { "metric": "idle-key-to-updated-frame", "percentile": "p95", @@ -1786,9 +1786,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "warm-10000-event-encrypted-sqlite", "eventCount": 10000 @@ -1801,12 +1801,12 @@ "name": "PERF-04", "unit": "ms", "n": 100, - "minimum": 3.0803200000009383, - "median": 11.934157999996387, - "p90": 18.613400000002002, - "p95": 19.67704600000434, - "p99": 20.905907000000298, - "maximum": 21.15657099999953, + "minimum": 3.89497300000221, + "median": 12.317813000001479, + "p90": 19.751868999999715, + "p95": 20.503766000001633, + "p99": 21.001294000001508, + "maximum": 21.90387799999735, "target": { "metric": "runtime-event-to-updated-frame", "percentile": "p95", @@ -1815,9 +1815,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "@xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "@xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "memory-journal-runtime-frame-path", "eventCount": 100 @@ -1830,12 +1830,12 @@ "name": "PERF-05", "unit": "ms", "n": 1, - "minimum": 898.5598299999983, - "median": 898.5598299999983, - "p90": 898.5598299999983, - "p95": 898.5598299999983, - "p99": 898.5598299999983, - "maximum": 898.5598299999983, + "minimum": 1560.6777469999943, + "median": 1560.6777469999943, + "p90": 1560.6777469999943, + "p95": 1560.6777469999943, + "p99": 1560.6777469999943, + "maximum": 1560.6777469999943, "target": { "metric": "replay-reduce-10000-events", "percentile": "p95", @@ -1844,8 +1844,8 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "terminal": "none; production StorageJournal + reducer", "dimensions": "none", "database": "warm-10000-event-encrypted-sqlite", @@ -1859,12 +1859,12 @@ "name": "PERF-06", "unit": "ms", "n": 1, - "minimum": 28.890989999999874, - "median": 28.890989999999874, - "p90": 28.890989999999874, - "p95": 28.890989999999874, - "p99": 28.890989999999874, - "maximum": 28.890989999999874, + "minimum": 20.259799999999814, + "median": 20.259799999999814, + "p90": 20.259799999999814, + "p95": 20.259799999999814, + "p99": 20.259799999999814, + "maximum": 20.259799999999814, "target": { "metric": "open-100000-event-conversation", "percentile": "p95", @@ -1873,9 +1873,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "cold-100000-event-encrypted-sqlite", "eventCount": 100000 @@ -1888,12 +1888,12 @@ "name": "PERF-07", "unit": "ms", "n": 10, - "minimum": 12.3392359999998, - "median": 15.613979000001564, - "p90": 16.98489100000006, - "p95": 18.307356999997864, - "p99": 18.307356999997864, - "maximum": 18.307356999997864, + "minimum": 12.842043000004196, + "median": 14.890056000003824, + "p90": 17.089618999998493, + "p95": 20.777404000000388, + "p99": 20.777404000000388, + "maximum": 20.777404000000388, "target": { "metric": "resize-during-stream-frame", "percentile": "p95", @@ -1902,9 +1902,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "40x12,80x24,120x40,200x60", "database": "packed headless 100-events-per-second stream", "eventCount": 42 @@ -1931,9 +1931,9 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", - "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", + "terminal": "node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.3", "dimensions": "80x24", "database": "deterministic-offline-fixture-idle", "eventCount": 0 @@ -1946,12 +1946,12 @@ "name": "PERF-09", "unit": "MiB RSS", "n": 1, - "minimum": 86.765625, - "median": 86.765625, - "p90": 86.765625, - "p95": 86.765625, - "p99": 86.765625, - "maximum": 86.765625, + "minimum": 111.84375, + "median": 111.84375, + "p90": 111.84375, + "p95": 111.84375, + "p99": 111.84375, + "maximum": 111.84375, "target": { "metric": "resident-memory-10000-event-conversation", "percentile": "p95", @@ -1960,8 +1960,8 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "terminal": "packed production view model; child process RSS", "dimensions": "80x24", "database": "warm-10000-event-encrypted-sqlite", @@ -1989,8 +1989,8 @@ }, "environment": { "machine": "drew-GTR-Pro (AMD RYZEN AI MAX+ 395 w/ Radeon 8060S; x64; 32 logical CPUs)", - "os": "linux 7.0.0-28-generic", - "node": "v24.13.0", + "os": "linux 7.0.0-30-generic", + "node": "v24.18.0", "terminal": "none; packed production encrypted SQLite artifacts", "dimensions": "none", "database": "cold-10000-event-encrypted-sqlite", diff --git a/scripts/performance/reporting.mjs b/scripts/performance/reporting.mjs index 913e78e4..6028a379 100644 --- a/scripts/performance/reporting.mjs +++ b/scripts/performance/reporting.mjs @@ -1,4 +1,5 @@ import { execFile as execFileCallback } from 'node:child_process' +import { readFileSync } from 'node:fs' import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises' import os from 'node:os' import { join, resolve } from 'node:path' @@ -21,9 +22,25 @@ export const smokeReportPath = join(outputDirectory, 'smoke.json') export const releaseReportPath = join(outputDirectory, 'release-measurements.json') export const command = process.env.BRAID_PERFORMANCE_COMMAND ?? 'pnpm run test:performance' export const FULL_REPETITIONS = 20 -export const processTerminal = - 'node-pty@1.1.0 + @xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1' -export const virtualTerminal = '@xterm/headless@6.0.0 + @earendil-works/pi-tui@0.84.1' +function loadPackageManifest() { + for (const path of [join(repository, 'package.json'), join(process.cwd(), 'package.json')]) { + try { + return JSON.parse(readFileSync(path, 'utf8')) + } catch { + // A compiled test copy may not include package metadata beside its scripts. + } + } + return {} +} + +const packageManifest = loadPackageManifest() +const dependencyVersion = (name) => + packageManifest.dependencies?.[name] ?? packageManifest.devDependencies?.[name] ?? 'unknown' +const piTuiVersion = dependencyVersion('@earendil-works/pi-tui') +const xtermHeadlessVersion = dependencyVersion('@xterm/headless') +const nodePtyVersion = dependencyVersion('node-pty') +export const processTerminal = `node-pty@${nodePtyVersion} + @xterm/headless@${xtermHeadlessVersion} + @earendil-works/pi-tui@${piTuiVersion}` +export const virtualTerminal = `@xterm/headless@${xtermHeadlessVersion} + @earendil-works/pi-tui@${piTuiVersion}` const packedProductionTuiChild = new URL('./packed-production-tui-child.mjs', import.meta.url) export function errorReason(error) { From e4e66372575b6f901935bb2222003446e3535999 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 28 Aug 2026 18:54:30 -0600 Subject: [PATCH 051/136] fix(live-proof): preserve redacted failure evidence --- .../verification/live/bridge/evidence.json | 6022 +++++++++++++++++ .../live/tangle-live-07-rerun.json | 1 + scripts/live-bridge/constants.mjs | 7 +- scripts/live-required.test.mjs | 15 + scripts/live-required/contracts.mjs | 2 +- .../tangle-sandbox-braid-stress.mjs | 4 + 6 files changed, 6047 insertions(+), 4 deletions(-) create mode 100644 artifacts/verification/live/bridge/evidence.json create mode 100644 artifacts/verification/live/tangle-live-07-rerun.json diff --git a/artifacts/verification/live/bridge/evidence.json b/artifacts/verification/live/bridge/evidence.json new file mode 100644 index 00000000..5c48b0be --- /dev/null +++ b/artifacts/verification/live/bridge/evidence.json @@ -0,0 +1,6022 @@ +{ + "schemaVersion": 1, + "command": "pnpm test:live:bridge:release", + "scope": { + "name": "packed-cli-bridge-release-proof", + "claims": [ + "packed startup", + "operation-specific Pi conformance", + "operation-specific Codex cross-runner handoff", + "operation-specific interactive protocol", + "operation-specific restart reconciliation", + "operation-specific conformance for every advertised runner", + "bounded process cleanup" + ], + "excludes": [] + }, + "optIn": true, + "startedAt": "2026-08-29T00:20:30.312Z", + "runtime": { + "node": "v24.18.0", + "platform": "linux", + "arch": "x64", + "cwd": "/home/drew/code/.worktrees/braid-10-complete" + }, + "environment": { + "endpoint": "http://127.0.0.1:3355", + "bearerConfigured": true, + "launchRequested": false + }, + "targetPolicy": { + "source": "default:release-runners", + "required": [ + { + "key": "claude-code-sonnet", + "label": "claude-code sonnet", + "modelId": "claude-code/sonnet", + "backend": "claude-code" + }, + { + "key": "glm-5.2", + "label": "GLM 5.2", + "modelId": "opencode/zai-coding-plan/glm-5.2", + "backend": "opencode" + }, + { + "key": "kimi-code-kimi-for-coding", + "label": "kimi-code kimi-for-coding", + "modelId": "kimi-code/kimi-for-coding", + "backend": "kimi-code" + }, + { + "key": "pi-deepseek-deepseek-v4-flash", + "label": "pi deepseek/deepseek-v4-flash", + "modelId": "pi/deepseek/deepseek-v4-flash", + "backend": "pi" + } + ] + }, + "targets": [ + { + "label": "claude-code sonnet", + "target": "claude-code/sonnet", + "profile": { + "path": ".braid/profiles/profile-claude-code-sonnet.json", + "harness": "claude-code", + "model": "sonnet" + }, + "connection": { + "id": "connection-live-cli-bridge", + "kind": "cli-bridge", + "endpoint": "http://127.0.0.1:3355", + "credentialConfigured": true + }, + "providerCapabilities": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": false, + "append": false + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "requests": [ + { + "version": 1, + "requestId": "init-claude-code-sonnet", + "command": "initialize", + "params": { + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", + "subscribe": true + } + }, + { + "version": 1, + "requestId": "send-claude-code-sonnet", + "operationId": "op-live-send-claude-code-sonnet", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK" + } + }, + { + "version": 1, + "requestId": "cancel-send-claude-code-sonnet", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + }, + { + "version": 1, + "requestId": "cancel-claude-code-sonnet", + "operationId": "op-live-cancel-claude-code-sonnet", + "command": "cancel_run", + "params": { + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "reason": "live packed smoke cancellation" + } + } + ], + "operation": "cli-bridge.target-smoke", + "credentialLifecycle": { + "configured": true, + "stored": true, + "removed": true, + "facility": "encrypted-headless" + }, + "initialize": { + "version": 1, + "type": "ack", + "requestId": "init-claude-code-sonnet", + "revision": 4, + "command": "initialize" + }, + "conversationId": "conv-1", + "branchId": "branch-1", + "initialCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "send": { + "version": 1, + "type": "ack", + "requestId": "send-claude-code-sonnet", + "operationId": "op-live-send-claude-code-sonnet", + "revision": 4, + "replayed": false, + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "admission": { + "version": 1, + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "turnId": "turn-df965174-25ce-4080-ad08-32247f7bb757", + "operationId": "op-live-send-claude-code-sonnet", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:20:55.662Z", + "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "profile": { + "name": "Braid live claude-code/sonnet", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "sonnet", + "reasoningEffort": "none" + }, + "harness": "claude-code" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "sonnet", + "runner": "claude-code" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": true + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", + "model": "sonnet", + "route": "claude-code/sonnet", + "runner": "claude-code", + "providerRunId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b", + "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", + "materializationDigest": "fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356", + "digest": "3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345" + }, + "command": "send" + }, + "activeCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": true, + "source": "runtime" + }, + "run.queue": { + "available": true, + "source": "provider" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": true, + "source": "provider" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconnecting it" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconciling it" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "normal": { + "status": "completed", + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "run": { + "id": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "turnId": "turn-df965174-25ce-4080-ad08-32247f7bb757", + "operationId": "op-live-send-claude-code-sonnet", + "status": "completed", + "startedAt": "2026-08-29T00:20:55.674Z", + "updatedAt": "2026-08-29T00:21:02.681Z", + "terminalAt": "2026-08-29T00:21:02.681Z", + "durationMs": 7007, + "inputTokens": 2, + "outputTokens": 30, + "tokensKnown": true, + "usdKnown": true, + "tokenStatus": "complete", + "costUsd": 0.0985582, + "costStatus": "reported", + "model": "claude-code/sonnet", + "provider": "cli-bridge", + "runner": "claude-code", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "environmentId": "environment-bd696f804a820bccca863d4b312600d9", + "controlRef": { + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd", + "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "executionId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "requestDigest": "sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b" + }, + "materializationDigest": "fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356", + "cursor": "1:0", + "cursorCommittedSequence": 12, + "contentBytes": 83 + }, + "assistant": { + "id": "message-8d48ace7-c0fb-4669-8764-b66e64f597fa", + "role": "assistant", + "text": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "status": "complete", + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "parts": [ + { + "id": "op-live-send-claude-code-sonnet:text", + "kind": "text", + "text": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "sourceEventId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final" + } + ] + }, + "finalText": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "marker": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK" + }, + "cancel": { + "prompt": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-claude-code-sonnet", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "revision": 14, + "replayed": false, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "admission": { + "version": 1, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:21:04.446Z", + "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", + "requested": { + "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live claude-code/sonnet", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "sonnet", + "reasoningEffort": "none" + }, + "harness": "claude-code" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "sonnet", + "runner": "claude-code" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", + "model": "sonnet", + "route": "claude-code/sonnet", + "runner": "claude-code", + "providerRunId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f", + "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", + "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5", + "digest": "d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1" + }, + "command": "send" + }, + "advertisedByProvider": false, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "activeRun": { + "id": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "status": "streaming", + "startedAt": "2026-08-29T00:21:04.457Z", + "updatedAt": "2026-08-29T00:21:04.457Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "sonnet", + "provider": "cli-bridge", + "runner": "claude-code", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-claude-code-sonnet", + "revision": 25, + "operationId": "op-live-cancel-claude-code-sonnet", + "command": "cancel_run", + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "control": "cancel", + "outcome": "unknown", + "replayed": false + }, + "attemptedRun": true, + "status": "advertised-but-not-terminal-cancelled" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": false, + "advertisedByBraid": false, + "advertised": false, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "error": { + "code": "LIVE_CAPABILITY_CONTRADICTION", + "message": "cancel capability reported advertised-but-not-terminal-cancelled; expected verified", + "exitCode": 1, + "details": { + "name": "cancel", + "status": "advertised-but-not-terminal-cancelled", + "advertised": true, + "capability": { + "prompt": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-claude-code-sonnet", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "revision": 14, + "replayed": false, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "admission": { + "version": 1, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:21:04.446Z", + "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", + "requested": { + "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": "[depth-limited]", + "connectionId": "connection-live-cli-bridge", + "interactions": "[depth-limited]", + "model": "sonnet", + "runner": "claude-code" + }, + "capabilities": { + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "controls": "[depth-limited]", + "events": "[depth-limited]", + "usage": true, + "environment": "[depth-limited]" + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", + "model": "sonnet", + "route": "claude-code/sonnet", + "runner": "claude-code", + "providerRunId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f", + "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", + "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5", + "digest": "d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1" + }, + "command": "send" + }, + "advertisedByProvider": false, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "activeRun": { + "id": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "status": "streaming", + "startedAt": "2026-08-29T00:21:04.457Z", + "updatedAt": "2026-08-29T00:21:04.457Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "sonnet", + "provider": "cli-bridge", + "runner": "claude-code", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-claude-code-sonnet", + "revision": 25, + "operationId": "op-live-cancel-claude-code-sonnet", + "command": "cancel_run", + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "control": "cancel", + "outcome": "unknown", + "replayed": false + }, + "attemptedRun": true, + "status": "advertised-but-not-terminal-cancelled" + } + } + }, + "status": "failed", + "stderr": "", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-claude-code-sonnet\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-claude-code-sonnet\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:53.785Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:53.785Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-claude-code-sonnet\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"revision\":4,\"replayed\":false,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"version\":1,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:20:55.662Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"digest\":\"3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"admission\":{\"version\":1,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:20:55.662Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"digest\":\"3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-claude-code-sonnet-87321068a54f8558de6d48df\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"87321068a54f8558de6d48dfc4ff071df6baa38536027ebb340caefeeb9deac6\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:20:55.684Z\",\"updatedAt\":\"2026-08-29T00:20:55.684Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"runId\":\"retained-intent-run:ab8d1d38943421a8bbfd85b56f698d10ca900a8f8d152a504a0ac7e3f9310f30\",\"requestedProfileDigest\":\"sha256:3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requestDigest\":\"sha256:ab8d1d38943421a8bbfd85b56f698d10ca900a8f8d152a504a0ac7e3f9310f30\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-claude-code-sonnet\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:20:55.674Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"activeRuns\":[{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"running\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\"},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"startedAt\":\"2026-08-29T00:20:55.674Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:20:57.505Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:20:57.505Z\"},\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"provider\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:20:57.505Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"1:0\",\"providerSequence\":2,\"cursor\":\"1:0\",\"receivedAt\":\"2026-08-29T00:21:00.866Z\"},\"part\":{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"1:0\"},\"delta\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:21:02.680Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"usage\":{\"input\":2,\"output\":30,\"costUsd\":0.0985582,\"model\":\"claude-code/sonnet\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-claude-code-sonnet-87321068a54f8558de6d48df\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"87321068a54f8558de6d48dfc4ff071df6baa38536027ebb340caefeeb9deac6\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T00:20:55.684Z\",\"updatedAt\":\"2026-08-29T00:21:02.701Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-claude-code-sonnet\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:20:57.505Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:20:57.505Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"2\"},{\"label\":\"output tokens\",\"value\":\"30\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"cost measurement\",\"value\":\"reported\"},{\"label\":\"model\",\"value\":\"claude-code/sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"revision\":14,\"replayed\":false,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"version\":1,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:21:04.446Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\",\"digest\":\"d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:21:04.446Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\",\"digest\":\"d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-claude-code-sonnet-e5f36571f043cb843a861455\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"e5f36571f043cb843a86145559563c6deb2f514f3274456ba1b25013bb90023a\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:21:04.466Z\",\"updatedAt\":\"2026-08-29T00:21:04.466Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"runId\":\"retained-intent-run:8bb3bcc8b1058253c5051a664a25e3c6af5f9932209834a5284b49f39f73313f\",\"requestedProfileDigest\":\"sha256:3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requestDigest\":\"sha256:8bb3bcc8b1058253c5051a664a25e3c6af5f9932209834a5284b49f39f73313f\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"revision\":16,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":16,\"sequence\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:04.457Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"running\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\"},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"activeRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:20:57.505Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:20:57.505Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-claude-code-sonnet\",\"revision\":25,\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"command\":\"cancel_run\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"outcome\":\"unknown\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-claude-code-sonnet-5515b6e8bbbfda20731ac558\",\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"5515b6e8bbbfda20731ac558c4952513a35ddfa7164a25a81e758a72c9aa690d\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:21:04.530Z\",\"updatedAt\":\"2026-08-29T00:21:04.530Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"source\":{\"eventId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:21:06.253Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:21:02.719Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:21:06.253Z\"},\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"provider\":{\"eventId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:21:06.253Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-claude-code-sonnet-5515b6e8bbbfda20731ac558\",\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"5515b6e8bbbfda20731ac558c4952513a35ddfa7164a25a81e758a72c9aa690d\",\"kind\":\"custom\",\"status\":\"unknown\",\"attempt\":1,\"outcomeDigest\":\"d0751b0e8ce25e30d2d826f1285ade45916c988dc0790be969fe898e27675605\",\"createdAt\":\"2026-08-29T00:21:04.530Z\",\"updatedAt\":\"2026-08-29T00:21:06.328Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"unknown\",\"detail\":\"CONTROL_OUTCOME_UNKNOWN\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.unknown\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"completeness\":\"unknown\",\"error\":\"Cancellation outcome could not be confirmed by the provider\"}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-claude-code-sonnet\",\"revision\":27,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":27,\"sequence\":27,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:06.347Z\",\"terminalAt\":\"2026-08-29T00:21:06.347Z\",\"durationMs\":1890,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"unknown\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[],\"lastError\":\"Cancellation outcome could not be confirmed by the provider\"},\"view\":{\"revision\":27,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"unknown\",\"statusText\":\"Cancellation outcome could not be confirmed by the provider\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"elapsedMs\":1890},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"unknown\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:21:06.253Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"unknown\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"unknown\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:lifecycle:local:unknown\",\"kind\":\"system\",\"title\":\"unknown\",\"status\":\"unknown\",\"detail\":\"Cancellation outcome could not be confirmed by the provider\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"unknown\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"unknown\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:21:06.253Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"unknown\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":true,\"source\":\"provider\"},\"run.reconcile\":{\"available\":true,\"source\":\"provider\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-claude-code-sonnet-e5f36571f043cb843a861455\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"e5f36571f043cb843a86145559563c6deb2f514f3274456ba1b25013bb90023a\",\"kind\":\"send\",\"status\":\"unknown\",\"attempt\":1,\"outcomeDigest\":\"d750ff0ec5ea61710ac8c366de9bad4d95a0636b9706f791721107881db4e8ac\",\"createdAt\":\"2026-08-29T00:21:04.466Z\",\"updatedAt\":\"2026-08-29T00:21:06.359Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"revision\":28,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":28,\"sequence\":28,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:06.347Z\",\"terminalAt\":\"2026-08-29T00:21:06.347Z\",\"durationMs\":1890,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"unknown\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[],\"lastError\":\"Cancellation outcome could not be confirmed by the provider\"},\"view\":{\"revision\":28,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"unknown\",\"statusText\":\"Cancellation outcome could not be confirmed by the provider\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"elapsedMs\":1890},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"unknown\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:21:06.253Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"unknown\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"unknown\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:lifecycle:local:unknown\",\"kind\":\"system\",\"title\":\"unknown\",\"status\":\"unknown\",\"detail\":\"Cancellation outcome could not be confirmed by the provider\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"unknown\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"unknown\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:21:06.253Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"unknown\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":true,\"source\":\"provider\"},\"run.reconcile\":{\"available\":true,\"source\":\"provider\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", + "process": { + "processIdentity": { + "instanceId": "4657286f-7f8b-4600-b17c-ffb56a0d099b", + "pid": 2246415, + "startedAt": 1787962853162 + }, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2246415 + ], + "roots": [ + 2246415 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "natural": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2246415 + ], + "roots": [ + 2246415 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": 0, + "signal": null + } + } + }, + { + "label": "GLM 5.2", + "target": "opencode/zai-coding-plan/glm-5.2", + "profile": { + "path": ".braid/profiles/profile-opencode-zai-coding-plan-glm-5-2.json", + "harness": "opencode", + "model": "glm-5.2", + "provider": "zai-coding-plan" + }, + "connection": { + "id": "connection-live-cli-bridge", + "kind": "cli-bridge", + "endpoint": "http://127.0.0.1:3355", + "credentialConfigured": true + }, + "providerCapabilities": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": false, + "append": false + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "requests": [ + { + "version": 1, + "requestId": "init-glm-5.2", + "command": "initialize", + "params": { + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2", + "subscribe": true + } + }, + { + "version": 1, + "requestId": "send-glm-5.2", + "operationId": "op-live-send-glm-5.2", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK" + } + }, + { + "version": 1, + "requestId": "cancel-send-glm-5.2", + "operationId": "op-live-cancel-send-glm-5.2", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + }, + { + "version": 1, + "requestId": "cancel-glm-5.2", + "operationId": "op-live-cancel-glm-5.2", + "command": "cancel_run", + "params": { + "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "reason": "live packed smoke cancellation" + } + } + ], + "operation": "cli-bridge.target-smoke", + "credentialLifecycle": { + "configured": true, + "stored": true, + "removed": true, + "facility": "encrypted-headless" + }, + "initialize": { + "version": 1, + "type": "ack", + "requestId": "init-glm-5.2", + "revision": 4, + "command": "initialize" + }, + "conversationId": "conv-1", + "branchId": "branch-1", + "initialCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "send": { + "version": 1, + "type": "ack", + "requestId": "send-glm-5.2", + "operationId": "op-live-send-glm-5.2", + "revision": 4, + "replayed": false, + "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "admission": { + "version": 1, + "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "turnId": "turn-d8860d89-c795-493b-9562-a815c84541bf", + "operationId": "op-live-send-glm-5.2", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:23:08.659Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", + "profile": { + "name": "Braid live opencode/zai-coding-plan/glm-5.2", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "glm-5.2", + "provider": "zai-coding-plan", + "reasoningEffort": "none" + }, + "harness": "opencode" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "glm-5.2", + "runner": "opencode" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": false, + "append": true + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "b68e6bdcee69b8fdf9bb71ace144ee2a32ece38f36ac72a1e2a944636cf07491", + "capabilitiesDigest": "cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd", + "materializationDigest": "a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc", + "digest": "2afa29fdd7f13affde6b0eafba617bd0f51279c7cb45573099e988e6cfa1b64e" + }, + "command": "send" + }, + "activeCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": true, + "source": "runtime" + }, + "run.queue": { + "available": true, + "source": "provider" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": true, + "source": "provider" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconnecting it" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconciling it" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "normal": { + "status": "completed", + "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "run": { + "id": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "turnId": "turn-d8860d89-c795-493b-9562-a815c84541bf", + "operationId": "op-live-send-glm-5.2", + "status": "completed", + "startedAt": "2026-08-29T00:23:08.670Z", + "updatedAt": "2026-08-29T00:23:12.634Z", + "terminalAt": "2026-08-29T00:23:12.634Z", + "durationMs": 3964, + "inputTokens": 17707, + "outputTokens": 44, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "opencode/zai-coding-plan/glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "environmentId": "environment-e89db0533b51b9bf25167b4285bf9650", + "controlRef": { + "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "provider": "cli-bridge", + "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0", + "sessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "executionId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "requestDigest": "sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4" + }, + "materializationDigest": "a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc", + "cursor": "2:0", + "cursorCommittedSequence": 12, + "contentBytes": 61 + }, + "assistant": { + "id": "message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb", + "role": "assistant", + "text": "LIVE_BRAID_GLM-5_2_OK", + "status": "complete", + "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "parts": [ + { + "id": "op-live-send-glm-5.2:text", + "kind": "text", + "text": "LIVE_BRAID_GLM-5_2_OK", + "sourceEventId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final" + } + ] + }, + "finalText": "LIVE_BRAID_GLM-5_2_OK", + "marker": "LIVE_BRAID_GLM-5_2_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK" + }, + "cancel": { + "prompt": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-glm-5.2", + "operationId": "op-live-cancel-send-glm-5.2", + "revision": 14, + "replayed": false, + "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "admission": { + "version": 1, + "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "turnId": "turn-ee012bc5-8987-476c-8194-81625ee71db1", + "operationId": "op-live-cancel-send-glm-5.2", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:23:13.407Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "requested": { + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live opencode/zai-coding-plan/glm-5.2", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "glm-5.2", + "provider": "zai-coding-plan", + "reasoningEffort": "none" + }, + "harness": "opencode" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "glm-5.2", + "runner": "opencode" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "991bee15b03b14fa9bc930ca0a390ff8acac2095ba0d0eef5505687841b87c3f", + "capabilitiesDigest": "cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd", + "materializationDigest": "b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b", + "digest": "074a2baab8b7a4f117d96a4a713ab364d613879a410c74d32fd76afdfdeb0af9" + }, + "command": "send" + }, + "advertisedByProvider": false, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "activeRun": { + "id": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "turnId": "turn-ee012bc5-8987-476c-8194-81625ee71db1", + "operationId": "op-live-cancel-send-glm-5.2", + "status": "streaming", + "startedAt": "2026-08-29T00:23:13.417Z", + "updatedAt": "2026-08-29T00:23:13.417Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "materializationDigest": "b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-glm-5.2", + "revision": 25, + "operationId": "op-live-cancel-glm-5.2", + "command": "cancel_run", + "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "control": "cancel", + "outcome": "rejected", + "replayed": false + }, + "attemptedRun": true, + "status": "advertised-but-not-terminal-cancelled" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": false, + "advertisedByBraid": false, + "advertised": false, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "error": { + "code": "LIVE_CAPABILITY_CONTRADICTION", + "message": "cancel capability reported advertised-but-not-terminal-cancelled; expected verified", + "exitCode": 1, + "details": { + "name": "cancel", + "status": "advertised-but-not-terminal-cancelled", + "advertised": true, + "capability": { + "prompt": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-glm-5.2", + "operationId": "op-live-cancel-send-glm-5.2", + "revision": 14, + "replayed": false, + "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "admission": { + "version": 1, + "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "turnId": "turn-ee012bc5-8987-476c-8194-81625ee71db1", + "operationId": "op-live-cancel-send-glm-5.2", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:23:13.407Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "requested": { + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": "[depth-limited]", + "connectionId": "connection-live-cli-bridge", + "interactions": "[depth-limited]", + "model": "glm-5.2", + "runner": "opencode" + }, + "capabilities": { + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "controls": "[depth-limited]", + "events": "[depth-limited]", + "usage": true, + "environment": "[depth-limited]" + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "991bee15b03b14fa9bc930ca0a390ff8acac2095ba0d0eef5505687841b87c3f", + "capabilitiesDigest": "cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd", + "materializationDigest": "b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b", + "digest": "074a2baab8b7a4f117d96a4a713ab364d613879a410c74d32fd76afdfdeb0af9" + }, + "command": "send" + }, + "advertisedByProvider": false, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "activeRun": { + "id": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "turnId": "turn-ee012bc5-8987-476c-8194-81625ee71db1", + "operationId": "op-live-cancel-send-glm-5.2", + "status": "streaming", + "startedAt": "2026-08-29T00:23:13.417Z", + "updatedAt": "2026-08-29T00:23:13.417Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", + "materializationDigest": "b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-glm-5.2", + "revision": 25, + "operationId": "op-live-cancel-glm-5.2", + "command": "cancel_run", + "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", + "control": "cancel", + "outcome": "rejected", + "replayed": false + }, + "attemptedRun": true, + "status": "advertised-but-not-terminal-cancelled" + } + } + }, + "status": "failed", + "stderr": "", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-glm-5.2\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-glm-5.2\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:06.923Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:06.923Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-glm-5.2\",\"operationId\":\"op-live-send-glm-5.2\",\"revision\":4,\"replayed\":false,\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"admission\":{\"version\":1,\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:23:08.659Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"b68e6bdcee69b8fdf9bb71ace144ee2a32ece38f36ac72a1e2a944636cf07491\",\"capabilitiesDigest\":\"cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd\",\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"digest\":\"2afa29fdd7f13affde6b0eafba617bd0f51279c7cb45573099e988e6cfa1b64e\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"admission\":{\"version\":1,\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:23:08.659Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"b68e6bdcee69b8fdf9bb71ace144ee2a32ece38f36ac72a1e2a944636cf07491\",\"capabilitiesDigest\":\"cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd\",\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"digest\":\"2afa29fdd7f13affde6b0eafba617bd0f51279c7cb45573099e988e6cfa1b64e\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-glm-5.2-7fac9b274f98e53c6267030a\",\"operationId\":\"op-live-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"7fac9b274f98e53c6267030af185dce40a524d16228323746e5228b2662ef83a\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:23:08.680Z\",\"updatedAt\":\"2026-08-29T00:23:08.680Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-glm-5.2\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"runId\":\"retained-intent-run:698798373dedaacfab91ae06ca100d481aae4de79d4d5145337fb5af53017334\",\"requestedProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requestDigest\":\"sha256:698798373dedaacfab91ae06ca100d481aae4de79d4d5145337fb5af53017334\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-glm-5.2\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:08.670Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:08.670Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"focusedRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"activeRuns\":[{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:08.670Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"running\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\"},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"focusedRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"startedAt\":\"2026-08-29T00:23:08.670Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-glm-5.2\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-glm-5.2\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"source\":{\"eventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:23:09.478Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:23:09.478Z\"},\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"provider\":{\"eventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:23:09.478Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"source\":{\"eventId\":\"2:0\",\"providerSequence\":2,\"cursor\":\"2:0\",\"receivedAt\":\"2026-08-29T00:23:12.534Z\"},\"part\":{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"2:0\"},\"delta\":\"LIVE_BRAID_GLM-5_2_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"source\":{\"eventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:23:12.633Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_GLM-5_2_OK\",\"usage\":{\"input\":17707,\"output\":44,\"usdKnown\":false,\"model\":\"opencode/zai-coding-plan/glm-5.2\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-glm-5.2-7fac9b274f98e53c6267030a\",\"operationId\":\"op-live-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"7fac9b274f98e53c6267030af185dce40a524d16228323746e5228b2662ef83a\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T00:23:08.680Z\",\"updatedAt\":\"2026-08-29T00:23:12.651Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-glm-5.2\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:08.670Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:12.634Z\",\"terminalAt\":\"2026-08-29T00:23:12.634Z\",\"durationMs\":3964,\"inputTokens\":17707,\"outputTokens\":44,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:09.478Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:08.670Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3964},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":61}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:09.478Z\"}],\"focusedRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"completed\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"environment:environment-e89db0533b51b9bf25167b4285bf9650\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:23:07.947Z\",\"occurredAt\":\"2026-08-29T00:23:09.478Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:12.634Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:23:07.947Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:23:07.947Z\",\"observed: 2026-08-29T00:23:09.478Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"17707\"},{\"label\":\"output tokens\",\"value\":\"44\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"model\",\"value\":\"opencode/zai-coding-plan/glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-glm-5.2\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"revision\":14,\"replayed\":false,\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"admission\":{\"version\":1,\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:23:13.407Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"991bee15b03b14fa9bc930ca0a390ff8acac2095ba0d0eef5505687841b87c3f\",\"capabilitiesDigest\":\"cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd\",\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\",\"digest\":\"074a2baab8b7a4f117d96a4a713ab364d613879a410c74d32fd76afdfdeb0af9\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:23:13.407Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"991bee15b03b14fa9bc930ca0a390ff8acac2095ba0d0eef5505687841b87c3f\",\"capabilitiesDigest\":\"cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd\",\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\",\"digest\":\"074a2baab8b7a4f117d96a4a713ab364d613879a410c74d32fd76afdfdeb0af9\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-glm-5.2-53e3d0cbc21ce8a0b8bb2a71\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"53e3d0cbc21ce8a0b8bb2a717a163213811e9bf3d88cf27a9169954038491dc7\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:23:13.425Z\",\"updatedAt\":\"2026-08-29T00:23:13.425Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-glm-5.2\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"runId\":\"retained-intent-run:f5792847a638e3209db5f6e2baa692d8fe70fcae20d90defbf33c1bd7896974c\",\"requestedProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requestDigest\":\"sha256:f5792847a638e3209db5f6e2baa692d8fe70fcae20d90defbf33c1bd7896974c\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-glm-5.2\",\"revision\":16,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":16,\"sequence\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:12.634Z\",\"terminalAt\":\"2026-08-29T00:23:12.634Z\",\"durationMs\":3964,\"inputTokens\":17707,\"outputTokens\":44,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"updatedAt\":\"2026-08-29T00:23:13.417Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":17707,\"output\":44,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:09.478Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"activeRuns\":[{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3964},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"running\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\"},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":17707,\"output\":44,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:09.478Z\"}],\"activeRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"completed\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"environment:environment-e89db0533b51b9bf25167b4285bf9650\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:23:07.947Z\",\"occurredAt\":\"2026-08-29T00:23:09.478Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:12.634Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"kind\":\"run\",\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"occurredAt\":\"2026-08-29T00:23:13.417Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:13.417Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:23:07.947Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:13.417Z\"},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ee012bc5-8987-476c-8194-81625ee71db1\"],\"runner\":\"opencode\",\"startedAt\":\"2026-08-29T00:23:13.417Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:23:07.947Z\",\"observed: 2026-08-29T00:23:09.478Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-glm-5.2\",\"revision\":25,\"operationId\":\"op-live-cancel-glm-5.2\",\"command\":\"cancel_run\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":\"cancel\",\"outcome\":\"rejected\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":{\"operationId\":\"op-live-cancel-glm-5.2\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":{\"operationId\":\"op-live-cancel-glm-5.2\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-glm-5.2-59cd12bc13883a02269bbe42\",\"operationId\":\"op-live-cancel-glm-5.2\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"59cd12bc13883a02269bbe4236945b25bab48807ad8d59089a713ae574568a5e\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:23:13.492Z\",\"updatedAt\":\"2026-08-29T00:23:13.492Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-glm-5.2\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"requestDigest\":\"sha256:da30212595dc2cfea3fe5363087d1ef6a3c6d1009f52c1d059f635569c01552f\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-glm-5.2\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"source\":{\"eventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:23:14.218Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:23:12.677Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:23:14.218Z\"},\"controlRef\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"requestDigest\":\"sha256:da30212595dc2cfea3fe5363087d1ef6a3c6d1009f52c1d059f635569c01552f\"},\"provider\":{\"eventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:23:14.218Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-glm-5.2-59cd12bc13883a02269bbe42\",\"operationId\":\"op-live-cancel-glm-5.2\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"59cd12bc13883a02269bbe4236945b25bab48807ad8d59089a713ae574568a5e\",\"kind\":\"custom\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"9b36e01becb0d1203e711951cfba6431bf6287b23dc3b2ba9925d802bc3351ff\",\"createdAt\":\"2026-08-29T00:23:13.492Z\",\"updatedAt\":\"2026-08-29T00:23:14.257Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":{\"operationId\":\"op-live-cancel-glm-5.2\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":\"cancel\",\"status\":\"rejected\",\"detail\":\"CONTROL_REJECTED\"}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-glm-5.2\",\"revision\":26,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":26,\"sequence\":26,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:12.634Z\",\"terminalAt\":\"2026-08-29T00:23:12.634Z\",\"durationMs\":3964,\"inputTokens\":17707,\"outputTokens\":44,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"cancelling\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"updatedAt\":\"2026-08-29T00:23:14.269Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"requestDigest\":\"sha256:da30212595dc2cfea3fe5363087d1ef6a3c6d1009f52c1d059f635569c01552f\"},\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":17707,\"output\":44,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:14.218Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"activeRuns\":[{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":26,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelling\",\"statusText\":\"cancelling\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3964},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"cancelling\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\"},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":17707,\"output\":44,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:14.218Z\"}],\"activeRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"completed\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:12.634Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"kind\":\"run\",\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"status\":\"cancelling\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"occurredAt\":\"2026-08-29T00:23:13.417Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"environment:environment-e89db0533b51b9bf25167b4285bf9650\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:23:07.947Z\",\"occurredAt\":\"2026-08-29T00:23:14.218Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelling\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:14.269Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelling\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:23:14.269Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelling\",\"detail\":\"rejected\",\"occurredAt\":\"2026-08-29T00:23:14.269Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:23:07.947Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelling\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:13.417Z\"},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelling\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ee012bc5-8987-476c-8194-81625ee71db1\"],\"runner\":\"opencode\",\"startedAt\":\"2026-08-29T00:23:13.417Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:23:07.947Z\",\"observed: 2026-08-29T00:23:14.218Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"fields\":[{\"label\":\"status\",\"value\":\"cancelling\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"The current runtime does not acknowledge provider cancellation\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"source\":{\"eventId\":\"3:0\",\"providerSequence\":2,\"cursor\":\"3:0\",\"receivedAt\":\"2026-08-29T00:24:07.874Z\"},\"part\":{\"id\":\"op-live-cancel-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"sourceEventId\":\"3:0\"},\"delta\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"source\":{\"eventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:24:08.006Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"usage\":{\"input\":17784,\"output\":5903,\"usdKnown\":false,\"model\":\"opencode/zai-coding-plan/glm-5.2\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-glm-5.2-53e3d0cbc21ce8a0b8bb2a71\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"53e3d0cbc21ce8a0b8bb2a717a163213811e9bf3d88cf27a9169954038491dc7\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T00:23:13.425Z\",\"updatedAt\":\"2026-08-29T00:24:08.046Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-glm-5.2\",\"revision\":29,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":29,\"sequence\":29,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"op-live-cancel-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"sourceEventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:final\"}]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:12.634Z\",\"terminalAt\":\"2026-08-29T00:23:12.634Z\",\"durationMs\":3964,\"inputTokens\":17707,\"outputTokens\":44,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"updatedAt\":\"2026-08-29T00:24:08.025Z\",\"terminalAt\":\"2026-08-29T00:24:08.025Z\",\"durationMs\":54608,\"inputTokens\":17784,\"outputTokens\":5903,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"requestDigest\":\"sha256:da30212595dc2cfea3fe5363087d1ef6a3c6d1009f52c1d059f635569c01552f\"},\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\",\"cursor\":\"3:0\",\"cursorCommittedSequence\":27,\"contentBytes\":19124}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":35491,\"output\":5947,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:14.218Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":29,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"op-live-cancel-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"sourceEventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3964},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"3:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17784,\"output\":5903,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":54608},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":19124}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":35491,\"output\":5947,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:14.218Z\"}],\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"completed\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:12.634Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"kind\":\"run\",\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"status\":\"completed\",\"elapsedMs\":54608,\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"occurredAt\":\"2026-08-29T00:23:13.417Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"environment:environment-e89db0533b51b9bf25167b4285bf9650\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:23:07.947Z\",\"occurredAt\":\"2026-08-29T00:23:14.218Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:24:08.025Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"completed\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:24:08.025Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"completed\",\"detail\":\"rejected\",\"occurredAt\":\"2026-08-29T00:24:08.025Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:23:07.947Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:13.417Z\"},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ee012bc5-8987-476c-8194-81625ee71db1\"],\"runner\":\"opencode\",\"elapsedMs\":54608,\"startedAt\":\"2026-08-29T00:23:13.417Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:23:07.947Z\",\"observed: 2026-08-29T00:23:14.218Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"17784\"},{\"label\":\"output tokens\",\"value\":\"5903\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"model\",\"value\":\"opencode/zai-coding-plan/glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":true,\"source\":\"application\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":30,\"revision\":30,\"event\":{\"sequence\":30,\"revision\":30,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", + "process": { + "processIdentity": { + "instanceId": "584d7b9a-0e6a-4702-8155-6ba64717ab24", + "pid": 2252629, + "startedAt": 1787962986475 + }, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2252629 + ], + "roots": [ + 2252629 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "natural": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2252629 + ], + "roots": [ + 2252629 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": 0, + "signal": null + } + } + }, + { + "label": "kimi-code kimi-for-coding", + "target": "kimi-code/kimi-for-coding", + "profile": { + "path": ".braid/profiles/profile-kimi-code-kimi-for-coding.json", + "harness": "kimi-code", + "model": "kimi-for-coding" + }, + "connection": { + "id": "connection-live-cli-bridge", + "kind": "cli-bridge", + "endpoint": "http://127.0.0.1:3355", + "credentialConfigured": true + }, + "providerCapabilities": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": false, + "append": false + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "requests": [ + { + "version": 1, + "requestId": "init-kimi-code-kimi-for-coding", + "command": "initialize", + "params": { + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding", + "subscribe": true + } + }, + { + "version": 1, + "requestId": "send-kimi-code-kimi-for-coding", + "operationId": "op-live-send-kimi-code-kimi-for-coding", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK" + } + } + ], + "operation": "cli-bridge.target-smoke", + "credentialLifecycle": { + "configured": true, + "stored": true, + "removed": true, + "facility": "encrypted-headless" + }, + "initialize": { + "version": 1, + "type": "ack", + "requestId": "init-kimi-code-kimi-for-coding", + "revision": 4, + "command": "initialize" + }, + "conversationId": "conv-1", + "branchId": "branch-1", + "initialCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "send": { + "version": 1, + "type": "ack", + "requestId": "send-kimi-code-kimi-for-coding", + "operationId": "op-live-send-kimi-code-kimi-for-coding", + "revision": 4, + "replayed": false, + "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "admission": { + "version": 1, + "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "turnId": "turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b", + "operationId": "op-live-send-kimi-code-kimi-for-coding", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:25:17.087Z", + "profileDigest": "fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK", + "profile": { + "name": "Braid live kimi-code/kimi-for-coding", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "kimi-for-coding", + "reasoningEffort": "none" + }, + "harness": "kimi-code" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "kimi-for-coding", + "runner": "kimi-code" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": false, + "append": false + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding", + "model": "kimi-for-coding", + "route": "kimi-code/kimi-for-coding", + "runner": "kimi-code", + "providerRunId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "7ff82b77bfc9b0b6366f70f5ae97ef3ab28c3a6f097e0bce0d516d9af210f40b", + "capabilitiesDigest": "b0057140d0dc718383709f80ba5aed38aebd502fc88950123c3da6aadc3c39a8", + "materializationDigest": "e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928", + "digest": "dd711fedf9bac28d135ab3a87286cbbbdf345102c66de88255e4cd819a84fae2" + }, + "command": "send" + }, + "activeCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": true, + "source": "runtime" + }, + "run.queue": { + "available": true, + "source": "provider" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": true, + "source": "provider" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconnecting it" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconciling it" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "normal": { + "status": "failed", + "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "run": { + "id": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "turnId": "turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b", + "operationId": "op-live-send-kimi-code-kimi-for-coding", + "status": "failed", + "startedAt": "2026-08-29T00:25:17.097Z", + "updatedAt": "2026-08-29T00:25:18.963Z", + "terminalAt": "2026-08-29T00:25:18.963Z", + "durationMs": 1866, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "kimi-for-coding", + "provider": "cli-bridge", + "runner": "kimi-code", + "connectionId": "connection-live-cli-bridge", + "completeness": "failed", + "providerSessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", + "environmentId": "environment-74b47b1fb3209b04ebfe833c616a7e3b", + "controlRef": { + "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "provider": "cli-bridge", + "environmentId": "cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0", + "sessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", + "executionId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "requestDigest": "sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b" + }, + "materializationDigest": "e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928", + "cursor": "2:0", + "cursorCommittedSequence": 12 + }, + "assistant": { + "id": "message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0", + "role": "assistant", + "text": "", + "status": "failed", + "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "parts": [] + }, + "finalText": "", + "marker": "LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK", + "markerObserved": false, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK" + }, + "error": { + "code": "LIVE_FINAL_OUTPUT_MISMATCH", + "message": "Packed Braid kimi-code kimi-for-coding turn completed without the expected response marker", + "exitCode": 1, + "details": { + "run": { + "id": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "turnId": "turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b", + "operationId": "op-live-send-kimi-code-kimi-for-coding", + "status": "failed", + "startedAt": "2026-08-29T00:25:17.097Z", + "updatedAt": "2026-08-29T00:25:18.963Z", + "terminalAt": "2026-08-29T00:25:18.963Z", + "durationMs": 1866, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "kimi-for-coding", + "provider": "cli-bridge", + "runner": "kimi-code", + "connectionId": "connection-live-cli-bridge", + "completeness": "failed", + "providerSessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", + "environmentId": "environment-74b47b1fb3209b04ebfe833c616a7e3b", + "controlRef": { + "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "provider": "cli-bridge", + "environmentId": "cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0", + "sessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", + "executionId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "requestDigest": "sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b" + }, + "materializationDigest": "e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928", + "cursor": "2:0", + "cursorCommittedSequence": 12 + }, + "assistant": { + "id": "message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0", + "role": "assistant", + "text": "", + "status": "failed", + "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "parts": [] + } + } + }, + "status": "failed", + "stderr": "", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-kimi-code-kimi-for-coding\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-kimi-code-kimi-for-coding\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:14.829Z\"}],\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"runConfiguration\":{\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:14.829Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:14.829Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-kimi-code-kimi-for-coding\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"revision\":4,\"replayed\":false,\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"admission\":{\"version\":1,\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:25:17.087Z\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"kimi-for-coding\",\"runner\":\"kimi-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":false},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"model\":\"kimi-for-coding\",\"route\":\"kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"providerRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"7ff82b77bfc9b0b6366f70f5ae97ef3ab28c3a6f097e0bce0d516d9af210f40b\",\"capabilitiesDigest\":\"b0057140d0dc718383709f80ba5aed38aebd502fc88950123c3da6aadc3c39a8\",\"materializationDigest\":\"e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928\",\"digest\":\"dd711fedf9bac28d135ab3a87286cbbbdf345102c66de88255e4cd819a84fae2\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"admission\":{\"version\":1,\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:25:17.087Z\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"kimi-for-coding\",\"runner\":\"kimi-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":false},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"model\":\"kimi-for-coding\",\"route\":\"kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"providerRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"7ff82b77bfc9b0b6366f70f5ae97ef3ab28c3a6f097e0bce0d516d9af210f40b\",\"capabilitiesDigest\":\"b0057140d0dc718383709f80ba5aed38aebd502fc88950123c3da6aadc3c39a8\",\"materializationDigest\":\"e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928\",\"digest\":\"dd711fedf9bac28d135ab3a87286cbbbdf345102c66de88255e4cd819a84fae2\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-kimi-code-kimi-for-coding-9fe8f4e6c89bb451cb1a0bcc\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"effectKind\":\"run.execute\",\"requestDigest\":\"9fe8f4e6c89bb451cb1a0bccf8353f80aac5d88c8d59abfb9715355b09c881c1\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:25:17.107Z\",\"updatedAt\":\"2026-08-29T00:25:17.107Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-kimi-code-kimi-for-coding\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"runId\":\"retained-intent-run:081a99813cee86bef4c1fcf1b868e258518261f1805ba1da1e5ffaf325bfea65\",\"requestedProfileDigest\":\"sha256:fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"requestDigest\":\"sha256:081a99813cee86bef4c1fcf1b868e258518261f1805ba1da1e5ffaf325bfea65\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-kimi-code-kimi-for-coding\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:17.097Z\"}],\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"runConfiguration\":{\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"status\":\"complete\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[{\"id\":\"part-message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}]},{\"id\":\"message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[]}],\"runs\":[{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:25:17.097Z\",\"updatedAt\":\"2026-08-29T00:25:17.097Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"kimi-for-coding\",\"provider\":\"cli-bridge\",\"runner\":\"kimi-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"materializationDigest\":\"e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"focusedRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"activeRuns\":[{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:17.097Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"status\":\"complete\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[{\"id\":\"part-message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}]},{\"id\":\"message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"status\":\"running\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"kimi-for-coding\"},\"runner\":\"kimi-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"focusedRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"kind\":\"run\",\"title\":\"run run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:25:17.097Z\",\"occurredAt\":\"2026-08-29T00:25:17.097Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"},{\"id\":\"activity:run-9408140a-dfdb-4854-8306-03cda6969eb9:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"occurredAt\":\"2026-08-29T00:25:17.097Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:25:17.097Z\"},{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\"],\"runner\":\"kimi-code\",\"startedAt\":\"2026-08-29T00:25:17.097Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"kimi-for-coding\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-kimi-code-kimi-for-coding\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"requestDigest\":\"sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-kimi-code-kimi-for-coding\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"source\":{\"eventId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:25:18.369Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:25:15.901Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:25:18.369Z\"},\"controlRef\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"requestDigest\":\"sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b\"},\"provider\":{\"eventId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:25:18.369Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"source\":{\"eventId\":\"2:0\",\"providerSequence\":2,\"cursor\":\"2:0\",\"receivedAt\":\"2026-08-29T00:25:18.962Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"status\":\"failed\",\"detail\":\"RUNTIME_STATUS\",\"provider\":{\"eventId\":\"2:0\",\"providerSequence\":2,\"cursor\":\"2:0\",\"receivedAt\":\"2026-08-29T00:25:18.962Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-kimi-code-kimi-for-coding-9fe8f4e6c89bb451cb1a0bcc\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"effectKind\":\"run.execute\",\"requestDigest\":\"9fe8f4e6c89bb451cb1a0bccf8353f80aac5d88c8d59abfb9715355b09c881c1\",\"kind\":\"send\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"2d2acf569882146ba42c49e3553984f716d39e5c29483aa9dd35daa8fb1f60bc\",\"createdAt\":\"2026-08-29T00:25:17.107Z\",\"updatedAt\":\"2026-08-29T00:25:18.972Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-kimi-code-kimi-for-coding\",\"revision\":13,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":13,\"sequence\":13,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:17.097Z\"}],\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"runConfiguration\":{\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"status\":\"complete\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[{\"id\":\"part-message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}]},{\"id\":\"message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"failed\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[]}],\"runs\":[{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"status\":\"failed\",\"startedAt\":\"2026-08-29T00:25:17.097Z\",\"updatedAt\":\"2026-08-29T00:25:18.963Z\",\"terminalAt\":\"2026-08-29T00:25:18.963Z\",\"durationMs\":1866,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"kimi-for-coding\",\"provider\":\"cli-bridge\",\"runner\":\"kimi-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"failed\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"environmentId\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"controlRef\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"requestDigest\":\"sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b\"},\"materializationDigest\":\"e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:25:15.901Z\",\"updatedAt\":\"2026-08-29T00:25:18.369Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":13,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:17.097Z\"}],\"branch\":\"branch-1\",\"status\":\"failed\",\"statusText\":\"failed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"status\":\"complete\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[{\"id\":\"part-message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}]},{\"id\":\"message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"failed\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"status\":\"failed\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"kimi-for-coding\",\"elapsedMs\":1866},\"runner\":\"kimi-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"completeness\":\"failed\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:25:15.901Z\",\"updatedAt\":\"2026-08-29T00:25:18.369Z\"}],\"focusedRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"kind\":\"run\",\"title\":\"run run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"status\":\"failed\",\"elapsedMs\":1866,\"startedAt\":\"2026-08-29T00:25:17.097Z\",\"occurredAt\":\"2026-08-29T00:25:17.097Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"},{\"id\":\"environment:environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:25:15.901Z\",\"occurredAt\":\"2026-08-29T00:25:18.369Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"environment\",\"entityId\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\"},{\"id\":\"activity:run-9408140a-dfdb-4854-8306-03cda6969eb9:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"failed\",\"detail\":\"profile fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"occurredAt\":\"2026-08-29T00:25:18.963Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"},{\"id\":\"activity:run-9408140a-dfdb-4854-8306-03cda6969eb9:status:local:failed\",\"kind\":\"system\",\"title\":\"failed\",\"status\":\"failed\",\"detail\":\"RUNTIME_STATUS\",\"occurredAt\":\"2026-08-29T00:25:18.963Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-9408140a-dfdb-4854-8306-03cda6969eb9\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:25:15.901Z\"},{\"id\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"failed\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:25:17.097Z\"},{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"failed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\"],\"runner\":\"kimi-code\",\"elapsedMs\":1866,\"startedAt\":\"2026-08-29T00:25:17.097Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:25:15.901Z\",\"observed: 2026-08-29T00:25:18.369Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"fields\":[{\"label\":\"status\",\"value\":\"failed\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"kimi-for-coding\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", + "process": { + "processIdentity": { + "instanceId": "08c6a3ac-cb39-483f-b208-74d0cc2b9215", + "pid": 2259754, + "startedAt": 1787963114379 + }, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2259754 + ], + "roots": [ + 2259754 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "natural": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2259754 + ], + "roots": [ + 2259754 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": 0, + "signal": null + } + } + }, + { + "label": "pi deepseek/deepseek-v4-flash", + "target": "pi/deepseek/deepseek-v4-flash", + "profile": { + "path": ".braid/profiles/profile-pi-deepseek-deepseek-v4-flash.json", + "harness": "pi", + "model": "deepseek-v4-flash", + "provider": "deepseek" + }, + "connection": { + "id": "connection-live-cli-bridge", + "kind": "cli-bridge", + "endpoint": "http://127.0.0.1:3355", + "credentialConfigured": true + }, + "providerCapabilities": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": false, + "append": false + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "requests": [ + { + "version": 1, + "requestId": "init-pi-deepseek-deepseek-v4-flash", + "command": "initialize", + "params": { + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash", + "subscribe": true + } + }, + { + "version": 1, + "requestId": "send-pi-deepseek-deepseek-v4-flash", + "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK" + } + } + ], + "operation": "cli-bridge.target-smoke", + "credentialLifecycle": { + "configured": true, + "stored": true, + "removed": true, + "facility": "encrypted-headless" + }, + "initialize": { + "version": 1, + "type": "ack", + "requestId": "init-pi-deepseek-deepseek-v4-flash", + "revision": 4, + "command": "initialize" + }, + "conversationId": "conv-1", + "branchId": "branch-1", + "initialCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "send": { + "version": 1, + "type": "ack", + "requestId": "send-pi-deepseek-deepseek-v4-flash", + "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", + "revision": 4, + "replayed": false, + "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "admission": { + "version": 1, + "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "turnId": "turn-7998ada5-574b-470c-84bd-07e5c00c6d99", + "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:25:20.226Z", + "profileDigest": "1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK", + "profile": { + "name": "Braid live pi/deepseek/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "deepseek", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": true + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": false, + "instructions": true, + "tools": false, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash", + "model": "deepseek-v4-flash", + "route": "pi/deepseek/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "0a8422f02e7951be1a620d63f79b5903c78c80d03b21c3660ce9d32448b05d57", + "capabilitiesDigest": "a9476d5bcb86b084bf94eb567b88ff77a83808043f3e699102be9a304c0539e5", + "materializationDigest": "0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99", + "digest": "10374b5fb3a910d49b701440872276621824023cc9373b9e79a1c56d4b5d6990" + }, + "command": "send" + }, + "activeCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": true, + "source": "runtime" + }, + "run.queue": { + "available": true, + "source": "provider" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": true, + "source": "provider" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconnecting it" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconciling it" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "normal": { + "status": "failed", + "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "run": { + "id": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "turnId": "turn-7998ada5-574b-470c-84bd-07e5c00c6d99", + "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", + "status": "failed", + "startedAt": "2026-08-29T00:25:20.237Z", + "updatedAt": "2026-08-29T00:25:23.102Z", + "terminalAt": "2026-08-29T00:25:23.064Z", + "durationMs": 2827, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "pi/deepseek/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "error": "RUNTIME_FINAL_ERROR", + "completeness": "failed", + "providerSessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "environmentId": "environment-0cad3c10f35f7aef52edafb03c248148", + "controlRef": { + "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0", + "sessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "executionId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "requestDigest": "sha256:ce76ce135f002bfeadab2d36cfc8bfd1652c0f0ce914019c423c179c10403eb5" + }, + "materializationDigest": "0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99", + "cursor": "1", + "cursorCommittedSequence": 12, + "contentBytes": 39 + }, + "assistant": { + "id": "message-c91eb4e7-22fc-4aef-a353-eb61fb36f879", + "role": "assistant", + "text": "", + "status": "failed", + "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "parts": [] + }, + "finalText": "", + "marker": "LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK", + "markerObserved": false, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK" + }, + "error": { + "code": "LIVE_FINAL_OUTPUT_MISMATCH", + "message": "Packed Braid pi deepseek/deepseek-v4-flash turn completed without the expected response marker", + "exitCode": 1, + "details": { + "run": { + "id": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "turnId": "turn-7998ada5-574b-470c-84bd-07e5c00c6d99", + "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", + "status": "failed", + "startedAt": "2026-08-29T00:25:20.237Z", + "updatedAt": "2026-08-29T00:25:23.102Z", + "terminalAt": "2026-08-29T00:25:23.064Z", + "durationMs": 2827, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "pi/deepseek/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "error": "RUNTIME_FINAL_ERROR", + "completeness": "failed", + "providerSessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "environmentId": "environment-0cad3c10f35f7aef52edafb03c248148", + "controlRef": { + "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0", + "sessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "executionId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "requestDigest": "sha256:ce76ce135f002bfeadab2d36cfc8bfd1652c0f0ce914019c423c179c10403eb5" + }, + "materializationDigest": "0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99", + "cursor": "1", + "cursorCommittedSequence": 12, + "contentBytes": 39 + }, + "assistant": { + "id": "message-c91eb4e7-22fc-4aef-a353-eb61fb36f879", + "role": "assistant", + "text": "", + "status": "failed", + "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", + "parts": [] + } + } + }, + "status": "failed", + "stderr": "", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-pi-deepseek-deepseek-v4-flash\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-pi-deepseek-deepseek-v4-flash\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:19.516Z\"}],\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:19.516Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:19.516Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-pi-deepseek-deepseek-v4-flash\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"revision\":4,\"replayed\":false,\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"admission\":{\"version\":1,\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:25:20.226Z\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"model\":\"deepseek-v4-flash\",\"route\":\"pi/deepseek/deepseek-v4-flash\",\"runner\":\"pi\",\"providerRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"0a8422f02e7951be1a620d63f79b5903c78c80d03b21c3660ce9d32448b05d57\",\"capabilitiesDigest\":\"a9476d5bcb86b084bf94eb567b88ff77a83808043f3e699102be9a304c0539e5\",\"materializationDigest\":\"0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99\",\"digest\":\"10374b5fb3a910d49b701440872276621824023cc9373b9e79a1c56d4b5d6990\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"admission\":{\"version\":1,\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:25:20.226Z\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"__braidTruncated\":true},\"__braidTruncated\":true},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-pi-deepseek-deepseek-v4-flash-ab8bdc367345bad70b10d22f\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"ab8bdc367345bad70b10d22fe24ce354d7dbd841e44895b3dd7d713bdabc5b37\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:25:20.249Z\",\"updatedAt\":\"2026-08-29T00:25:20.249Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"executionId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"runId\":\"retained-intent-run:10232103a420175a3c5caeaf5d8557b74c52362f42c7415ccb5a2bacff017105\",\"requestedProfileDigest\":\"sha256:1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"requestDigest\":\"sha256:10232103a420175a3c5caeaf5d8557b74c52362f42c7415ccb5a2bacff017105\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-pi-deepseek-deepseek-v4-flash\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:20.237Z\"}],\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[{\"id\":\"part-message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-c91eb4e7-22fc-4aef-a353-eb61fb36f879\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[]}],\"runs\":[{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:25:20.237Z\",\"updatedAt\":\"2026-08-29T00:25:20.237Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"materializationDigest\":\"0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"focusedRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"activeRuns\":[{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:20.237Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[{\"id\":\"part-message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-c91eb4e7-22fc-4aef-a353-eb61fb36f879\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"status\":\"running\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\"},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"focusedRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"kind\":\"run\",\"title\":\"run run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:25:20.237Z\",\"occurredAt\":\"2026-08-29T00:25:20.237Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"},{\"id\":\"activity:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"occurredAt\":\"2026-08-29T00:25:20.237Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:25:20.237Z\"},{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-7998ada5-574b-470c-84bd-07e5c00c6d99\"],\"runner\":\"pi\",\"startedAt\":\"2026-08-29T00:25:20.237Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"executionId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.reconnecting\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"status\":\"reconnecting\",\"completeness\":\"streaming\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"source\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:25:23.023Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:25:21.243Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:25:23.023Z\"},\"controlRef\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"executionId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"requestDigest\":\"sha256:ce76ce135f002bfeadab2d36cfc8bfd1652c0f0ce914019c423c179c10403eb5\"},\"provider\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:25:23.023Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"source\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T00:25:23.064Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"status\":\"failed\",\"detail\":\"RUNTIME_STATUS\",\"provider\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T00:25:23.064Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"source\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:25:23.101Z\"},\"status\":\"failed\",\"completeness\":\"complete\",\"finalText\":\"\",\"usage\":{\"input\":0,\"output\":0,\"tokensKnown\":false,\"usdKnown\":false,\"model\":\"pi/deepseek/deepseek-v4-flash\"},\"reason\":\"RUNTIME_FINAL_REASON\",\"error\":\"RUNTIME_FINAL_ERROR\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-pi-deepseek-deepseek-v4-flash-ab8bdc367345bad70b10d22f\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"ab8bdc367345bad70b10d22fe24ce354d7dbd841e44895b3dd7d713bdabc5b37\",\"kind\":\"send\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"2d2acf569882146ba42c49e3553984f716d39e5c29483aa9dd35daa8fb1f60bc\",\"createdAt\":\"2026-08-29T00:25:20.249Z\",\"updatedAt\":\"2026-08-29T00:25:23.122Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-pi-deepseek-deepseek-v4-flash\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:20.237Z\"}],\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[{\"id\":\"part-message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-c91eb4e7-22fc-4aef-a353-eb61fb36f879\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"failed\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[]}],\"runs\":[{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"status\":\"failed\",\"startedAt\":\"2026-08-29T00:25:20.237Z\",\"updatedAt\":\"2026-08-29T00:25:23.102Z\",\"terminalAt\":\"2026-08-29T00:25:23.064Z\",\"durationMs\":2827,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"pi/deepseek/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"error\":\"RUNTIME_FINAL_ERROR\",\"completeness\":\"failed\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"environmentId\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"controlRef\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"executionId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"requestDigest\":\"sha256:ce76ce135f002bfeadab2d36cfc8bfd1652c0f0ce914019c423c179c10403eb5\"},\"materializationDigest\":\"0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99\",\"cursor\":\"1\",\"cursorCommittedSequence\":12,\"contentBytes\":39}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:25:21.243Z\",\"updatedAt\":\"2026-08-29T00:25:23.023Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"activeRuns\":[],\"lastError\":\"RUNTIME_FINAL_ERROR\"},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:20.237Z\"}],\"branch\":\"branch-1\",\"status\":\"failed\",\"statusText\":\"RUNTIME_FINAL_ERROR\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[{\"id\":\"part-message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-c91eb4e7-22fc-4aef-a353-eb61fb36f879\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"failed\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"status\":\"failed\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"model\":\"pi/deepseek/deepseek-v4-flash\",\"effort\":\"none\",\"error\":\"RUNTIME_FINAL_ERROR\",\"cursor\":\"1\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"pi/deepseek/deepseek-v4-flash\",\"elapsedMs\":2827},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"completeness\":\"failed\",\"contentBytes\":39}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:25:21.243Z\",\"updatedAt\":\"2026-08-29T00:25:23.023Z\"}],\"focusedRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"kind\":\"run\",\"title\":\"run run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"status\":\"failed\",\"detail\":\"RUNTIME_FINAL_ERROR\",\"elapsedMs\":2827,\"startedAt\":\"2026-08-29T00:25:20.237Z\",\"occurredAt\":\"2026-08-29T00:25:20.237Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"},{\"id\":\"environment:environment-0cad3c10f35f7aef52edafb03c248148\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:25:21.243Z\",\"occurredAt\":\"2026-08-29T00:25:23.023Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"environment\",\"entityId\":\"environment-0cad3c10f35f7aef52edafb03c248148\"},{\"id\":\"activity:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"failed\",\"detail\":\"profile 1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"occurredAt\":\"2026-08-29T00:25:23.102Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"},{\"id\":\"activity:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"failed\",\"occurredAt\":\"2026-08-29T00:25:23.102Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"},{\"id\":\"activity:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:status:local:failed\",\"kind\":\"system\",\"title\":\"failed\",\"status\":\"failed\",\"detail\":\"RUNTIME_STATUS\",\"occurredAt\":\"2026-08-29T00:25:23.102Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"failed\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:25:20.237Z\"},{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"failed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-7998ada5-574b-470c-84bd-07e5c00c6d99\"],\"runner\":\"pi\",\"elapsedMs\":2827,\"startedAt\":\"2026-08-29T00:25:20.237Z\"},{\"id\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:25:21.243Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:25:21.243Z\",\"observed: 2026-08-29T00:25:23.023Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"fields\":[{\"label\":\"status\",\"value\":\"failed\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"pi/deepseek/deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", + "process": { + "processIdentity": { + "instanceId": "06bed5f3-b6f4-487a-90c0-442aa0a3130a", + "pid": 2260083, + "startedAt": 1787963119084 + }, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2260083 + ], + "roots": [ + 2260083 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "natural": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2260083 + ], + "roots": [ + 2260083 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": 0, + "signal": null + } + } + } + ], + "releaseProofs": [], + "releaseOperations": [], + "bridge": { + "initialHealth": { + "status": 200, + "ok": true, + "body": { + "status": "ok", + "cached_verdicts": false, + "oldest_probed_at": "2026-08-29T00:20:30.167Z", + "backends": [ + { + "name": "claude-code", + "state": "ready", + "version": "2.1.248 (Claude Code)", + "probed_at": "2026-08-29T00:20:30.167Z", + "cached": false + }, + { + "name": "opencode", + "state": "ready", + "version": "1.18.18", + "probed_at": "2026-08-29T00:20:30.167Z", + "cached": false + }, + { + "name": "kimi-code", + "state": "ready", + "version": "0.36.1", + "probed_at": "2026-08-29T00:20:30.167Z", + "cached": false + }, + { + "name": "pi", + "state": "ready", + "version": "0.83.0", + "probed_at": "2026-08-29T00:20:30.167Z", + "cached": false + }, + { + "name": "passthrough", + "state": "unavailable", + "detail": "no provider keys configured", + "probed_at": "2026-08-29T00:20:30.333Z", + "cached": false + } + ], + "admission": { + "active": 6, + "live": 6, + "stale": 0, + "unbound": 0, + "oldestHeldMs": 15624593, + "reclaimed": 8, + "queued": 0, + "maxActive": 20, + "maxQueue": 48, + "reservedActive": 2, + "bulkMaxActive": 18, + "activeByClass": { + "reserved": 6, + "bulk": 0 + }, + "queuedByClass": { + "reserved": 0, + "bulk": 0 + } + }, + "memory": { + "heap_used_bytes": 113001800, + "heap_total_bytes": 118554624, + "heap_limit_bytes": 17381195776, + "heap_used_pct": 0.7, + "rss_bytes": 215638016, + "external_bytes": 7782974, + "runs_retained": 2309, + "run_replay_bytes": 79310 + }, + "ts": "2026-08-29T00:20:30.333Z" + }, + "text": "{\"status\":\"ok\",\"cached_verdicts\":false,\"oldest_probed_at\":\"2026-08-29T00:20:30.167Z\",\"backends\":[{\"name\":\"claude-code\",\"state\":\"ready\",\"version\":\"2.1.248 (Claude Code)\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":false},{\"name\":\"opencode\",\"state\":\"ready\",\"version\":\"1.18.18\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":false},{\"name\":\"kimi-code\",\"state\":\"ready\",\"version\":\"0.36.1\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":false},{\"name\":\"pi\",\"state\":\"ready\",\"version\":\"0.83.0\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":false},{\"name\":\"passthrough\",\"state\":\"unavailable\",\"detail\":\"no provider keys configured\",\"probed_at\":\"2026-08-29T00:20:30.333Z\",\"cached\":false}],\"admission\":{\"active\":6,\"live\":6,\"stale\":0,\"unbound\":0,\"oldestHeldMs\":15624593,\"reclaimed\":8,\"queued\":0,\"maxActive\":20,\"maxQueue\":48,\"reservedActive\":2,\"bulkMaxActive\":18,\"activeByClass\":{\"reserved\":6,\"bulk\":0},\"queuedByClass\":{\"reserved\":0,\"bulk\":0}},\"memory\":{\"heap_used_bytes\":113001800,\"heap_total_bytes\":118554624,\"heap_limit_bytes\":17381195776,\"heap_used_pct\":0.7,\"rss_bytes\":215638016,\"external_bytes\":7782974,\"runs_retained\":2309,\"run_replay_bytes\":79310},\"ts\":\"2026-08-29T00:20:30.333Z\"}" + }, + "runtimeContract": { + "status": 200, + "ok": true, + "body": { + "name": "cli-bridge", + "version": "0.2.0", + "scheme": "bridge//", + "capabilities": { + "profileMaterialization": "cli-bridge.profile-materialization.v2", + "usageCostProvenance": "cli-bridge.usage-cost.v1" + }, + "backends": [ + "claude-code", + "opencode", + "kimi-code", + "pi", + "passthrough" + ], + "endpoints": [ + "/health", + "/v1/models", + "/v1/chat/completions", + "/v1/sessions", + "/v1/capabilities", + "/v1/sessions/:id/turns", + "/v1/sessions/:id/input", + "/v1/sessions/:id/events", + "/v1/sessions/:id/status", + "/v1/sessions/:id/transcript", + "/v1/sessions/:id/steer", + "/v1/sessions/:id/cancel", + "/v1/sessions/:id/detach", + "/v1/sessions/:id/close", + "/v1/runs/:id", + "/v1/runs/:id/events", + "/v1/runs/:id/cancel", + "/v1/runs/:runId/interactions/:interactionId/respond", + "/cad/render", + "/images/generate" + ] + }, + "text": "{\"name\":\"cli-bridge\",\"version\":\"0.2.0\",\"scheme\":\"bridge//\",\"capabilities\":{\"profileMaterialization\":\"cli-bridge.profile-materialization.v2\",\"usageCostProvenance\":\"cli-bridge.usage-cost.v1\"},\"backends\":[\"claude-code\",\"opencode\",\"kimi-code\",\"pi\",\"passthrough\"],\"endpoints\":[\"/health\",\"/v1/models\",\"/v1/chat/completions\",\"/v1/sessions\",\"/v1/capabilities\",\"/v1/sessions/:id/turns\",\"/v1/sessions/:id/input\",\"/v1/sessions/:id/events\",\"/v1/sessions/:id/status\",\"/v1/sessions/:id/transcript\",\"/v1/sessions/:id/steer\",\"/v1/sessions/:id/cancel\",\"/v1/sessions/:id/detach\",\"/v1/sessions/:id/close\",\"/v1/runs/:id\",\"/v1/runs/:id/events\",\"/v1/runs/:id/cancel\",\"/v1/runs/:runId/interactions/:interactionId/respond\",\"/cad/render\",\"/images/generate\"]}" + }, + "models": { + "status": 200, + "ok": true, + "body": { + "object": "list", + "data": [ + { + "id": "claude-code/sonnet", + "object": "model", + "backend": "claude-code" + }, + { + "id": "claude-code/opus", + "object": "model", + "backend": "claude-code" + }, + { + "id": "claude-code/haiku", + "object": "model", + "backend": "claude-code" + }, + { + "id": "opencode/deepseek/deepseek-v4-flash", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/deepseek/deepseek-v4-flash-vision-exp", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/deepseek/deepseek-v4-pro", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/kimi-for-coding/k3", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/kimi-for-coding/k3-256k", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/kimi-for-coding/kimi-for-coding", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/kimi-for-coding/kimi-for-coding-highspeed", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-4.7", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5-turbo", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.2", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.2-highspeed", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.3", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.3-flash", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.3-highspeed", + "object": "model", + "backend": "opencode" + }, + { + "id": "kimi-code/kimi-for-coding", + "object": "model", + "backend": "kimi-code" + }, + { + "id": "kimi-code/kimi-k2.6", + "object": "model", + "backend": "kimi-code" + }, + { + "id": "pi/deepseek/deepseek-v4-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/deepseek/deepseek-v4-pro", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/kimi-for-coding-oauth/kimi-for-coding", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/moonshot/kimi-k2-thinking", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/moonshot/kimi-k2.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.3-codex-spark", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.4", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.4-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.6-luna", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.6-sol", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.6-terra", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/claude-haiku-4-5-20251001", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/claude-opus-4-6", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/claude-sonnet-4-6", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/deepseek-v4-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/deepseek-v4-pro", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/deepseek/deepseek-chat", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/fireworks/deepseek-v4-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gemini-2.5-flash-lite", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gemini-3-pro-preview", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/glm-5.2", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-4o-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-5-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-5.4", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-5.4-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/groq/llama-3.1-8b-instant", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/moonshotai/kimi-k2.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/openai/gpt-5.6-luna", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/openrouter/auto", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5-code", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5-turbo", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5.1", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-air", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-airx", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-x", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.6", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.7", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.7-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.7-flashx", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5-code", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5-turbo", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5.1", + "object": "model", + "backend": "pi" + } + ] + }, + "text": "{\"object\":\"list\",\"data\":[{\"id\":\"claude-code/sonnet\",\"object\":\"model\",\"backend\":\"claude-code\"},{\"id\":\"claude-code/opus\",\"object\":\"model\",\"backend\":\"claude-code\"},{\"id\":\"claude-code/haiku\",\"object\":\"model\",\"backend\":\"claude-code\"},{\"id\":\"opencode/deepseek/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/deepseek/deepseek-v4-flash-vision-exp\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/deepseek/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/k3\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/k3-256k\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/kimi-for-coding\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/kimi-for-coding-highspeed\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-4.7\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5-turbo\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.2\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.2-highspeed\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.3\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.3-flash\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.3-highspeed\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"kimi-code/kimi-for-coding\",\"object\":\"model\",\"backend\":\"kimi-code\"},{\"id\":\"kimi-code/kimi-k2.6\",\"object\":\"model\",\"backend\":\"kimi-code\"},{\"id\":\"pi/deepseek/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/deepseek/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/kimi-for-coding-oauth/kimi-for-coding\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/moonshot/kimi-k2-thinking\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/moonshot/kimi-k2.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.3-codex-spark\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.4\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.4-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-luna\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-sol\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-terra\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-haiku-4-5-20251001\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-opus-4-6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-sonnet-4-6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek/deepseek-chat\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/fireworks/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gemini-2.5-flash-lite\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gemini-3-pro-preview\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/glm-5.2\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-4o-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5.4\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5.4-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/groq/llama-3.1-8b-instant\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/moonshotai/kimi-k2.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/openai/gpt-5.6-luna\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/openrouter/auto\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5-code\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5-turbo\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5.1\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-air\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-airx\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-x\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7-flashx\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5-code\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5-turbo\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5.1\",\"object\":\"model\",\"backend\":\"pi\"}]}" + }, + "requiredHealth": { + "status": 200, + "ok": true, + "body": { + "status": "ok", + "cached_verdicts": true, + "oldest_probed_at": "2026-08-29T00:20:30.167Z", + "backends": [ + { + "name": "claude-code", + "state": "ready", + "version": "2.1.248 (Claude Code)", + "probed_at": "2026-08-29T00:20:30.167Z", + "cached": true + }, + { + "name": "opencode", + "state": "ready", + "version": "1.18.18", + "probed_at": "2026-08-29T00:20:30.167Z", + "cached": true + }, + { + "name": "kimi-code", + "state": "ready", + "version": "0.36.1", + "probed_at": "2026-08-29T00:20:30.167Z", + "cached": true + }, + { + "name": "pi", + "state": "ready", + "version": "0.83.0", + "probed_at": "2026-08-29T00:20:30.167Z", + "cached": true + }, + { + "name": "passthrough", + "state": "unavailable", + "detail": "no provider keys configured", + "probed_at": "2026-08-29T00:20:44.756Z", + "cached": false + } + ], + "admission": { + "active": 6, + "live": 6, + "stale": 0, + "unbound": 0, + "oldestHeldMs": 15638273, + "reclaimed": 8, + "queued": 0, + "maxActive": 20, + "maxQueue": 48, + "reservedActive": 2, + "bulkMaxActive": 18, + "activeByClass": { + "reserved": 6, + "bulk": 0 + }, + "queuedByClass": { + "reserved": 0, + "bulk": 0 + } + }, + "memory": { + "heap_used_bytes": 112990056, + "heap_total_bytes": 118554624, + "heap_limit_bytes": 17381195776, + "heap_used_pct": 0.7, + "rss_bytes": 215638016, + "external_bytes": 7490048, + "runs_retained": 2310, + "run_replay_bytes": 46057 + }, + "ts": "2026-08-29T00:20:44.756Z" + }, + "text": "{\"status\":\"ok\",\"cached_verdicts\":true,\"oldest_probed_at\":\"2026-08-29T00:20:30.167Z\",\"backends\":[{\"name\":\"claude-code\",\"state\":\"ready\",\"version\":\"2.1.248 (Claude Code)\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":true},{\"name\":\"opencode\",\"state\":\"ready\",\"version\":\"1.18.18\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":true},{\"name\":\"kimi-code\",\"state\":\"ready\",\"version\":\"0.36.1\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":true},{\"name\":\"pi\",\"state\":\"ready\",\"version\":\"0.83.0\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":true},{\"name\":\"passthrough\",\"state\":\"unavailable\",\"detail\":\"no provider keys configured\",\"probed_at\":\"2026-08-29T00:20:44.756Z\",\"cached\":false}],\"admission\":{\"active\":6,\"live\":6,\"stale\":0,\"unbound\":0,\"oldestHeldMs\":15638273,\"reclaimed\":8,\"queued\":0,\"maxActive\":20,\"maxQueue\":48,\"reservedActive\":2,\"bulkMaxActive\":18,\"activeByClass\":{\"reserved\":6,\"bulk\":0},\"queuedByClass\":{\"reserved\":0,\"bulk\":0}},\"memory\":{\"heap_used_bytes\":112990056,\"heap_total_bytes\":118554624,\"heap_limit_bytes\":17381195776,\"heap_used_pct\":0.7,\"rss_bytes\":215638016,\"external_bytes\":7490048,\"runs_retained\":2310,\"run_replay_bytes\":46057},\"ts\":\"2026-08-29T00:20:44.756Z\"}" + }, + "advertisedModels": [ + "claude-code/sonnet", + "claude-code/opus", + "claude-code/haiku", + "opencode/deepseek/deepseek-v4-flash", + "opencode/deepseek/deepseek-v4-flash-vision-exp", + "opencode/deepseek/deepseek-v4-pro", + "opencode/kimi-for-coding/k3", + "opencode/kimi-for-coding/k3-256k", + "opencode/kimi-for-coding/kimi-for-coding", + "opencode/kimi-for-coding/kimi-for-coding-highspeed", + "opencode/zai-coding-plan/glm-4.7", + "opencode/zai-coding-plan/glm-5-turbo", + "opencode/zai-coding-plan/glm-5.2", + "opencode/zai-coding-plan/glm-5.2-highspeed", + "opencode/zai-coding-plan/glm-5.3", + "opencode/zai-coding-plan/glm-5.3-flash", + "opencode/zai-coding-plan/glm-5.3-highspeed", + "kimi-code/kimi-for-coding", + "kimi-code/kimi-k2.6", + "pi/deepseek/deepseek-v4-flash", + "pi/deepseek/deepseek-v4-pro", + "pi/kimi-for-coding-oauth/kimi-for-coding", + "pi/moonshot/kimi-k2-thinking", + "pi/moonshot/kimi-k2.5", + "pi/openai-codex/gpt-5.3-codex-spark", + "pi/openai-codex/gpt-5.4", + "pi/openai-codex/gpt-5.4-mini", + "pi/openai-codex/gpt-5.5", + "pi/openai-codex/gpt-5.6-luna", + "pi/openai-codex/gpt-5.6-sol", + "pi/openai-codex/gpt-5.6-terra", + "pi/tangle-router/claude-haiku-4-5-20251001", + "pi/tangle-router/claude-opus-4-6", + "pi/tangle-router/claude-sonnet-4-6", + "pi/tangle-router/deepseek-v4-flash", + "pi/tangle-router/deepseek-v4-pro", + "pi/tangle-router/deepseek/deepseek-chat", + "pi/tangle-router/fireworks/deepseek-v4-flash", + "pi/tangle-router/gemini-2.5-flash-lite", + "pi/tangle-router/gemini-3-pro-preview", + "pi/tangle-router/glm-5.2", + "pi/tangle-router/gpt-4o-mini", + "pi/tangle-router/gpt-5-mini", + "pi/tangle-router/gpt-5.4", + "pi/tangle-router/gpt-5.4-mini", + "pi/tangle-router/groq/llama-3.1-8b-instant", + "pi/tangle-router/moonshotai/kimi-k2.5", + "pi/tangle-router/openai/gpt-5.6-luna", + "pi/tangle-router/openrouter/auto", + "pi/zai-coding-paas/glm-5", + "pi/zai-coding-paas/glm-5-code", + "pi/zai-coding-paas/glm-5-turbo", + "pi/zai-coding-paas/glm-5.1", + "pi/zai-glm/glm-4.5", + "pi/zai-glm/glm-4.5-air", + "pi/zai-glm/glm-4.5-airx", + "pi/zai-glm/glm-4.5-flash", + "pi/zai-glm/glm-4.5-x", + "pi/zai-glm/glm-4.6", + "pi/zai-glm/glm-4.7", + "pi/zai-glm/glm-4.7-flash", + "pi/zai-glm/glm-4.7-flashx", + "pi/zai-glm/glm-5", + "pi/zai-glm/glm-5-code", + "pi/zai-glm/glm-5-turbo", + "pi/zai-glm/glm-5.1" + ], + "missingTargets": [], + "selectedTargets": [ + { + "key": "claude-code-sonnet", + "label": "claude-code sonnet", + "modelId": "claude-code/sonnet" + }, + { + "key": "glm-5.2", + "label": "GLM 5.2", + "modelId": "opencode/zai-coding-plan/glm-5.2" + }, + { + "key": "kimi-code-kimi-for-coding", + "label": "kimi-code kimi-for-coding", + "modelId": "kimi-code/kimi-for-coding" + }, + { + "key": "pi-deepseek-deepseek-v4-flash", + "label": "pi deepseek/deepseek-v4-flash", + "modelId": "pi/deepseek/deepseek-v4-flash" + } + ] + }, + "selectedTargets": [ + { + "key": "claude-code-sonnet", + "label": "claude-code sonnet", + "modelId": "claude-code/sonnet" + }, + { + "key": "glm-5.2", + "label": "GLM 5.2", + "modelId": "opencode/zai-coding-plan/glm-5.2" + }, + { + "key": "kimi-code-kimi-for-coding", + "label": "kimi-code kimi-for-coding", + "modelId": "kimi-code/kimi-for-coding" + }, + { + "key": "pi-deepseek-deepseek-v4-flash", + "label": "pi deepseek/deepseek-v4-flash", + "modelId": "pi/deepseek/deepseek-v4-flash" + } + ], + "temp": { + "packRoot": "/tmp/braid-live-pack-eV8ASJ", + "installRoot": "/tmp/braid-live-install-bKXPm2" + }, + "build": { + "command": "pnpm", + "args": [ + "run", + "build" + ], + "code": 0, + "signal": null, + "stdout": "", + "stderr": "\u001b[2m$ node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/build-startup.mjs\u001b[22m\n", + "durationMs": 1635, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "packCommand": { + "command": "pnpm", + "args": [ + "pack", + "--pack-destination", + "/tmp/braid-live-pack-eV8ASJ" + ], + "code": 0, + "signal": null, + "stdout": "package: @tangle-network/braid@0.3.0\n\u001b[94mTarball Contents\u001b[39m\ndist/adapters/agent-interface/harness-runtime.d.ts\ndist/adapters/agent-interface/harness-runtime.d.ts.map\ndist/adapters/agent-interface/harness-runtime.js\ndist/adapters/agent-interface/harness-runtime.js.map\ndist/adapters/agent-interface/interaction-runtime.d.ts\ndist/adapters/agent-interface/interaction-runtime.d.ts.map\ndist/adapters/agent-interface/interaction-runtime.js\ndist/adapters/agent-interface/interaction-runtime.js.map\ndist/adapters/agent-interface/module-url.d.ts\ndist/adapters/agent-interface/module-url.d.ts.map\ndist/adapters/agent-interface/module-url.js\ndist/adapters/agent-interface/module-url.js.map\ndist/adapters/agent-interface/profile-runtime.d.ts\ndist/adapters/agent-interface/profile-runtime.d.ts.map\ndist/adapters/agent-interface/profile-runtime.js\ndist/adapters/agent-interface/profile-runtime.js.map\ndist/adapters/analysis/agent-eval-version.d.ts\ndist/adapters/analysis/agent-eval-version.d.ts.map\ndist/adapters/analysis/agent-eval-version.js\ndist/adapters/analysis/agent-eval-version.js.map\ndist/adapters/analysis/citations.d.ts\ndist/adapters/analysis/citations.d.ts.map\ndist/adapters/analysis/citations.js\ndist/adapters/analysis/citations.js.map\ndist/adapters/analysis/eval-analyst.d.ts\ndist/adapters/analysis/eval-analyst.d.ts.map\ndist/adapters/analysis/eval-analyst.js\ndist/adapters/analysis/eval-analyst.js.map\ndist/adapters/analysis/managed-analysis-runtime.d.ts\ndist/adapters/analysis/managed-analysis-runtime.d.ts.map\ndist/adapters/analysis/managed-analysis-runtime.js\ndist/adapters/analysis/managed-analysis-runtime.js.map\ndist/adapters/analysis/model-execution-scope.d.ts\ndist/adapters/analysis/model-execution-scope.d.ts.map\ndist/adapters/analysis/model-execution-scope.js\ndist/adapters/analysis/model-execution-scope.js.map\ndist/adapters/analysis/production-analysis-analyst.d.ts\ndist/adapters/analysis/production-analysis-analyst.d.ts.map\ndist/adapters/analysis/production-analysis-analyst.js\ndist/adapters/analysis/production-analysis-analyst.js.map\ndist/adapters/analysis/python-runner.d.ts\ndist/adapters/analysis/python-runner.d.ts.map\ndist/adapters/analysis/python-runner.js\ndist/adapters/analysis/python-runner.js.map\ndist/adapters/analysis/question-analyst.d.ts\ndist/adapters/analysis/question-analyst.d.ts.map\ndist/adapters/analysis/question-analyst.js\ndist/adapters/analysis/question-analyst.js.map\ndist/adapters/analysis/runtime-model-owner.d.ts\ndist/adapters/analysis/runtime-model-owner.d.ts.map\ndist/adapters/analysis/runtime-model-owner.js\ndist/adapters/analysis/runtime-model-owner.js.map\ndist/adapters/analysis/runtime-retained-model-call.d.ts\ndist/adapters/analysis/runtime-retained-model-call.d.ts.map\ndist/adapters/analysis/runtime-retained-model-call.js\ndist/adapters/analysis/runtime-retained-model-call.js.map\ndist/adapters/analysis/trace-analysis-adapter.d.ts\ndist/adapters/analysis/trace-analysis-adapter.d.ts.map\ndist/adapters/analysis/trace-analysis-adapter.js\ndist/adapters/analysis/trace-analysis-adapter.js.map\ndist/adapters/analysis/trace-event-projection.d.ts\ndist/adapters/analysis/trace-event-projection.d.ts.map\ndist/adapters/analysis/trace-event-projection.js\ndist/adapters/analysis/trace-event-projection.js.map\ndist/adapters/analysis/trace-store.d.ts\ndist/adapters/analysis/trace-store.d.ts.map\ndist/adapters/analysis/trace-store.js\ndist/adapters/analysis/trace-store.js.map\ndist/adapters/connections/aws-nitro-root-g1.d.ts\ndist/adapters/connections/aws-nitro-root-g1.d.ts.map\ndist/adapters/connections/aws-nitro-root-g1.js\ndist/adapters/connections/aws-nitro-root-g1.js.map\ndist/adapters/connections/cli-bridge-health.d.ts\ndist/adapters/connections/cli-bridge-health.d.ts.map\ndist/adapters/connections/cli-bridge-health.js\ndist/adapters/connections/cli-bridge-health.js.map\ndist/adapters/connections/cli-bridge-model-route.d.ts\ndist/adapters/connections/cli-bridge-model-route.d.ts.map\ndist/adapters/connections/cli-bridge-model-route.js\ndist/adapters/connections/cli-bridge-model-route.js.map\ndist/adapters/connections/cli-bridge-model-validation.d.ts\ndist/adapters/connections/cli-bridge-model-validation.d.ts.map\ndist/adapters/connections/cli-bridge-model-validation.js\ndist/adapters/connections/cli-bridge-model-validation.js.map\ndist/adapters/connections/nitro-confidential-attestation.d.ts\ndist/adapters/connections/nitro-confidential-attestation.d.ts.map\ndist/adapters/connections/nitro-confidential-attestation.js\ndist/adapters/connections/nitro-confidential-attestation.js.map\ndist/adapters/connections/production-connection-credentials.d.ts\ndist/adapters/connections/production-connection-credentials.d.ts.map\ndist/adapters/connections/production-connection-credentials.js\ndist/adapters/connections/production-connection-credentials.js.map\ndist/adapters/connections/production-connection-endpoints.d.ts\ndist/adapters/connections/production-connection-endpoints.d.ts.map\ndist/adapters/connections/production-connection-endpoints.js\ndist/adapters/connections/production-connection-endpoints.js.map\ndist/adapters/connections/production-connection-health.d.ts\ndist/adapters/connections/production-connection-health.d.ts.map\ndist/adapters/connections/production-connection-health.js\ndist/adapters/connections/production-connection-health.js.map\ndist/adapters/connections/production-connection-providers.d.ts\ndist/adapters/connections/production-connection-providers.d.ts.map\ndist/adapters/connections/production-connection-providers.js\ndist/adapters/connections/production-connection-providers.js.map\ndist/adapters/connections/production-connection-types.d.ts\ndist/adapters/connections/production-connection-types.d.ts.map\ndist/adapters/connections/production-connection-types.js\ndist/adapters/connections/production-connection-types.js.map\ndist/adapters/connections/production-connections.d.ts\ndist/adapters/connections/production-connections.d.ts.map\ndist/adapters/connections/production-connections.js\ndist/adapters/connections/production-connections.js.map\ndist/adapters/connections/tangle-retained-control-lookup.d.ts\ndist/adapters/connections/tangle-retained-control-lookup.d.ts.map\ndist/adapters/connections/tangle-retained-control-lookup.js\ndist/adapters/connections/tangle-retained-control-lookup.js.map\ndist/adapters/credentials/headless-key.d.ts\ndist/adapters/credentials/headless-key.d.ts.map\ndist/adapters/credentials/headless-key.js\ndist/adapters/credentials/headless-key.js.map\ndist/adapters/credentials/headless-store.d.ts\ndist/adapters/credentials/headless-store.d.ts.map\ndist/adapters/credentials/headless-store.js\ndist/adapters/credentials/headless-store.js.map\ndist/adapters/credentials/memory.d.ts\ndist/adapters/credentials/memory.d.ts.map\ndist/adapters/credentials/memory.js\ndist/adapters/credentials/memory.js.map\ndist/adapters/credentials/os.d.ts\ndist/adapters/credentials/os.d.ts.map\ndist/adapters/credentials/os.js\ndist/adapters/credentials/os.js.map\ndist/adapters/persistence/posix-at.d.ts\ndist/adapters/persistence/posix-at.d.ts.map\ndist/adapters/persistence/posix-at.js\ndist/adapters/persistence/posix-at.js.map\ndist/adapters/persistence/safe-file-descriptor.d.ts\ndist/adapters/persistence/safe-file-descriptor.d.ts.map\ndist/adapters/persistence/safe-file-descriptor.js\ndist/adapters/persistence/safe-file-descriptor.js.map\ndist/adapters/persistence/safe-file-io.d.ts\ndist/adapters/persistence/safe-file-io.d.ts.map\ndist/adapters/persistence/safe-file-io.js\ndist/adapters/persistence/safe-file-io.js.map\ndist/adapters/persistence/safe-file.d.ts\ndist/adapters/persistence/safe-file.d.ts.map\ndist/adapters/persistence/safe-file.js\ndist/adapters/persistence/safe-file.js.map\ndist/adapters/runtime/agent-runtime-execution.d.ts\ndist/adapters/runtime/agent-runtime-execution.d.ts.map\ndist/adapters/runtime/agent-runtime-execution.js\ndist/adapters/runtime/agent-runtime-execution.js.map\ndist/adapters/runtime/agent-runtime-version.d.ts\ndist/adapters/runtime/agent-runtime-version.d.ts.map\ndist/adapters/runtime/agent-runtime-version.js\ndist/adapters/runtime/agent-runtime-version.js.map\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-execution.js\ndist/adapters/runtime/cli-bridge-retained-execution.js.map\ndist/adapters/runtime/cli-bridge-retained-run.d.ts\ndist/adapters/runtime/cli-bridge-retained-run.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-run.js\ndist/adapters/runtime/cli-bridge-retained-run.js.map\ndist/adapters/runtime/execution-observation-source.d.ts\ndist/adapters/runtime/execution-observation-source.d.ts.map\ndist/adapters/runtime/execution-observation-source.js\ndist/adapters/runtime/execution-observation-source.js.map\ndist/adapters/runtime/lazy-execution.d.ts\ndist/adapters/runtime/lazy-execution.d.ts.map\ndist/adapters/runtime/lazy-execution.js\ndist/adapters/runtime/lazy-execution.js.map\ndist/adapters/runtime/mode-routing-execution.d.ts\ndist/adapters/runtime/mode-routing-execution.d.ts.map\ndist/adapters/runtime/mode-routing-execution.js\ndist/adapters/runtime/mode-routing-execution.js.map\ndist/adapters/runtime/native-interactive-run-broker.d.ts\ndist/adapters/runtime/native-interactive-run-broker.d.ts.map\ndist/adapters/runtime/native-interactive-run-broker.js\ndist/adapters/runtime/native-interactive-run-broker.js.map\ndist/adapters/runtime/prepared-execution.d.ts\ndist/adapters/runtime/prepared-execution.d.ts.map\ndist/adapters/runtime/prepared-execution.js\ndist/adapters/runtime/prepared-execution.js.map\ndist/adapters/runtime/production-backend-common.d.ts\ndist/adapters/runtime/production-backend-common.d.ts.map\ndist/adapters/runtime/production-backend-common.js\ndist/adapters/runtime/production-backend-common.js.map\ndist/adapters/runtime/production-backend-resolver.d.ts\ndist/adapters/runtime/production-backend-resolver.d.ts.map\ndist/adapters/runtime/production-backend-resolver.js\ndist/adapters/runtime/production-backend-resolver.js.map\ndist/adapters/runtime/production-cli-bridge-backend.d.ts\ndist/adapters/runtime/production-cli-bridge-backend.d.ts.map\ndist/adapters/runtime/production-cli-bridge-backend.js\ndist/adapters/runtime/production-cli-bridge-backend.js.map\ndist/adapters/runtime/production-tangle-inference-backend.d.ts\ndist/adapters/runtime/production-tangle-inference-backend.d.ts.map\ndist/adapters/runtime/production-tangle-inference-backend.js\ndist/adapters/runtime/production-tangle-inference-backend.js.map\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts.map\ndist/adapters/runtime/production-tangle-sandbox-backend.js\ndist/adapters/runtime/production-tangle-sandbox-backend.js.map\ndist/adapters/runtime/retained-execution-contract.d.ts\ndist/adapters/runtime/retained-execution-contract.d.ts.map\ndist/adapters/runtime/retained-execution-contract.js\ndist/adapters/runtime/retained-execution-contract.js.map\ndist/adapters/runtime/retained-execution-projection.d.ts\ndist/adapters/runtime/retained-execution-projection.d.ts.map\ndist/adapters/runtime/retained-execution-projection.js\ndist/adapters/runtime/retained-execution-projection.js.map\ndist/adapters/runtime/retained-execution-state.d.ts\ndist/adapters/runtime/retained-execution-state.d.ts.map\ndist/adapters/runtime/retained-execution-state.js\ndist/adapters/runtime/retained-execution-state.js.map\ndist/adapters/runtime/retained-execution-stream.d.ts\ndist/adapters/runtime/retained-execution-stream.d.ts.map\ndist/adapters/runtime/retained-execution-stream.js\ndist/adapters/runtime/retained-execution-stream.js.map\ndist/adapters/runtime/retained-execution.d.ts\ndist/adapters/runtime/retained-execution.d.ts.map\ndist/adapters/runtime/retained-execution.js\ndist/adapters/runtime/retained-execution.js.map\ndist/adapters/runtime/retained-native-continuation.d.ts\ndist/adapters/runtime/retained-native-continuation.d.ts.map\ndist/adapters/runtime/retained-native-continuation.js\ndist/adapters/runtime/retained-native-continuation.js.map\ndist/adapters/runtime/sandbox-account-observation.d.ts\ndist/adapters/runtime/sandbox-account-observation.d.ts.map\ndist/adapters/runtime/sandbox-account-observation.js\ndist/adapters/runtime/sandbox-account-observation.js.map\ndist/adapters/runtime/sandbox-instance-observation.d.ts\ndist/adapters/runtime/sandbox-instance-observation.d.ts.map\ndist/adapters/runtime/sandbox-instance-observation.js\ndist/adapters/runtime/sandbox-instance-observation.js.map\ndist/adapters/runtime/sandbox-observation-types.d.ts\ndist/adapters/runtime/sandbox-observation-types.d.ts.map\ndist/adapters/runtime/sandbox-observation-types.js\ndist/adapters/runtime/sandbox-observation-types.js.map\ndist/adapters/runtime/sandbox-observation.d.ts\ndist/adapters/runtime/sandbox-observation.d.ts.map\ndist/adapters/runtime/sandbox-observation.js\ndist/adapters/runtime/sandbox-observation.js.map\ndist/adapters/runtime/supervisor-control.d.ts\ndist/adapters/runtime/supervisor-control.d.ts.map\ndist/adapters/runtime/supervisor-control.js\ndist/adapters/runtime/supervisor-control.js.map\ndist/adapters/runtime/supervisor-watch.d.ts\ndist/adapters/runtime/supervisor-watch.d.ts.map\ndist/adapters/runtime/supervisor-watch.js\ndist/adapters/runtime/supervisor-watch.js.map\ndist/adapters/runtime/tangle-retained-execution.d.ts\ndist/adapters/runtime/tangle-retained-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-execution.js\ndist/adapters/runtime/tangle-retained-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-contract.js\ndist/adapters/runtime/tangle-retained-interactive-contract.js.map\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-execution.js\ndist/adapters/runtime/tangle-retained-interactive-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-projection.js\ndist/adapters/runtime/tangle-retained-interactive-projection.js.map\ndist/adapters/runtime/tangle-retained-run.d.ts\ndist/adapters/runtime/tangle-retained-run.d.ts.map\ndist/adapters/runtime/tangle-retained-run.js\ndist/adapters/runtime/tangle-retained-run.js.map\ndist/adapters/runtime/tangle-sandbox-retention.d.ts\ndist/adapters/runtime/tangle-sandbox-retention.d.ts.map\ndist/adapters/runtime/tangle-sandbox-retention.js\ndist/adapters/runtime/tangle-sandbox-retention.js.map\ndist/adapters/runtime/unavailable-execution.d.ts\ndist/adapters/runtime/unavailable-execution.d.ts.map\ndist/adapters/runtime/unavailable-execution.js\ndist/adapters/runtime/unavailable-execution.js.map\ndist/adapters/storage/memory-base.d.ts\ndist/adapters/storage/memory-base.d.ts.map\ndist/adapters/storage/memory-base.js\ndist/adapters/storage/memory-base.js.map\ndist/adapters/storage/memory-effects.d.ts\ndist/adapters/storage/memory-effects.d.ts.map\ndist/adapters/storage/memory-effects.js\ndist/adapters/storage/memory-effects.js.map\ndist/adapters/storage/memory-journal.d.ts\ndist/adapters/storage/memory-journal.d.ts.map\ndist/adapters/storage/memory-journal.js\ndist/adapters/storage/memory-journal.js.map\ndist/adapters/storage/memory-maintenance.d.ts\ndist/adapters/storage/memory-maintenance.d.ts.map\ndist/adapters/storage/memory-maintenance.js\ndist/adapters/storage/memory-maintenance.js.map\ndist/adapters/storage/memory-operations.d.ts\ndist/adapters/storage/memory-operations.d.ts.map\ndist/adapters/storage/memory-operations.js\ndist/adapters/storage/memory-operations.js.map\ndist/adapters/storage/memory-retention.d.ts\ndist/adapters/storage/memory-retention.d.ts.map\ndist/adapters/storage/memory-retention.js\ndist/adapters/storage/memory-retention.js.map\ndist/adapters/storage/memory.d.ts\ndist/adapters/storage/memory.d.ts.map\ndist/adapters/storage/memory.js\ndist/adapters/storage/memory.js.map\ndist/adapters/storage/sqlite-base.d.ts\ndist/adapters/storage/sqlite-base.d.ts.map\ndist/adapters/storage/sqlite-base.js\ndist/adapters/storage/sqlite-base.js.map\ndist/adapters/storage/sqlite-bound-open.d.ts\ndist/adapters/storage/sqlite-bound-open.d.ts.map\ndist/adapters/storage/sqlite-bound-open.js\ndist/adapters/storage/sqlite-bound-open.js.map\ndist/adapters/storage/sqlite-content.d.ts\ndist/adapters/storage/sqlite-content.d.ts.map\ndist/adapters/storage/sqlite-content.js\ndist/adapters/storage/sqlite-content.js.map\ndist/adapters/storage/sqlite-crypto.d.ts\ndist/adapters/storage/sqlite-crypto.d.ts.map\ndist/adapters/storage/sqlite-crypto.js\ndist/adapters/storage/sqlite-crypto.js.map\ndist/adapters/storage/sqlite-driver.d.ts\ndist/adapters/storage/sqlite-driver.d.ts.map\ndist/adapters/storage/sqlite-driver.js\ndist/adapters/storage/sqlite-driver.js.map\ndist/adapters/storage/sqlite-effects.d.ts\ndist/adapters/storage/sqlite-effects.d.ts.map\ndist/adapters/storage/sqlite-effects.js\ndist/adapters/storage/sqlite-effects.js.map\ndist/adapters/storage/sqlite-errors.d.ts\ndist/adapters/storage/sqlite-errors.d.ts.map\ndist/adapters/storage/sqlite-errors.js\ndist/adapters/storage/sqlite-errors.js.map\ndist/adapters/storage/sqlite-initialization.d.ts\ndist/adapters/storage/sqlite-initialization.d.ts.map\ndist/adapters/storage/sqlite-initialization.js\ndist/adapters/storage/sqlite-initialization.js.map\ndist/adapters/storage/sqlite-journal.d.ts\ndist/adapters/storage/sqlite-journal.d.ts.map\ndist/adapters/storage/sqlite-journal.js\ndist/adapters/storage/sqlite-journal.js.map\ndist/adapters/storage/sqlite-lifecycle.d.ts\ndist/adapters/storage/sqlite-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-lifecycle.js\ndist/adapters/storage/sqlite-lifecycle.js.map\ndist/adapters/storage/sqlite-maintenance.d.ts\ndist/adapters/storage/sqlite-maintenance.d.ts.map\ndist/adapters/storage/sqlite-maintenance.js\ndist/adapters/storage/sqlite-maintenance.js.map\ndist/adapters/storage/sqlite-operations.d.ts\ndist/adapters/storage/sqlite-operations.d.ts.map\ndist/adapters/storage/sqlite-operations.js\ndist/adapters/storage/sqlite-operations.js.map\ndist/adapters/storage/sqlite-paths.d.ts\ndist/adapters/storage/sqlite-paths.d.ts.map\ndist/adapters/storage/sqlite-paths.js\ndist/adapters/storage/sqlite-paths.js.map\ndist/adapters/storage/sqlite-projection.d.ts\ndist/adapters/storage/sqlite-projection.d.ts.map\ndist/adapters/storage/sqlite-projection.js\ndist/adapters/storage/sqlite-projection.js.map\ndist/adapters/storage/sqlite-queue.d.ts\ndist/adapters/storage/sqlite-queue.d.ts.map\ndist/adapters/storage/sqlite-queue.js\ndist/adapters/storage/sqlite-queue.js.map\ndist/adapters/storage/sqlite-recovery.d.ts\ndist/adapters/storage/sqlite-recovery.d.ts.map\ndist/adapters/storage/sqlite-recovery.js\ndist/adapters/storage/sqlite-recovery.js.map\ndist/adapters/storage/sqlite-redaction.d.ts\ndist/adapters/storage/sqlite-redaction.d.ts.map\ndist/adapters/storage/sqlite-redaction.js\ndist/adapters/storage/sqlite-redaction.js.map\ndist/adapters/storage/sqlite-rows.d.ts\ndist/adapters/storage/sqlite-rows.d.ts.map\ndist/adapters/storage/sqlite-rows.js\ndist/adapters/storage/sqlite-rows.js.map\ndist/adapters/storage/sqlite-schema.d.ts\ndist/adapters/storage/sqlite-schema.d.ts.map\ndist/adapters/storage/sqlite-schema.js\ndist/adapters/storage/sqlite-schema.js.map\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-codec.js\ndist/adapters/storage/sqlite-state-snapshot-codec.js.map\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-keys.js\ndist/adapters/storage/sqlite-state-snapshot-keys.js.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js.map\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-read.js\ndist/adapters/storage/sqlite-state-snapshot-read.js.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.js\ndist/adapters/storage/sqlite-state-snapshot-transaction.js.map\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-types.js\ndist/adapters/storage/sqlite-state-snapshot-types.js.map\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-write.js\ndist/adapters/storage/sqlite-state-snapshot-write.js.map\ndist/adapters/storage/sqlite-state-snapshots.d.ts\ndist/adapters/storage/sqlite-state-snapshots.d.ts.map\ndist/adapters/storage/sqlite-state-snapshots.js\ndist/adapters/storage/sqlite-state-snapshots.js.map\ndist/adapters/storage/sqlite-types.d.ts\ndist/adapters/storage/sqlite-types.d.ts.map\ndist/adapters/storage/sqlite-types.js\ndist/adapters/storage/sqlite-types.js.map\ndist/adapters/storage/sqlite.d.ts\ndist/adapters/storage/sqlite.d.ts.map\ndist/adapters/storage/sqlite.js\ndist/adapters/storage/sqlite.js.map\ndist/adapters/storage/storage-validation.d.ts\ndist/adapters/storage/storage-validation.d.ts.map\ndist/adapters/storage/storage-validation.js\ndist/adapters/storage/storage-validation.js.map\ndist/adapters/tui/alternate-screen-terminal.d.ts\ndist/adapters/tui/alternate-screen-terminal.d.ts.map\ndist/adapters/tui/alternate-screen-terminal.js\ndist/adapters/tui/alternate-screen-terminal.js.map\ndist/adapters/tui/application-ui-controller.d.ts\ndist/adapters/tui/application-ui-controller.d.ts.map\ndist/adapters/tui/application-ui-controller.js\ndist/adapters/tui/application-ui-controller.js.map\ndist/adapters/tui/native-terminal-transport.d.ts\ndist/adapters/tui/native-terminal-transport.d.ts.map\ndist/adapters/tui/native-terminal-transport.js\ndist/adapters/tui/native-terminal-transport.js.map\ndist/adapters/tui/profile-connection-dispatch.d.ts\ndist/adapters/tui/profile-connection-dispatch.d.ts.map\ndist/adapters/tui/profile-connection-dispatch.js\ndist/adapters/tui/profile-connection-dispatch.js.map\ndist/adapters/tui/ui-automation-command.d.ts\ndist/adapters/tui/ui-automation-command.d.ts.map\ndist/adapters/tui/ui-automation-command.js\ndist/adapters/tui/ui-automation-command.js.map\ndist/adapters/tui/ui-automation-dispatch.d.ts\ndist/adapters/tui/ui-automation-dispatch.d.ts.map\ndist/adapters/tui/ui-automation-dispatch.js\ndist/adapters/tui/ui-automation-dispatch.js.map\ndist/adapters/tui/ui-capabilities.d.ts\ndist/adapters/tui/ui-capabilities.d.ts.map\ndist/adapters/tui/ui-capabilities.js\ndist/adapters/tui/ui-capabilities.js.map\ndist/adapters/tui/ui-command-dispatch.d.ts\ndist/adapters/tui/ui-command-dispatch.d.ts.map\ndist/adapters/tui/ui-command-dispatch.js\ndist/adapters/tui/ui-command-dispatch.js.map\ndist/adapters/tui/ui-conversation-dispatch.d.ts\ndist/adapters/tui/ui-conversation-dispatch.d.ts.map\ndist/adapters/tui/ui-conversation-dispatch.js\ndist/adapters/tui/ui-conversation-dispatch.js.map\ndist/adapters/tui/ui-core-dispatch.d.ts\ndist/adapters/tui/ui-core-dispatch.d.ts.map\ndist/adapters/tui/ui-core-dispatch.js\ndist/adapters/tui/ui-core-dispatch.js.map\ndist/adapters/tui/ui-dispatch-context.d.ts\ndist/adapters/tui/ui-dispatch-context.d.ts.map\ndist/adapters/tui/ui-dispatch-context.js\ndist/adapters/tui/ui-dispatch-context.js.map\ndist/adapters/tui/ui-dispatch-error.d.ts\ndist/adapters/tui/ui-dispatch-error.d.ts.map\ndist/adapters/tui/ui-dispatch-error.js\ndist/adapters/tui/ui-dispatch-error.js.map\ndist/adapters/tui/ui-dispatch.d.ts\ndist/adapters/tui/ui-dispatch.d.ts.map\ndist/adapters/tui/ui-dispatch.js\ndist/adapters/tui/ui-dispatch.js.map\ndist/adapters/tui/ui-entity-details.d.ts\ndist/adapters/tui/ui-entity-details.d.ts.map\ndist/adapters/tui/ui-entity-details.js\ndist/adapters/tui/ui-entity-details.js.map\ndist/adapters/tui/ui-fixtures.d.ts\ndist/adapters/tui/ui-fixtures.d.ts.map\ndist/adapters/tui/ui-fixtures.js\ndist/adapters/tui/ui-fixtures.js.map\ndist/adapters/tui/ui-headless-dispatch.d.ts\ndist/adapters/tui/ui-headless-dispatch.d.ts.map\ndist/adapters/tui/ui-headless-dispatch.js\ndist/adapters/tui/ui-headless-dispatch.js.map\ndist/adapters/tui/ui-intelligence-dispatch.d.ts\ndist/adapters/tui/ui-intelligence-dispatch.d.ts.map\ndist/adapters/tui/ui-intelligence-dispatch.js\ndist/adapters/tui/ui-intelligence-dispatch.js.map\ndist/adapters/tui/ui-intelligence-fixtures.d.ts\ndist/adapters/tui/ui-intelligence-fixtures.d.ts.map\ndist/adapters/tui/ui-intelligence-fixtures.js\ndist/adapters/tui/ui-intelligence-fixtures.js.map\ndist/adapters/tui/ui-intelligence-result-view.d.ts\ndist/adapters/tui/ui-intelligence-result-view.d.ts.map\ndist/adapters/tui/ui-intelligence-result-view.js\ndist/adapters/tui/ui-intelligence-result-view.js.map\ndist/adapters/tui/ui-interaction-receipt.d.ts\ndist/adapters/tui/ui-interaction-receipt.d.ts.map\ndist/adapters/tui/ui-interaction-receipt.js\ndist/adapters/tui/ui-interaction-receipt.js.map\ndist/adapters/tui/ui-projection.d.ts\ndist/adapters/tui/ui-projection.d.ts.map\ndist/adapters/tui/ui-projection.js\ndist/adapters/tui/ui-projection.js.map\ndist/adapters/tui/ui-semantic-state.d.ts\ndist/adapters/tui/ui-semantic-state.d.ts.map\ndist/adapters/tui/ui-semantic-state.js\ndist/adapters/tui/ui-semantic-state.js.map\ndist/adapters/tui/ui-subscriber-delivery.d.ts\ndist/adapters/tui/ui-subscriber-delivery.d.ts.map\ndist/adapters/tui/ui-subscriber-delivery.js\ndist/adapters/tui/ui-subscriber-delivery.js.map\ndist/adapters/tui/ui-view-model.d.ts\ndist/adapters/tui/ui-view-model.d.ts.map\ndist/adapters/tui/ui-view-model.js\ndist/adapters/tui/ui-view-model.js.map\ndist/app/action-host.d.ts\ndist/app/action-host.d.ts.map\ndist/app/action-host.js\ndist/app/action-host.js.map\ndist/app/action-serialization.d.ts\ndist/app/action-serialization.d.ts.map\ndist/app/action-serialization.js\ndist/app/action-serialization.js.map\ndist/app/analysis-comparison-contracts.d.ts\ndist/app/analysis-comparison-contracts.d.ts.map\ndist/app/analysis-comparison-contracts.js\ndist/app/analysis-comparison-contracts.js.map\ndist/app/analysis-comparison-evidence.d.ts\ndist/app/analysis-comparison-evidence.d.ts.map\ndist/app/analysis-comparison-evidence.js\ndist/app/analysis-comparison-evidence.js.map\ndist/app/analysis-comparison-facts.d.ts\ndist/app/analysis-comparison-facts.d.ts.map\ndist/app/analysis-comparison-facts.js\ndist/app/analysis-comparison-facts.js.map\ndist/app/analysis-comparison-graph.d.ts\ndist/app/analysis-comparison-graph.d.ts.map\ndist/app/analysis-comparison-graph.js\ndist/app/analysis-comparison-graph.js.map\ndist/app/analysis-comparison-lifecycle.d.ts\ndist/app/analysis-comparison-lifecycle.d.ts.map\ndist/app/analysis-comparison-lifecycle.js\ndist/app/analysis-comparison-lifecycle.js.map\ndist/app/analysis-comparison-record.d.ts\ndist/app/analysis-comparison-record.d.ts.map\ndist/app/analysis-comparison-record.js\ndist/app/analysis-comparison-record.js.map\ndist/app/analysis-comparison-request.d.ts\ndist/app/analysis-comparison-request.d.ts.map\ndist/app/analysis-comparison-request.js\ndist/app/analysis-comparison-request.js.map\ndist/app/analysis-comparison.d.ts\ndist/app/analysis-comparison.d.ts.map\ndist/app/analysis-comparison.js\ndist/app/analysis-comparison.js.map\ndist/app/analysis-execution-session.d.ts\ndist/app/analysis-execution-session.d.ts.map\ndist/app/analysis-execution-session.js\ndist/app/analysis-execution-session.js.map\ndist/app/analysis-execution-target.d.ts\ndist/app/analysis-execution-target.d.ts.map\ndist/app/analysis-execution-target.js\ndist/app/analysis-execution-target.js.map\ndist/app/analysis-graph-projector.d.ts\ndist/app/analysis-graph-projector.d.ts.map\ndist/app/analysis-graph-projector.js\ndist/app/analysis-graph-projector.js.map\ndist/app/analysis-lifecycle.d.ts\ndist/app/analysis-lifecycle.d.ts.map\ndist/app/analysis-lifecycle.js\ndist/app/analysis-lifecycle.js.map\ndist/app/analysis-model-call-records.d.ts\ndist/app/analysis-model-call-records.d.ts.map\ndist/app/analysis-model-call-records.js\ndist/app/analysis-model-call-records.js.map\ndist/app/analysis-operation.d.ts\ndist/app/analysis-operation.d.ts.map\ndist/app/analysis-operation.js\ndist/app/analysis-operation.js.map\ndist/app/analysis-persistence.d.ts\ndist/app/analysis-persistence.d.ts.map\ndist/app/analysis-persistence.js\ndist/app/analysis-persistence.js.map\ndist/app/analysis-promotion.d.ts\ndist/app/analysis-promotion.d.ts.map\ndist/app/analysis-promotion.js\ndist/app/analysis-promotion.js.map\ndist/app/analysis-request.d.ts\ndist/app/analysis-request.d.ts.map\ndist/app/analysis-request.js\ndist/app/analysis-request.js.map\ndist/app/analysis-result-mapper.d.ts\ndist/app/analysis-result-mapper.d.ts.map\ndist/app/analysis-result-mapper.js\ndist/app/analysis-result-mapper.js.map\ndist/app/analysis-retained-admission.d.ts\ndist/app/analysis-retained-admission.d.ts.map\ndist/app/analysis-retained-admission.js\ndist/app/analysis-retained-admission.js.map\ndist/app/analysis-service.d.ts\ndist/app/analysis-service.d.ts.map\ndist/app/analysis-service.js\ndist/app/analysis-service.js.map\ndist/app/analysis-source.d.ts\ndist/app/analysis-source.d.ts.map\ndist/app/analysis-source.js\ndist/app/analysis-source.js.map\ndist/app/analysis-types.d.ts\ndist/app/analysis-types.d.ts.map\ndist/app/analysis-types.js\ndist/app/analysis-types.js.map\ndist/app/application-guards.d.ts\ndist/app/application-guards.d.ts.map\ndist/app/application-guards.js\ndist/app/application-guards.js.map\ndist/app/application-interaction-actions.d.ts\ndist/app/application-interaction-actions.d.ts.map\ndist/app/application-interaction-actions.js\ndist/app/application-interaction-actions.js.map\ndist/app/application-lifecycle.d.ts\ndist/app/application-lifecycle.d.ts.map\ndist/app/application-lifecycle.js\ndist/app/application-lifecycle.js.map\ndist/app/application-options.d.ts\ndist/app/application-options.d.ts.map\ndist/app/application-options.js\ndist/app/application-options.js.map\ndist/app/application-port-builder.d.ts\ndist/app/application-port-builder.d.ts.map\ndist/app/application-port-builder.js\ndist/app/application-port-builder.js.map\ndist/app/application-port-runtime.d.ts\ndist/app/application-port-runtime.d.ts.map\ndist/app/application-port-runtime.js\ndist/app/application-port-runtime.js.map\ndist/app/application-ports.d.ts\ndist/app/application-ports.d.ts.map\ndist/app/application-ports.js\ndist/app/application-ports.js.map\ndist/app/application-runtime-wiring.d.ts\ndist/app/application-runtime-wiring.d.ts.map\ndist/app/application-runtime-wiring.js\ndist/app/application-runtime-wiring.js.map\ndist/app/application-support.d.ts\ndist/app/application-support.d.ts.map\ndist/app/application-support.js\ndist/app/application-support.js.map\ndist/app/application-transition.d.ts\ndist/app/application-transition.d.ts.map\ndist/app/application-transition.js\ndist/app/application-transition.js.map\ndist/app/application-types.d.ts\ndist/app/application-types.d.ts.map\ndist/app/application-types.js\ndist/app/application-types.js.map\ndist/app/application.d.ts\ndist/app/application.d.ts.map\ndist/app/application.js\ndist/app/application.js.map\ndist/app/automation-actions.d.ts\ndist/app/automation-actions.d.ts.map\ndist/app/automation-actions.js\ndist/app/automation-actions.js.map\ndist/app/automation-matching.d.ts\ndist/app/automation-matching.d.ts.map\ndist/app/automation-matching.js\ndist/app/automation-matching.js.map\ndist/app/automation-rule-audit.d.ts\ndist/app/automation-rule-audit.d.ts.map\ndist/app/automation-rule-audit.js\ndist/app/automation-rule-audit.js.map\ndist/app/automation-rule-persistence.d.ts\ndist/app/automation-rule-persistence.d.ts.map\ndist/app/automation-rule-persistence.js\ndist/app/automation-rule-persistence.js.map\ndist/app/automation-rule-store.d.ts\ndist/app/automation-rule-store.d.ts.map\ndist/app/automation-rule-store.js\ndist/app/automation-rule-store.js.map\ndist/app/automation-rule-types.d.ts\ndist/app/automation-rule-types.d.ts.map\ndist/app/automation-rule-types.js\ndist/app/automation-rule-types.js.map\ndist/app/automation-rule-update.d.ts\ndist/app/automation-rule-update.d.ts.map\ndist/app/automation-rule-update.js\ndist/app/automation-rule-update.js.map\ndist/app/automation-rule-validation.d.ts\ndist/app/automation-rule-validation.d.ts.map\ndist/app/automation-rule-validation.js\ndist/app/automation-rule-validation.js.map\ndist/app/automation-rules.d.ts\ndist/app/automation-rules.d.ts.map\ndist/app/automation-rules.js\ndist/app/automation-rules.js.map\ndist/app/composition-options.d.ts\ndist/app/composition-options.d.ts.map\ndist/app/composition-options.js\ndist/app/composition-options.js.map\ndist/app/composition.d.ts\ndist/app/composition.d.ts.map\ndist/app/composition.js\ndist/app/composition.js.map\ndist/app/configuration-action-transition.d.ts\ndist/app/configuration-action-transition.d.ts.map\ndist/app/configuration-action-transition.js\ndist/app/configuration-action-transition.js.map\ndist/app/configuration-session.d.ts\ndist/app/configuration-session.d.ts.map\ndist/app/configuration-session.js\ndist/app/configuration-session.js.map\ndist/app/connection-action-support.d.ts\ndist/app/connection-action-support.d.ts.map\ndist/app/connection-action-support.js\ndist/app/connection-action-support.js.map\ndist/app/connection-action-types.d.ts\ndist/app/connection-action-types.d.ts.map\ndist/app/connection-action-types.js\ndist/app/connection-action-types.js.map\ndist/app/connection-actions.d.ts\ndist/app/connection-actions.d.ts.map\ndist/app/connection-actions.js\ndist/app/connection-actions.js.map\ndist/app/connection-errors.d.ts\ndist/app/connection-errors.d.ts.map\ndist/app/connection-errors.js\ndist/app/connection-errors.js.map\ndist/app/connection-probe.d.ts\ndist/app/connection-probe.d.ts.map\ndist/app/connection-probe.js\ndist/app/connection-probe.js.map\ndist/app/connection-record-factory.d.ts\ndist/app/connection-record-factory.d.ts.map\ndist/app/connection-record-factory.js\ndist/app/connection-record-factory.js.map\ndist/app/connections.d.ts\ndist/app/connections.d.ts.map\ndist/app/connections.js\ndist/app/connections.js.map\ndist/app/control-effects.d.ts\ndist/app/control-effects.d.ts.map\ndist/app/control-effects.js\ndist/app/control-effects.js.map\ndist/app/conversation-branch-effects.d.ts\ndist/app/conversation-branch-effects.d.ts.map\ndist/app/conversation-branch-effects.js\ndist/app/conversation-branch-effects.js.map\ndist/app/conversation-branches.d.ts\ndist/app/conversation-branches.d.ts.map\ndist/app/conversation-branches.js\ndist/app/conversation-branches.js.map\ndist/app/conversation-composition.d.ts\ndist/app/conversation-composition.d.ts.map\ndist/app/conversation-composition.js\ndist/app/conversation-composition.js.map\ndist/app/conversation-context.d.ts\ndist/app/conversation-context.d.ts.map\ndist/app/conversation-context.js\ndist/app/conversation-context.js.map\ndist/app/conversation-drafts.d.ts\ndist/app/conversation-drafts.d.ts.map\ndist/app/conversation-drafts.js\ndist/app/conversation-drafts.js.map\ndist/app/conversation-exports.d.ts\ndist/app/conversation-exports.d.ts.map\ndist/app/conversation-exports.js\ndist/app/conversation-exports.js.map\ndist/app/conversation-import-analyses.d.ts\ndist/app/conversation-import-analyses.d.ts.map\ndist/app/conversation-import-analyses.js\ndist/app/conversation-import-analyses.js.map\ndist/app/conversation-import-builder.d.ts\ndist/app/conversation-import-builder.d.ts.map\ndist/app/conversation-import-builder.js\ndist/app/conversation-import-builder.js.map\ndist/app/conversation-import-document.d.ts\ndist/app/conversation-import-document.d.ts.map\ndist/app/conversation-import-document.js\ndist/app/conversation-import-document.js.map\ndist/app/conversation-import-graph.d.ts\ndist/app/conversation-import-graph.d.ts.map\ndist/app/conversation-import-graph.js\ndist/app/conversation-import-graph.js.map\ndist/app/conversation-import-messages.d.ts\ndist/app/conversation-import-messages.d.ts.map\ndist/app/conversation-import-messages.js\ndist/app/conversation-import-messages.js.map\ndist/app/conversation-import-runs.d.ts\ndist/app/conversation-import-runs.d.ts.map\ndist/app/conversation-import-runs.js\ndist/app/conversation-import-runs.js.map\ndist/app/conversation-import-validation.d.ts\ndist/app/conversation-import-validation.d.ts.map\ndist/app/conversation-import-validation.js\ndist/app/conversation-import-validation.js.map\ndist/app/conversation-import-values.d.ts\ndist/app/conversation-import-values.d.ts.map\ndist/app/conversation-import-values.js\ndist/app/conversation-import-values.js.map\ndist/app/conversation-imports.d.ts\ndist/app/conversation-imports.d.ts.map\ndist/app/conversation-imports.js\ndist/app/conversation-imports.js.map\ndist/app/conversation-lifecycle.d.ts\ndist/app/conversation-lifecycle.d.ts.map\ndist/app/conversation-lifecycle.js\ndist/app/conversation-lifecycle.js.map\ndist/app/conversation-operation-coordinator.d.ts\ndist/app/conversation-operation-coordinator.d.ts.map\ndist/app/conversation-operation-coordinator.js\ndist/app/conversation-operation-coordinator.js.map\ndist/app/conversation-records.d.ts\ndist/app/conversation-records.d.ts.map\ndist/app/conversation-records.js\ndist/app/conversation-records.js.map\ndist/app/conversation-support.d.ts\ndist/app/conversation-support.d.ts.map\ndist/app/conversation-support.js\ndist/app/conversation-support.js.map\ndist/app/conversation-types.d.ts\ndist/app/conversation-types.d.ts.map\ndist/app/conversation-types.js\ndist/app/conversation-types.js.map\ndist/app/conversation-visibility.d.ts\ndist/app/conversation-visibility.d.ts.map\ndist/app/conversation-visibility.js\ndist/app/conversation-visibility.js.map\ndist/app/conversations.d.ts\ndist/app/conversations.d.ts.map\ndist/app/conversations.js\ndist/app/conversations.js.map\ndist/app/default-profiles.d.ts\ndist/app/default-profiles.d.ts.map\ndist/app/default-profiles.js\ndist/app/default-profiles.js.map\ndist/app/durable-send.d.ts\ndist/app/durable-send.d.ts.map\ndist/app/durable-send.js\ndist/app/durable-send.js.map\ndist/app/effect-coordinator.d.ts\ndist/app/effect-coordinator.d.ts.map\ndist/app/effect-coordinator.js\ndist/app/effect-coordinator.js.map\ndist/app/effect-projection.d.ts\ndist/app/effect-projection.d.ts.map\ndist/app/effect-projection.js\ndist/app/effect-projection.js.map\ndist/app/effective-run-configuration.d.ts\ndist/app/effective-run-configuration.d.ts.map\ndist/app/effective-run-configuration.js\ndist/app/effective-run-configuration.js.map\ndist/app/errors.d.ts\ndist/app/errors.d.ts.map\ndist/app/errors.js\ndist/app/errors.js.map\ndist/app/fail-closed-journal.d.ts\ndist/app/fail-closed-journal.d.ts.map\ndist/app/fail-closed-journal.js\ndist/app/fail-closed-journal.js.map\ndist/app/intelligence-actions.d.ts\ndist/app/intelligence-actions.d.ts.map\ndist/app/intelligence-actions.js\ndist/app/intelligence-actions.js.map\ndist/app/interaction-automation-coordinator.d.ts\ndist/app/interaction-automation-coordinator.d.ts.map\ndist/app/interaction-automation-coordinator.js\ndist/app/interaction-automation-coordinator.js.map\ndist/app/interaction-controller.d.ts\ndist/app/interaction-controller.d.ts.map\ndist/app/interaction-controller.js\ndist/app/interaction-controller.js.map\ndist/app/interaction-effects.d.ts\ndist/app/interaction-effects.d.ts.map\ndist/app/interaction-effects.js\ndist/app/interaction-effects.js.map\ndist/app/interaction-request.d.ts\ndist/app/interaction-request.d.ts.map\ndist/app/interaction-request.js\ndist/app/interaction-request.js.map\ndist/app/interaction-response-replay.d.ts\ndist/app/interaction-response-replay.d.ts.map\ndist/app/interaction-response-replay.js\ndist/app/interaction-response-replay.js.map\ndist/app/interaction-response.d.ts\ndist/app/interaction-response.d.ts.map\ndist/app/interaction-response.js\ndist/app/interaction-response.js.map\ndist/app/journal.d.ts\ndist/app/journal.d.ts.map\ndist/app/journal.js\ndist/app/journal.js.map\ndist/app/legacy-cancel.d.ts\ndist/app/legacy-cancel.d.ts.map\ndist/app/legacy-cancel.js\ndist/app/legacy-cancel.js.map\ndist/app/operation-fingerprint.d.ts\ndist/app/operation-fingerprint.d.ts.map\ndist/app/operation-fingerprint.js\ndist/app/operation-fingerprint.js.map\ndist/app/operation-ledger.d.ts\ndist/app/operation-ledger.d.ts.map\ndist/app/operation-ledger.js\ndist/app/operation-ledger.js.map\ndist/app/production-composition.d.ts\ndist/app/production-composition.d.ts.map\ndist/app/production-composition.js\ndist/app/production-composition.js.map\ndist/app/profile-action-support.d.ts\ndist/app/profile-action-support.d.ts.map\ndist/app/profile-action-support.js\ndist/app/profile-action-support.js.map\ndist/app/profile-actions.d.ts\ndist/app/profile-actions.d.ts.map\ndist/app/profile-actions.js\ndist/app/profile-actions.js.map\ndist/app/profile-draft.d.ts\ndist/app/profile-draft.d.ts.map\ndist/app/profile-draft.js\ndist/app/profile-draft.js.map\ndist/app/profile-model-settings.d.ts\ndist/app/profile-model-settings.d.ts.map\ndist/app/profile-model-settings.js\ndist/app/profile-model-settings.js.map\ndist/app/profile-persistence.d.ts\ndist/app/profile-persistence.d.ts.map\ndist/app/profile-persistence.js\ndist/app/profile-persistence.js.map\ndist/app/profile-save-recovery.d.ts\ndist/app/profile-save-recovery.d.ts.map\ndist/app/profile-save-recovery.js\ndist/app/profile-save-recovery.js.map\ndist/app/profile-selection.d.ts\ndist/app/profile-selection.d.ts.map\ndist/app/profile-selection.js\ndist/app/profile-selection.js.map\ndist/app/profile-snapshots.d.ts\ndist/app/profile-snapshots.d.ts.map\ndist/app/profile-snapshots.js\ndist/app/profile-snapshots.js.map\ndist/app/profile-sources.d.ts\ndist/app/profile-sources.d.ts.map\ndist/app/profile-sources.js\ndist/app/profile-sources.js.map\ndist/app/profile-types.d.ts\ndist/app/profile-types.d.ts.map\ndist/app/profile-types.js\ndist/app/profile-types.js.map\ndist/app/profile-validation.d.ts\ndist/app/profile-validation.d.ts.map\ndist/app/profile-validation.js\ndist/app/profile-validation.js.map\ndist/app/profiles.d.ts\ndist/app/profiles.d.ts.map\ndist/app/profiles.js\ndist/app/profiles.js.map\ndist/app/provider-snapshot.d.ts\ndist/app/provider-snapshot.d.ts.map\ndist/app/provider-snapshot.js\ndist/app/provider-snapshot.js.map\ndist/app/provider-values.d.ts\ndist/app/provider-values.d.ts.map\ndist/app/provider-values.js\ndist/app/provider-values.js.map\ndist/app/run-admission-continuation.d.ts\ndist/app/run-admission-continuation.d.ts.map\ndist/app/run-admission-continuation.js\ndist/app/run-admission-continuation.js.map\ndist/app/run-admission-dispatch.d.ts\ndist/app/run-admission-dispatch.d.ts.map\ndist/app/run-admission-dispatch.js\ndist/app/run-admission-dispatch.js.map\ndist/app/run-admission-receipt.d.ts\ndist/app/run-admission-receipt.d.ts.map\ndist/app/run-admission-receipt.js\ndist/app/run-admission-receipt.js.map\ndist/app/run-admission-request.d.ts\ndist/app/run-admission-request.d.ts.map\ndist/app/run-admission-request.js\ndist/app/run-admission-request.js.map\ndist/app/run-admission-validation.d.ts\ndist/app/run-admission-validation.d.ts.map\ndist/app/run-admission-validation.js\ndist/app/run-admission-validation.js.map\ndist/app/run-admission.d.ts\ndist/app/run-admission.d.ts.map\ndist/app/run-admission.js\ndist/app/run-admission.js.map\ndist/app/run-continuation.d.ts\ndist/app/run-continuation.d.ts.map\ndist/app/run-continuation.js\ndist/app/run-continuation.js.map\ndist/app/run-controls.d.ts\ndist/app/run-controls.d.ts.map\ndist/app/run-controls.js\ndist/app/run-controls.js.map\ndist/app/run-event-mapper.d.ts\ndist/app/run-event-mapper.d.ts.map\ndist/app/run-event-mapper.js\ndist/app/run-event-mapper.js.map\ndist/app/run-execution-snapshot.d.ts\ndist/app/run-execution-snapshot.d.ts.map\ndist/app/run-execution-snapshot.js\ndist/app/run-execution-snapshot.js.map\ndist/app/run-execution.d.ts\ndist/app/run-execution.d.ts.map\ndist/app/run-execution.js\ndist/app/run-execution.js.map\ndist/app/run-ingestion.d.ts\ndist/app/run-ingestion.d.ts.map\ndist/app/run-ingestion.js\ndist/app/run-ingestion.js.map\ndist/app/run-ledger.d.ts\ndist/app/run-ledger.d.ts.map\ndist/app/run-ledger.js\ndist/app/run-ledger.js.map\ndist/app/run-recovery-context.d.ts\ndist/app/run-recovery-context.d.ts.map\ndist/app/run-recovery-context.js\ndist/app/run-recovery-context.js.map\ndist/app/run-replay.d.ts\ndist/app/run-replay.d.ts.map\ndist/app/run-replay.js\ndist/app/run-replay.js.map\ndist/app/run-status.d.ts\ndist/app/run-status.d.ts.map\ndist/app/run-status.js\ndist/app/run-status.js.map\ndist/app/run-stream-sanitizer.d.ts\ndist/app/run-stream-sanitizer.d.ts.map\ndist/app/run-stream-sanitizer.js\ndist/app/run-stream-sanitizer.js.map\ndist/app/runtime-selection.d.ts\ndist/app/runtime-selection.d.ts.map\ndist/app/runtime-selection.js\ndist/app/runtime-selection.js.map\ndist/app/shutdown-controller.d.ts\ndist/app/shutdown-controller.d.ts.map\ndist/app/shutdown-controller.js\ndist/app/shutdown-controller.js.map\ndist/app/storage-journal-support.d.ts\ndist/app/storage-journal-support.d.ts.map\ndist/app/storage-journal-support.js\ndist/app/storage-journal-support.js.map\ndist/app/storage-journal.d.ts\ndist/app/storage-journal.d.ts.map\ndist/app/storage-journal.js\ndist/app/storage-journal.js.map\ndist/app/supervisor-projection.d.ts\ndist/app/supervisor-projection.d.ts.map\ndist/app/supervisor-projection.js\ndist/app/supervisor-projection.js.map\ndist/app/supervisor-service.d.ts\ndist/app/supervisor-service.d.ts.map\ndist/app/supervisor-service.js\ndist/app/supervisor-service.js.map\ndist/app/unavailable-analyst.d.ts\ndist/app/unavailable-analyst.d.ts.map\ndist/app/unavailable-analyst.js\ndist/app/unavailable-analyst.js.map\ndist/bin/args.d.ts\ndist/bin/args.d.ts.map\ndist/bin/args.js\ndist/bin/args.js.map\ndist/bin/braid-runtime.d.ts\ndist/bin/braid-runtime.d.ts.map\ndist/bin/braid-runtime.js\ndist/bin/braid-runtime.js.map\ndist/bin/braid.d.ts\ndist/bin/braid.d.ts.map\ndist/bin/braid.js\ndist/bin/braid.js.map\ndist/bin/fixture-application.d.ts\ndist/bin/fixture-application.d.ts.map\ndist/bin/fixture-application.js\ndist/bin/fixture-application.js.map\ndist/bin/interface-runner.d.ts\ndist/bin/interface-runner.d.ts.map\ndist/bin/interface-runner.js\ndist/bin/interface-runner.js.map\ndist/bin/interface-signal-lifecycle.d.ts\ndist/bin/interface-signal-lifecycle.d.ts.map\ndist/bin/interface-signal-lifecycle.js\ndist/bin/interface-signal-lifecycle.js.map\ndist/bin/interface-state-recorder.d.ts\ndist/bin/interface-state-recorder.d.ts.map\ndist/bin/interface-state-recorder.js\ndist/bin/interface-state-recorder.js.map\ndist/bin/native-interactive-actions.d.ts\ndist/bin/native-interactive-actions.d.ts.map\ndist/bin/native-interactive-actions.js\ndist/bin/native-interactive-actions.js.map\ndist/bin/plain.d.ts\ndist/bin/plain.d.ts.map\ndist/bin/plain.js\ndist/bin/plain.js.map\ndist/bin/production-active-profile.d.ts\ndist/bin/production-active-profile.d.ts.map\ndist/bin/production-active-profile.js\ndist/bin/production-active-profile.js.map\ndist/bin/production-application.d.ts\ndist/bin/production-application.d.ts.map\ndist/bin/production-application.js\ndist/bin/production-application.js.map\ndist/bin/production-bridge-client.d.ts\ndist/bin/production-bridge-client.d.ts.map\ndist/bin/production-bridge-client.js\ndist/bin/production-bridge-client.js.map\ndist/bin/production-bridge-discovery.d.ts\ndist/bin/production-bridge-discovery.d.ts.map\ndist/bin/production-bridge-discovery.js\ndist/bin/production-bridge-discovery.js.map\ndist/bin/production-config-mutation-lock.d.ts\ndist/bin/production-config-mutation-lock.d.ts.map\ndist/bin/production-config-mutation-lock.js\ndist/bin/production-config-mutation-lock.js.map\ndist/bin/production-connection-action-options.d.ts\ndist/bin/production-connection-action-options.d.ts.map\ndist/bin/production-connection-action-options.js\ndist/bin/production-connection-action-options.js.map\ndist/bin/production-connection-actions.d.ts\ndist/bin/production-connection-actions.d.ts.map\ndist/bin/production-connection-actions.js\ndist/bin/production-connection-actions.js.map\ndist/bin/production-connection-catalog.d.ts\ndist/bin/production-connection-catalog.d.ts.map\ndist/bin/production-connection-catalog.js\ndist/bin/production-connection-catalog.js.map\ndist/bin/production-connection-credential-cleanup.d.ts\ndist/bin/production-connection-credential-cleanup.d.ts.map\ndist/bin/production-connection-credential-cleanup.js\ndist/bin/production-connection-credential-cleanup.js.map\ndist/bin/production-connection-credential-removal-record.d.ts\ndist/bin/production-connection-credential-removal-record.d.ts.map\ndist/bin/production-connection-credential-removal-record.js\ndist/bin/production-connection-credential-removal-record.js.map\ndist/bin/production-connection-removal.d.ts\ndist/bin/production-connection-removal.d.ts.map\ndist/bin/production-connection-removal.js\ndist/bin/production-connection-removal.js.map\ndist/bin/production-connection-replay.d.ts\ndist/bin/production-connection-replay.d.ts.map\ndist/bin/production-connection-replay.js\ndist/bin/production-connection-replay.js.map\ndist/bin/production-credential-context.d.ts\ndist/bin/production-credential-context.d.ts.map\ndist/bin/production-credential-context.js\ndist/bin/production-credential-context.js.map\ndist/bin/production-credential-reference.d.ts\ndist/bin/production-credential-reference.d.ts.map\ndist/bin/production-credential-reference.js\ndist/bin/production-credential-reference.js.map\ndist/bin/production-key-path.d.ts\ndist/bin/production-key-path.d.ts.map\ndist/bin/production-key-path.js\ndist/bin/production-key-path.js.map\ndist/bin/production-profile-projection.d.ts\ndist/bin/production-profile-projection.d.ts.map\ndist/bin/production-profile-projection.js\ndist/bin/production-profile-projection.js.map\ndist/bin/production-setup-credentials.d.ts\ndist/bin/production-setup-credentials.d.ts.map\ndist/bin/production-setup-credentials.js\ndist/bin/production-setup-credentials.js.map\ndist/bin/production-setup-discovery.d.ts\ndist/bin/production-setup-discovery.d.ts.map\ndist/bin/production-setup-discovery.js\ndist/bin/production-setup-discovery.js.map\ndist/bin/production-setup-persistence.d.ts\ndist/bin/production-setup-persistence.d.ts.map\ndist/bin/production-setup-persistence.js\ndist/bin/production-setup-persistence.js.map\ndist/bin/production-setup-transition.d.ts\ndist/bin/production-setup-transition.d.ts.map\ndist/bin/production-setup-transition.js\ndist/bin/production-setup-transition.js.map\ndist/bin/production-setup-types.d.ts\ndist/bin/production-setup-types.d.ts.map\ndist/bin/production-setup-types.js\ndist/bin/production-setup-types.js.map\ndist/bin/production-setup-validation.d.ts\ndist/bin/production-setup-validation.d.ts.map\ndist/bin/production-setup-validation.js\ndist/bin/production-setup-validation.js.map\ndist/bin/production-setup.d.ts\ndist/bin/production-setup.d.ts.map\ndist/bin/production-setup.js\ndist/bin/production-setup.js.map\ndist/bin/production-startup.d.ts\ndist/bin/production-startup.d.ts.map\ndist/bin/production-startup.js\ndist/bin/production-startup.js.map\ndist/bin/runtime-startup-options.d.ts\ndist/bin/runtime-startup-options.d.ts.map\ndist/bin/runtime-startup-options.js\ndist/bin/runtime-startup-options.js.map\ndist/bin/state-path.d.ts\ndist/bin/state-path.d.ts.map\ndist/bin/state-path.js\ndist/bin/state-path.js.map\ndist/domain/analysis-model-call.d.ts\ndist/domain/analysis-model-call.d.ts.map\ndist/domain/analysis-model-call.js\ndist/domain/analysis-model-call.js.map\ndist/domain/bounded-structured.d.ts\ndist/domain/bounded-structured.d.ts.map\ndist/domain/bounded-structured.js\ndist/domain/bounded-structured.js.map\ndist/domain/canonical-json.d.ts\ndist/domain/canonical-json.d.ts.map\ndist/domain/canonical-json.js\ndist/domain/canonical-json.js.map\ndist/domain/canonical.d.ts\ndist/domain/canonical.d.ts.map\ndist/domain/canonical.js\ndist/domain/canonical.js.map\ndist/domain/code-unit-order.d.ts\ndist/domain/code-unit-order.d.ts.map\ndist/domain/code-unit-order.js\ndist/domain/code-unit-order.js.map\ndist/domain/connection-removal.d.ts\ndist/domain/connection-removal.d.ts.map\ndist/domain/connection-removal.js\ndist/domain/connection-removal.js.map\ndist/domain/content-budget.d.ts\ndist/domain/content-budget.d.ts.map\ndist/domain/content-budget.js\ndist/domain/content-budget.js.map\ndist/domain/entities-base.d.ts\ndist/domain/entities-base.d.ts.map\ndist/domain/entities-base.js\ndist/domain/entities-base.js.map\ndist/domain/entities-core.d.ts\ndist/domain/entities-core.d.ts.map\ndist/domain/entities-core.js\ndist/domain/entities-core.js.map\ndist/domain/entities-graph.d.ts\ndist/domain/entities-graph.d.ts.map\ndist/domain/entities-graph.js\ndist/domain/entities-graph.js.map\ndist/domain/entities-interactions.d.ts\ndist/domain/entities-interactions.d.ts.map\ndist/domain/entities-interactions.js\ndist/domain/entities-interactions.js.map\ndist/domain/entities-messages.d.ts\ndist/domain/entities-messages.d.ts.map\ndist/domain/entities-messages.js\ndist/domain/entities-messages.js.map\ndist/domain/entities-runtime.d.ts\ndist/domain/entities-runtime.d.ts.map\ndist/domain/entities-runtime.js\ndist/domain/entities-runtime.js.map\ndist/domain/entities.d.ts\ndist/domain/entities.d.ts.map\ndist/domain/entities.js\ndist/domain/entities.js.map\ndist/domain/events-legacy.d.ts\ndist/domain/events-legacy.d.ts.map\ndist/domain/events-legacy.js\ndist/domain/events-legacy.js.map\ndist/domain/events.d.ts\ndist/domain/events.d.ts.map\ndist/domain/events.js\ndist/domain/events.js.map\ndist/domain/execution-observation.d.ts\ndist/domain/execution-observation.d.ts.map\ndist/domain/execution-observation.js\ndist/domain/execution-observation.js.map\ndist/domain/graph-records.d.ts\ndist/domain/graph-records.d.ts.map\ndist/domain/graph-records.js\ndist/domain/graph-records.js.map\ndist/domain/ids-core.d.ts\ndist/domain/ids-core.d.ts.map\ndist/domain/ids-core.js\ndist/domain/ids-core.js.map\ndist/domain/ids-types.d.ts\ndist/domain/ids-types.d.ts.map\ndist/domain/ids-types.js\ndist/domain/ids-types.js.map\ndist/domain/ids-values.d.ts\ndist/domain/ids-values.d.ts.map\ndist/domain/ids-values.js\ndist/domain/ids-values.js.map\ndist/domain/ids.d.ts\ndist/domain/ids.d.ts.map\ndist/domain/ids.js\ndist/domain/ids.js.map\ndist/domain/interaction-timeout.d.ts\ndist/domain/interaction-timeout.d.ts.map\ndist/domain/interaction-timeout.js\ndist/domain/interaction-timeout.js.map\ndist/domain/invariants-base.d.ts\ndist/domain/invariants-base.d.ts.map\ndist/domain/invariants-base.js\ndist/domain/invariants-base.js.map\ndist/domain/invariants-conversation.d.ts\ndist/domain/invariants-conversation.d.ts.map\ndist/domain/invariants-conversation.js\ndist/domain/invariants-conversation.js.map\ndist/domain/invariants-profile.d.ts\ndist/domain/invariants-profile.d.ts.map\ndist/domain/invariants-profile.js\ndist/domain/invariants-profile.js.map\ndist/domain/invariants-relations.d.ts\ndist/domain/invariants-relations.d.ts.map\ndist/domain/invariants-relations.js\ndist/domain/invariants-relations.js.map\ndist/domain/invariants-retained-admission.d.ts\ndist/domain/invariants-retained-admission.d.ts.map\ndist/domain/invariants-retained-admission.js\ndist/domain/invariants-retained-admission.js.map\ndist/domain/invariants-run.d.ts\ndist/domain/invariants-run.d.ts.map\ndist/domain/invariants-run.js\ndist/domain/invariants-run.js.map\ndist/domain/invariants-runtime.d.ts\ndist/domain/invariants-runtime.d.ts.map\ndist/domain/invariants-runtime.js\ndist/domain/invariants-runtime.js.map\ndist/domain/invariants-state.d.ts\ndist/domain/invariants-state.d.ts.map\ndist/domain/invariants-state.js\ndist/domain/invariants-state.js.map\ndist/domain/invariants.d.ts\ndist/domain/invariants.d.ts.map\ndist/domain/invariants.js\ndist/domain/invariants.js.map\ndist/domain/legacy-interaction-snapshot.d.ts\ndist/domain/legacy-interaction-snapshot.d.ts.map\ndist/domain/legacy-interaction-snapshot.js\ndist/domain/legacy-interaction-snapshot.js.map\ndist/domain/materialization-receipt.d.ts\ndist/domain/materialization-receipt.d.ts.map\ndist/domain/materialization-receipt.js\ndist/domain/materialization-receipt.js.map\ndist/domain/materialized-state-snapshot.d.ts\ndist/domain/materialized-state-snapshot.d.ts.map\ndist/domain/materialized-state-snapshot.js\ndist/domain/materialized-state-snapshot.js.map\ndist/domain/materialized-state.d.ts\ndist/domain/materialized-state.d.ts.map\ndist/domain/materialized-state.js\ndist/domain/materialized-state.js.map\ndist/domain/projection-checksum.d.ts\ndist/domain/projection-checksum.d.ts.map\ndist/domain/projection-checksum.js\ndist/domain/projection-checksum.js.map\ndist/domain/provider-values.d.ts\ndist/domain/provider-values.d.ts.map\ndist/domain/provider-values.js\ndist/domain/provider-values.js.map\ndist/domain/public-metadata.d.ts\ndist/domain/public-metadata.d.ts.map\ndist/domain/public-metadata.js\ndist/domain/public-metadata.js.map\ndist/domain/receipts.d.ts\ndist/domain/receipts.d.ts.map\ndist/domain/receipts.js\ndist/domain/receipts.js.map\ndist/domain/redaction.d.ts\ndist/domain/redaction.d.ts.map\ndist/domain/redaction.js\ndist/domain/redaction.js.map\ndist/domain/reducer-content.d.ts\ndist/domain/reducer-content.d.ts.map\ndist/domain/reducer-content.js\ndist/domain/reducer-content.js.map\ndist/domain/reducer-conversation-events.d.ts\ndist/domain/reducer-conversation-events.d.ts.map\ndist/domain/reducer-conversation-events.js\ndist/domain/reducer-conversation-events.js.map\ndist/domain/reducer-domain-events.d.ts\ndist/domain/reducer-domain-events.d.ts.map\ndist/domain/reducer-domain-events.js\ndist/domain/reducer-domain-events.js.map\ndist/domain/reducer-execution-observation.d.ts\ndist/domain/reducer-execution-observation.d.ts.map\ndist/domain/reducer-execution-observation.js\ndist/domain/reducer-execution-observation.js.map\ndist/domain/reducer-helpers.d.ts\ndist/domain/reducer-helpers.d.ts.map\ndist/domain/reducer-helpers.js\ndist/domain/reducer-helpers.js.map\ndist/domain/reducer-interactions.d.ts\ndist/domain/reducer-interactions.d.ts.map\ndist/domain/reducer-interactions.js\ndist/domain/reducer-interactions.js.map\ndist/domain/reducer-legacy.d.ts\ndist/domain/reducer-legacy.d.ts.map\ndist/domain/reducer-legacy.js\ndist/domain/reducer-legacy.js.map\ndist/domain/reducer-lifecycle.d.ts\ndist/domain/reducer-lifecycle.d.ts.map\ndist/domain/reducer-lifecycle.js\ndist/domain/reducer-lifecycle.js.map\ndist/domain/reducer-replay.d.ts\ndist/domain/reducer-replay.d.ts.map\ndist/domain/reducer-replay.js\ndist/domain/reducer-replay.js.map\ndist/domain/reducer-retained-admission.d.ts\ndist/domain/reducer-retained-admission.d.ts.map\ndist/domain/reducer-retained-admission.js\ndist/domain/reducer-retained-admission.js.map\ndist/domain/reducer-run-graph.d.ts\ndist/domain/reducer-run-graph.d.ts.map\ndist/domain/reducer-run-graph.js\ndist/domain/reducer-run-graph.js.map\ndist/domain/reducer-runtime.d.ts\ndist/domain/reducer-runtime.d.ts.map\ndist/domain/reducer-runtime.js\ndist/domain/reducer-runtime.js.map\ndist/domain/reducer-support.d.ts\ndist/domain/reducer-support.d.ts.map\ndist/domain/reducer-support.js\ndist/domain/reducer-support.js.map\ndist/domain/reducer.d.ts\ndist/domain/reducer.d.ts.map\ndist/domain/reducer.js\ndist/domain/reducer.js.map\ndist/domain/run-contracts.d.ts\ndist/domain/run-contracts.d.ts.map\ndist/domain/run-contracts.js\ndist/domain/run-contracts.js.map\ndist/domain/run-interactions.d.ts\ndist/domain/run-interactions.d.ts.map\ndist/domain/run-interactions.js\ndist/domain/run-interactions.js.map\ndist/domain/run-usage.d.ts\ndist/domain/run-usage.d.ts.map\ndist/domain/run-usage.js\ndist/domain/run-usage.js.map\ndist/domain/runtime-diagnostics.d.ts\ndist/domain/runtime-diagnostics.d.ts.map\ndist/domain/runtime-diagnostics.js\ndist/domain/runtime-diagnostics.js.map\ndist/domain/runtime-events.d.ts\ndist/domain/runtime-events.d.ts.map\ndist/domain/runtime-events.js\ndist/domain/runtime-events.js.map\ndist/domain/runtime-projection.d.ts\ndist/domain/runtime-projection.d.ts.map\ndist/domain/runtime-projection.js\ndist/domain/runtime-projection.js.map\ndist/domain/secret-sanitizer.d.ts\ndist/domain/secret-sanitizer.d.ts.map\ndist/domain/secret-sanitizer.js\ndist/domain/secret-sanitizer.js.map\ndist/domain/state.d.ts\ndist/domain/state.d.ts.map\ndist/domain/state.js\ndist/domain/state.js.map\ndist/domain/terminal-sanitizer.d.ts\ndist/domain/terminal-sanitizer.d.ts.map\ndist/domain/terminal-sanitizer.js\ndist/domain/terminal-sanitizer.js.map\ndist/domain/text.d.ts\ndist/domain/text.d.ts.map\ndist/domain/text.js\ndist/domain/text.js.map\ndist/eval/calibration.d.ts\ndist/eval/calibration.d.ts.map\ndist/eval/calibration.js\ndist/eval/calibration.js.map\ndist/eval/campaigns.d.ts\ndist/eval/campaigns.d.ts.map\ndist/eval/campaigns.js\ndist/eval/campaigns.js.map\ndist/eval/cases.d.ts\ndist/eval/cases.d.ts.map\ndist/eval/cases.js\ndist/eval/cases.js.map\ndist/eval/execution.d.ts\ndist/eval/execution.d.ts.map\ndist/eval/execution.js\ndist/eval/execution.js.map\ndist/eval/fixtures.d.ts\ndist/eval/fixtures.d.ts.map\ndist/eval/fixtures.js\ndist/eval/fixtures.js.map\ndist/eval/product-path.d.ts\ndist/eval/product-path.d.ts.map\ndist/eval/product-path.js\ndist/eval/product-path.js.map\ndist/eval/record-builder.d.ts\ndist/eval/record-builder.d.ts.map\ndist/eval/record-builder.js\ndist/eval/record-builder.js.map\ndist/eval/records.d.ts\ndist/eval/records.d.ts.map\ndist/eval/records.js\ndist/eval/records.js.map\ndist/eval/release-decision.d.ts\ndist/eval/release-decision.d.ts.map\ndist/eval/release-decision.js\ndist/eval/release-decision.js.map\ndist/eval/release-markers.d.ts\ndist/eval/release-markers.d.ts.map\ndist/eval/release-markers.js\ndist/eval/release-markers.js.map\ndist/eval/runner.d.ts\ndist/eval/runner.d.ts.map\ndist/eval/runner.js\ndist/eval/runner.js.map\ndist/eval/types.d.ts\ndist/eval/types.d.ts.map\ndist/eval/types.js\ndist/eval/types.js.map\ndist/index.d.ts\ndist/index.d.ts.map\ndist/index.js\ndist/index.js.map\ndist/installed-package-version.d.ts\ndist/installed-package-version.d.ts.map\ndist/installed-package-version.js\ndist/installed-package-version.js.map\ndist/ports/clock.d.ts\ndist/ports/clock.d.ts.map\ndist/ports/clock.js\ndist/ports/clock.js.map\ndist/ports/connection-lifecycle.d.ts\ndist/ports/connection-lifecycle.d.ts.map\ndist/ports/connection-lifecycle.js\ndist/ports/connection-lifecycle.js.map\ndist/ports/credentials.d.ts\ndist/ports/credentials.d.ts.map\ndist/ports/credentials.js\ndist/ports/credentials.js.map\ndist/ports/effect-storage.d.ts\ndist/ports/effect-storage.d.ts.map\ndist/ports/effect-storage.js\ndist/ports/effect-storage.js.map\ndist/ports/execution.d.ts\ndist/ports/execution.d.ts.map\ndist/ports/execution.js\ndist/ports/execution.js.map\ndist/ports/ids.d.ts\ndist/ports/ids.d.ts.map\ndist/ports/ids.js\ndist/ports/ids.js.map\ndist/ports/native-interactive-execution.d.ts\ndist/ports/native-interactive-execution.d.ts.map\ndist/ports/native-interactive-execution.js\ndist/ports/native-interactive-execution.js.map\ndist/ports/native-terminal-transport.d.ts\ndist/ports/native-terminal-transport.d.ts.map\ndist/ports/native-terminal-transport.js\ndist/ports/native-terminal-transport.js.map\ndist/ports/storage.d.ts\ndist/ports/storage.d.ts.map\ndist/ports/storage.js\ndist/ports/storage.js.map\ndist/startup/chunks/analysis-comparison-facts-4HBRMPC5.js\ndist/startup/chunks/analysis-comparison-facts-4HBRMPC5.js.map\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js.map\ndist/startup/chunks/chunk-26WJ3D3U.js\ndist/startup/chunks/chunk-26WJ3D3U.js.map\ndist/startup/chunks/chunk-2B6P3EZQ.js\ndist/startup/chunks/chunk-2B6P3EZQ.js.map\ndist/startup/chunks/chunk-3SLVNOQZ.js\ndist/startup/chunks/chunk-3SLVNOQZ.js.map\ndist/startup/chunks/chunk-4GTWJJDM.js\ndist/startup/chunks/chunk-4GTWJJDM.js.map\ndist/startup/chunks/chunk-5LULVGCK.js\ndist/startup/chunks/chunk-5LULVGCK.js.map\ndist/startup/chunks/chunk-67SGXJUO.js\ndist/startup/chunks/chunk-67SGXJUO.js.map\ndist/startup/chunks/chunk-6G7QKB6J.js\ndist/startup/chunks/chunk-6G7QKB6J.js.map\ndist/startup/chunks/chunk-AUQCJYW5.js\ndist/startup/chunks/chunk-AUQCJYW5.js.map\ndist/startup/chunks/chunk-BFMMIDTZ.js\ndist/startup/chunks/chunk-BFMMIDTZ.js.map\ndist/startup/chunks/chunk-BGO6DSSS.js\ndist/startup/chunks/chunk-BGO6DSSS.js.map\ndist/startup/chunks/chunk-BO5OWTBZ.js\ndist/startup/chunks/chunk-BO5OWTBZ.js.map\ndist/startup/chunks/chunk-CBH5A2GJ.js\ndist/startup/chunks/chunk-CBH5A2GJ.js.map\ndist/startup/chunks/chunk-CS5FUFHS.js\ndist/startup/chunks/chunk-CS5FUFHS.js.map\ndist/startup/chunks/chunk-D3IM3CS6.js\ndist/startup/chunks/chunk-D3IM3CS6.js.map\ndist/startup/chunks/chunk-DCHT46BU.js\ndist/startup/chunks/chunk-DCHT46BU.js.map\ndist/startup/chunks/chunk-DLR6FLQV.js\ndist/startup/chunks/chunk-DLR6FLQV.js.map\ndist/startup/chunks/chunk-EG7UPV4Q.js\ndist/startup/chunks/chunk-EG7UPV4Q.js.map\ndist/startup/chunks/chunk-EMP3DK5W.js\ndist/startup/chunks/chunk-EMP3DK5W.js.map\ndist/startup/chunks/chunk-EZFTDPNQ.js\ndist/startup/chunks/chunk-EZFTDPNQ.js.map\ndist/startup/chunks/chunk-H6G73VXZ.js\ndist/startup/chunks/chunk-H6G73VXZ.js.map\ndist/startup/chunks/chunk-HLJ57SGD.js\ndist/startup/chunks/chunk-HLJ57SGD.js.map\ndist/startup/chunks/chunk-HLP7TC7Z.js\ndist/startup/chunks/chunk-HLP7TC7Z.js.map\ndist/startup/chunks/chunk-JAKKUJKI.js\ndist/startup/chunks/chunk-JAKKUJKI.js.map\ndist/startup/chunks/chunk-L2HDP2QD.js\ndist/startup/chunks/chunk-L2HDP2QD.js.map\ndist/startup/chunks/chunk-LPK6XAHA.js\ndist/startup/chunks/chunk-LPK6XAHA.js.map\ndist/startup/chunks/chunk-PAPTIOCL.js\ndist/startup/chunks/chunk-PAPTIOCL.js.map\ndist/startup/chunks/chunk-PXRVFPRL.js\ndist/startup/chunks/chunk-PXRVFPRL.js.map\ndist/startup/chunks/chunk-Q3LDIHCH.js\ndist/startup/chunks/chunk-Q3LDIHCH.js.map\ndist/startup/chunks/chunk-QSPEMKTL.js\ndist/startup/chunks/chunk-QSPEMKTL.js.map\ndist/startup/chunks/chunk-SZE3RHE6.js\ndist/startup/chunks/chunk-SZE3RHE6.js.map\ndist/startup/chunks/chunk-UDYGU3OR.js\ndist/startup/chunks/chunk-UDYGU3OR.js.map\ndist/startup/chunks/chunk-UTHORCP6.js\ndist/startup/chunks/chunk-UTHORCP6.js.map\ndist/startup/chunks/chunk-V7LWVMBP.js\ndist/startup/chunks/chunk-V7LWVMBP.js.map\ndist/startup/chunks/chunk-V7ZXNCA7.js\ndist/startup/chunks/chunk-V7ZXNCA7.js.map\ndist/startup/chunks/chunk-VCOQDTVF.js\ndist/startup/chunks/chunk-VCOQDTVF.js.map\ndist/startup/chunks/chunk-VRWZ5M2N.js\ndist/startup/chunks/chunk-VRWZ5M2N.js.map\ndist/startup/chunks/chunk-VTNLVERY.js\ndist/startup/chunks/chunk-VTNLVERY.js.map\ndist/startup/chunks/configuration-wizard-DGU4QOC6.js\ndist/startup/chunks/configuration-wizard-DGU4QOC6.js.map\ndist/startup/chunks/production-composition-5YSIRRBV.js\ndist/startup/chunks/production-composition-5YSIRRBV.js.map\ndist/startup/chunks/production-connection-providers-O7T54RL3.js\ndist/startup/chunks/production-connection-providers-O7T54RL3.js.map\ndist/startup/chunks/production-connections-GMFNYZ3Z.js\ndist/startup/chunks/production-connections-GMFNYZ3Z.js.map\ndist/startup/chunks/profile-connection-dispatch-KC4YZ42X.js\ndist/startup/chunks/profile-connection-dispatch-KC4YZ42X.js.map\ndist/startup/chunks/supervisor-control-F4IMJYTH.js\ndist/startup/chunks/supervisor-control-F4IMJYTH.js.map\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js.map\ndist/startup/chunks/trace-store-FHTNGCPR.js\ndist/startup/chunks/trace-store-FHTNGCPR.js.map\ndist/startup/chunks/ui-dispatch-EYGVLSE3.js\ndist/startup/chunks/ui-dispatch-EYGVLSE3.js.map\ndist/startup/durable-runtime.d.ts\ndist/startup/durable-runtime.d.ts.map\ndist/startup/durable-runtime.js\ndist/startup/durable-runtime.js.map\ndist/startup/preview-runtime.d.ts\ndist/startup/preview-runtime.d.ts.map\ndist/startup/preview-runtime.js\ndist/startup/preview-runtime.js.map\ndist/startup/terminal-runtime.d.ts\ndist/startup/terminal-runtime.d.ts.map\ndist/startup/terminal-runtime.js\ndist/startup/terminal-runtime.js.map\ndist/startup/terminal-signal-latch.d.ts\ndist/startup/terminal-signal-latch.d.ts.map\ndist/startup/terminal-signal-latch.js\ndist/startup/terminal-signal-latch.js.map\ndist/testing/deterministic-backend.d.ts\ndist/testing/deterministic-backend.d.ts.map\ndist/testing/deterministic-backend.js\ndist/testing/deterministic-backend.js.map\ndist/testing/product-demo-fixture.d.ts\ndist/testing/product-demo-fixture.d.ts.map\ndist/testing/product-demo-fixture.js\ndist/testing/product-demo-fixture.js.map\ndist/testing/runtime-contract-fixtures.d.ts\ndist/testing/runtime-contract-fixtures.d.ts.map\ndist/testing/runtime-contract-fixtures.js\ndist/testing/runtime-contract-fixtures.js.map\ndist/testing/supervision-fixture.d.ts\ndist/testing/supervision-fixture.d.ts.map\ndist/testing/supervision-fixture.js\ndist/testing/supervision-fixture.js.map\ndist/testing/supervision-ui-fixture.d.ts\ndist/testing/supervision-ui-fixture.d.ts.map\ndist/testing/supervision-ui-fixture.js\ndist/testing/supervision-ui-fixture.js.map\ndist/version.d.ts\ndist/version.d.ts.map\ndist/version.js\ndist/version.js.map\ndist/views/headless/bounded-output.d.ts\ndist/views/headless/bounded-output.d.ts.map\ndist/views/headless/bounded-output.js\ndist/views/headless/bounded-output.js.map\ndist/views/headless/protocol-limits.d.ts\ndist/views/headless/protocol-limits.d.ts.map\ndist/views/headless/protocol-limits.js\ndist/views/headless/protocol-limits.js.map\ndist/views/headless/protocol.d.ts\ndist/views/headless/protocol.d.ts.map\ndist/views/headless/protocol.js\ndist/views/headless/protocol.js.map\ndist/views/headless/rpc-automation-commands.d.ts\ndist/views/headless/rpc-automation-commands.d.ts.map\ndist/views/headless/rpc-automation-commands.js\ndist/views/headless/rpc-automation-commands.js.map\ndist/views/headless/rpc-errors.d.ts\ndist/views/headless/rpc-errors.d.ts.map\ndist/views/headless/rpc-errors.js\ndist/views/headless/rpc-errors.js.map\ndist/views/headless/rpc-interaction-commands.d.ts\ndist/views/headless/rpc-interaction-commands.d.ts.map\ndist/views/headless/rpc-interaction-commands.js\ndist/views/headless/rpc-interaction-commands.js.map\ndist/views/headless/rpc-parser.d.ts\ndist/views/headless/rpc-parser.d.ts.map\ndist/views/headless/rpc-parser.js\ndist/views/headless/rpc-parser.js.map\ndist/views/headless/rpc-types.d.ts\ndist/views/headless/rpc-types.d.ts.map\ndist/views/headless/rpc-types.js\ndist/views/headless/rpc-types.js.map\ndist/views/headless/rpc.d.ts\ndist/views/headless/rpc.d.ts.map\ndist/views/headless/rpc.js\ndist/views/headless/rpc.js.map\ndist/views/shared/analysis-model-call-presentation.d.ts\ndist/views/shared/analysis-model-call-presentation.d.ts.map\ndist/views/shared/analysis-model-call-presentation.js\ndist/views/shared/analysis-model-call-presentation.js.map\ndist/views/shared/analysis-presentation.d.ts\ndist/views/shared/analysis-presentation.d.ts.map\ndist/views/shared/analysis-presentation.js\ndist/views/shared/analysis-presentation.js.map\ndist/views/shared/appearance.d.ts\ndist/views/shared/appearance.d.ts.map\ndist/views/shared/appearance.js\ndist/views/shared/appearance.js.map\ndist/views/shared/canonical.d.ts\ndist/views/shared/canonical.d.ts.map\ndist/views/shared/canonical.js\ndist/views/shared/canonical.js.map\ndist/views/shared/command-registry.d.ts\ndist/views/shared/command-registry.d.ts.map\ndist/views/shared/command-registry.js\ndist/views/shared/command-registry.js.map\ndist/views/shared/command-table.d.ts\ndist/views/shared/command-table.d.ts.map\ndist/views/shared/command-table.js\ndist/views/shared/command-table.js.map\ndist/views/shared/comparison-presentation.d.ts\ndist/views/shared/comparison-presentation.d.ts.map\ndist/views/shared/comparison-presentation.js\ndist/views/shared/comparison-presentation.js.map\ndist/views/shared/connection-lifecycle.d.ts\ndist/views/shared/connection-lifecycle.d.ts.map\ndist/views/shared/connection-lifecycle.js\ndist/views/shared/connection-lifecycle.js.map\ndist/views/shared/duration.d.ts\ndist/views/shared/duration.d.ts.map\ndist/views/shared/duration.js\ndist/views/shared/duration.js.map\ndist/views/shared/environment-presentation.d.ts\ndist/views/shared/environment-presentation.d.ts.map\ndist/views/shared/environment-presentation.js\ndist/views/shared/environment-presentation.js.map\ndist/views/shared/headless-commands.d.ts\ndist/views/shared/headless-commands.d.ts.map\ndist/views/shared/headless-commands.js\ndist/views/shared/headless-commands.js.map\ndist/views/shared/intents.d.ts\ndist/views/shared/intents.d.ts.map\ndist/views/shared/intents.js\ndist/views/shared/intents.js.map\ndist/views/shared/models.d.ts\ndist/views/shared/models.d.ts.map\ndist/views/shared/models.js\ndist/views/shared/models.js.map\ndist/views/shared/native-interactive-actions.d.ts\ndist/views/shared/native-interactive-actions.d.ts.map\ndist/views/shared/native-interactive-actions.js\ndist/views/shared/native-interactive-actions.js.map\ndist/views/shared/plain-accessibility.d.ts\ndist/views/shared/plain-accessibility.d.ts.map\ndist/views/shared/plain-accessibility.js\ndist/views/shared/plain-accessibility.js.map\ndist/views/shared/sanitize.d.ts\ndist/views/shared/sanitize.d.ts.map\ndist/views/shared/sanitize.js\ndist/views/shared/sanitize.js.map\ndist/views/shared/semantic-activity-limit.d.ts\ndist/views/shared/semantic-activity-limit.d.ts.map\ndist/views/shared/semantic-activity-limit.js\ndist/views/shared/semantic-activity-limit.js.map\ndist/views/shared/semantic-activity.d.ts\ndist/views/shared/semantic-activity.d.ts.map\ndist/views/shared/semantic-activity.js\ndist/views/shared/semantic-activity.js.map\ndist/views/shared/semantic-details.d.ts\ndist/views/shared/semantic-details.d.ts.map\ndist/views/shared/semantic-details.js\ndist/views/shared/semantic-details.js.map\ndist/views/shared/semantic-graph-edges.d.ts\ndist/views/shared/semantic-graph-edges.d.ts.map\ndist/views/shared/semantic-graph-edges.js\ndist/views/shared/semantic-graph-edges.js.map\ndist/views/shared/semantic-graph-filters.d.ts\ndist/views/shared/semantic-graph-filters.d.ts.map\ndist/views/shared/semantic-graph-filters.js\ndist/views/shared/semantic-graph-filters.js.map\ndist/views/shared/semantic-graph-nodes.d.ts\ndist/views/shared/semantic-graph-nodes.d.ts.map\ndist/views/shared/semantic-graph-nodes.js\ndist/views/shared/semantic-graph-nodes.js.map\ndist/views/shared/semantic-graph.d.ts\ndist/views/shared/semantic-graph.d.ts.map\ndist/views/shared/semantic-graph.js\ndist/views/shared/semantic-graph.js.map\ndist/views/shared/semantic-projection.d.ts\ndist/views/shared/semantic-projection.d.ts.map\ndist/views/shared/semantic-projection.js\ndist/views/shared/semantic-projection.js.map\ndist/views/shared/semantic-query-scope.d.ts\ndist/views/shared/semantic-query-scope.d.ts.map\ndist/views/shared/semantic-query-scope.js\ndist/views/shared/semantic-query-scope.js.map\ndist/views/shared/semantic-query-types.d.ts\ndist/views/shared/semantic-query-types.d.ts.map\ndist/views/shared/semantic-query-types.js\ndist/views/shared/semantic-query-types.js.map\ndist/views/shared/usage-projection.d.ts\ndist/views/shared/usage-projection.d.ts.map\ndist/views/shared/usage-projection.js\ndist/views/shared/usage-projection.js.map\ndist/views/tui/activity-browser.d.ts\ndist/views/tui/activity-browser.d.ts.map\ndist/views/tui/activity-browser.js\ndist/views/tui/activity-browser.js.map\ndist/views/tui/activity-document.d.ts\ndist/views/tui/activity-document.d.ts.map\ndist/views/tui/activity-document.js\ndist/views/tui/activity-document.js.map\ndist/views/tui/activity.d.ts\ndist/views/tui/activity.d.ts.map\ndist/views/tui/activity.js\ndist/views/tui/activity.js.map\ndist/views/tui/analysis.d.ts\ndist/views/tui/analysis.d.ts.map\ndist/views/tui/analysis.js\ndist/views/tui/analysis.js.map\ndist/views/tui/autocomplete-guard.d.ts\ndist/views/tui/autocomplete-guard.d.ts.map\ndist/views/tui/autocomplete-guard.js\ndist/views/tui/autocomplete-guard.js.map\ndist/views/tui/automation-overlay-workflow.d.ts\ndist/views/tui/automation-overlay-workflow.d.ts.map\ndist/views/tui/automation-overlay-workflow.js\ndist/views/tui/automation-overlay-workflow.js.map\ndist/views/tui/automation-rule-panel.d.ts\ndist/views/tui/automation-rule-panel.d.ts.map\ndist/views/tui/automation-rule-panel.js\ndist/views/tui/automation-rule-panel.js.map\ndist/views/tui/automation-rule-presentation.d.ts\ndist/views/tui/automation-rule-presentation.d.ts.map\ndist/views/tui/automation-rule-presentation.js\ndist/views/tui/automation-rule-presentation.js.map\ndist/views/tui/automation-rule-response-editor.d.ts\ndist/views/tui/automation-rule-response-editor.d.ts.map\ndist/views/tui/automation-rule-response-editor.js\ndist/views/tui/automation-rule-response-editor.js.map\ndist/views/tui/command-palette.d.ts\ndist/views/tui/command-palette.d.ts.map\ndist/views/tui/command-palette.js\ndist/views/tui/command-palette.js.map\ndist/views/tui/comparison.d.ts\ndist/views/tui/comparison.d.ts.map\ndist/views/tui/comparison.js\ndist/views/tui/comparison.js.map\ndist/views/tui/composer-view.d.ts\ndist/views/tui/composer-view.d.ts.map\ndist/views/tui/composer-view.js\ndist/views/tui/composer-view.js.map\ndist/views/tui/configuration-credential.d.ts\ndist/views/tui/configuration-credential.d.ts.map\ndist/views/tui/configuration-credential.js\ndist/views/tui/configuration-credential.js.map\ndist/views/tui/configuration-presenters.d.ts\ndist/views/tui/configuration-presenters.d.ts.map\ndist/views/tui/configuration-presenters.js\ndist/views/tui/configuration-presenters.js.map\ndist/views/tui/configuration-responsive-text.d.ts\ndist/views/tui/configuration-responsive-text.d.ts.map\ndist/views/tui/configuration-responsive-text.js\ndist/views/tui/configuration-responsive-text.js.map\ndist/views/tui/configuration-review.d.ts\ndist/views/tui/configuration-review.d.ts.map\ndist/views/tui/configuration-review.js\ndist/views/tui/configuration-review.js.map\ndist/views/tui/configuration-wizard-presentation.d.ts\ndist/views/tui/configuration-wizard-presentation.d.ts.map\ndist/views/tui/configuration-wizard-presentation.js\ndist/views/tui/configuration-wizard-presentation.js.map\ndist/views/tui/configuration-wizard.d.ts\ndist/views/tui/configuration-wizard.d.ts.map\ndist/views/tui/configuration-wizard.js\ndist/views/tui/configuration-wizard.js.map\ndist/views/tui/connection-metadata-editor-actions.d.ts\ndist/views/tui/connection-metadata-editor-actions.d.ts.map\ndist/views/tui/connection-metadata-editor-actions.js\ndist/views/tui/connection-metadata-editor-actions.js.map\ndist/views/tui/connection-metadata-editor-inputs.d.ts\ndist/views/tui/connection-metadata-editor-inputs.d.ts.map\ndist/views/tui/connection-metadata-editor-inputs.js\ndist/views/tui/connection-metadata-editor-inputs.js.map\ndist/views/tui/connection-metadata-editor-model.d.ts\ndist/views/tui/connection-metadata-editor-model.d.ts.map\ndist/views/tui/connection-metadata-editor-model.js\ndist/views/tui/connection-metadata-editor-model.js.map\ndist/views/tui/connection-metadata-editor-presentation.d.ts\ndist/views/tui/connection-metadata-editor-presentation.d.ts.map\ndist/views/tui/connection-metadata-editor-presentation.js\ndist/views/tui/connection-metadata-editor-presentation.js.map\ndist/views/tui/connection-metadata-editor-rendering.d.ts\ndist/views/tui/connection-metadata-editor-rendering.d.ts.map\ndist/views/tui/connection-metadata-editor-rendering.js\ndist/views/tui/connection-metadata-editor-rendering.js.map\ndist/views/tui/connection-metadata-editor.d.ts\ndist/views/tui/connection-metadata-editor.d.ts.map\ndist/views/tui/connection-metadata-editor.js\ndist/views/tui/connection-metadata-editor.js.map\ndist/views/tui/connection-overlay-workflow.d.ts\ndist/views/tui/connection-overlay-workflow.d.ts.map\ndist/views/tui/connection-overlay-workflow.js\ndist/views/tui/connection-overlay-workflow.js.map\ndist/views/tui/connection-setup-actions.d.ts\ndist/views/tui/connection-setup-actions.d.ts.map\ndist/views/tui/connection-setup-actions.js\ndist/views/tui/connection-setup-actions.js.map\ndist/views/tui/connection-setup-rendering.d.ts\ndist/views/tui/connection-setup-rendering.d.ts.map\ndist/views/tui/connection-setup-rendering.js\ndist/views/tui/connection-setup-rendering.js.map\ndist/views/tui/connection-setup.d.ts\ndist/views/tui/connection-setup.d.ts.map\ndist/views/tui/connection-setup.js\ndist/views/tui/connection-setup.js.map\ndist/views/tui/conversation-dialogs.d.ts\ndist/views/tui/conversation-dialogs.d.ts.map\ndist/views/tui/conversation-dialogs.js\ndist/views/tui/conversation-dialogs.js.map\ndist/views/tui/conversation-overlay-actions.d.ts\ndist/views/tui/conversation-overlay-actions.d.ts.map\ndist/views/tui/conversation-overlay-actions.js\ndist/views/tui/conversation-overlay-actions.js.map\ndist/views/tui/conversation-overlay-helpers.d.ts\ndist/views/tui/conversation-overlay-helpers.d.ts.map\ndist/views/tui/conversation-overlay-helpers.js\ndist/views/tui/conversation-overlay-helpers.js.map\ndist/views/tui/conversation-overlays.d.ts\ndist/views/tui/conversation-overlays.d.ts.map\ndist/views/tui/conversation-overlays.js\ndist/views/tui/conversation-overlays.js.map\ndist/views/tui/details.d.ts\ndist/views/tui/details.d.ts.map\ndist/views/tui/details.js\ndist/views/tui/details.js.map\ndist/views/tui/dynamic-autocomplete.d.ts\ndist/views/tui/dynamic-autocomplete.d.ts.map\ndist/views/tui/dynamic-autocomplete.js\ndist/views/tui/dynamic-autocomplete.js.map\ndist/views/tui/entity-browser-layout.d.ts\ndist/views/tui/entity-browser-layout.d.ts.map\ndist/views/tui/entity-browser-layout.js\ndist/views/tui/entity-browser-layout.js.map\ndist/views/tui/entity-browser.d.ts\ndist/views/tui/entity-browser.d.ts.map\ndist/views/tui/entity-browser.js\ndist/views/tui/entity-browser.js.map\ndist/views/tui/execution-target.d.ts\ndist/views/tui/execution-target.d.ts.map\ndist/views/tui/execution-target.js\ndist/views/tui/execution-target.js.map\ndist/views/tui/focused-surface.d.ts\ndist/views/tui/focused-surface.d.ts.map\ndist/views/tui/focused-surface.js\ndist/views/tui/focused-surface.js.map\ndist/views/tui/fork-preview.d.ts\ndist/views/tui/fork-preview.d.ts.map\ndist/views/tui/fork-preview.js\ndist/views/tui/fork-preview.js.map\ndist/views/tui/graph.d.ts\ndist/views/tui/graph.d.ts.map\ndist/views/tui/graph.js\ndist/views/tui/graph.js.map\ndist/views/tui/help.d.ts\ndist/views/tui/help.d.ts.map\ndist/views/tui/help.js\ndist/views/tui/help.js.map\ndist/views/tui/interaction-automation-response.d.ts\ndist/views/tui/interaction-automation-response.d.ts.map\ndist/views/tui/interaction-automation-response.js\ndist/views/tui/interaction-automation-response.js.map\ndist/views/tui/interaction-decisions.d.ts\ndist/views/tui/interaction-decisions.d.ts.map\ndist/views/tui/interaction-decisions.js\ndist/views/tui/interaction-decisions.js.map\ndist/views/tui/interaction-input-response.d.ts\ndist/views/tui/interaction-input-response.d.ts.map\ndist/views/tui/interaction-input-response.js\ndist/views/tui/interaction-input-response.js.map\ndist/views/tui/interaction-presentation.d.ts\ndist/views/tui/interaction-presentation.d.ts.map\ndist/views/tui/interaction-presentation.js\ndist/views/tui/interaction-presentation.js.map\ndist/views/tui/interaction.d.ts\ndist/views/tui/interaction.d.ts.map\ndist/views/tui/interaction.js\ndist/views/tui/interaction.js.map\ndist/views/tui/keyboard.d.ts\ndist/views/tui/keyboard.d.ts.map\ndist/views/tui/keyboard.js\ndist/views/tui/keyboard.js.map\ndist/views/tui/layout.d.ts\ndist/views/tui/layout.d.ts.map\ndist/views/tui/layout.js\ndist/views/tui/layout.js.map\ndist/views/tui/measurement-display.d.ts\ndist/views/tui/measurement-display.d.ts.map\ndist/views/tui/measurement-display.js\ndist/views/tui/measurement-display.js.map\ndist/views/tui/modal-coordinator.d.ts\ndist/views/tui/modal-coordinator.d.ts.map\ndist/views/tui/modal-coordinator.js\ndist/views/tui/modal-coordinator.js.map\ndist/views/tui/profile-compatibility.d.ts\ndist/views/tui/profile-compatibility.d.ts.map\ndist/views/tui/profile-compatibility.js\ndist/views/tui/profile-compatibility.js.map\ndist/views/tui/profile-editor-actions.d.ts\ndist/views/tui/profile-editor-actions.d.ts.map\ndist/views/tui/profile-editor-actions.js\ndist/views/tui/profile-editor-actions.js.map\ndist/views/tui/profile-editor-rendering.d.ts\ndist/views/tui/profile-editor-rendering.d.ts.map\ndist/views/tui/profile-editor-rendering.js\ndist/views/tui/profile-editor-rendering.js.map\ndist/views/tui/profile-editor.d.ts\ndist/views/tui/profile-editor.d.ts.map\ndist/views/tui/profile-editor.js\ndist/views/tui/profile-editor.js.map\ndist/views/tui/safe-markdown.d.ts\ndist/views/tui/safe-markdown.d.ts.map\ndist/views/tui/safe-markdown.js\ndist/views/tui/safe-markdown.js.map\ndist/views/tui/secret-input.d.ts\ndist/views/tui/secret-input.d.ts.map\ndist/views/tui/secret-input.js\ndist/views/tui/secret-input.js.map\ndist/views/tui/selector.d.ts\ndist/views/tui/selector.d.ts.map\ndist/views/tui/selector.js\ndist/views/tui/selector.js.map\ndist/views/tui/supervisor-actions.d.ts\ndist/views/tui/supervisor-actions.d.ts.map\ndist/views/tui/supervisor-actions.js\ndist/views/tui/supervisor-actions.js.map\ndist/views/tui/terminal-app.d.ts\ndist/views/tui/terminal-app.d.ts.map\ndist/views/tui/terminal-app.js\ndist/views/tui/terminal-app.js.map\ndist/views/tui/terminal-chrome.d.ts\ndist/views/tui/terminal-chrome.d.ts.map\ndist/views/tui/terminal-chrome.js\ndist/views/tui/terminal-chrome.js.map\ndist/views/tui/terminal-command-controller.d.ts\ndist/views/tui/terminal-command-controller.d.ts.map\ndist/views/tui/terminal-command-controller.js\ndist/views/tui/terminal-command-controller.js.map\ndist/views/tui/terminal-compatibility.d.ts\ndist/views/tui/terminal-compatibility.d.ts.map\ndist/views/tui/terminal-compatibility.js\ndist/views/tui/terminal-compatibility.js.map\ndist/views/tui/terminal-drafts.d.ts\ndist/views/tui/terminal-drafts.d.ts.map\ndist/views/tui/terminal-drafts.js\ndist/views/tui/terminal-drafts.js.map\ndist/views/tui/terminal-identity.d.ts\ndist/views/tui/terminal-identity.d.ts.map\ndist/views/tui/terminal-identity.js\ndist/views/tui/terminal-identity.js.map\ndist/views/tui/terminal-input-controller.d.ts\ndist/views/tui/terminal-input-controller.d.ts.map\ndist/views/tui/terminal-input-controller.js\ndist/views/tui/terminal-input-controller.js.map\ndist/views/tui/terminal-interaction-controller.d.ts\ndist/views/tui/terminal-interaction-controller.d.ts.map\ndist/views/tui/terminal-interaction-controller.js\ndist/views/tui/terminal-interaction-controller.js.map\ndist/views/tui/terminal-overlays.d.ts\ndist/views/tui/terminal-overlays.d.ts.map\ndist/views/tui/terminal-overlays.js\ndist/views/tui/terminal-overlays.js.map\ndist/views/tui/terminal-shell.d.ts\ndist/views/tui/terminal-shell.d.ts.map\ndist/views/tui/terminal-shell.js\ndist/views/tui/terminal-shell.js.map\ndist/views/tui/terminal-surface-overlays.d.ts\ndist/views/tui/terminal-surface-overlays.d.ts.map\ndist/views/tui/terminal-surface-overlays.js\ndist/views/tui/terminal-surface-overlays.js.map\ndist/views/tui/terminal-usage.d.ts\ndist/views/tui/terminal-usage.d.ts.map\ndist/views/tui/terminal-usage.js\ndist/views/tui/terminal-usage.js.map\ndist/views/tui/theme.d.ts\ndist/views/tui/theme.d.ts.map\ndist/views/tui/theme.js\ndist/views/tui/theme.js.map\ndist/views/tui/transcript.d.ts\ndist/views/tui/transcript.d.ts.map\ndist/views/tui/transcript.js\ndist/views/tui/transcript.js.map\nLICENSE\npackage.json\nREADME.md\nTHIRD_PARTY_LICENSES.json\nTHIRD_PARTY_NOTICES.md\n\u001b[94mTarball Details\u001b[39m\n/tmp/braid-live-pack-eV8ASJ/tangle-network-braid-0.3.0.tgz\n", + "stderr": "", + "durationMs": 993, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "install": { + "command": "npm", + "args": [ + "install", + "--no-audit", + "--no-fund", + "/tmp/braid-live-pack-eV8ASJ/tangle-network-braid-0.3.0.tgz" + ], + "code": 0, + "signal": null, + "stdout": "\nadded 68 packages in 5s\n", + "stderr": "npm warn deprecated koffi@3.1.4: Unstable Windows builds\nnpm warn allow-scripts 2 packages have install scripts not yet covered by allowScripts:\nnpm warn allow-scripts @dataiku/uv@0.12.0 (postinstall: node install.cjs)\nnpm warn allow-scripts koffi@3.1.4 (install: node ./cnoke.cjs -P . -D src/koffi --prebuild --release)\nnpm warn allow-scripts\nnpm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts ` to allow.\n", + "durationMs": 5311, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "version": { + "command": "/home/drew/.nvm/versions/node/v24.18.0/bin/node", + "args": [ + "/tmp/braid-live-install-bKXPm2/node_modules/@tangle-network/braid/dist/bin/braid.js", + "--version" + ], + "code": 0, + "signal": null, + "stdout": "0.3.0\n", + "stderr": "", + "durationMs": 47, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "artifact": { + "tarball": "tangle-network-braid-0.3.0.tgz", + "sha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325", + "binary": "node_modules/@tangle-network/braid/dist/bin/braid.js" + }, + "provider": { + "package": "@tangle-network/agent-provider-cli-bridge", + "capabilities": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": false, + "append": false + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "analysis": { + "claim": "packed-analysis-readiness-only", + "python": { + "status": "ready", + "readiness": "ready" + }, + "ask": { + "readiness": "ready", + "status": "engine-configured", + "diagnostics": [] + } + }, + "credentialState": { + "configured": true, + "facility": "encrypted-headless", + "targetCount": 4, + "storedCount": 4, + "removedCount": 4 + }, + "error": { + "code": "LIVE_TARGET_FAILED", + "message": "At least one packed live target was failed", + "exitCode": 1, + "details": { + "target": { + "label": "claude-code sonnet", + "target": "claude-code/sonnet", + "profile": { + "path": ".braid/profiles/profile-claude-code-sonnet.json", + "harness": "claude-code", + "model": "sonnet" + }, + "connection": { + "id": "connection-live-cli-bridge", + "kind": "cli-bridge", + "endpoint": "http://127.0.0.1:3355", + "credentialConfigured": true + }, + "providerCapabilities": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": false, + "append": false + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "requests": [ + { + "version": 1, + "requestId": "init-claude-code-sonnet", + "command": "initialize", + "params": { + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", + "subscribe": true + } + }, + { + "version": 1, + "requestId": "send-claude-code-sonnet", + "operationId": "op-live-send-claude-code-sonnet", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK" + } + }, + { + "version": 1, + "requestId": "cancel-send-claude-code-sonnet", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + }, + { + "version": 1, + "requestId": "cancel-claude-code-sonnet", + "operationId": "op-live-cancel-claude-code-sonnet", + "command": "cancel_run", + "params": { + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "reason": "live packed smoke cancellation" + } + } + ], + "operation": "cli-bridge.target-smoke", + "credentialLifecycle": { + "configured": true, + "stored": true, + "removed": true, + "facility": "encrypted-headless" + }, + "initialize": { + "version": 1, + "type": "ack", + "requestId": "init-claude-code-sonnet", + "revision": 4, + "command": "initialize" + }, + "conversationId": "conv-1", + "branchId": "branch-1", + "initialCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "send": { + "version": 1, + "type": "ack", + "requestId": "send-claude-code-sonnet", + "operationId": "op-live-send-claude-code-sonnet", + "revision": 4, + "replayed": false, + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "admission": { + "version": 1, + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "turnId": "turn-df965174-25ce-4080-ad08-32247f7bb757", + "operationId": "op-live-send-claude-code-sonnet", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:20:55.662Z", + "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "profile": { + "name": "Braid live claude-code/sonnet", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "sonnet", + "reasoningEffort": "none" + }, + "harness": "claude-code" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "sonnet", + "runner": "claude-code" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", + "model": "sonnet", + "route": "claude-code/sonnet", + "runner": "claude-code", + "providerRunId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b", + "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", + "materializationDigest": "fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356", + "digest": "3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345" + }, + "command": "send" + }, + "activeCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": true, + "source": "runtime" + }, + "run.queue": { + "available": true, + "source": "provider" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": true, + "source": "provider" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconnecting it" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconciling it" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "normal": { + "status": "completed", + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "run": { + "id": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "turnId": "turn-df965174-25ce-4080-ad08-32247f7bb757", + "operationId": "op-live-send-claude-code-sonnet", + "status": "completed", + "startedAt": "2026-08-29T00:20:55.674Z", + "updatedAt": "2026-08-29T00:21:02.681Z", + "terminalAt": "2026-08-29T00:21:02.681Z", + "durationMs": 7007, + "inputTokens": 2, + "outputTokens": 30, + "tokensKnown": true, + "usdKnown": true, + "tokenStatus": "complete", + "costUsd": 0.0985582, + "costStatus": "reported", + "model": "claude-code/sonnet", + "provider": "cli-bridge", + "runner": "claude-code", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "environmentId": "environment-bd696f804a820bccca863d4b312600d9", + "controlRef": { + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd", + "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "executionId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "requestDigest": "sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b" + }, + "materializationDigest": "fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356", + "cursor": "1:0", + "cursorCommittedSequence": 12, + "contentBytes": 83 + }, + "assistant": { + "id": "message-8d48ace7-c0fb-4669-8764-b66e64f597fa", + "role": "assistant", + "text": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "status": "complete", + "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "parts": [ + { + "id": "op-live-send-claude-code-sonnet:text", + "kind": "text", + "text": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "sourceEventId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final" + } + ] + }, + "finalText": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "marker": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK" + }, + "cancel": { + "prompt": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-claude-code-sonnet", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "revision": 14, + "replayed": false, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "admission": { + "version": 1, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:21:04.446Z", + "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", + "requested": { + "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live claude-code/sonnet", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "claude-code" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "sonnet", + "runner": "claude-code" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", + "model": "sonnet", + "route": "claude-code/sonnet", + "runner": "claude-code", + "providerRunId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f", + "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", + "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5", + "digest": "d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1" + }, + "command": "send" + }, + "advertisedByProvider": false, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "activeRun": { + "id": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "status": "streaming", + "startedAt": "2026-08-29T00:21:04.457Z", + "updatedAt": "2026-08-29T00:21:04.457Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "sonnet", + "provider": "cli-bridge", + "runner": "claude-code", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-claude-code-sonnet", + "revision": 25, + "operationId": "op-live-cancel-claude-code-sonnet", + "command": "cancel_run", + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "control": "cancel", + "outcome": "unknown", + "replayed": false + }, + "attemptedRun": true, + "status": "advertised-but-not-terminal-cancelled" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": false, + "advertisedByBraid": false, + "advertised": false, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "error": { + "code": "LIVE_CAPABILITY_CONTRADICTION", + "message": "cancel capability reported advertised-but-not-terminal-cancelled; expected verified", + "exitCode": 1, + "details": { + "name": "cancel", + "status": "advertised-but-not-terminal-cancelled", + "advertised": true, + "capability": { + "prompt": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-claude-code-sonnet", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "revision": 14, + "replayed": false, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "admission": { + "version": 1, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T00:21:04.446Z", + "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", + "requested": "[depth-limited]", + "capabilities": "[depth-limited]", + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationReceipt": "[depth-limited]", + "admissionStatus": "admitted", + "requestDigest": "95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f", + "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", + "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5", + "digest": "d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1" + }, + "command": "send" + }, + "advertisedByProvider": false, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "activeRun": { + "id": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", + "operationId": "op-live-cancel-send-claude-code-sonnet", + "status": "streaming", + "startedAt": "2026-08-29T00:21:04.457Z", + "updatedAt": "2026-08-29T00:21:04.457Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "sonnet", + "provider": "cli-bridge", + "runner": "claude-code", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-claude-code-sonnet", + "revision": 25, + "operationId": "op-live-cancel-claude-code-sonnet", + "command": "cancel_run", + "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "control": "cancel", + "outcome": "unknown", + "replayed": false + }, + "attemptedRun": true, + "status": "advertised-but-not-terminal-cancelled" + } + } + }, + "status": "failed", + "stderr": "", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-claude-code-sonnet\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-claude-code-sonnet\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:53.785Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:53.785Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-claude-code-sonnet\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"revision\":4,\"replayed\":false,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"version\":1,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:20:55.662Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"digest\":\"3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"admission\":{\"version\":1,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:20:55.662Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"digest\":\"3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-claude-code-sonnet-87321068a54f8558de6d48df\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"87321068a54f8558de6d48dfc4ff071df6baa38536027ebb340caefeeb9deac6\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:20:55.684Z\",\"updatedAt\":\"2026-08-29T00:20:55.684Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"runId\":\"retained-intent-run:ab8d1d38943421a8bbfd85b56f698d10ca900a8f8d152a504a0ac7e3f9310f30\",\"requestedProfileDigest\":\"sha256:3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requestDigest\":\"sha256:ab8d1d38943421a8bbfd85b56f698d10ca900a8f8d152a504a0ac7e3f9310f30\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-claude-code-sonnet\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:20:55.674Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"activeRuns\":[{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"running\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\"},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"startedAt\":\"2026-08-29T00:20:55.674Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:20:57.505Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:20:57.505Z\"},\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"provider\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:20:57.505Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"1:0\",\"providerSequence\":2,\"cursor\":\"1:0\",\"receivedAt\":\"2026-08-29T00:21:00.866Z\"},\"part\":{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"1:0\"},\"delta\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:21:02.680Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"usage\":{\"input\":2,\"output\":30,\"costUsd\":0.0985582,\"model\":\"claude-code/sonnet\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-claude-code-sonnet-87321068a54f8558de6d48df\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"87321068a54f8558de6d48dfc4ff071df6baa38536027ebb340caefeeb9deac6\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T00:20:55.684Z\",\"updatedAt\":\"2026-08-29T00:21:02.701Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-claude-code-sonnet\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:20:57.505Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:20:57.505Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"2\"},{\"label\":\"output tokens\",\"value\":\"30\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"cost measurement\",\"value\":\"reported\"},{\"label\":\"model\",\"value\":\"claude-code/sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"revision\":14,\"replayed\":false,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"version\":1,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:21:04.446Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\",\"digest\":\"d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:21:04.446Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\",\"digest\":\"d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-claude-code-sonnet-e5f36571f043cb843a861455\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"e5f36571f043cb843a86145559563c6deb2f514f3274456ba1b25013bb90023a\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:21:04.466Z\",\"updatedAt\":\"2026-08-29T00:21:04.466Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"runId\":\"retained-intent-run:8bb3bcc8b1058253c5051a664a25e3c6af5f9932209834a5284b49f39f73313f\",\"requestedProfileDigest\":\"sha256:3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requestDigest\":\"sha256:8bb3bcc8b1058253c5051a664a25e3c6af5f9932209834a5284b49f39f73313f\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"revision\":16,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":16,\"sequence\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:04.457Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"running\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\"},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"activeRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:20:57.505Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:20:57.505Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-claude-code-sonnet\",\"revision\":25,\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"command\":\"cancel_run\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"outcome\":\"unknown\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-claude-code-sonnet-5515b6e8bbbfda20731ac558\",\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"5515b6e8bbbfda20731ac558c4952513a35ddfa7164a25a81e758a72c9aa690d\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:21:04.530Z\",\"updatedAt\":\"2026-08-29T00:21:04.530Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"source\":{\"eventId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:21:06.253Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:21:02.719Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:21:06.253Z\"},\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"provider\":{\"eventId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:21:06.253Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-claude-code-sonnet-5515b6e8bbbfda20731ac558\",\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"5515b6e8bbbfda20731ac558c4952513a35ddfa7164a25a81e758a72c9aa690d\",\"kind\":\"custom\",\"status\":\"unknown\",\"attempt\":1,\"outcomeDigest\":\"d0751b0e8ce25e30d2d826f1285ade45916c988dc0790be969fe898e27675605\",\"createdAt\":\"2026-08-29T00:21:04.530Z\",\"updatedAt\":\"2026-08-29T00:21:06.328Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"unknown\",\"detail\":\"CONTROL_OUTCOME_UNKNOWN\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.unknown\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"completeness\":\"unknown\",\"error\":\"Cancellation outcome could not be confirmed by the provider\"}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-claude-code-sonnet\",\"revision\":27,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":27,\"sequence\":27,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:06.347Z\",\"terminalAt\":\"2026-08-29T00:21:06.347Z\",\"durationMs\":1890,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"unknown\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[],\"lastError\":\"Cancellation outcome could not be confirmed by the provider\"},\"view\":{\"revision\":27,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"unknown\",\"statusText\":\"Cancellation outcome could not be confirmed by the provider\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"elapsedMs\":1890},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"unknown\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:21:06.253Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"unknown\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"unknown\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:lifecycle:local:unknown\",\"kind\":\"system\",\"title\":\"unknown\",\"status\":\"unknown\",\"detail\":\"Cancellation outcome could not be confirmed by the provider\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"unknown\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"unknown\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:21:06.253Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"unknown\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":true,\"source\":\"provider\"},\"run.reconcile\":{\"available\":true,\"source\":\"provider\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-claude-code-sonnet-e5f36571f043cb843a861455\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"e5f36571f043cb843a86145559563c6deb2f514f3274456ba1b25013bb90023a\",\"kind\":\"send\",\"status\":\"unknown\",\"attempt\":1,\"outcomeDigest\":\"d750ff0ec5ea61710ac8c366de9bad4d95a0636b9706f791721107881db4e8ac\",\"createdAt\":\"2026-08-29T00:21:04.466Z\",\"updatedAt\":\"2026-08-29T00:21:06.359Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"revision\":28,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":28,\"sequence\":28,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:06.347Z\",\"terminalAt\":\"2026-08-29T00:21:06.347Z\",\"durationMs\":1890,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"unknown\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[],\"lastError\":\"Cancellation outcome could not be confirmed by the provider\"},\"view\":{\"revision\":28,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"unknown\",\"statusText\":\"Cancellation outcome could not be confirmed by the provider\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"elapsedMs\":1890},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"unknown\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:21:06.253Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"unknown\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"unknown\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:lifecycle:local:unknown\",\"kind\":\"system\",\"title\":\"unknown\",\"status\":\"unknown\",\"detail\":\"Cancellation outcome could not be confirmed by the provider\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"unknown\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"unknown\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:21:06.253Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"unknown\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":true,\"source\":\"provider\"},\"run.reconcile\":{\"available\":true,\"source\":\"provider\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", + "process": { + "processIdentity": { + "instanceId": "4657286f-7f8b-4600-b17c-ffb56a0d099b", + "pid": 2246415, + "startedAt": 1787962853162 + }, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2246415 + ], + "roots": [ + 2246415 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "natural": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2246415 + ], + "roots": [ + 2246415 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": 0, + "signal": null + } + } + } + } + }, + "cleanup": { + "ok": true, + "results": [ + { + "path": "/tmp/braid-live-pack-eV8ASJ", + "removed": true + }, + { + "path": "/tmp/braid-live-install-bKXPm2", + "removed": true + }, + { + "path": "/tmp/braid-live-targets-t25Lze", + "removed": true + } + ] + }, + "status": "failed", + "exitCode": 1, + "finishedAt": "2026-08-29T00:25:23.281Z" +} diff --git a/artifacts/verification/live/tangle-live-07-rerun.json b/artifacts/verification/live/tangle-live-07-rerun.json new file mode 100644 index 00000000..6c183cf4 --- /dev/null +++ b/artifacts/verification/live/tangle-live-07-rerun.json @@ -0,0 +1 @@ +{"schemaVersion":"braid.tangle-sandbox-braid-soak.v1","status":"failed","startedAt":"2026-08-29T00:39:53.691Z","completedAt":"2026-08-29T00:40:22.387Z","requestedRuns":3,"attemptedRuns":1,"concurrency":2,"stoppedAfterCanary":true,"failures":["attempted 1 of 3 requested runs","run 1 did not pass exact proof","run 1: status was not passed"],"cleanup":{"exactProofs":1,"exactResourcesRemaining":0,"resourceProofsUnavailable":0,"activeResourceDelta":0,"activeResourceDeltas":[0]},"accountUsage":{"complete":true,"before":{"computeMinutes":146,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":7,"totalSandboxes":14386,"periodStart":{},"periodEnd":{}},"after":{"computeMinutes":146,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":7,"totalSandboxes":14387,"periodStart":{},"periodEnd":{}},"delta":{"activeSandboxes":0,"totalSandboxes":1,"computeMinutes":0,"gpuSeconds":0,"gpuCostUsd":0,"unknownFields":[]}},"latency":{"totalMs":{"n":1,"min":28694.776799000003,"median":28694.776799000003,"p90":28694.776799000003,"max":28694.776799000003},"phases":{}},"sessionSpend":"[REDACTED]","attempts":[{"index":0,"completionSequence":0,"startedAt":"2026-08-29T00:39:53.691Z","completedAt":"2026-08-29T00:40:22.387Z","requireZeroActiveResourceDelta":false,"proof":{"schemaVersion":"braid.tangle-sandbox-braid-stress.v1","proofId":"braid-cloud-stress-1787963993692-2309136-e3a16660","config":{"endpoint":"https://sandbox.tangle.tools","connectionId":"connection-live-tangle-sandbox","connectionKind":"tangle-sandbox","credentialConfigured":true,"model":"tangle-router/glm-5.2","runner":"opencode","lifecycle":"retained","idleTtlSeconds":1800},"timing":{"totalMs":28694.776799000003},"processes":{"binarySha256":"141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f"},"status":"failed","cleanup":{"exactResource":true,"mode":"exact-owned-resource-set","identity":{"confirmed":true,"mode":"exact-owned-resource-set","matchedCount":1,"removedIds":["sandbox-e1df5e0d9f98"],"deletions":[{"id":"sandbox-e1df5e0d9f98","attempts":["[TRUNCATED]"],"confirmed":true}],"remainingIds":[]},"activeResourceDelta":0,"activeResourceDeltaRequired":false,"accountUsageScope":"account-wide","accountUsageAttribution":"unattributed-shared-usage","usageObservationComplete":true,"usageDelta":{"activeSandboxes":0,"totalSandboxes":1,"computeMinutes":0,"gpuSeconds":0,"gpuCostUsd":0,"unknownFields":[]}},"usage":[{"phase":"before","status":"[REDACTED]","value":"[CIRCULAR]"},{"phase":"after","status":"[REDACTED]","value":"[CIRCULAR]"}],"accountIdentities":[{"phase":"before","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}},{"phase":"after","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}}],"accountIdentityConsistency":{"stable":true,"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46"},"workspaceVerification":null,"progress":{"firstRunId":"run-74463b8e-7bcb-4af2-84ba-9108387c89cd","providerEnvironmentId":"sandbox-e1df5e0d9f98","firstControlRef":{"runId":"run-74463b8e-7bcb-4af2-84ba-9108387c89cd","provider":"tangle-sandbox","environmentId":"sandbox-e1df5e0d9f98","sessionId":"[REDACTED]","executionId":"run-74463b8e-7bcb-4af2-84ba-9108387c89cd","requestDigest":"sha256:9322c83217b50aecc0b93ac60ee56dceef27b5f02b35d7af32ee94f4b593fe49"},"resumeFromCursor":"13"},"failure":{"name":"Error","message":"reconnect failed: CAPABILITY_UNAVAILABLE: Detach the active run before reconnecting it","fingerprint":{"name":"Error"}},"diagnostics":{"freshProcess":{"responseCount":3,"run":{"id":"run-74463b8e-7bcb-4af2-84ba-9108387c89cd","operationId":"op-braid-cloud-stress-1787963993692-2309136-e3a16660-turn-1","status":"reconnecting","environmentId":"environment-71b349da5d2af5953b1b48ea77d83208","providerSessionId":"[REDACTED]","materializationDigest":"7056f78561fcb92f793b4854eb6278fa3eeb1e347b8f3b1ce47679b7515fbd77","cursor":"13","observations":{"localEnvironmentId":"environment-71b349da5d2af5953b1b48ea77d83208","providerEnvironmentId":"sandbox-e1df5e0d9f98","environmentRecord":{"id":"[TRUNCATED]","connectionId":"[TRUNCATED]","kind":"[TRUNCATED]","provider":"[TRUNCATED]","providerEnvironmentId":"[TRUNCATED]","lifecycle":"[TRUNCATED]","lifecycleMode":"[TRUNCATED]","cleanup":"[TRUNCATED]","continuity":"[TRUNCATED]","location":"[TRUNCATED]","runtimeEndpointHost":"[TRUNCATED]","storagePersistence":"[TRUNCATED]","accountUsage":"[TRUNCATED]","unavailableTelemetry":"[TRUNCATED]","createdAt":"[TRUNCATED]","updatedAt":"[TRUNCATED]"},"run":{"inputTokens":"[TRUNCATED]","outputTokens":"[TRUNCATED]","reasoningTokens":"[TRUNCATED]","cacheReadTokens":"[TRUNCATED]","cacheWriteTokens":"[TRUNCATED]","costUsd":"[TRUNCATED]","costStatus":"[TRUNCATED]","usage":"[TRUNCATED]","cost":"[TRUNCATED]","tokensKnown":"[TRUNCATED]","usdKnown":"[TRUNCATED]","usageCompleteness":"[TRUNCATED]","latencyMs":"[TRUNCATED]","durationMs":"[TRUNCATED]","model":"[TRUNCATED]","provider":"[TRUNCATED]","runner":"[TRUNCATED]","operationId":"[TRUNCATED]","profileSnapshotId":"[TRUNCATED]","connectionId":"[TRUNCATED]","providerSessionId":"[REDACTED]","environmentId":"[TRUNCATED]","replayCursor":"[TRUNCATED]","lastCursor":"[TRUNCATED]","lastProviderSequence":"[TRUNCATED]","eventCount":"[TRUNCATED]","contentBytes":"[TRUNCATED]","contentTruncated":"[TRUNCATED]","missingSequence":"[TRUNCATED]","terminalReason":"[TRUNCATED]","materializationDigest":"[TRUNCATED]","complete":"[TRUNCATED]","status":"[TRUNCATED]","error":"[TRUNCATED]","startedAt":"[TRUNCATED]","updatedAt":"[TRUNCATED]","terminalAt":"[TRUNCATED]","placement":"[TRUNCATED]","resourceSample":"[TRUNCATED]","requestedResources":"[TRUNCATED]","machineId":"[TRUNCATED]","runtimeEndpointHost":"[TRUNCATED]","requestedRegion":"[TRUNCATED]","verifiedRegion":"[TRUNCATED]","storagePersistence":"[TRUNCATED]","gpu":"[TRUNCATED]"},"environment":{"kind":"[TRUNCATED]","providerEnvironmentId":"[TRUNCATED]","provider":"[TRUNCATED]","name":"[TRUNCATED]","lifecycle":"[TRUNCATED]","lifecycleMode":"[TRUNCATED]","cleanup":"[TRUNCATED]","continuity":"[TRUNCATED]","location":"[TRUNCATED]","region":"[TRUNCATED]","runtimeEndpointHost":"[TRUNCATED]","machineId":"[TRUNCATED]","requestedRegion":"[TRUNCATED]","verifiedRegion":"[TRUNCATED]","storagePersistence":"[TRUNCATED]","requestedResources":"[TRUNCATED]","resourceSample":"[TRUNCATED]","gpu":"[TRUNCATED]","accountUsage":"[TRUNCATED]","unavailableTelemetry":"[TRUNCATED]","placement":"[TRUNCATED]","repository":"[TRUNCATED]","gitRef":"[TRUNCATED]","workingDirectory":"[TRUNCATED]","image":"[TRUNCATED]","createdAt":"[TRUNCATED]","startedAt":"[TRUNCATED]","lastActivityAt":"[TRUNCATED]","expiresAt":"[TRUNCATED]","updatedAt":"[TRUNCATED]"}}},"errors":[{"requestId":"braid-live-reconnect-834f6a2a-9fdc-4309-ab2d-435e7558dec1","code":"CAPABILITY_UNAVAILABLE","message":"Detach the active run before reconnecting it"}]}},"failureProcessCleanup":{"fresh":{"cleanupStatus":"term","exited":true,"descendantsVerified":true,"exit":{"code":null,"signal":"SIGTERM"}}}}}]} diff --git a/scripts/live-bridge/constants.mjs b/scripts/live-bridge/constants.mjs index fb7117c7..241d1ea0 100644 --- a/scripts/live-bridge/constants.mjs +++ b/scripts/live-bridge/constants.mjs @@ -47,13 +47,14 @@ export const targetDefinitions = Object.freeze([ ]) export const livePrompts = Object.freeze({ - normal: (key) => `Reply with exactly LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_OK.`, + normal: (key) => + `Output only this token, with no punctuation or explanation: LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_OK`, cancel: (key) => `For LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.`, handoffSource: (key) => - `Reply with exactly LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_HANDOFF_SOURCE_OK.`, + `Output only this token, with no punctuation or explanation: LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_HANDOFF_SOURCE_OK`, handoffDestination: (key) => - `Reply with exactly LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_HANDOFF_OK.`, + `Output only this token, with no punctuation or explanation: LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_HANDOFF_OK`, interactive: (key) => `Ask one user-visible permission question before completing LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_INTERACTIVE_OK.`, restart: (key) => diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index e927a058..cf95534d 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -916,6 +916,21 @@ test('nested credential fields and error text are redacted before public output' assert.match(nestedMessage, /\[REDACTED\]/u) }) +test('public JSON redaction preserves field names', () => { + const output = safeJson( + { + status: 'completed', + startedAt: '2026-08-28T00:00:00.000Z', + completedAt: '2026-08-28T00:00:01.000Z', + }, + { TANGLE_API_KEY: 'completed' }, + ) + const parsed = JSON.parse(output) + assert.equal(parsed.status, '[REDACTED]') + assert.equal(parsed.startedAt, '2026-08-28T00:00:00.000Z') + assert.equal(parsed.completedAt, '2026-08-28T00:00:01.000Z') +}) + test('retained Sandbox error details are safe for direct proof output', () => { const secret = 'retained-sandbox-error-secret-canary-4f8c' const networkError = Object.assign(new Error(`transport failed ${secret}`), { diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index c03e2e93..190e419d 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -937,7 +937,7 @@ export function safeJson(value, environment = process.env) { } catch { serialized = JSON.stringify({ status: 'unavailable', reason: '[UNAVAILABLE]' }) } - return redactText(serialized === undefined ? 'null' : serialized, secrets) + return serialized === undefined ? 'null' : serialized } export function endpointEvidence(value) { diff --git a/scripts/live-required/tangle-sandbox-braid-stress.mjs b/scripts/live-required/tangle-sandbox-braid-stress.mjs index fb9949b9..100cbf89 100644 --- a/scripts/live-required/tangle-sandbox-braid-stress.mjs +++ b/scripts/live-required/tangle-sandbox-braid-stress.mjs @@ -1874,6 +1874,10 @@ export async function runBraidSandboxStress({ config: config ? configEvidence(config) : undefined, timing: phases, }), + processes: { + ...(result?.processes ?? {}), + binarySha256: result?.processes?.binarySha256 ?? binarySha256 ?? null, + }, status: failure === undefined && cleanupError === undefined && From 72153991a402251bc741cc1228c02bb60c23c01b Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 01:20:14 -0600 Subject: [PATCH 052/136] feat(product): finish retained multi-run workflows --- .../2026-08-28T21-44-00Z/findings.jsonl | 1 + .../2026-08-28T21-44-00Z/manifest.json | 19 + .../2026-08-28T21-44-00Z/summary.md | 31 + .../2026-08-28-orchestrate-braid-10.md | 87 + .agent/release-progress.md | 103 + .agent/skill-runs.jsonl | 15 + THIRD_PARTY_LICENSES.json | 4 + .../live/bridge/native-continuation.json | 388 ++ .../live/bridge/pi-canonical-current.json | 3524 ++++++++++++++++ .../live/bridge/pi-interaction-current.json | 1947 +++++++++ ...aid-multirun-production-1787978842355.json | 1 + ...raid-stress-current-canary-proc-fixed.json | 1 + ...raid-stress-current-cohort-proc-fixed.json | 1 + artifacts/verification/w6/120x40-plain.txt | 2 +- artifacts/verification/w6/120x40.png | Bin 22570 -> 22649 bytes artifacts/verification/w6/120x40.txt | 2 +- artifacts/verification/w6/200x60-plain.txt | 2 +- artifacts/verification/w6/200x60.png | Bin 10412 -> 10379 bytes artifacts/verification/w6/200x60.txt | 2 +- artifacts/verification/w6/40x12-plain.txt | 2 +- artifacts/verification/w6/40x12.png | Bin 14275 -> 14275 bytes .../verification/w6/80x24-automation.gif | Bin 22889 -> 22889 bytes artifacts/verification/w6/80x24-plain.txt | 2 +- .../w6/80x24-transcript-keyboard.gif | Bin 370867 -> 357540 bytes artifacts/verification/w6/80x24.png | Bin 18510 -> 18510 bytes .../verification/w6/capture-manifest.json | 146 +- artifacts/verification/w6/package-proof.json | 3726 ++++++++++------- .../w6/raw/transcript-keyboard.cast | 135 +- .../w6/states/active-streaming.json | 32 +- .../w6/states/active-streaming.png | Bin 15309 -> 15091 bytes .../w6/states/active-streaming.txt | 2 +- .../verification/w6/states/analysis.json | 2 +- artifacts/verification/w6/states/analysis.png | Bin 58389 -> 58389 bytes .../verification/w6/states/automation.json | 2 +- .../verification/w6/states/automation.png | Bin 4156 -> 4156 bytes .../w6/states/command-palette-120.json | 2 +- .../w6/states/command-palette-120.png | Bin 36822 -> 36822 bytes .../w6/states/command-palette-40.json | 2 +- .../w6/states/command-palette-40.png | Bin 9482 -> 9482 bytes .../w6/states/command-palette-80.json | 2 +- .../w6/states/command-palette-80.png | Bin 35276 -> 35276 bytes .../verification/w6/states/comparison.json | 2 +- .../verification/w6/states/comparison.png | Bin 64782 -> 64782 bytes artifacts/verification/w6/states/empty.json | 2 +- artifacts/verification/w6/states/empty.png | Bin 5782 -> 5782 bytes .../w6/states/failure-or-reconnect.json | 40 +- .../w6/states/failure-or-reconnect.png | Bin 18786 -> 18786 bytes .../verification/w6/states/fork-preview.json | 2 +- .../verification/w6/states/fork-preview.png | Bin 9878 -> 9878 bytes .../w6/states/graph-or-analysis.json | 2 +- .../w6/states/graph-or-analysis.png | Bin 20641 -> 20641 bytes .../verification/w6/states/interaction.json | 2 +- .../verification/w6/states/interaction.png | Bin 28820 -> 28820 bytes .../verification/w6/states/multi-run.json | 413 +- .../verification/w6/states/multi-run.png | Bin 24852 -> 24549 bytes .../verification/w6/states/multi-run.txt | 6 +- artifacts/verification/w6/states/narrow.json | 2 +- artifacts/verification/w6/states/narrow.png | Bin 9639 -> 9639 bytes artifacts/verification/w6/states/profile.json | 2 +- artifacts/verification/w6/states/profile.png | Bin 6355 -> 6355 bytes .../verification/w6/states/supervision.json | 77 +- .../verification/w6/states/supervision.png | Bin 25615 -> 24507 bytes .../verification/w6/states/supervision.txt | 8 +- docs/02-experience-specification.md | 4 +- docs/08-verification.md | 6 +- package.json | 7 +- pnpm-lock.yaml | 200 +- pnpm-workspace.yaml | 10 +- scripts/capture-visual-definitions.mjs | 3 + scripts/live-bridge/config.mjs | 4 +- scripts/live-bridge/constants.mjs | 15 + scripts/live-bridge/endpoint.mjs | 41 +- scripts/live-bridge/evidence.mjs | 3 +- scripts/live-bridge/main.mjs | 31 +- scripts/live-bridge/matrix.mjs | 13 +- scripts/live-bridge/native-continuation.mjs | 1378 ++++++ scripts/live-bridge/process-tree.mjs | 48 +- scripts/live-bridge/protocol.mjs | 35 +- scripts/live-bridge/release-operations.mjs | 176 +- .../live-bridge/release-proof-validation.mjs | 62 +- .../release-proof-validation.test.mjs | 268 +- scripts/live-bridge/release-proofs.mjs | 24 +- scripts/live-bridge/target-actions.mjs | 18 +- scripts/live-bridge/target-flow.mjs | 20 +- scripts/live-required/multirun-contract.mjs | 5 +- .../tangle-sandbox-braid-multirun.mjs | 4 +- .../tangle-sandbox-braid-multirun.test.mjs | 4 +- scripts/package-proof-parity.mjs | 46 +- scripts/package-proof-trace.mjs | 45 + scripts/performance/memory-child.mjs | 16 +- scripts/performance/process-measurements.mjs | 6 +- .../runtime/agent-runtime-execution.ts | 2 +- src/adapters/runtime/lazy-execution.ts | 30 +- .../runtime/retained-execution-contract.ts | 15 +- .../runtime/retained-execution-projection.ts | 25 +- .../runtime/retained-execution-stream.ts | 6 +- src/adapters/runtime/retained-execution.ts | 73 +- .../runtime/retained-native-continuation.ts | 64 +- src/adapters/tui/application-ui-controller.ts | 4 +- src/adapters/tui/ui-capabilities.ts | 43 +- src/adapters/tui/ui-command-dispatch.ts | 15 +- src/adapters/tui/ui-projection.ts | 20 +- src/adapters/tui/ui-view-model.ts | 64 +- src/app/application-interaction-actions.ts | 88 +- src/app/application.ts | 30 +- src/app/automation-actions.ts | 82 +- src/app/composition-options.ts | 27 + src/app/composition.ts | 219 +- src/app/conversation-branch-effects.ts | 36 +- src/app/conversation-branches.ts | 39 +- src/app/conversation-composition.ts | 2 + src/app/conversation-types.ts | 3 + src/app/default-profiles.ts | 18 + src/app/interaction-controller.ts | 128 +- src/app/interaction-response-replay.ts | 32 +- src/app/run-admission-context.ts | 116 + src/app/run-admission-validation.ts | 48 +- src/app/run-event-mapper.ts | 25 +- src/domain/interaction-identity.ts | 9 + src/domain/invariants-run.ts | 27 +- src/domain/legacy-interaction-snapshot.ts | 147 +- src/domain/reducer-interactions.ts | 34 +- src/domain/reducer-lifecycle.ts | 15 +- src/domain/runtime-projection.ts | 2 + src/domain/state.ts | 10 + src/ports/execution.ts | 17 +- src/startup/durable-runtime.ts | 2 +- src/testing/supervision-ui-fixture.ts | 8 + src/views/shared/duration.ts | 3 +- src/views/shared/models.ts | 1 + src/views/shared/semantic-activity.ts | 5 +- src/views/tui/execution-target.ts | 10 +- src/views/tui/profile-compatibility.ts | 4 +- src/views/tui/terminal-chrome.ts | 2 +- src/views/tui/terminal-identity.ts | 2 +- test/cli-bridge-retained-restart.test.ts | 3 + test/cli-startup.test.ts | 20 + test/conversation-branch-effects.test.ts | 142 +- test/conversations.test.ts | 15 +- test/domain-invariants.test.ts | 15 +- test/domain-reducer.test.ts | 87 +- test/intelligence-dispatch.test.ts | 22 +- test/interaction-response-durability.test.ts | 242 +- test/interactions.test.ts | 254 +- test/performance.test.ts | 4 +- test/profile-compatibility-ui.test.ts | 8 +- test/retained-execution-lifecycle.test.ts | 184 +- test/retained-native-continuation.test.ts | 242 +- test/run-admission-architecture.test.ts | 1 + test/run-event-mapper-stream-safety.test.ts | 53 +- test/scripts.test.ts | 75 + test/storage-snapshots.test.ts | 24 +- test/support/runtime-bridge-server.ts | 6 +- test/terminal-responsive.test.ts | 34 +- test/terminal-usage-status.test.ts | 2 +- test/tui-core-workflows.test.ts | 40 + test/tui-native-continuation.test.ts | 6 +- test/w6-ui.test.ts | 2 +- test/w8-runs.test.ts | 116 +- 159 files changed, 13497 insertions(+), 2887 deletions(-) create mode 100644 .agent/critical-audit/2026-08-28T21-44-00Z/findings.jsonl create mode 100644 .agent/critical-audit/2026-08-28T21-44-00Z/manifest.json create mode 100644 .agent/critical-audit/2026-08-28T21-44-00Z/summary.md create mode 100644 .agent/pursuits/2026-08-28-orchestrate-braid-10.md create mode 100644 .agent/release-progress.md create mode 100644 artifacts/verification/live/bridge/native-continuation.json create mode 100644 artifacts/verification/live/bridge/pi-canonical-current.json create mode 100644 artifacts/verification/live/bridge/pi-interaction-current.json create mode 100644 artifacts/verification/live/tangle-sandbox-braid-multirun-production-1787978842355.json create mode 100644 artifacts/verification/live/tangle-sandbox-braid-stress-current-canary-proc-fixed.json create mode 100644 artifacts/verification/live/tangle-sandbox-braid-stress-current-cohort-proc-fixed.json create mode 100644 scripts/live-bridge/native-continuation.mjs create mode 100644 scripts/package-proof-trace.mjs create mode 100644 src/app/composition-options.ts create mode 100644 src/app/default-profiles.ts create mode 100644 src/app/run-admission-context.ts create mode 100644 src/domain/interaction-identity.ts diff --git a/.agent/critical-audit/2026-08-28T21-44-00Z/findings.jsonl b/.agent/critical-audit/2026-08-28T21-44-00Z/findings.jsonl new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.agent/critical-audit/2026-08-28T21-44-00Z/findings.jsonl @@ -0,0 +1 @@ + diff --git a/.agent/critical-audit/2026-08-28T21-44-00Z/manifest.json b/.agent/critical-audit/2026-08-28T21-44-00Z/manifest.json new file mode 100644 index 00000000..dfdfc4ea --- /dev/null +++ b/.agent/critical-audit/2026-08-28T21-44-00Z/manifest.json @@ -0,0 +1,19 @@ +{ + "scope": "LIVE-07 and LIVE-08 provider-bound cloud proof changes", + "base": "1dca6db491f9a03f898a0437394d5903598c7434", + "head": "9671907", + "files": [ + "docs/components/README.md", + "docs/components/cloud-proof-observations.md", + "scripts/live-required/contracts.mjs", + "scripts/live-required/tangle-sandbox-braid-interactive.mjs", + "scripts/live-required/tangle-sandbox-braid-soak.mjs", + "scripts/live-required/tangle-sandbox-braid-stress.mjs", + "test/tangle-live07-wiring.test.mjs", + "test/tangle-sandbox-braid-soak-script.test.mjs" + ], + "projectType": "Node package with live release scripts", + "reviewers": ["A-correctness-security", "B-architecture-performance", "C-real-system-coverage"], + "mode": "serial", + "notInspected": "Unrelated dirty source, package, and verification artifacts were excluded from this commit." +} diff --git a/.agent/critical-audit/2026-08-28T21-44-00Z/summary.md b/.agent/critical-audit/2026-08-28T21-44-00Z/summary.md new file mode 100644 index 00000000..d30122cb --- /dev/null +++ b/.agent/critical-audit/2026-08-28T21-44-00Z/summary.md @@ -0,0 +1,31 @@ +# Audit: LIVE-07/LIVE-08 provider-bound proofs — 1dca6db..9671907 — n=8 files, 0 findings + +**Verdict:** APPROVE — changed proof paths reject unverified provider evidence · 0 CRITICAL / 0 HIGH / 0 MEDIUM / 0 LOW +**Worst:** none — no reproducible defect remained in the changed scope. +**Next:** run protected Sandbox LIVE-07/LIVE-08 provider probes before release. + +## Scope + +| Field | Value | +|---|---| +| Files | n=8 via commit diff and explicit changed-file scope | +| Base..head | `1dca6db491f9a03f898a0437394d5903598c7434..9671907` | +| Project type | Node package with live release scripts | +| Reviewers | A,B,C · serial | +| Not inspected | Unrelated dirty source, package, and verification artifacts. | + +## Findings — 0 of 0, ranked + +No changed-scope finding had a reproducible failure scenario after the focused proof suite, syntax check, lint check, diff check, and credential-shaped literal scan. + +## Assumptions & unverified + +| Assumption | Finding it would flip | Check that settles it | +|---|---|---| +| A protected provider run is available for this branch. | Live provider behavior remains unverified. | Run the protected LIVE-07 and LIVE-08 scripts and inspect the redacted receipts. | +| The public Sandbox API preserves the retained workspace files and usage fields. | Provider readback or telemetry could remain unavailable. | Execute the scripts against Sandbox and require their provider-bound checks. | + +## Self-gate + +9/9 passed — failed: none. +1 verdict = decision + 1 number · 2 every finding has file:line · 3 concrete failure scenario · 4 status label · 5 evidence is a pointer · 6 cost both sides · 7 fix + verification per row · 8 zero adjectives standing in for counts · 9 words ≤600 outside tables. diff --git a/.agent/pursuits/2026-08-28-orchestrate-braid-10.md b/.agent/pursuits/2026-08-28-orchestrate-braid-10.md new file mode 100644 index 00000000..427f93ae --- /dev/null +++ b/.agent/pursuits/2026-08-28-orchestrate-braid-10.md @@ -0,0 +1,87 @@ +# Braid completion workflow + +## Objective + +Ship Braid as a production terminal for concurrent, durable agent work. + +The release must start, stream, switch, branch, fork, ask, analyze, supervise, and control parallel sessions through current shared contracts. + +Every component must have an implementation note that describes the smallest general design which satisfies its contract. + +## Structure + +The workflow is a pipeline with one integration barrier. + +Three isolated implementation tracks run in parallel before integration. + +1. Stream safety owns incremental sanitation, durable event safety, replay, cancellation, and output limits. +2. Multi-run product owns concurrent branch runs, focused-run state, controls, terminal workflows, and responsive presentation. +3. Runtime continuity owns retained reconnect, native continuation, exact worker control, and any missing shared runtime contract. + +The integration branch accepts a track only after its narrow tests pass. + +Shared package changes merge and publish before Braid consumes them. + +## Coordination policy + +- Three Luna-max workers write independent implementations in isolated worktrees. +- The operator owns architecture boundaries, integration, live checks, commits, releases, and final claims. +- Workers must extend current contracts and must not add provider-specific execution paths to Braid. +- Every durable event change includes idempotency, restart, and migration coverage. +- Every streaming change includes disconnect, replay, duplicate-event, cancellation, and finalization coverage. +- Every interaction change includes accept, decline, timeout, cancel, and restart coverage. +- Every visible workflow includes keyboard proof and captures at 40x12, 80x24, 120x40, and 200x60. +- A worker can request an upstream change, but the owning package must implement it. +- No track opens a separate Braid pull request. + +## Expected worker count + +Three concurrent workers run in each implementation wave. + +The expected total is 12 to 18 worker turns across implementation, integration repair, live proof, and adversarial review. + +## Waves + +### Wave 1: foundations + +- Make streamed output safe before it enters the journal or reducer. +- Replace the global active-run slot with branch-scoped active work and one explicit focus. +- Reproduce and repair retained Tangle reconnect with preserved failure evidence. +- Adopt the current runtime package only after its required API is proven. + +### Integration barrier + +- Integrate passing commits into one Braid branch. +- Resolve the state, migration, and adapter interfaces once. +- Run contract, type, dependency, performance, security, and full local checks. + +### Wave 2: complete workflows + +- Complete exact native continuation and same-session recovery. +- Complete portable conversation handoff and workspace fork through owning packages. +- Complete trace analysis actions from run details. +- Complete supervisor worker navigation, attach, steer, and acknowledged cancellation. +- Complete the conditional work strip, capability-driven selectors, help navigation, and truthful route copy. +- Create component notes and a complete source-to-component index. + +### Wave 3: proof and delivery + +- Run the current live CLI Bridge and Tangle matrix from packed artifacts. +- Prove concurrent sessions, retained reconnect, interactions, fork, analysis, attach, steer, cancel, cleanup, and replay. +- Capture dark and light terminal evidence at all required sizes. +- Record the changed user flows. +- Run three independent adversarial reviews after all implementation checks pass. +- Fix every valid finding and repeat the affected checks. +- Open one pull request per changed repository. +- Merge and publish dependencies in order. +- Install the published Braid package in a clean directory and repeat the release checks. + +## Synthesis rule + +Prefer one general owning contract over a Braid-only special case. + +Prefer explicit identifiers and immutable projections over inferred global state. + +Reject an implementation if it cannot prove restart, replay, cancellation, capability failure, and bounded resource use where those conditions apply. + +The product is complete only when the published package passes the required live matrix and leaves no owned resource behind. diff --git a/.agent/release-progress.md b/.agent/release-progress.md new file mode 100644 index 00000000..8f4ea3dd --- /dev/null +++ b/.agent/release-progress.md @@ -0,0 +1,103 @@ +# Release Progress + +## Release record + +This file tracks one candidate and its matching public release cohort. +Populate every `not recorded` value from the same release artifact and verification run. +Do not copy a version, integrity value, or live result from an earlier cohort. + +- Candidate Braid package and version: `not recorded` +- Candidate Braid commit: `not recorded` +- Runtime package and version: `not recorded` +- Sandbox package and version: `not recorded` +- Agent Interface package and version: `not recorded` +- Tangle provider package and version: `not recorded` +- Runtime artifact commit and tarball integrity: `not recorded` +- Braid artifact tarball integrity: `not recorded` +- Runtime rollback package and version: `not recorded` +- Braid rollback package and version: `not recorded` +- Registry and live-service environment: public npm and public Tangle services +- Release credentials: protected release environments and `gh-drew` + +## Public dependency cohort + +- Agent Interface: `not recorded`; registry version, owning-repository checks, and publication proof are pending. +- Tangle provider: `not recorded`; registry version, owning-repository checks, and publication proof are pending. +- Sandbox: `not recorded`; registry version, owning-repository checks, and publication proof are pending. +- Runtime: `not recorded`; registry version, owning-repository checks, and publication proof are pending. +- Runtime package integrity: `not recorded`. +- Braid has no file, link, or workspace production dependencies: verify against the final lockfile before publication. + +## Prior cohort record + +The entries below describe the 2026-08-28 checkpoint only. +They are historical evidence and do not describe the current release candidate. + +- Agent Interface `1.7.1` passed 478 of 478 tests before publication. +- Tangle provider `0.14.1` passed 170 of 170 tests before publication. +- Sandbox `0.34.0` came from merged commit `c2abc576520f6303fb26528391c706a150419a33`. +- Runtime `0.177.0` came from merged commit `4b6ff007`. +- Runtime package integrity was `sha512-6UYAtUEmhzluJYe6VL4ECKyNCQD0HAx9sch2W5BTcA5R/ddrlANy5jJ3Sq7TPmm07JeeMq3iolTEfrGgbDPQEw==`. +- Runtime provenance, tag, source, workflow, and isolated installation were verified after publication. + +## Completed Product Work + +- The Work Strip supports concurrent runs, explicit focus, switching, and targeted cancellation. +- Native continuation resumes the selected provider session. +- Cross-runner and cross-workspace forks create new branches without changing agent identity. +- Interaction views support typed answers, acceptance, decline, timeout, cancel, and restart recovery. +- Analysis freezes one run, records cited findings, and preserves promotion decisions. +- Supervisor views project the Runtime worker tree and route steer, cancel, and exact terminal attach. +- Braid suspends its screen during worker attach and delegates terminal transport to Runtime. +- All 51 exported terminal components map to 25 component documents. +- Every component document states its best simple general implementation. +- The UI captures 16 product states and 21 keyboard frames at all four required terminal sizes. + +## Current proof record + +Record each result with its candidate commit, command, date, and artifact path. +Use `not recorded` until the check runs against the release record above. + +- Local package and terminal checks: `not recorded`. +- Provider and Sandbox live checks: `not recorded`. +- Restart, concurrent-session, and interaction checks: `not recorded`. +- Package-to-candidate comparison: `not recorded`. +- Dependency audit and source graph: `not recorded`. + +## LIVE-10 status record + +- Current LIVE-10 result: `not recorded`. +- Current evidence path and artifact: `not recorded`. +- Previous observation from 2026-08-28: Base Sepolia chain `84532` had one active blueprint-12 binary and zero blueprint-12 services. +- Previous observation from 2026-08-28: The advertised operator endpoint did not complete TLS or expose the required API. +- Previous observation from 2026-08-28: The operator host was ARM64, while the published Nitro binary was x86_64. +- Previous observation from 2026-08-28: The host had no Nitro process, Nitro routing, or AWS deployment credentials. +- Previous observation from 2026-08-28: Production Sandbox had no Nitro driver allowlist or Nitro target configuration. +- Previous observation from 2026-08-28: Four temporary host-agent sandboxes were deleted and excluded from confidential proof. +- Release decision: block publication until LIVE-10 passes against the release record above. + +## Remaining Sequence + +1. Finish and verify warm-start performance against the published dependency cohort. +2. Regenerate stable visual captures and inspect every corrected flow. +3. Run the complete local, package, property, performance, and live-provider checks. +4. Run independent architecture, security, UI, and release reviews and fix each valid finding. +5. Merge one Braid pull request after current checks and reviews pass. +6. Publish the candidate package recorded above only after every required live row, including LIVE-10, passes. +7. Download the public Braid package and compare it with the approved candidate. + +## Decision + +- Keep npm `latest` on the last verified release while any required live check is unavailable. +- Merge reusable product and proof improvements when their exact checks pass. +- Do not replace provider proof with fixtures, local Sidecar runs, or host-agent sandboxes. +- Do not describe an unavailable confidential path as shipped. + +## Timeline + +- 2026-08-28: Proved retained Tangle reconnect after forced Braid process termination. +- 2026-08-28: Implemented multi-run focus, continuation, forks, interactions, analysis, and supervisor controls. +- 2026-08-28: Published Agent Interface `1.7.1`, Tangle provider `0.14.1`, Sandbox `0.34.0`, and Runtime `0.177.0`. +- 2026-08-28: Proved the public Sandbox Sidecar input, detach, reconnect, replay, and interaction flow. +- 2026-08-28: Proved two retained Tangle multirun cohorts with exact cleanup. +- 2026-08-28: Confirmed that Base Sepolia has zero blueprint-12 services and no reachable Nitro operator. diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index d69a68c3..26b939c9 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -71,3 +71,18 @@ {"skill":"/product-design","ts":"2026-08-28T10:49:51Z","project":"braid-10-complete","target":"integrated concurrent-run terminal workflow","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/diagnose","ts":"2026-08-28T19:50:09Z","project":"braid-10-complete","target":"Braid local performance f=1/n=16 clusters=1","operatorPrompt":"","durationMin":null,"verdict":"ROOT_CAUSE_CONFIRMED","dispatchedTo":"/autopsy","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/autopsy","ts":"2026-08-28T19:50:09Z","project":"braid-10-complete","target":"Braid controller projection cache","operatorPrompt":"","durationMin":null,"verdict":"INFRA_BUG","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/simplify","ts":"2026-08-28T21:04:05Z","project":"braid-10-complete","target":"shared Braid supervisor snapshot fixtures","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/harden","ts":"2026-08-28T21:24:57Z","project":"braid-10-complete","target":"POSIX escaped-descendant cleanup ownership in Braid live bridge, LIVE07, and LIVE08","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/critical-audit","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/harden","ts":"2026-08-28T21:41:41Z","project":"braid-10-complete","target":"LIVE-07/LIVE-08 provider-bound Sandbox proof hardening: input, reconnect, execution attempts, cleanup, identity, usage, telemetry, spend","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/critical-audit","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/critical-audit","ts":"2026-08-28T21:43:09Z","project":"braid-10-complete","target":"LIVE-07/LIVE-08 provider-bound cloud proof changes n=8 files","operatorPrompt":"","durationMin":null,"verdict":"APPROVE","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/product-design","ts":"2026-08-28T23:32:44Z","project":"braid-10-complete","target":"Braid W6 terminal visual capture","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/ui-test","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/ui-test","ts":"2026-08-28T23:32:45Z","project":"braid-10-complete","target":"Braid W6 terminal keyboard and state captures","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/ground-truth","ts":"2026-08-29T00:13:35Z","project":"braid-10-complete","target":"Braid packed PERF-01..PERF-10 public cohort matrix","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/evolve","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/diagnose","ts":"2026-08-29T00:13:40Z","project":"braid-10-complete","target":"performance command metadata lookup failure f=1/n=1","operatorPrompt":"","durationMin":null,"verdict":"ROOT_CAUSE_CONFIRMED","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/harden","ts":"2026-08-29T01:15:35Z","project":"braid-10-complete","target":"cli-bridge static bearer exposure and consumer rotation","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/verify","ts":"2026-08-29T02:22:58Z","project":"braid-10-complete","target":"native continuation admission lifecycle integration","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"--help","ts":"2026-08-29T03:42:36Z","project":"braid-10-complete","target":"","operatorPrompt":"","durationMin":null,"verdict":"n/a","dispatchedTo":"stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/verify","ts":"2026-08-29T03:42:50Z","project":"braid-10-complete","target":"post-fix full pnpm check, performance cache, PTY and visual proof","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/ui-test","ts":"2026-08-29T03:42:50Z","project":"braid-10-complete","target":"packed W6 terminal captures at 40x12, 80x24, 120x40, 200x60 and keyboard flow","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/verify","ts":"2026-08-29T04:21:54Z","project":"braid-10-complete","target":"Braid release-readiness: tests, checks, PTY, visual captures, package proof, component docs","operatorPrompt":"","durationMin":null,"verdict":"HOLD","dispatchedTo":"/converge","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/harden","ts":"2026-08-29T07:05:42Z","project":"braid-10-complete","target":"Braid interaction response reconciliation and startup ordering","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/critical-audit","operatorOverride":null,"transcriptPath":null,"traceDir":null} diff --git a/THIRD_PARTY_LICENSES.json b/THIRD_PARTY_LICENSES.json index c380ad5b..fa6c99d1 100644 --- a/THIRD_PARTY_LICENSES.json +++ b/THIRD_PARTY_LICENSES.json @@ -77,6 +77,10 @@ "license": "MIT", "name": "@tangle-network/sandbox" }, + { + "license": "Apache-2.0", + "name": "@tangle-network/tcloud-attestation" + }, { "license": "MIT", "name": "@types/proper-lockfile" diff --git a/artifacts/verification/live/bridge/native-continuation.json b/artifacts/verification/live/bridge/native-continuation.json new file mode 100644 index 00000000..c954eedb --- /dev/null +++ b/artifacts/verification/live/bridge/native-continuation.json @@ -0,0 +1,388 @@ +{ + "schema": "braid.live-bridge.native-continuation.v1", + "command": "pnpm test:live:bridge:continuation", + "scope": { + "claims": [ + "admission before terminal output", + "active status and event access", + "exact cancellation", + "cancelled terminal replay", + "byte-identical duplicate admission", + "successful native continuation" + ], + "provider": "real Pi through Tangle Router" + }, + "startedAt": "2026-08-29T04:25:26.025Z", + "runtime": { + "node": "v24.18.0", + "platform": "linux", + "arch": "x64" + }, + "environment": { + "endpoint": "http://127.0.0.1:3478", + "bearerConfigured": true, + "model": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "provider": "tangle-router", + "timeoutMs": 120000 + }, + "capabilities": { + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + } + }, + "bridgeCapabilities": { + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": true, + "messages": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + } + }, + "provider": { + "name": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "route": "pi/tangle-router/deepseek-v4-flash", + "real": true + }, + "cleanup": [ + { + "scope": "session", + "sessionId": "braid-live-native-1787977526323-cancel-session", + "continuationObserved": true, + "cancellation": { + "attempted": false + }, + "status": 200, + "closed": true, + "session": { + "status": "closed" + } + }, + { + "scope": "session", + "sessionId": "braid-live-native-1787977526323-success-session", + "continuationObserved": true, + "cancellation": { + "attempted": false + }, + "status": 200, + "closed": true, + "session": { + "status": "closed" + } + }, + { + "scope": "environment", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "destroyed": true + } + ], + "cancellation": { + "sessionId": "braid-live-native-1787977526323-cancel-session", + "first": { + "success": true, + "status": "done", + "elapsedMs": 4218, + "run": { + "runId": "braid-live-native-1787977526323-cancel-execution-1", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "sessionId": "braid-live-native-1787977526323-cancel-session", + "executionId": "braid-live-native-1787977526323-cancel-execution-1", + "requestDigest": "sha256:ad922cab8b37cf530e3a83877b14ae3eaa66452b970c0a23f459f2499a542912" + }, + "boundary": { + "runId": "braid-live-native-1787977526323-cancel-execution-1", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "sessionId": "braid-live-native-1787977526323-cancel-session", + "executionId": "braid-live-native-1787977526323-cancel-execution-1", + "requestDigest": "sha256:ad922cab8b37cf530e3a83877b14ae3eaa66452b970c0a23f459f2499a542912", + "kind": "revision", + "observedAt": "2026-08-29T04:25:30.533Z" + }, + "session": { + "id": "braid-live-native-1787977526323-cancel-session", + "backend": "pi", + "model": "pi/tangle-router/deepseek-v4-flash", + "status": "idle", + "runId": "braid-live-native-1787977526323-cancel-execution-1" + } + }, + "admission": { + "controlRef": { + "runId": "native-continuation:sha256:1d7e9aaeba9c1c4a64f86778eccbe8e49e98b8c8c2cd23ae6c2fd4b6a9e763d0", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "sessionId": "braid-live-native-1787977526323-cancel-session", + "executionId": "native-continuation:sha256:1d7e9aaeba9c1c4a64f86778eccbe8e49e98b8c8c2cd23ae6c2fd4b6a9e763d0", + "requestDigest": "sha256:287f9fcf416ddcfb178be42747cf77f61255514ac713159f15b490dc6eaf2749" + }, + "elapsedMs": 39, + "request": { + "operationId": "braid-live-native-1787977526323-cancel-continue", + "requestDigest": "sha256:128e00589b94fb4229e0bb62e88b84392acc32c38cdddc93b43d989d27d8b856", + "turnDigest": "sha256:3898278147dbc94641bc32f0c7e87e3c9e2011debc7ec70840fa65302cab7875" + } + }, + "active": { + "status": { + "status": "running", + "terminal": false, + "state": "detached", + "canonicalLastSeq": 5 + }, + "events": { + "status": 200, + "contentType": "text/event-stream", + "count": 12, + "types": [ + "status", + "raw", + "message.part.updated" + ], + "session": { + "id": "braid-live-native-1787977526323-cancel-session", + "backend": "pi", + "model": "pi/tangle-router/deepseek-v4-flash", + "status": "idle", + "runId": "braid-live-native-1787977526323-cancel-execution-1" + }, + "backends": [ + "pi" + ], + "providers": [ + "tangle-router" + ], + "models": [ + "deepseek-v4-flash" + ] + } + }, + "cancellation": { + "request": { + "operationId": "braid-live-native-1787977526323-cancel-cancel", + "requestDigest": "sha256:1594647aa48426bcb09ed7f04ca7ee22da4942a01710d198c68c97cb54a3eb8a" + }, + "acknowledgement": { + "status": "accepted", + "effect": "cancel_requested" + }, + "elapsedMs": 14 + }, + "terminal": { + "status": { + "status": "cancelled", + "terminal": true, + "state": "terminal", + "canonicalLastSeq": 16 + }, + "acknowledgement": "accepted", + "result": { + "success": false, + "status": "cancelled", + "error": "pi native turn aborted" + }, + "elapsedMs": 55 + }, + "terminalReplay": { + "status": 200, + "acknowledgement": "replayed", + "result": { + "success": false, + "status": "cancelled" + } + }, + "duplicateAdmission": { + "statuses": [ + 202, + 202 + ], + "phases": [ + "admitted", + "admitted" + ], + "controlRefs": [ + { + "runId": "native-continuation:sha256:1d7e9aaeba9c1c4a64f86778eccbe8e49e98b8c8c2cd23ae6c2fd4b6a9e763d0", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "sessionId": "braid-live-native-1787977526323-cancel-session", + "executionId": "native-continuation:sha256:1d7e9aaeba9c1c4a64f86778eccbe8e49e98b8c8c2cd23ae6c2fd4b6a9e763d0", + "requestDigest": "sha256:287f9fcf416ddcfb178be42747cf77f61255514ac713159f15b490dc6eaf2749" + }, + { + "runId": "native-continuation:sha256:1d7e9aaeba9c1c4a64f86778eccbe8e49e98b8c8c2cd23ae6c2fd4b6a9e763d0", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "sessionId": "braid-live-native-1787977526323-cancel-session", + "executionId": "native-continuation:sha256:1d7e9aaeba9c1c4a64f86778eccbe8e49e98b8c8c2cd23ae6c2fd4b6a9e763d0", + "requestDigest": "sha256:287f9fcf416ddcfb178be42747cf77f61255514ac713159f15b490dc6eaf2749" + } + ], + "byteIdentical": true, + "wire": { + "bytes": 1528, + "digest": "sha256:2206cde3049f02181404deca6ecd716737a352fd6199695ed6bc567a9a1c7ffb" + } + }, + "assertions": { + "admissionBeforeTerminal": true, + "activeStatus": true, + "activeEvents": true, + "exactCancel": true, + "cancelledTerminalReplay": true, + "duplicateAdmissionByteIdentical": true, + "timing": { + "admissionElapsedMs": 39, + "cancelElapsedMs": 14, + "terminalElapsedMs": 55, + "terminalObservedAfterCancel": true + } + } + }, + "success": { + "sessionId": "braid-live-native-1787977526323-success-session", + "first": { + "success": true, + "status": "done", + "elapsedMs": 3023, + "run": { + "runId": "braid-live-native-1787977526323-success-execution-1", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "sessionId": "braid-live-native-1787977526323-success-session", + "executionId": "braid-live-native-1787977526323-success-execution-1", + "requestDigest": "sha256:380bd3caa7da82acc325ba7a41569b3145f69be883cfb7e86663138d12e78fbd" + }, + "boundary": { + "runId": "braid-live-native-1787977526323-success-execution-1", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "sessionId": "braid-live-native-1787977526323-success-session", + "executionId": "braid-live-native-1787977526323-success-execution-1", + "requestDigest": "sha256:380bd3caa7da82acc325ba7a41569b3145f69be883cfb7e86663138d12e78fbd", + "kind": "revision", + "observedAt": "2026-08-29T04:25:35.073Z" + }, + "session": { + "id": "braid-live-native-1787977526323-success-session", + "backend": "pi", + "model": "pi/tangle-router/deepseek-v4-flash", + "status": "idle", + "runId": "braid-live-native-1787977526323-success-execution-1" + } + }, + "admission": { + "controlRef": { + "runId": "native-continuation:sha256:d88bfaa3f984051fee54ae5844d147bc579bf92af86ab9b7035678d9bf8e0ec2", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGMwYzRiNTY1OTU4NGQwNjM0NmZlNmQ1NjJlM2Q5M2ZmODE4ZTQ1YTA5ODFiNzEzMGE5NTQ0NDE4ZDY1N2VmZCIsIjFmNGExZTZmLWE3OTYtNDAwNC1iNmEzLTZlNWFmM2ViOTZiOCJd", + "sessionId": "braid-live-native-1787977526323-success-session", + "executionId": "native-continuation:sha256:d88bfaa3f984051fee54ae5844d147bc579bf92af86ab9b7035678d9bf8e0ec2", + "requestDigest": "sha256:4f33ac1f127965e28aba747378d1bc803fed5bdb234a6f66f0530bea46513bd9" + }, + "elapsedMs": 33, + "request": { + "operationId": "braid-live-native-1787977526323-success-continue", + "requestDigest": "sha256:1980e5fa4847a296ee1fb6b11954078cdcb3b58887e0a2147765c7300ef378b3", + "turnDigest": "sha256:80df5bc4c46ba4475450fdd8d13508ead8459e3d71a31942998cbeff9f35d39c" + } + }, + "terminal": { + "status": { + "status": "done", + "terminal": true, + "state": "terminal", + "canonicalLastSeq": 19 + }, + "acknowledgement": "accepted", + "result": { + "success": true, + "status": "done", + "text": "Braid live continuation success." + } + }, + "assertions": { + "admissionBeforeTerminal": true, + "successfulContinuation": true + } + }, + "assertions": { + "admissionBeforeTerminal": true, + "activeStatus": true, + "activeEvents": true, + "exactCancel": true, + "cancelledTerminalReplay": true, + "duplicateAdmissionByteIdentical": true, + "successfulContinuation": true + }, + "status": "passed", + "finishedAt": "2026-08-29T04:25:37.348Z" +} diff --git a/artifacts/verification/live/bridge/pi-canonical-current.json b/artifacts/verification/live/bridge/pi-canonical-current.json new file mode 100644 index 00000000..8f3ae520 --- /dev/null +++ b/artifacts/verification/live/bridge/pi-canonical-current.json @@ -0,0 +1,3524 @@ +{ + "schemaVersion": 1, + "command": "pnpm test:live:bridge", + "scope": { + "name": "one-shot-production-target-proof", + "claims": [ + "packed startup", + "exact marker response for each required target", + "advertised cancel and interaction semantics", + "bounded process cleanup" + ], + "excludes": [ + "LIVE-01..05 full interactive runner conformance" + ] + }, + "optIn": true, + "startedAt": "2026-08-29T05:06:55.300Z", + "runtime": { + "node": "v24.18.0", + "platform": "linux", + "arch": "x64", + "cwd": "/home/drew/code/.worktrees/braid-10-complete" + }, + "environment": { + "endpoint": "http://127.0.0.1:3480", + "bearerConfigured": false, + "launchRequested": true + }, + "targetPolicy": { + "source": "default:health-discovered", + "required": [ + { + "key": "pi-tangle-router-deepseek-v4-flash", + "label": "Pi with Tangle Router DeepSeek V4 Flash", + "modelId": "pi/tangle-router/deepseek-v4-flash", + "backend": "pi" + } + ] + }, + "targets": [ + { + "label": "Pi with Tangle Router DeepSeek V4 Flash", + "target": "pi/tangle-router/deepseek-v4-flash", + "profile": { + "path": ".braid/profiles/profile-pi-tangle-router-deepseek-v4-flash.json", + "harness": "pi", + "model": "deepseek-v4-flash", + "provider": "tangle-router" + }, + "connection": { + "id": "connection-live-cli-bridge", + "kind": "cli-bridge", + "endpoint": "http://127.0.0.1:3480", + "credentialConfigured": false + }, + "providerCapabilities": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": true + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "requests": [ + { + "version": 1, + "requestId": "init-pi-tangle-router-deepseek-v4-flash", + "command": "initialize", + "params": { + "workspace": "/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash", + "subscribe": true + } + }, + { + "version": 1, + "requestId": "send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK" + } + }, + { + "version": 1, + "requestId": "cancel-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + }, + { + "version": 1, + "requestId": "cancel-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "params": { + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "reason": "live packed smoke cancellation" + } + }, + { + "version": 1, + "requestId": "final-state-pi-tangle-router-deepseek-v4-flash", + "command": "get_state", + "params": { + "projection": "full" + } + }, + { + "version": 1, + "requestId": "shutdown-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-shutdown-pi-tangle-router-deepseek-v4-flash", + "command": "shutdown", + "params": { + "mode": "wait" + } + } + ], + "operation": "cli-bridge.target-smoke", + "credentialLifecycle": { + "configured": false, + "stored": false, + "removed": true + }, + "initialize": { + "version": 1, + "type": "ack", + "requestId": "init-pi-tangle-router-deepseek-v4-flash", + "revision": 4, + "command": "initialize" + }, + "conversationId": "conv-1", + "branchId": "branch-1", + "initialCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "send": { + "version": 1, + "type": "ack", + "requestId": "send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "revision": 4, + "replayed": false, + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "admission": { + "version": 1, + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "turnId": "turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T05:07:16.176Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": true + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": false, + "instructions": true, + "tools": false, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "2e7be28d7144b26b5b852604e612feb374d4c000f71f76afc279b902c7fd45fd", + "capabilitiesDigest": "ddc6284b3633f963459e1d4573baf9f16d2db828706ec2603a7ae9d4c0771559", + "materializationDigest": "9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e", + "digest": "cbfa72f1147c61f4d5af7108ad7dcd4566929d25e8608b77479e2f1e93b5bf30" + }, + "command": "send" + }, + "activeCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": true, + "source": "runtime" + }, + "run.queue": { + "available": true, + "source": "provider" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": true, + "source": "provider" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconnecting it" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "Detach the active run before reconciling it" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "normal": { + "status": "completed", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "run": { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "turnId": "turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T05:07:16.187Z", + "updatedAt": "2026-08-29T05:07:21.497Z", + "terminalAt": "2026-08-29T05:07:21.497Z", + "durationMs": 5310, + "inputTokens": 985, + "outputTokens": 41, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "reasoningTokens": 16, + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "environmentId": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "controlRef": { + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "executionId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "requestDigest": "sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd" + }, + "materializationDigest": "9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e", + "cursor": "55", + "cursorCommittedSequence": 66, + "contentBytes": 333 + }, + "assistant": { + "id": "message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "parts": [ + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning", + "kind": "reasoning", + "text": "The user wants me to output only a specific token with no punctuation or explanation.", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:49" + }, + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:final" + } + ] + }, + "finalText": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "marker": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK" + }, + "cancel": { + "prompt": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "revision": 68, + "replayed": false, + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "admission": { + "version": 1, + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "turnId": "turn-61af125a-5404-405b-bf60-7658bf3a0276", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T05:07:22.139Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "interactions": { + "kinds": "[depth-limited]", + "answerFieldTypes": "[depth-limited]", + "responseScopes": "[depth-limited]", + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "retainedControl": "exact-after-dispatch" + }, + "nativeContextBoundaryProof": { + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "executionId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "requestDigest": "sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd", + "boundary": { + "kind": "revision", + "revision": "pi:c2a57878-8c9f-4d35-8a3e-aa2e760f1eef:2" + }, + "observedAt": "2026-08-29T05:07:21.417Z" + }, + "admissionStatus": "admitted", + "requestDigest": "4e7ad98a6f6b723f6891148d2176907c0ae907822131aef0a1ee996705524962", + "capabilitiesDigest": "ddc6284b3633f963459e1d4573baf9f16d2db828706ec2603a7ae9d4c0771559", + "materializationDigest": "92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d", + "digest": "221d7140445090562118a215937d99b0704057e4db47a25dd937f9a3bccafc10" + }, + "command": "send" + }, + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "activeRun": { + "id": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "turnId": "turn-61af125a-5404-405b-bf60-7658bf3a0276", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "streaming", + "startedAt": "2026-08-29T05:07:22.150Z", + "updatedAt": "2026-08-29T05:07:22.150Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "materializationDigest": "92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-pi-tangle-router-deepseek-v4-flash", + "revision": 85, + "operationId": "op-live-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "run": { + "id": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "turnId": "turn-61af125a-5404-405b-bf60-7658bf3a0276", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T05:07:22.150Z", + "updatedAt": "2026-08-29T05:07:23.188Z", + "terminalAt": "2026-08-29T05:07:23.188Z", + "durationMs": 1038, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "completeness": "complete", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "environmentId": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "controlRef": { + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "executionId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "requestDigest": "sha256:8ccb11f8942e4eb8496e5f324790d1af124339a27d297b8e0c1097245122b2f1" + }, + "materializationDigest": "92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d", + "cursor": "5", + "cursorCommittedSequence": 83, + "contentBytes": 14 + }, + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": true, + "advertisedByBraid": false, + "advertised": false, + "provider": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "semanticAssertions": { + "cancel": "verified", + "interaction": "reported-unavailable" + }, + "finalState": { + "version": 1, + "type": "state", + "requestId": "final-state-pi-tangle-router-deepseek-v4-flash", + "revision": 87, + "projection": "full", + "state": { + "schemaVersion": 2, + "revision": 87, + "sequence": 87, + "workspace": "/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "updatedAt": "2026-08-29T05:07:22.150Z" + } + ], + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "runConfiguration": { + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "connectionId": "connection-live-cli-bridge", + "overrides": {} + }, + "draft": "", + "messages": [ + { + "id": "message-7f281582-c0b6-4974-aae2-f153906672d4", + "role": "user", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "parts": [ + { + "id": "part-message-7f281582-c0b6-4974-aae2-f153906672d4", + "kind": "text", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK" + } + ] + }, + { + "id": "message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "parts": [ + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning", + "kind": "reasoning", + "text": "The user wants me to output only a specific token with no punctuation or explanation.", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:49" + }, + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:final" + } + ] + }, + { + "id": "message-cb8ddc20-6cab-4626-aab0-d1dcf6903995", + "role": "user", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "status": "complete", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "parts": [ + { + "id": "part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995", + "kind": "text", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + ] + }, + { + "id": "message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "parts": [] + } + ], + "runs": [ + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "turnId": "turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T05:07:16.187Z", + "updatedAt": "2026-08-29T05:07:21.497Z", + "terminalAt": "2026-08-29T05:07:21.497Z", + "durationMs": 5310, + "inputTokens": 985, + "outputTokens": 41, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "reasoningTokens": 16, + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "environmentId": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "controlRef": { + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "executionId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "requestDigest": "sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd" + }, + "materializationDigest": "9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e", + "cursor": "55", + "cursorCommittedSequence": 66, + "contentBytes": 333 + }, + { + "id": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "turnId": "turn-61af125a-5404-405b-bf60-7658bf3a0276", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T05:07:22.150Z", + "updatedAt": "2026-08-29T05:07:23.188Z", + "terminalAt": "2026-08-29T05:07:23.188Z", + "durationMs": 1038, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "completeness": "complete", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "environmentId": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "controlRef": { + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "executionId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "requestDigest": "sha256:8ccb11f8942e4eb8496e5f324790d1af124339a27d297b8e0c1097245122b2f1" + }, + "materializationDigest": "92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d", + "cursor": "5", + "cursorCommittedSequence": 83, + "contentBytes": 14 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 2, + "input": 985, + "output": 41, + "reasoning": 16, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 2, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 2, + "unknownLatencySources": 2 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T05:07:15.562Z", + "updatedAt": "2026-08-29T05:07:23.086Z" + } + ], + "interactions": [], + "queue": [], + "activeRunId": null, + "focusedRunId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "activeRuns": [], + "lastError": null + }, + "view": { + "revision": 87, + "workspace": "/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "runOverrides": {}, + "connection": "Live local CLI Bridge", + "conversationId": "conv-1", + "conversationTitle": "New conversation", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "active": true, + "updatedAt": "2026-08-29T05:07:22.150Z" + } + ], + "branch": "branch-1", + "status": "cancelled", + "statusText": "cancelled", + "queueCount": 0, + "queue": [], + "messages": [ + { + "id": "message-7f281582-c0b6-4974-aae2-f153906672d4", + "role": "user", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "parts": [ + { + "id": "part-message-7f281582-c0b6-4974-aae2-f153906672d4", + "kind": "text", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK" + } + ] + }, + { + "id": "message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "parts": [ + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning", + "kind": "reasoning", + "text": "The user wants me to output only a specific token with no punctuation or explanation.", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:49" + }, + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:final" + } + ] + }, + { + "id": "message-cb8ddc20-6cab-4626-aab0-d1dcf6903995", + "role": "user", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "status": "complete", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "parts": [ + { + "id": "part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995", + "kind": "text", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + ] + }, + { + "id": "message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "parts": [] + } + ], + "hiddenMessageCount": 0, + "runs": [ + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "turnId": "turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "model": "pi/tangle-router/deepseek-v4-flash", + "effort": "none", + "cursor": "55", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "usage": { + "input": 985, + "output": 41, + "reasoning": 16, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "elapsedMs": 5310 + }, + "runner": "pi", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "completeness": "complete", + "contentBytes": 333 + }, + { + "id": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "turnId": "turn-61af125a-5404-405b-bf60-7658bf3a0276", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "cancelled", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "model": "deepseek-v4-flash", + "effort": "none", + "cursor": "5", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "requestedSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "usage": { + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "elapsedMs": 1038 + }, + "runner": "pi", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "completeness": "complete", + "contentBytes": 14 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 2, + "input": 985, + "output": 41, + "reasoning": 16, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 2, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 2, + "unknownLatencySources": 2 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T05:07:15.562Z", + "updatedAt": "2026-08-29T05:07:23.086Z" + } + ], + "focusedRunId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "interactions": [], + "activity": [ + { + "id": "run:run-a4c4a821-54f0-4e58-971c-f55621c01041", + "kind": "run", + "title": "run run-a4c4a821-54f0-4e58-971c-f55621c01041", + "status": "completed", + "elapsedMs": 5310, + "startedAt": "2026-08-29T05:07:16.187Z", + "occurredAt": "2026-08-29T05:07:16.187Z", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "completed", + "detail": "profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "occurredAt": "2026-08-29T05:07:21.497Z", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting", + "kind": "system", + "title": "starting", + "status": "completed", + "occurredAt": "2026-08-29T05:07:21.497Z", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting", + "kind": "system", + "title": "starting", + "status": "completed", + "occurredAt": "2026-08-29T05:07:21.497Z", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "completed", + "occurredAt": "2026-08-29T05:07:21.497Z", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:running", + "kind": "system", + "title": "running", + "status": "completed", + "occurredAt": "2026-08-29T05:07:21.497Z", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:4", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 5", + "occurredAt": "2026-08-29T05:07:21.497Z", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:4", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:5", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 6", + "occurredAt": "2026-08-29T05:07:21.497Z", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:5", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:6", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 7", + "occurredAt": "2026-08-29T05:07:21.497Z", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:6", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:51", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 52", + "occurredAt": "2026-08-29T05:07:21.497Z", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:51", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:52", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 53", + "occurredAt": "2026-08-29T05:07:21.497Z", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:52", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:53", + "kind": "system", + "title": "event model-processing", + "status": "completed", + "detail": "sequence 54", + "occurredAt": "2026-08-29T05:07:21.497Z", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:53", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:54", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 55", + "occurredAt": "2026-08-29T05:07:21.497Z", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:54", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "run", + "entityId": "run-a4c4a821-54f0-4e58-971c-f55621c01041" + }, + { + "id": "run:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "kind": "run", + "title": "run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "status": "cancelled", + "elapsedMs": 1038, + "startedAt": "2026-08-29T05:07:22.150Z", + "occurredAt": "2026-08-29T05:07:22.150Z", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + }, + { + "id": "environment:environment-dbebe77e25e68ce00a506d93a97ff95d", + "kind": "environment", + "title": "cli-bridge execution", + "status": "complete", + "detail": "local-process · local · explicit", + "startedAt": "2026-08-29T05:07:15.562Z", + "occurredAt": "2026-08-29T05:07:23.086Z", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "entityType": "environment", + "entityId": "environment-dbebe77e25e68ce00a506d93a97ff95d" + }, + { + "id": "activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "cancelled", + "detail": "profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "occurredAt": "2026-08-29T05:07:23.188Z", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + }, + { + "id": "activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:control:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "live packed smoke cancellation", + "occurredAt": "2026-08-29T05:07:23.188Z", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + }, + { + "id": "activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:starting", + "kind": "system", + "title": "starting", + "status": "cancelled", + "occurredAt": "2026-08-29T05:07:23.188Z", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + }, + { + "id": "activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:starting", + "kind": "system", + "title": "starting", + "status": "cancelled", + "occurredAt": "2026-08-29T05:07:23.188Z", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + }, + { + "id": "activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "cancelled", + "occurredAt": "2026-08-29T05:07:23.188Z", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + }, + { + "id": "activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:lifecycle:local:reconnecting", + "kind": "system", + "title": "reconnecting", + "status": "cancelled", + "detail": "5", + "occurredAt": "2026-08-29T05:07:23.188Z", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + }, + { + "id": "activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:control.ack:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "accepted", + "occurredAt": "2026-08-29T05:07:23.188Z", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + }, + { + "id": "event:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:4", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 5", + "occurredAt": "2026-08-29T05:07:23.188Z", + "sourceEventId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:4", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + }, + { + "id": "event:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:5", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 6", + "occurredAt": "2026-08-29T05:07:23.188Z", + "sourceEventId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:5", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "entityType": "run", + "entityId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + } + ], + "graph": [ + { + "id": "conv-1", + "type": "conversation", + "title": "New conversation", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-29T05:07:15.069Z" + }, + { + "id": "branch-1", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conv-1" + ], + "startedAt": "2026-08-29T05:07:15.069Z" + }, + { + "id": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "type": "environment", + "title": "cli-bridge execution", + "status": "complete", + "depth": 4, + "edgeLabel": "attached", + "parentIds": [ + "run:run-a4c4a821-54f0-4e58-971c-f55621c01041", + "run:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7" + ], + "runner": "cli-bridge", + "startedAt": "2026-08-29T05:07:15.562Z" + }, + { + "id": "turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8", + "type": "turn", + "title": "Turn", + "status": "complete", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T05:07:16.187Z" + }, + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "type": "run", + "title": "Run", + "status": "completed", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8" + ], + "runner": "pi", + "elapsedMs": 5310, + "startedAt": "2026-08-29T05:07:16.187Z" + }, + { + "id": "turn-61af125a-5404-405b-bf60-7658bf3a0276", + "type": "turn", + "title": "Turn", + "status": "cancelled", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T05:07:22.150Z" + }, + { + "id": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "type": "run", + "title": "Run", + "status": "cancelled", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-61af125a-5404-405b-bf60-7658bf3a0276" + ], + "runner": "pi", + "elapsedMs": 1038, + "startedAt": "2026-08-29T05:07:22.150Z" + } + ], + "graphQuery": "", + "entityDetails": [ + { + "entityType": "environment", + "entityId": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "title": "cli-bridge execution", + "status": "ready", + "lines": [ + "provider: cli-bridge", + "execution: local-process · local", + "connection: connection-live-cli-bridge", + "lifecycle: ready · retained · cleanup explicit", + "continuity: session", + "runtime endpoint host: 127.0.0.1", + "placement: requested not specified · verified unavailable", + "machine: unavailable · physical IP is not exposed", + "created: 2026-08-29T05:07:15.562Z", + "observed: 2026-08-29T05:07:23.086Z", + "unavailable: cli-subscription-and-quota:not-exposed-by-provider", + "unavailable: effective-resources:not-exposed-by-provider", + "unavailable: machine-specs:not-exposed-by-provider", + "unavailable: runtime-cpu-memory-usage:not-exposed-by-provider" + ] + } + ], + "details": { + "title": "run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "fields": [ + { + "label": "status", + "value": "aborted" + }, + { + "label": "input tokens", + "value": "0" + }, + { + "label": "output tokens", + "value": "0" + }, + { + "label": "model", + "value": "deepseek-v4-flash" + } + ] + }, + "capabilities": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": true, + "source": "application" + }, + "analysis.recipe": { + "available": true, + "source": "application" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "draft": "", + "selectedSurface": "transcript", + "appearance": { + "color": "none", + "highContrast": false, + "reducedMotion": false + } + } + }, + "shutdown": { + "version": 1, + "type": "ack", + "requestId": "shutdown-pi-tangle-router-deepseek-v4-flash", + "revision": 87, + "operationId": "op-live-shutdown-pi-tangle-router-deepseek-v4-flash", + "command": "shutdown" + }, + "operationEvidence": { + "normal": { + "status": "completed", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "run": { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "turnId": "turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T05:07:16.187Z", + "updatedAt": "2026-08-29T05:07:21.497Z", + "terminalAt": "2026-08-29T05:07:21.497Z", + "durationMs": 5310, + "inputTokens": 985, + "outputTokens": 41, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "reasoningTokens": 16, + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "environmentId": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "controlRef": { + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "executionId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "requestDigest": "sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd" + }, + "materializationDigest": "9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e", + "cursor": "55", + "cursorCommittedSequence": 66, + "contentBytes": 333 + }, + "assistant": { + "id": "message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "parts": [ + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning", + "kind": "reasoning", + "text": "The user wants me to output only a specific token with no punctuation or explanation.", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:49" + }, + { + "id": "run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-a4c4a821-54f0-4e58-971c-f55621c01041:final" + } + ] + }, + "finalText": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "marker": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK" + }, + "cancel": { + "prompt": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "revision": 68, + "replayed": false, + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "admission": { + "version": 1, + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "turnId": "turn-61af125a-5404-405b-bf60-7658bf3a0276", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T05:07:22.139Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "nativeContinuation": "[depth-limited]", + "interactions": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "retainedControl": "exact-after-dispatch" + }, + "nativeContextBoundaryProof": { + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "executionId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "requestDigest": "sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd", + "boundary": { + "kind": "revision", + "revision": "pi:c2a57878-8c9f-4d35-8a3e-aa2e760f1eef:2" + }, + "observedAt": "2026-08-29T05:07:21.417Z" + }, + "admissionStatus": "admitted", + "requestDigest": "4e7ad98a6f6b723f6891148d2176907c0ae907822131aef0a1ee996705524962", + "capabilitiesDigest": "ddc6284b3633f963459e1d4573baf9f16d2db828706ec2603a7ae9d4c0771559", + "materializationDigest": "92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d", + "digest": "221d7140445090562118a215937d99b0704057e4db47a25dd937f9a3bccafc10" + }, + "command": "send" + }, + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "activeRun": { + "id": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "turnId": "turn-61af125a-5404-405b-bf60-7658bf3a0276", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "streaming", + "startedAt": "2026-08-29T05:07:22.150Z", + "updatedAt": "2026-08-29T05:07:22.150Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "materializationDigest": "92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-pi-tangle-router-deepseek-v4-flash", + "revision": 85, + "operationId": "op-live-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "run": { + "id": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "turnId": "turn-61af125a-5404-405b-bf60-7658bf3a0276", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T05:07:22.150Z", + "updatedAt": "2026-08-29T05:07:23.188Z", + "terminalAt": "2026-08-29T05:07:23.188Z", + "durationMs": 1038, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "completeness": "complete", + "providerSessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "environmentId": "environment-dbebe77e25e68ce00a506d93a97ff95d", + "controlRef": { + "runId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ", + "sessionId": "session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041", + "executionId": "run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7", + "requestDigest": "sha256:8ccb11f8942e4eb8496e5f324790d1af124339a27d297b8e0c1097245122b2f1" + }, + "materializationDigest": "92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d", + "cursor": "5", + "cursorCommittedSequence": 83, + "contentBytes": 14 + }, + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": true, + "advertisedByBraid": false, + "advertised": false, + "provider": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + } + }, + "operationReceipt": { + "operation": "cli-bridge.target-smoke", + "packed": true, + "runId": "run-a4c4a821-54f0-4e58-971c-f55621c01041", + "status": "passed" + }, + "status": "passed", + "stderr": "", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-pi-tangle-router-deepseek-v4-flash\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-pi-tangle-router-deepseek-v4-flash\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:07:15.069Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:07:15.069Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:07:15.069Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-pi-tangle-router-deepseek-v4-flash\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":4,\"replayed\":false,\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"admission\":{\"version\":1,\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T05:07:16.176Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"model\":\"deepseek-v4-flash\",\"route\":\"pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"providerRunId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"2e7be28d7144b26b5b852604e612feb374d4c000f71f76afc279b902c7fd45fd\",\"capabilitiesDigest\":\"ddc6284b3633f963459e1d4573baf9f16d2db828706ec2603a7ae9d4c0771559\",\"materializationDigest\":\"9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e\",\"digest\":\"cbfa72f1147c61f4d5af7108ad7dcd4566929d25e8608b77479e2f1e93b5bf30\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"admission\":{\"version\":1,\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T05:07:16.176Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"__braidTruncated\":true},\"__braidTruncated\":true},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-pi-tangle-router-deepseek-v4-flash-cb9191f630ae0e76636ff2ff\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"cb9191f630ae0e76636ff2ff38feedf3f6ed7d46254ec39ee9a1464a79dcfcbd\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T05:07:16.199Z\",\"updatedAt\":\"2026-08-29T05:07:16.199Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"runId\":\"retained-intent-run:89fc0197f0cac0dc655eb859866bba1b263033aa4f3324ae48cce40bfa78ad87\",\"requestedProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requestDigest\":\"sha256:89fc0197f0cac0dc655eb859866bba1b263033aa4f3324ae48cce40bfa78ad87\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-pi-tangle-router-deepseek-v4-flash\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:07:16.187Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[]}],\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"updatedAt\":\"2026-08-29T05:07:16.187Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"materializationDigest\":\"9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"focusedRunId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"activeRuns\":[{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:07:16.187Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"running\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\"},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"focusedRunId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"kind\":\"run\",\"title\":\"run run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"running\",\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"occurredAt\":\"2026-08-29T05:07:16.187Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:16.187Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\"],\"runner\":\"pi\",\"startedAt\":\"2026-08-29T05:07:16.187Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestDigest\":\"sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T05:07:17.828Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T05:07:17.828Z\"},\"controlRef\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestDigest\":\"sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd\"},\"provider\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T05:07:17.828Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T05:07:17.845Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T05:07:17.845Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T05:07:18.154Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T05:07:18.154Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T05:07:18.162Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"streaming\",\"provider\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T05:07:18.162Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"providerSequence\":5,\"cursor\":\"4\",\"receivedAt\":\"2026-08-29T05:07:18.169Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"providerSequence\":6,\"cursor\":\"5\",\"receivedAt\":\"2026-08-29T05:07:18.175Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"providerSequence\":7,\"cursor\":\"6\",\"receivedAt\":\"2026-08-29T05:07:20.220Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:7\",\"providerSequence\":8,\"cursor\":\"7\",\"receivedAt\":\"2026-08-29T05:07:20.624Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:7\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:8\",\"providerSequence\":9,\"cursor\":\"8\",\"receivedAt\":\"2026-08-29T05:07:20.632Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:8\"},\"delta\":\"T\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:9\",\"providerSequence\":10,\"cursor\":\"9\",\"receivedAt\":\"2026-08-29T05:07:20.735Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:9\"},\"delta\":\"he user\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:10\",\"providerSequence\":11,\"cursor\":\"10\",\"receivedAt\":\"2026-08-29T05:07:20.745Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:10\"},\"delta\":\" want\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:11\",\"providerSequence\":12,\"cursor\":\"11\",\"receivedAt\":\"2026-08-29T05:07:20.752Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:11\"},\"delta\":\"s me\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:12\",\"providerSequence\":13,\"cursor\":\"12\",\"receivedAt\":\"2026-08-29T05:07:20.760Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:12\"},\"delta\":\" \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:13\",\"providerSequence\":14,\"cursor\":\"13\",\"receivedAt\":\"2026-08-29T05:07:20.767Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:13\"},\"delta\":\"to outpu\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:14\",\"providerSequence\":15,\"cursor\":\"14\",\"receivedAt\":\"2026-08-29T05:07:20.773Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:14\"},\"delta\":\"t only\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:15\",\"providerSequence\":16,\"cursor\":\"15\",\"receivedAt\":\"2026-08-29T05:07:20.783Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:15\"},\"delta\":\" \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:16\",\"providerSequence\":17,\"cursor\":\"16\",\"receivedAt\":\"2026-08-29T05:07:20.801Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:16\"},\"delta\":\"a specifi\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:17\",\"providerSequence\":18,\"cursor\":\"17\",\"receivedAt\":\"2026-08-29T05:07:20.811Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:17\"},\"delta\":\"c \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:18\",\"providerSequence\":19,\"cursor\":\"18\",\"receivedAt\":\"2026-08-29T05:07:20.818Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:18\"},\"delta\":\"token wit\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":30,\"revision\":30,\"event\":{\"sequence\":30,\"revision\":30,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:19\",\"providerSequence\":20,\"cursor\":\"19\",\"receivedAt\":\"2026-08-29T05:07:20.825Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:19\"},\"delta\":\"h no\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":31,\"revision\":31,\"event\":{\"sequence\":31,\"revision\":31,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:20\",\"providerSequence\":21,\"cursor\":\"20\",\"receivedAt\":\"2026-08-29T05:07:20.832Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:20\"},\"delta\":\" punctuation\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":32,\"revision\":32,\"event\":{\"sequence\":32,\"revision\":32,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:21\",\"providerSequence\":22,\"cursor\":\"21\",\"receivedAt\":\"2026-08-29T05:07:20.839Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:21\"},\"delta\":\" or\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":33,\"revision\":33,\"event\":{\"sequence\":33,\"revision\":33,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:22\",\"providerSequence\":23,\"cursor\":\"22\",\"receivedAt\":\"2026-08-29T05:07:20.846Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:22\"},\"delta\":\" explanation\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":34,\"revision\":34,\"event\":{\"sequence\":34,\"revision\":34,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:23\",\"providerSequence\":24,\"cursor\":\"23\",\"receivedAt\":\"2026-08-29T05:07:20.854Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:23\"},\"delta\":\".\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":35,\"revision\":35,\"event\":{\"sequence\":35,\"revision\":35,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:24\",\"providerSequence\":25,\"cursor\":\"24\",\"receivedAt\":\"2026-08-29T05:07:20.861Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:24\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":36,\"revision\":36,\"event\":{\"sequence\":36,\"revision\":36,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:25\",\"providerSequence\":26,\"cursor\":\"25\",\"receivedAt\":\"2026-08-29T05:07:20.868Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"L\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:25\"},\"delta\":\"L\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":37,\"revision\":37,\"event\":{\"sequence\":37,\"revision\":37,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:26\",\"providerSequence\":27,\"cursor\":\"26\",\"receivedAt\":\"2026-08-29T05:07:20.879Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:26\"},\"delta\":\"IVE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":38,\"revision\":38,\"event\":{\"sequence\":38,\"revision\":38,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:27\",\"providerSequence\":28,\"cursor\":\"27\",\"receivedAt\":\"2026-08-29T05:07:20.885Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_B\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:27\"},\"delta\":\"_\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":39,\"revision\":39,\"event\":{\"sequence\":39,\"revision\":39,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:28\",\"providerSequence\":29,\"cursor\":\"28\",\"receivedAt\":\"2026-08-29T05:07:20.892Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRA\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:28\"},\"delta\":\"BR\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":40,\"revision\":40,\"event\":{\"sequence\":40,\"revision\":40,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:29\",\"providerSequence\":30,\"cursor\":\"29\",\"receivedAt\":\"2026-08-29T05:07:20.899Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:29\"},\"delta\":\"AID\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":41,\"revision\":41,\"event\":{\"sequence\":41,\"revision\":41,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:30\",\"providerSequence\":31,\"cursor\":\"30\",\"receivedAt\":\"2026-08-29T05:07:20.906Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_P\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:30\"},\"delta\":\"_\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":42,\"revision\":42,\"event\":{\"sequence\":42,\"revision\":42,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:31\",\"providerSequence\":32,\"cursor\":\"31\",\"receivedAt\":\"2026-08-29T05:07:20.925Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:31\"},\"delta\":\"PI\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":43,\"revision\":43,\"event\":{\"sequence\":43,\"revision\":43,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:32\",\"providerSequence\":33,\"cursor\":\"32\",\"receivedAt\":\"2026-08-29T05:07:20.934Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-T\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:32\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":44,\"revision\":44,\"event\":{\"sequence\":44,\"revision\":44,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:33\",\"providerSequence\":34,\"cursor\":\"33\",\"receivedAt\":\"2026-08-29T05:07:20.941Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANG\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:33\"},\"delta\":\"TANG\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":45,\"revision\":45,\"event\":{\"sequence\":45,\"revision\":45,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:34\",\"providerSequence\":35,\"cursor\":\"34\",\"receivedAt\":\"2026-08-29T05:07:20.948Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:34\"},\"delta\":\"LE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":46,\"revision\":46,\"event\":{\"sequence\":46,\"revision\":46,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:35\",\"providerSequence\":36,\"cursor\":\"35\",\"receivedAt\":\"2026-08-29T05:07:20.955Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:35\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":47,\"revision\":47,\"event\":{\"sequence\":47,\"revision\":47,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:36\",\"providerSequence\":37,\"cursor\":\"36\",\"receivedAt\":\"2026-08-29T05:07:20.963Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-RO\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:36\"},\"delta\":\"RO\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":48,\"revision\":48,\"event\":{\"sequence\":48,\"revision\":48,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:37\",\"providerSequence\":38,\"cursor\":\"37\",\"receivedAt\":\"2026-08-29T05:07:20.969Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUT\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:37\"},\"delta\":\"U\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":49,\"revision\":49,\"event\":{\"sequence\":49,\"revision\":49,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:38\",\"providerSequence\":39,\"cursor\":\"38\",\"receivedAt\":\"2026-08-29T05:07:20.975Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:38\"},\"delta\":\"TER\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":50,\"revision\":50,\"event\":{\"sequence\":50,\"revision\":50,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:39\",\"providerSequence\":40,\"cursor\":\"39\",\"receivedAt\":\"2026-08-29T05:07:20.982Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-D\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:39\"},\"delta\":\"-D\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":51,\"revision\":51,\"event\":{\"sequence\":51,\"revision\":51,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:40\",\"providerSequence\":41,\"cursor\":\"40\",\"receivedAt\":\"2026-08-29T05:07:20.988Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEP\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:40\"},\"delta\":\"EE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":52,\"revision\":52,\"event\":{\"sequence\":52,\"revision\":52,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:41\",\"providerSequence\":42,\"cursor\":\"41\",\"receivedAt\":\"2026-08-29T05:07:20.994Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEE\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:41\"},\"delta\":\"PSEE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":53,\"revision\":53,\"event\":{\"sequence\":53,\"revision\":53,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:42\",\"providerSequence\":43,\"cursor\":\"42\",\"receivedAt\":\"2026-08-29T05:07:21.001Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:42\"},\"delta\":\"\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":54,\"revision\":54,\"event\":{\"sequence\":54,\"revision\":54,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:43\",\"providerSequence\":44,\"cursor\":\"43\",\"receivedAt\":\"2026-08-29T05:07:21.007Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:43\"},\"delta\":\"K-V\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":55,\"revision\":55,\"event\":{\"sequence\":55,\"revision\":55,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:44\",\"providerSequence\":45,\"cursor\":\"44\",\"receivedAt\":\"2026-08-29T05:07:21.013Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:44\"},\"delta\":\"4\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":56,\"revision\":56,\"event\":{\"sequence\":56,\"revision\":56,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:45\",\"providerSequence\":46,\"cursor\":\"45\",\"receivedAt\":\"2026-08-29T05:07:21.018Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-F\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:45\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":57,\"revision\":57,\"event\":{\"sequence\":57,\"revision\":57,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:46\",\"providerSequence\":47,\"cursor\":\"46\",\"receivedAt\":\"2026-08-29T05:07:21.024Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FL\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:46\"},\"delta\":\"FL\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":58,\"revision\":58,\"event\":{\"sequence\":58,\"revision\":58,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:47\",\"providerSequence\":48,\"cursor\":\"47\",\"receivedAt\":\"2026-08-29T05:07:21.030Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:47\"},\"delta\":\"AS\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":59,\"revision\":59,\"event\":{\"sequence\":59,\"revision\":59,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:48\",\"providerSequence\":49,\"cursor\":\"48\",\"receivedAt\":\"2026-08-29T05:07:21.036Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:48\"},\"delta\":\"H_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":60,\"revision\":60,\"event\":{\"sequence\":60,\"revision\":60,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\",\"providerSequence\":50,\"cursor\":\"49\",\"receivedAt\":\"2026-08-29T05:07:21.430Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":61,\"revision\":61,\"event\":{\"sequence\":61,\"revision\":61,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:50\",\"providerSequence\":51,\"cursor\":\"50\",\"receivedAt\":\"2026-08-29T05:07:21.437Z\"},\"part\":{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:50\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":62,\"revision\":62,\"event\":{\"sequence\":62,\"revision\":62,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"providerSequence\":52,\"cursor\":\"51\",\"receivedAt\":\"2026-08-29T05:07:21.445Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":63,\"revision\":63,\"event\":{\"sequence\":63,\"revision\":63,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"providerSequence\":53,\"cursor\":\"52\",\"receivedAt\":\"2026-08-29T05:07:21.452Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":64,\"revision\":64,\"event\":{\"sequence\":64,\"revision\":64,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"providerSequence\":54,\"cursor\":\"53\",\"receivedAt\":\"2026-08-29T05:07:21.460Z\"},\"unknown\":{\"type\":\"model-processing\",\"phase\":\"generating\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":65,\"revision\":65,\"event\":{\"sequence\":65,\"revision\":65,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"providerSequence\":55,\"cursor\":\"54\",\"receivedAt\":\"2026-08-29T05:07:21.468Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":66,\"revision\":66,\"event\":{\"sequence\":66,\"revision\":66,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:55\",\"providerSequence\":56,\"cursor\":\"55\",\"receivedAt\":\"2026-08-29T05:07:21.478Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"running\",\"provider\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:55\",\"providerSequence\":56,\"cursor\":\"55\",\"receivedAt\":\"2026-08-29T05:07:21.478Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":67,\"revision\":67,\"event\":{\"sequence\":67,\"revision\":67,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"source\":{\"eventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\",\"providerSequence\":57,\"receivedAt\":\"2026-08-29T05:07:21.496Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"usage\":{\"input\":985,\"output\":41,\"reasoning\":16,\"usdKnown\":false,\"model\":\"pi/tangle-router/deepseek-v4-flash\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":68,\"revision\":68,\"event\":{\"sequence\":68,\"revision\":68,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-pi-tangle-router-deepseek-v4-flash-cb9191f630ae0e76636ff2ff\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"cb9191f630ae0e76636ff2ff38feedf3f6ed7d46254ec39ee9a1464a79dcfcbd\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T05:07:16.199Z\",\"updatedAt\":\"2026-08-29T05:07:21.514Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-pi-tangle-router-deepseek-v4-flash\",\"revision\":68,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":68,\"sequence\":68,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:07:16.187Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]}],\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"updatedAt\":\"2026-08-29T05:07:21.497Z\",\"terminalAt\":\"2026-08-29T05:07:21.497Z\",\"durationMs\":5310,\"inputTokens\":985,\"outputTokens\":41,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":16,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"controlRef\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestDigest\":\"sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd\"},\"materializationDigest\":\"9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e\",\"cursor\":\"55\",\"cursorCommittedSequence\":66,\"contentBytes\":333}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:17.828Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":68,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:07:16.187Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"55\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":5310},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"completeness\":\"complete\",\"contentBytes\":333}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:17.828Z\"}],\"focusedRunId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"kind\":\"run\",\"title\":\"run run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"completed\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"occurredAt\":\"2026-08-29T05:07:16.187Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"environment:environment-dbebe77e25e68ce00a506d93a97ff95d\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:07:15.562Z\",\"occurredAt\":\"2026-08-29T05:07:17.828Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 52\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 53\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 54\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 55\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:07:15.562Z\"},{\"id\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\"],\"runner\":\"pi\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:07:15.562Z\",\"observed: 2026-08-29T05:07:17.828Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"985\"},{\"label\":\"output tokens\",\"value\":\"41\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"model\",\"value\":\"pi/tangle-router/deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-pi-tangle-router-deepseek-v4-flash\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":68,\"replayed\":false,\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"admission\":{\"version\":1,\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T05:07:22.139Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"model\":\"deepseek-v4-flash\",\"route\":\"pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"providerRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"retainedControl\":\"exact-after-dispatch\"},\"nativeContextBoundaryProof\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestDigest\":\"sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd\",\"boundary\":{\"kind\":\"revision\",\"revision\":\"pi:c2a57878-8c9f-4d35-8a3e-aa2e760f1eef:2\"},\"observedAt\":\"2026-08-29T05:07:21.417Z\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"4e7ad98a6f6b723f6891148d2176907c0ae907822131aef0a1ee996705524962\",\"capabilitiesDigest\":\"ddc6284b3633f963459e1d4573baf9f16d2db828706ec2603a7ae9d4c0771559\",\"materializationDigest\":\"92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d\",\"digest\":\"221d7140445090562118a215937d99b0704057e4db47a25dd937f9a3bccafc10\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":69,\"revision\":69,\"event\":{\"sequence\":69,\"revision\":69,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":70,\"revision\":70,\"event\":{\"sequence\":70,\"revision\":70,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T05:07:22.139Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"__braidTruncated\":true},\"__braidTruncated\":true},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":71,\"revision\":71,\"event\":{\"sequence\":71,\"revision\":71,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-pi-tangle-router-deepseek-v4-flash-27ab54fb7795df6f5470b0b5\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"27ab54fb7795df6f5470b0b5030292dd63a50164e678edd694e4e8d14e143c3d\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T05:07:22.158Z\",\"updatedAt\":\"2026-08-29T05:07:22.158Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":72,\"revision\":72,\"event\":{\"sequence\":72,\"revision\":72,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"runId\":\"retained-intent-run:3603340c808e1a7a55267fb3e98cf88d6cb111cd332239479bc49b3c9ded92d1\",\"requestedProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requestDigest\":\"sha256:3603340c808e1a7a55267fb3e98cf88d6cb111cd332239479bc49b3c9ded92d1\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":70,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":70,\"sequence\":70,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:07:22.150Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]},{\"id\":\"message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[{\"id\":\"part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[]}],\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"updatedAt\":\"2026-08-29T05:07:21.497Z\",\"terminalAt\":\"2026-08-29T05:07:21.497Z\",\"durationMs\":5310,\"inputTokens\":985,\"outputTokens\":41,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":16,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"controlRef\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestDigest\":\"sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd\"},\"materializationDigest\":\"9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e\",\"cursor\":\"55\",\"cursorCommittedSequence\":66,\"contentBytes\":333},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T05:07:22.150Z\",\"updatedAt\":\"2026-08-29T05:07:22.150Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"materializationDigest\":\"92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:17.828Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"focusedRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"activeRuns\":[{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":70,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:07:22.150Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]},{\"id\":\"message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[{\"id\":\"part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"55\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":5310},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"completeness\":\"complete\",\"contentBytes\":333},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"running\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\"},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:17.828Z\"}],\"activeRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"focusedRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"kind\":\"run\",\"title\":\"run run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"completed\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"occurredAt\":\"2026-08-29T05:07:16.187Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"environment:environment-dbebe77e25e68ce00a506d93a97ff95d\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:07:15.562Z\",\"occurredAt\":\"2026-08-29T05:07:17.828Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 52\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 53\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 54\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 55\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"run:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"kind\":\"run\",\"title\":\"run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"status\":\"running\",\"startedAt\":\"2026-08-29T05:07:22.150Z\",\"occurredAt\":\"2026-08-29T05:07:22.150Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:22.150Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:07:15.562Z\"},{\"id\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\"],\"runner\":\"pi\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:22.150Z\"},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-61af125a-5404-405b-bf60-7658bf3a0276\"],\"runner\":\"pi\",\"startedAt\":\"2026-08-29T05:07:22.150Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:07:15.562Z\",\"observed: 2026-08-29T05:07:17.828Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-pi-tangle-router-deepseek-v4-flash\",\"revision\":85,\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"command\":\"cancel_run\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"control\":\"cancel\",\"outcome\":\"accepted\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":73,\"revision\":73,\"event\":{\"sequence\":73,\"revision\":73,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"control\":{\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":74,\"revision\":74,\"event\":{\"sequence\":74,\"revision\":74,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"control\":{\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":75,\"revision\":75,\"event\":{\"sequence\":75,\"revision\":75,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-pi-tangle-router-deepseek-v4-flash-0acc84832a1aa4118d7c5e43\",\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"0acc84832a1aa4118d7c5e43d276fe0521b1cf99a83e1193c3372c379fa67fa7\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T05:07:22.236Z\",\"updatedAt\":\"2026-08-29T05:07:22.236Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":76,\"revision\":76,\"event\":{\"sequence\":76,\"revision\":76,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":77,\"revision\":77,\"event\":{\"sequence\":77,\"revision\":77,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"requestDigest\":\"sha256:8ccb11f8942e4eb8496e5f324790d1af124339a27d297b8e0c1097245122b2f1\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":78,\"revision\":78,\"event\":{\"sequence\":78,\"revision\":78,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"source\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T05:07:23.086Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T05:07:21.544Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T05:07:23.086Z\"},\"controlRef\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"requestDigest\":\"sha256:8ccb11f8942e4eb8496e5f324790d1af124339a27d297b8e0c1097245122b2f1\"},\"provider\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T05:07:23.086Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":79,\"revision\":79,\"event\":{\"sequence\":79,\"revision\":79,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"source\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T05:07:23.114Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T05:07:23.114Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":80,\"revision\":80,\"event\":{\"sequence\":80,\"revision\":80,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"source\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T05:07:23.121Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T05:07:23.121Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":81,\"revision\":81,\"event\":{\"sequence\":81,\"revision\":81,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"source\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T05:07:23.129Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"status\":\"streaming\",\"provider\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T05:07:23.129Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":82,\"revision\":82,\"event\":{\"sequence\":82,\"revision\":82,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"source\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:4\",\"providerSequence\":5,\"cursor\":\"4\",\"receivedAt\":\"2026-08-29T05:07:23.136Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":83,\"revision\":83,\"event\":{\"sequence\":83,\"revision\":83,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"source\":{\"eventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:5\",\"providerSequence\":6,\"cursor\":\"5\",\"receivedAt\":\"2026-08-29T05:07:23.144Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":84,\"revision\":84,\"event\":{\"sequence\":84,\"revision\":84,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-pi-tangle-router-deepseek-v4-flash-0acc84832a1aa4118d7c5e43\",\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"0acc84832a1aa4118d7c5e43d276fe0521b1cf99a83e1193c3372c379fa67fa7\",\"kind\":\"custom\",\"status\":\"acknowledged\",\"attempt\":1,\"outcomeDigest\":\"f430d9c9c101fec536eed9da90bf212be94a7c138332862d1e9774b1266d9187\",\"createdAt\":\"2026-08-29T05:07:22.236Z\",\"updatedAt\":\"2026-08-29T05:07:23.159Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":85,\"revision\":85,\"event\":{\"sequence\":85,\"revision\":85,\"kind\":\"run.reconnecting\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"status\":\"reconnecting\",\"completeness\":\"streaming\",\"cursor\":\"5\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":86,\"revision\":86,\"event\":{\"sequence\":86,\"revision\":86,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"control\":{\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"control\":\"cancel\",\"status\":\"accepted\",\"detail\":\"CONTROL_DETAIL\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":87,\"revision\":87,\"event\":{\"sequence\":87,\"revision\":87,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"status\":\"aborted\",\"completeness\":\"complete\",\"finalText\":\"\",\"usage\":{\"input\":0,\"output\":0,\"tokensKnown\":false,\"usdKnown\":false,\"model\":\"deepseek-v4-flash\"},\"reason\":\"CONTROL_DETAIL\"}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-pi-tangle-router-deepseek-v4-flash\",\"revision\":87,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":87,\"sequence\":87,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:07:22.150Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]},{\"id\":\"message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[{\"id\":\"part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[]}],\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"updatedAt\":\"2026-08-29T05:07:21.497Z\",\"terminalAt\":\"2026-08-29T05:07:21.497Z\",\"durationMs\":5310,\"inputTokens\":985,\"outputTokens\":41,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":16,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"controlRef\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestDigest\":\"sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd\"},\"materializationDigest\":\"9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e\",\"cursor\":\"55\",\"cursorCommittedSequence\":66,\"contentBytes\":333},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T05:07:22.150Z\",\"updatedAt\":\"2026-08-29T05:07:23.188Z\",\"terminalAt\":\"2026-08-29T05:07:23.188Z\",\"durationMs\":1038,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"controlRef\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"requestDigest\":\"sha256:8ccb11f8942e4eb8496e5f324790d1af124339a27d297b8e0c1097245122b2f1\"},\"materializationDigest\":\"92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d\",\"cursor\":\"5\",\"cursorCommittedSequence\":83,\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:23.086Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":87,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:07:22.150Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]},{\"id\":\"message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[{\"id\":\"part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"55\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":5310},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"completeness\":\"complete\",\"contentBytes\":333},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"5\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":1038},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"completeness\":\"complete\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:23.086Z\"}],\"focusedRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"kind\":\"run\",\"title\":\"run run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"completed\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"occurredAt\":\"2026-08-29T05:07:16.187Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 52\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 53\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 54\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 55\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"run:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"kind\":\"run\",\"title\":\"run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"status\":\"cancelled\",\"elapsedMs\":1038,\"startedAt\":\"2026-08-29T05:07:22.150Z\",\"occurredAt\":\"2026-08-29T05:07:22.150Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"environment:environment-dbebe77e25e68ce00a506d93a97ff95d\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:07:15.562Z\",\"occurredAt\":\"2026-08-29T05:07:23.086Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"5\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"event:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"sourceEventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:4\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"event:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"sourceEventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:5\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"run:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:07:15.562Z\"},{\"id\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\"],\"runner\":\"pi\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:22.150Z\"},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-61af125a-5404-405b-bf60-7658bf3a0276\"],\"runner\":\"pi\",\"elapsedMs\":1038,\"startedAt\":\"2026-08-29T05:07:22.150Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:07:15.562Z\",\"observed: 2026-08-29T05:07:23.086Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"final-state-pi-tangle-router-deepseek-v4-flash\",\"revision\":87,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":87,\"sequence\":87,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:07:22.150Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]},{\"id\":\"message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[{\"id\":\"part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[]}],\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"updatedAt\":\"2026-08-29T05:07:21.497Z\",\"terminalAt\":\"2026-08-29T05:07:21.497Z\",\"durationMs\":5310,\"inputTokens\":985,\"outputTokens\":41,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":16,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"controlRef\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestDigest\":\"sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd\"},\"materializationDigest\":\"9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e\",\"cursor\":\"55\",\"cursorCommittedSequence\":66,\"contentBytes\":333},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T05:07:22.150Z\",\"updatedAt\":\"2026-08-29T05:07:23.188Z\",\"terminalAt\":\"2026-08-29T05:07:23.188Z\",\"durationMs\":1038,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"controlRef\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"requestDigest\":\"sha256:8ccb11f8942e4eb8496e5f324790d1af124339a27d297b8e0c1097245122b2f1\"},\"materializationDigest\":\"92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d\",\"cursor\":\"5\",\"cursorCommittedSequence\":83,\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:23.086Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":87,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:07:22.150Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]},{\"id\":\"message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[{\"id\":\"part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"55\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":5310},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"completeness\":\"complete\",\"contentBytes\":333},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"5\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":1038},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"completeness\":\"complete\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:23.086Z\"}],\"focusedRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"kind\":\"run\",\"title\":\"run run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"completed\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"occurredAt\":\"2026-08-29T05:07:16.187Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 52\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 53\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 54\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 55\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"run:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"kind\":\"run\",\"title\":\"run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"status\":\"cancelled\",\"elapsedMs\":1038,\"startedAt\":\"2026-08-29T05:07:22.150Z\",\"occurredAt\":\"2026-08-29T05:07:22.150Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"environment:environment-dbebe77e25e68ce00a506d93a97ff95d\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:07:15.562Z\",\"occurredAt\":\"2026-08-29T05:07:23.086Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"5\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"event:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"sourceEventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:4\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"event:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"sourceEventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:5\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"run:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:07:15.562Z\"},{\"id\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\"],\"runner\":\"pi\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:22.150Z\"},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-61af125a-5404-405b-bf60-7658bf3a0276\"],\"runner\":\"pi\",\"elapsedMs\":1038,\"startedAt\":\"2026-08-29T05:07:22.150Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:07:15.562Z\",\"observed: 2026-08-29T05:07:23.086Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"shutdown-pi-tangle-router-deepseek-v4-flash\",\"revision\":87,\"operationId\":\"op-live-shutdown-pi-tangle-router-deepseek-v4-flash\",\"command\":\"shutdown\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":88,\"revision\":88,\"event\":{\"sequence\":88,\"revision\":88,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-live-shutdown-pi-tangle-router-deepseek-v4-flash\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":89,\"revision\":89,\"event\":{\"sequence\":89,\"revision\":89,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-pi-tangle-router-deepseek-v4-flash-27ab54fb7795df6f5470b0b5\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"27ab54fb7795df6f5470b0b5030292dd63a50164e678edd694e4e8d14e143c3d\",\"kind\":\"send\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"709050be156660bc04bed3766c3160fcc713b9a8ebb19bfd0cd66bbe285c86e9\",\"createdAt\":\"2026-08-29T05:07:22.158Z\",\"updatedAt\":\"2026-08-29T05:07:24.423Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":89,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":89,\"sequence\":89,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:07:22.150Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]},{\"id\":\"message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[{\"id\":\"part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[]}],\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"updatedAt\":\"2026-08-29T05:07:21.497Z\",\"terminalAt\":\"2026-08-29T05:07:21.497Z\",\"durationMs\":5310,\"inputTokens\":985,\"outputTokens\":41,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":16,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"controlRef\":{\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestDigest\":\"sha256:e5ac7136a22d99a04a6c231985e0a7db5f1806d450a12560907815f0f1e6d3bd\"},\"materializationDigest\":\"9aa50c8a310acc80d7ff50155832b964882fc4ab4b53eed7c34d865fd2102e3e\",\"cursor\":\"55\",\"cursorCommittedSequence\":66,\"contentBytes\":333},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T05:07:22.150Z\",\"updatedAt\":\"2026-08-29T05:07:23.188Z\",\"terminalAt\":\"2026-08-29T05:07:23.188Z\",\"durationMs\":1038,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"controlRef\":{\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NDJjYTJkM2QxYTYyNDBhODk3ODY2MDViMzU3YTZkYWI1NTczMzgxZmVmNDE1MTNjYzA3YTNmM2UzOGRkYmRlNyIsIm5JVkw5Y0ZFNDlwTzdFSTg2RFY5UXFPb2FYdzhHbzgwLXlkWnhobVE0VHMiXQ\",\"sessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"executionId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"requestDigest\":\"sha256:8ccb11f8942e4eb8496e5f324790d1af124339a27d297b8e0c1097245122b2f1\"},\"materializationDigest\":\"92257048624d30b0d9fef21a9cf18bdf8d5a58e011aa8d91275187da9882a62d\",\"cursor\":\"5\",\"cursorCommittedSequence\":83,\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:23.086Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":89,\"workspace\":\"/tmp/braid-live-targets-hVb5BS/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:07:22.150Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-7f281582-c0b6-4974-aae2-f153906672d4\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"part-message-7f281582-c0b6-4974-aae2-f153906672d4\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-e9508c4e-3e21-4ef1-83f4-3001d7b812c7\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"parts\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user wants me to output only a specific token with no punctuation or explanation.\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:49\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:message:1:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:final\"}]},{\"id\":\"message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[{\"id\":\"part-message-cb8ddc20-6cab-4626-aab0-d1dcf6903995\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-a7d2a920-130e-4184-bad6-7bc7c1a8b1ed\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"turnId\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"55\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":5310},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"completeness\":\"complete\",\"contentBytes\":333},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"turnId\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"5\",\"providerSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"requestedSessionId\":\"session-braid-run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":1038},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"completeness\":\"complete\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":985,\"output\":41,\"reasoning\":16,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:07:15.562Z\",\"updatedAt\":\"2026-08-29T05:07:23.086Z\"}],\"focusedRunId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"kind\":\"run\",\"title\":\"run run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"status\":\"completed\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\",\"occurredAt\":\"2026-08-29T05:07:16.187Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"activity:run-a4c4a821-54f0-4e58-971c-f55621c01041:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:4\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:5\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:6\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 52\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:51\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 53\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:52\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 54\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:53\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"event:run-a4c4a821-54f0-4e58-971c-f55621c01041:run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 55\",\"occurredAt\":\"2026-08-29T05:07:21.497Z\",\"sourceEventId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041:54\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"run\",\"entityId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\"},{\"id\":\"run:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"kind\":\"run\",\"title\":\"run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"status\":\"cancelled\",\"elapsedMs\":1038,\"startedAt\":\"2026-08-29T05:07:22.150Z\",\"occurredAt\":\"2026-08-29T05:07:22.150Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"environment:environment-dbebe77e25e68ce00a506d93a97ff95d\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:07:15.562Z\",\"occurredAt\":\"2026-08-29T05:07:23.086Z\",\"runId\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"5\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"activity:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"event:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"sourceEventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:4\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"},{\"id\":\"event:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:07:23.188Z\",\"sourceEventId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7:5\",\"runId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"entityType\":\"run\",\"entityId\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:07:15.069Z\"},{\"id\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"run:run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:07:15.562Z\"},{\"id\":\"turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"run-a4c4a821-54f0-4e58-971c-f55621c01041\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-535759c8-2a13-4e32-bc7a-c93ed9aa09b8\"],\"runner\":\"pi\",\"elapsedMs\":5310,\"startedAt\":\"2026-08-29T05:07:16.187Z\"},{\"id\":\"turn-61af125a-5404-405b-bf60-7658bf3a0276\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:07:22.150Z\"},{\"id\":\"run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-61af125a-5404-405b-bf60-7658bf3a0276\"],\"runner\":\"pi\",\"elapsedMs\":1038,\"startedAt\":\"2026-08-29T05:07:22.150Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dbebe77e25e68ce00a506d93a97ff95d\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:07:15.562Z\",\"observed: 2026-08-29T05:07:23.086Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-d4f5dd6c-7968-4049-bcc8-08dee556a4d7\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n", + "process": { + "processIdentity": { + "instanceId": "07f9c7b1-b000-43cd-9740-185a05f1093f", + "pid": 1852716, + "startedAt": 1787980034459 + }, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 1852716 + ], + "roots": [ + 1852716 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "natural": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 1852716 + ], + "roots": [ + 1852716 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": 0, + "signal": null + } + } + } + ], + "bridge": { + "initialHealth": { + "ok": false, + "error": "fetch failed" + }, + "launch": { + "requested": true, + "directory": "/home/drew/code/.worktrees/cli-bridge-continuation-control", + "command": "pnpm start", + "health": { + "status": 200, + "ok": true, + "body": { + "status": "ok", + "cached_verdicts": false, + "oldest_probed_at": "2026-08-29T05:06:56.428Z", + "backends": [ + { + "name": "pi", + "state": "ready", + "version": "0.83.0", + "probed_at": "2026-08-29T05:06:56.428Z", + "cached": false + } + ], + "admission": { + "active": 0, + "live": 0, + "stale": 0, + "unbound": 0, + "oldestHeldMs": null, + "reclaimed": 0, + "queued": 0, + "maxActive": 8, + "maxQueue": 16, + "reservedActive": 2, + "bulkMaxActive": 6, + "activeByClass": { + "reserved": 0, + "bulk": 0 + }, + "queuedByClass": { + "reserved": 0, + "bulk": 0 + } + }, + "executor": { + "in_flight": 0, + "max": 4, + "queued": 0, + "acquire_deadline_ms": 60000, + "max_acquire_deadline_ms": 900000, + "acquires": 0, + "timeouts": 0, + "scoped_host": { + "in_flight": 0, + "max": 4, + "queued": 0, + "acquire_deadline_ms": 60000, + "max_acquire_deadline_ms": 900000, + "acquires": 1, + "timeouts": 0, + "reserved": 2, + "bulk_in_flight": 0, + "bulk_max": 2, + "queued_reserved": 0, + "queued_bulk": 0 + } + }, + "memory": { + "heap_used_bytes": 48048152, + "heap_total_bytes": 119754752, + "heap_limit_bytes": 4496293888, + "heap_used_pct": 1.1, + "rss_bytes": 160186368, + "external_bytes": 6669380, + "runs_retained": 0, + "run_replay_bytes": 0 + }, + "ts": "2026-08-29T05:06:56.428Z" + }, + "text": "{\"status\":\"ok\",\"cached_verdicts\":false,\"oldest_probed_at\":\"2026-08-29T05:06:56.428Z\",\"backends\":[{\"name\":\"pi\",\"state\":\"ready\",\"version\":\"0.83.0\",\"probed_at\":\"2026-08-29T05:06:56.428Z\",\"cached\":false}],\"admission\":{\"active\":0,\"live\":0,\"stale\":0,\"unbound\":0,\"oldestHeldMs\":null,\"reclaimed\":0,\"queued\":0,\"maxActive\":8,\"maxQueue\":16,\"reservedActive\":2,\"bulkMaxActive\":6,\"activeByClass\":{\"reserved\":0,\"bulk\":0},\"queuedByClass\":{\"reserved\":0,\"bulk\":0}},\"executor\":{\"in_flight\":0,\"max\":4,\"queued\":0,\"acquire_deadline_ms\":60000,\"max_acquire_deadline_ms\":900000,\"acquires\":0,\"timeouts\":0,\"scoped_host\":{\"in_flight\":0,\"max\":4,\"queued\":0,\"acquire_deadline_ms\":60000,\"max_acquire_deadline_ms\":900000,\"acquires\":1,\"timeouts\":0,\"reserved\":2,\"bulk_in_flight\":0,\"bulk_max\":2,\"queued_reserved\":0,\"queued_bulk\":0}},\"memory\":{\"heap_used_bytes\":48048152,\"heap_total_bytes\":119754752,\"heap_limit_bytes\":4496293888,\"heap_used_pct\":1.1,\"rss_bytes\":160186368,\"external_bytes\":6669380,\"runs_retained\":0,\"run_replay_bytes\":0},\"ts\":\"2026-08-29T05:06:56.428Z\"}" + }, + "process": { + "stdout": "[cli-bridge] listening on http://127.0.0.1:3480 (host=127.0.0.1)\n[cli-bridge] backends: pi\n[cli-bridge] bearer: none (loopback only)\n[cli-bridge] host admission: maxActive=8 maxQueue=16/class reservedActive=2 (bulk ceiling 6) queueTimeoutMs=30000 bulkQueueTimeoutMs=240000\n[cli-bridge] reserved-lane clients: pr-reviewer\n[cli-bridge] traces: /home/drew/code/.worktrees/cli-bridge-continuation-control/data/traces/spans.jsonl (max 16777216 bytes × 2 files)\n[cli-bridge] jail default: fs-jail root=/.agent-home\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] SIGTERM — shutting down\n\u001b[41m\u001b[31m[\u001b[39m\u001b[49m\u001b[41m\u001b[30mELIFECYCLE\u001b[39m\u001b[49m\u001b[41m\u001b[31m]\u001b[39m\u001b[49m \u001b[31mCommand failed.\u001b[39m\n", + "stderr": "(node:1826905) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n\u001b[2m$ tsx src/server.ts\u001b[22m\n(node:1826923) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:1826940) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n[cli-bridge] admission maxActive=8 exceeds scoped-executor concurrency=4: the executor is the real ceiling. Lower BRIDGE_HOST_CHAT_MAX_ACTIVE or raise CLI_BRIDGE_SCOPE_MAX_CONCURRENCY so one gate owns the limit.\n", + "termination": { + "strategy": "process-group", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": true, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 1826905, + 1826922, + 1826923, + 1826940 + ], + "roots": [ + 1826905 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "term", + "termSignal": { + "method": "process-group", + "sent": true + }, + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": null, + "signal": "SIGTERM" + } + } + }, + "runtimeContract": { + "status": 200, + "ok": true, + "body": { + "name": "cli-bridge", + "version": "0.3.0", + "scheme": "bridge//", + "capabilities": { + "profileMaterialization": "cli-bridge.profile-materialization.v2", + "usageCostProvenance": "cli-bridge.usage-cost.v1", + "runtimeAttachments": { + "mcp": true + } + }, + "backends": [ + "pi" + ], + "endpoints": [ + "/health", + "/v1/models", + "/v1/chat/completions", + "/v1/sessions", + "/v1/capabilities", + "/v1/sessions/:id/turns", + "/v1/sessions/:id/input", + "/v1/sessions/:id/events", + "/v1/sessions/:id/status", + "/v1/sessions/:id/transcript", + "/v1/sessions/:id/steer", + "/v1/sessions/:id/cancel", + "/v1/sessions/:id/detach", + "/v1/sessions/:id/close", + "/v1/runs/:id", + "/v1/runs/:id/events", + "/v1/runs/:id/cancel", + "/v1/runs/:runId/interactions/:interactionId/respond", + "/cad/render", + "/images/generate" + ] + }, + "text": "{\"name\":\"cli-bridge\",\"version\":\"0.3.0\",\"scheme\":\"bridge//\",\"capabilities\":{\"profileMaterialization\":\"cli-bridge.profile-materialization.v2\",\"usageCostProvenance\":\"cli-bridge.usage-cost.v1\",\"runtimeAttachments\":{\"mcp\":true}},\"backends\":[\"pi\"],\"endpoints\":[\"/health\",\"/v1/models\",\"/v1/chat/completions\",\"/v1/sessions\",\"/v1/capabilities\",\"/v1/sessions/:id/turns\",\"/v1/sessions/:id/input\",\"/v1/sessions/:id/events\",\"/v1/sessions/:id/status\",\"/v1/sessions/:id/transcript\",\"/v1/sessions/:id/steer\",\"/v1/sessions/:id/cancel\",\"/v1/sessions/:id/detach\",\"/v1/sessions/:id/close\",\"/v1/runs/:id\",\"/v1/runs/:id/events\",\"/v1/runs/:id/cancel\",\"/v1/runs/:runId/interactions/:interactionId/respond\",\"/cad/render\",\"/images/generate\"]}" + }, + "models": { + "status": 200, + "ok": true, + "body": { + "object": "list", + "data": [ + { + "id": "pi/deepseek/deepseek-v4-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/deepseek/deepseek-v4-pro", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/kimi-for-coding-oauth/kimi-for-coding", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/moonshot/kimi-k2-thinking", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/moonshot/kimi-k2.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.3-codex-spark", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.4", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.4-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.6-luna", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.6-sol", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.6-terra", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/claude-haiku-4-5-20251001", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/claude-opus-4-6", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/claude-sonnet-4-6", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/deepseek-v4-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/deepseek-v4-pro", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/deepseek/deepseek-chat", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/fireworks/deepseek-v4-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gemini-2.5-flash-lite", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gemini-3-pro-preview", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/glm-5.2", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-4o-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-5-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-5.4", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-5.4-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/groq/llama-3.1-8b-instant", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/moonshotai/kimi-k2.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/openai/gpt-5.6-luna", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/openrouter/auto", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5-code", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5-turbo", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5.1", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-air", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-airx", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-x", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.6", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.7", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.7-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.7-flashx", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5-code", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5-turbo", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5.1", + "object": "model", + "backend": "pi" + } + ] + }, + "text": "{\"object\":\"list\",\"data\":[{\"id\":\"pi/deepseek/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/deepseek/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/kimi-for-coding-oauth/kimi-for-coding\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/moonshot/kimi-k2-thinking\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/moonshot/kimi-k2.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.3-codex-spark\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.4\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.4-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-luna\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-sol\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-terra\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-haiku-4-5-20251001\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-opus-4-6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-sonnet-4-6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek/deepseek-chat\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/fireworks/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gemini-2.5-flash-lite\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gemini-3-pro-preview\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/glm-5.2\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-4o-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5.4\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5.4-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/groq/llama-3.1-8b-instant\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/moonshotai/kimi-k2.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/openai/gpt-5.6-luna\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/openrouter/auto\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5-code\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5-turbo\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5.1\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-air\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-airx\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-x\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7-flashx\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5-code\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5-turbo\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5.1\",\"object\":\"model\",\"backend\":\"pi\"}]}" + }, + "requiredHealth": { + "status": 200, + "ok": true, + "body": { + "status": "ok", + "cached_verdicts": true, + "oldest_probed_at": "2026-08-29T05:06:56.428Z", + "backends": [ + { + "name": "pi", + "state": "ready", + "version": "0.83.0", + "probed_at": "2026-08-29T05:06:56.428Z", + "cached": true + } + ], + "admission": { + "active": 0, + "live": 0, + "stale": 0, + "unbound": 0, + "oldestHeldMs": null, + "reclaimed": 0, + "queued": 0, + "maxActive": 8, + "maxQueue": 16, + "reservedActive": 2, + "bulkMaxActive": 6, + "activeByClass": { + "reserved": 0, + "bulk": 0 + }, + "queuedByClass": { + "reserved": 0, + "bulk": 0 + } + }, + "executor": { + "in_flight": 0, + "max": 4, + "queued": 0, + "acquire_deadline_ms": 60000, + "max_acquire_deadline_ms": 900000, + "acquires": 0, + "timeouts": 0, + "scoped_host": { + "in_flight": 0, + "max": 4, + "queued": 0, + "acquire_deadline_ms": 60000, + "max_acquire_deadline_ms": 900000, + "acquires": 2, + "timeouts": 0, + "reserved": 2, + "bulk_in_flight": 0, + "bulk_max": 2, + "queued_reserved": 0, + "queued_bulk": 0 + } + }, + "memory": { + "heap_used_bytes": 49848344, + "heap_total_bytes": 119754752, + "heap_limit_bytes": 4496293888, + "heap_used_pct": 1.1, + "rss_bytes": 160186368, + "external_bytes": 6809992, + "runs_retained": 0, + "run_replay_bytes": 0 + }, + "ts": "2026-08-29T05:07:01.911Z" + }, + "text": "{\"status\":\"ok\",\"cached_verdicts\":true,\"oldest_probed_at\":\"2026-08-29T05:06:56.428Z\",\"backends\":[{\"name\":\"pi\",\"state\":\"ready\",\"version\":\"0.83.0\",\"probed_at\":\"2026-08-29T05:06:56.428Z\",\"cached\":true}],\"admission\":{\"active\":0,\"live\":0,\"stale\":0,\"unbound\":0,\"oldestHeldMs\":null,\"reclaimed\":0,\"queued\":0,\"maxActive\":8,\"maxQueue\":16,\"reservedActive\":2,\"bulkMaxActive\":6,\"activeByClass\":{\"reserved\":0,\"bulk\":0},\"queuedByClass\":{\"reserved\":0,\"bulk\":0}},\"executor\":{\"in_flight\":0,\"max\":4,\"queued\":0,\"acquire_deadline_ms\":60000,\"max_acquire_deadline_ms\":900000,\"acquires\":0,\"timeouts\":0,\"scoped_host\":{\"in_flight\":0,\"max\":4,\"queued\":0,\"acquire_deadline_ms\":60000,\"max_acquire_deadline_ms\":900000,\"acquires\":2,\"timeouts\":0,\"reserved\":2,\"bulk_in_flight\":0,\"bulk_max\":2,\"queued_reserved\":0,\"queued_bulk\":0}},\"memory\":{\"heap_used_bytes\":49848344,\"heap_total_bytes\":119754752,\"heap_limit_bytes\":4496293888,\"heap_used_pct\":1.1,\"rss_bytes\":160186368,\"external_bytes\":6809992,\"runs_retained\":0,\"run_replay_bytes\":0},\"ts\":\"2026-08-29T05:07:01.911Z\"}" + }, + "advertisedModels": [ + "pi/deepseek/deepseek-v4-flash", + "pi/deepseek/deepseek-v4-pro", + "pi/kimi-for-coding-oauth/kimi-for-coding", + "pi/moonshot/kimi-k2-thinking", + "pi/moonshot/kimi-k2.5", + "pi/openai-codex/gpt-5.3-codex-spark", + "pi/openai-codex/gpt-5.4", + "pi/openai-codex/gpt-5.4-mini", + "pi/openai-codex/gpt-5.5", + "pi/openai-codex/gpt-5.6-luna", + "pi/openai-codex/gpt-5.6-sol", + "pi/openai-codex/gpt-5.6-terra", + "pi/tangle-router/claude-haiku-4-5-20251001", + "pi/tangle-router/claude-opus-4-6", + "pi/tangle-router/claude-sonnet-4-6", + "pi/tangle-router/deepseek-v4-flash", + "pi/tangle-router/deepseek-v4-pro", + "pi/tangle-router/deepseek/deepseek-chat", + "pi/tangle-router/fireworks/deepseek-v4-flash", + "pi/tangle-router/gemini-2.5-flash-lite", + "pi/tangle-router/gemini-3-pro-preview", + "pi/tangle-router/glm-5.2", + "pi/tangle-router/gpt-4o-mini", + "pi/tangle-router/gpt-5-mini", + "pi/tangle-router/gpt-5.4", + "pi/tangle-router/gpt-5.4-mini", + "pi/tangle-router/groq/llama-3.1-8b-instant", + "pi/tangle-router/moonshotai/kimi-k2.5", + "pi/tangle-router/openai/gpt-5.6-luna", + "pi/tangle-router/openrouter/auto", + "pi/zai-coding-paas/glm-5", + "pi/zai-coding-paas/glm-5-code", + "pi/zai-coding-paas/glm-5-turbo", + "pi/zai-coding-paas/glm-5.1", + "pi/zai-glm/glm-4.5", + "pi/zai-glm/glm-4.5-air", + "pi/zai-glm/glm-4.5-airx", + "pi/zai-glm/glm-4.5-flash", + "pi/zai-glm/glm-4.5-x", + "pi/zai-glm/glm-4.6", + "pi/zai-glm/glm-4.7", + "pi/zai-glm/glm-4.7-flash", + "pi/zai-glm/glm-4.7-flashx", + "pi/zai-glm/glm-5", + "pi/zai-glm/glm-5-code", + "pi/zai-glm/glm-5-turbo", + "pi/zai-glm/glm-5.1" + ], + "missingTargets": [], + "selectedTargets": [ + { + "key": "pi-tangle-router-deepseek-v4-flash", + "label": "Pi with Tangle Router DeepSeek V4 Flash", + "modelId": "pi/tangle-router/deepseek-v4-flash" + } + ] + }, + "selectedTargets": [ + { + "key": "pi-tangle-router-deepseek-v4-flash", + "label": "Pi with Tangle Router DeepSeek V4 Flash", + "modelId": "pi/tangle-router/deepseek-v4-flash" + } + ], + "temp": { + "packRoot": "/tmp/braid-live-pack-ZfeUUH", + "installRoot": "/tmp/braid-live-install-KIUvQZ" + }, + "build": { + "command": "pnpm", + "args": [ + "run", + "build" + ], + "code": 0, + "signal": null, + "stdout": "", + "stderr": "\u001b[2m$ node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/build-startup.mjs\u001b[22m\n", + "durationMs": 3133, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "packCommand": { + "command": "pnpm", + "args": [ + "pack", + "--pack-destination", + "/tmp/braid-live-pack-ZfeUUH" + ], + "code": 0, + "signal": null, + "stdout": "package: @tangle-network/braid@0.3.0\n\u001b[94mTarball Contents\u001b[39m\ndist/adapters/agent-interface/harness-runtime.d.ts\ndist/adapters/agent-interface/harness-runtime.d.ts.map\ndist/adapters/agent-interface/harness-runtime.js\ndist/adapters/agent-interface/harness-runtime.js.map\ndist/adapters/agent-interface/interaction-runtime.d.ts\ndist/adapters/agent-interface/interaction-runtime.d.ts.map\ndist/adapters/agent-interface/interaction-runtime.js\ndist/adapters/agent-interface/interaction-runtime.js.map\ndist/adapters/agent-interface/module-url.d.ts\ndist/adapters/agent-interface/module-url.d.ts.map\ndist/adapters/agent-interface/module-url.js\ndist/adapters/agent-interface/module-url.js.map\ndist/adapters/agent-interface/profile-runtime.d.ts\ndist/adapters/agent-interface/profile-runtime.d.ts.map\ndist/adapters/agent-interface/profile-runtime.js\ndist/adapters/agent-interface/profile-runtime.js.map\ndist/adapters/analysis/agent-eval-version.d.ts\ndist/adapters/analysis/agent-eval-version.d.ts.map\ndist/adapters/analysis/agent-eval-version.js\ndist/adapters/analysis/agent-eval-version.js.map\ndist/adapters/analysis/citations.d.ts\ndist/adapters/analysis/citations.d.ts.map\ndist/adapters/analysis/citations.js\ndist/adapters/analysis/citations.js.map\ndist/adapters/analysis/eval-analyst.d.ts\ndist/adapters/analysis/eval-analyst.d.ts.map\ndist/adapters/analysis/eval-analyst.js\ndist/adapters/analysis/eval-analyst.js.map\ndist/adapters/analysis/managed-analysis-runtime.d.ts\ndist/adapters/analysis/managed-analysis-runtime.d.ts.map\ndist/adapters/analysis/managed-analysis-runtime.js\ndist/adapters/analysis/managed-analysis-runtime.js.map\ndist/adapters/analysis/model-execution-scope.d.ts\ndist/adapters/analysis/model-execution-scope.d.ts.map\ndist/adapters/analysis/model-execution-scope.js\ndist/adapters/analysis/model-execution-scope.js.map\ndist/adapters/analysis/production-analysis-analyst.d.ts\ndist/adapters/analysis/production-analysis-analyst.d.ts.map\ndist/adapters/analysis/production-analysis-analyst.js\ndist/adapters/analysis/production-analysis-analyst.js.map\ndist/adapters/analysis/python-runner.d.ts\ndist/adapters/analysis/python-runner.d.ts.map\ndist/adapters/analysis/python-runner.js\ndist/adapters/analysis/python-runner.js.map\ndist/adapters/analysis/question-analyst.d.ts\ndist/adapters/analysis/question-analyst.d.ts.map\ndist/adapters/analysis/question-analyst.js\ndist/adapters/analysis/question-analyst.js.map\ndist/adapters/analysis/runtime-model-owner.d.ts\ndist/adapters/analysis/runtime-model-owner.d.ts.map\ndist/adapters/analysis/runtime-model-owner.js\ndist/adapters/analysis/runtime-model-owner.js.map\ndist/adapters/analysis/runtime-retained-model-call.d.ts\ndist/adapters/analysis/runtime-retained-model-call.d.ts.map\ndist/adapters/analysis/runtime-retained-model-call.js\ndist/adapters/analysis/runtime-retained-model-call.js.map\ndist/adapters/analysis/trace-analysis-adapter.d.ts\ndist/adapters/analysis/trace-analysis-adapter.d.ts.map\ndist/adapters/analysis/trace-analysis-adapter.js\ndist/adapters/analysis/trace-analysis-adapter.js.map\ndist/adapters/analysis/trace-event-projection.d.ts\ndist/adapters/analysis/trace-event-projection.d.ts.map\ndist/adapters/analysis/trace-event-projection.js\ndist/adapters/analysis/trace-event-projection.js.map\ndist/adapters/analysis/trace-store.d.ts\ndist/adapters/analysis/trace-store.d.ts.map\ndist/adapters/analysis/trace-store.js\ndist/adapters/analysis/trace-store.js.map\ndist/adapters/connections/aws-nitro-root-g1.d.ts\ndist/adapters/connections/aws-nitro-root-g1.d.ts.map\ndist/adapters/connections/aws-nitro-root-g1.js\ndist/adapters/connections/aws-nitro-root-g1.js.map\ndist/adapters/connections/cli-bridge-health.d.ts\ndist/adapters/connections/cli-bridge-health.d.ts.map\ndist/adapters/connections/cli-bridge-health.js\ndist/adapters/connections/cli-bridge-health.js.map\ndist/adapters/connections/cli-bridge-model-route.d.ts\ndist/adapters/connections/cli-bridge-model-route.d.ts.map\ndist/adapters/connections/cli-bridge-model-route.js\ndist/adapters/connections/cli-bridge-model-route.js.map\ndist/adapters/connections/cli-bridge-model-validation.d.ts\ndist/adapters/connections/cli-bridge-model-validation.d.ts.map\ndist/adapters/connections/cli-bridge-model-validation.js\ndist/adapters/connections/cli-bridge-model-validation.js.map\ndist/adapters/connections/nitro-confidential-attestation.d.ts\ndist/adapters/connections/nitro-confidential-attestation.d.ts.map\ndist/adapters/connections/nitro-confidential-attestation.js\ndist/adapters/connections/nitro-confidential-attestation.js.map\ndist/adapters/connections/production-connection-credentials.d.ts\ndist/adapters/connections/production-connection-credentials.d.ts.map\ndist/adapters/connections/production-connection-credentials.js\ndist/adapters/connections/production-connection-credentials.js.map\ndist/adapters/connections/production-connection-endpoints.d.ts\ndist/adapters/connections/production-connection-endpoints.d.ts.map\ndist/adapters/connections/production-connection-endpoints.js\ndist/adapters/connections/production-connection-endpoints.js.map\ndist/adapters/connections/production-connection-health.d.ts\ndist/adapters/connections/production-connection-health.d.ts.map\ndist/adapters/connections/production-connection-health.js\ndist/adapters/connections/production-connection-health.js.map\ndist/adapters/connections/production-connection-providers.d.ts\ndist/adapters/connections/production-connection-providers.d.ts.map\ndist/adapters/connections/production-connection-providers.js\ndist/adapters/connections/production-connection-providers.js.map\ndist/adapters/connections/production-connection-types.d.ts\ndist/adapters/connections/production-connection-types.d.ts.map\ndist/adapters/connections/production-connection-types.js\ndist/adapters/connections/production-connection-types.js.map\ndist/adapters/connections/production-connections.d.ts\ndist/adapters/connections/production-connections.d.ts.map\ndist/adapters/connections/production-connections.js\ndist/adapters/connections/production-connections.js.map\ndist/adapters/connections/tangle-retained-control-lookup.d.ts\ndist/adapters/connections/tangle-retained-control-lookup.d.ts.map\ndist/adapters/connections/tangle-retained-control-lookup.js\ndist/adapters/connections/tangle-retained-control-lookup.js.map\ndist/adapters/credentials/headless-key.d.ts\ndist/adapters/credentials/headless-key.d.ts.map\ndist/adapters/credentials/headless-key.js\ndist/adapters/credentials/headless-key.js.map\ndist/adapters/credentials/headless-store.d.ts\ndist/adapters/credentials/headless-store.d.ts.map\ndist/adapters/credentials/headless-store.js\ndist/adapters/credentials/headless-store.js.map\ndist/adapters/credentials/memory.d.ts\ndist/adapters/credentials/memory.d.ts.map\ndist/adapters/credentials/memory.js\ndist/adapters/credentials/memory.js.map\ndist/adapters/credentials/os.d.ts\ndist/adapters/credentials/os.d.ts.map\ndist/adapters/credentials/os.js\ndist/adapters/credentials/os.js.map\ndist/adapters/persistence/posix-at.d.ts\ndist/adapters/persistence/posix-at.d.ts.map\ndist/adapters/persistence/posix-at.js\ndist/adapters/persistence/posix-at.js.map\ndist/adapters/persistence/safe-file-descriptor.d.ts\ndist/adapters/persistence/safe-file-descriptor.d.ts.map\ndist/adapters/persistence/safe-file-descriptor.js\ndist/adapters/persistence/safe-file-descriptor.js.map\ndist/adapters/persistence/safe-file-io.d.ts\ndist/adapters/persistence/safe-file-io.d.ts.map\ndist/adapters/persistence/safe-file-io.js\ndist/adapters/persistence/safe-file-io.js.map\ndist/adapters/persistence/safe-file.d.ts\ndist/adapters/persistence/safe-file.d.ts.map\ndist/adapters/persistence/safe-file.js\ndist/adapters/persistence/safe-file.js.map\ndist/adapters/runtime/agent-runtime-execution.d.ts\ndist/adapters/runtime/agent-runtime-execution.d.ts.map\ndist/adapters/runtime/agent-runtime-execution.js\ndist/adapters/runtime/agent-runtime-execution.js.map\ndist/adapters/runtime/agent-runtime-version.d.ts\ndist/adapters/runtime/agent-runtime-version.d.ts.map\ndist/adapters/runtime/agent-runtime-version.js\ndist/adapters/runtime/agent-runtime-version.js.map\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-execution.js\ndist/adapters/runtime/cli-bridge-retained-execution.js.map\ndist/adapters/runtime/cli-bridge-retained-run.d.ts\ndist/adapters/runtime/cli-bridge-retained-run.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-run.js\ndist/adapters/runtime/cli-bridge-retained-run.js.map\ndist/adapters/runtime/execution-observation-source.d.ts\ndist/adapters/runtime/execution-observation-source.d.ts.map\ndist/adapters/runtime/execution-observation-source.js\ndist/adapters/runtime/execution-observation-source.js.map\ndist/adapters/runtime/lazy-execution.d.ts\ndist/adapters/runtime/lazy-execution.d.ts.map\ndist/adapters/runtime/lazy-execution.js\ndist/adapters/runtime/lazy-execution.js.map\ndist/adapters/runtime/mode-routing-execution.d.ts\ndist/adapters/runtime/mode-routing-execution.d.ts.map\ndist/adapters/runtime/mode-routing-execution.js\ndist/adapters/runtime/mode-routing-execution.js.map\ndist/adapters/runtime/native-interactive-run-broker.d.ts\ndist/adapters/runtime/native-interactive-run-broker.d.ts.map\ndist/adapters/runtime/native-interactive-run-broker.js\ndist/adapters/runtime/native-interactive-run-broker.js.map\ndist/adapters/runtime/prepared-execution.d.ts\ndist/adapters/runtime/prepared-execution.d.ts.map\ndist/adapters/runtime/prepared-execution.js\ndist/adapters/runtime/prepared-execution.js.map\ndist/adapters/runtime/production-backend-common.d.ts\ndist/adapters/runtime/production-backend-common.d.ts.map\ndist/adapters/runtime/production-backend-common.js\ndist/adapters/runtime/production-backend-common.js.map\ndist/adapters/runtime/production-backend-resolver.d.ts\ndist/adapters/runtime/production-backend-resolver.d.ts.map\ndist/adapters/runtime/production-backend-resolver.js\ndist/adapters/runtime/production-backend-resolver.js.map\ndist/adapters/runtime/production-cli-bridge-backend.d.ts\ndist/adapters/runtime/production-cli-bridge-backend.d.ts.map\ndist/adapters/runtime/production-cli-bridge-backend.js\ndist/adapters/runtime/production-cli-bridge-backend.js.map\ndist/adapters/runtime/production-tangle-inference-backend.d.ts\ndist/adapters/runtime/production-tangle-inference-backend.d.ts.map\ndist/adapters/runtime/production-tangle-inference-backend.js\ndist/adapters/runtime/production-tangle-inference-backend.js.map\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts.map\ndist/adapters/runtime/production-tangle-sandbox-backend.js\ndist/adapters/runtime/production-tangle-sandbox-backend.js.map\ndist/adapters/runtime/retained-execution-contract.d.ts\ndist/adapters/runtime/retained-execution-contract.d.ts.map\ndist/adapters/runtime/retained-execution-contract.js\ndist/adapters/runtime/retained-execution-contract.js.map\ndist/adapters/runtime/retained-execution-projection.d.ts\ndist/adapters/runtime/retained-execution-projection.d.ts.map\ndist/adapters/runtime/retained-execution-projection.js\ndist/adapters/runtime/retained-execution-projection.js.map\ndist/adapters/runtime/retained-execution-state.d.ts\ndist/adapters/runtime/retained-execution-state.d.ts.map\ndist/adapters/runtime/retained-execution-state.js\ndist/adapters/runtime/retained-execution-state.js.map\ndist/adapters/runtime/retained-execution-stream.d.ts\ndist/adapters/runtime/retained-execution-stream.d.ts.map\ndist/adapters/runtime/retained-execution-stream.js\ndist/adapters/runtime/retained-execution-stream.js.map\ndist/adapters/runtime/retained-execution.d.ts\ndist/adapters/runtime/retained-execution.d.ts.map\ndist/adapters/runtime/retained-execution.js\ndist/adapters/runtime/retained-execution.js.map\ndist/adapters/runtime/retained-native-continuation.d.ts\ndist/adapters/runtime/retained-native-continuation.d.ts.map\ndist/adapters/runtime/retained-native-continuation.js\ndist/adapters/runtime/retained-native-continuation.js.map\ndist/adapters/runtime/sandbox-account-observation.d.ts\ndist/adapters/runtime/sandbox-account-observation.d.ts.map\ndist/adapters/runtime/sandbox-account-observation.js\ndist/adapters/runtime/sandbox-account-observation.js.map\ndist/adapters/runtime/sandbox-instance-observation.d.ts\ndist/adapters/runtime/sandbox-instance-observation.d.ts.map\ndist/adapters/runtime/sandbox-instance-observation.js\ndist/adapters/runtime/sandbox-instance-observation.js.map\ndist/adapters/runtime/sandbox-observation-types.d.ts\ndist/adapters/runtime/sandbox-observation-types.d.ts.map\ndist/adapters/runtime/sandbox-observation-types.js\ndist/adapters/runtime/sandbox-observation-types.js.map\ndist/adapters/runtime/sandbox-observation.d.ts\ndist/adapters/runtime/sandbox-observation.d.ts.map\ndist/adapters/runtime/sandbox-observation.js\ndist/adapters/runtime/sandbox-observation.js.map\ndist/adapters/runtime/supervisor-control.d.ts\ndist/adapters/runtime/supervisor-control.d.ts.map\ndist/adapters/runtime/supervisor-control.js\ndist/adapters/runtime/supervisor-control.js.map\ndist/adapters/runtime/supervisor-watch.d.ts\ndist/adapters/runtime/supervisor-watch.d.ts.map\ndist/adapters/runtime/supervisor-watch.js\ndist/adapters/runtime/supervisor-watch.js.map\ndist/adapters/runtime/tangle-retained-execution.d.ts\ndist/adapters/runtime/tangle-retained-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-execution.js\ndist/adapters/runtime/tangle-retained-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-contract.js\ndist/adapters/runtime/tangle-retained-interactive-contract.js.map\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-execution.js\ndist/adapters/runtime/tangle-retained-interactive-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-projection.js\ndist/adapters/runtime/tangle-retained-interactive-projection.js.map\ndist/adapters/runtime/tangle-retained-run.d.ts\ndist/adapters/runtime/tangle-retained-run.d.ts.map\ndist/adapters/runtime/tangle-retained-run.js\ndist/adapters/runtime/tangle-retained-run.js.map\ndist/adapters/runtime/tangle-sandbox-retention.d.ts\ndist/adapters/runtime/tangle-sandbox-retention.d.ts.map\ndist/adapters/runtime/tangle-sandbox-retention.js\ndist/adapters/runtime/tangle-sandbox-retention.js.map\ndist/adapters/runtime/unavailable-execution.d.ts\ndist/adapters/runtime/unavailable-execution.d.ts.map\ndist/adapters/runtime/unavailable-execution.js\ndist/adapters/runtime/unavailable-execution.js.map\ndist/adapters/storage/memory-base.d.ts\ndist/adapters/storage/memory-base.d.ts.map\ndist/adapters/storage/memory-base.js\ndist/adapters/storage/memory-base.js.map\ndist/adapters/storage/memory-effects.d.ts\ndist/adapters/storage/memory-effects.d.ts.map\ndist/adapters/storage/memory-effects.js\ndist/adapters/storage/memory-effects.js.map\ndist/adapters/storage/memory-journal.d.ts\ndist/adapters/storage/memory-journal.d.ts.map\ndist/adapters/storage/memory-journal.js\ndist/adapters/storage/memory-journal.js.map\ndist/adapters/storage/memory-maintenance.d.ts\ndist/adapters/storage/memory-maintenance.d.ts.map\ndist/adapters/storage/memory-maintenance.js\ndist/adapters/storage/memory-maintenance.js.map\ndist/adapters/storage/memory-operations.d.ts\ndist/adapters/storage/memory-operations.d.ts.map\ndist/adapters/storage/memory-operations.js\ndist/adapters/storage/memory-operations.js.map\ndist/adapters/storage/memory-retention.d.ts\ndist/adapters/storage/memory-retention.d.ts.map\ndist/adapters/storage/memory-retention.js\ndist/adapters/storage/memory-retention.js.map\ndist/adapters/storage/memory.d.ts\ndist/adapters/storage/memory.d.ts.map\ndist/adapters/storage/memory.js\ndist/adapters/storage/memory.js.map\ndist/adapters/storage/sqlite-base.d.ts\ndist/adapters/storage/sqlite-base.d.ts.map\ndist/adapters/storage/sqlite-base.js\ndist/adapters/storage/sqlite-base.js.map\ndist/adapters/storage/sqlite-bound-open.d.ts\ndist/adapters/storage/sqlite-bound-open.d.ts.map\ndist/adapters/storage/sqlite-bound-open.js\ndist/adapters/storage/sqlite-bound-open.js.map\ndist/adapters/storage/sqlite-content.d.ts\ndist/adapters/storage/sqlite-content.d.ts.map\ndist/adapters/storage/sqlite-content.js\ndist/adapters/storage/sqlite-content.js.map\ndist/adapters/storage/sqlite-crypto.d.ts\ndist/adapters/storage/sqlite-crypto.d.ts.map\ndist/adapters/storage/sqlite-crypto.js\ndist/adapters/storage/sqlite-crypto.js.map\ndist/adapters/storage/sqlite-driver.d.ts\ndist/adapters/storage/sqlite-driver.d.ts.map\ndist/adapters/storage/sqlite-driver.js\ndist/adapters/storage/sqlite-driver.js.map\ndist/adapters/storage/sqlite-effects.d.ts\ndist/adapters/storage/sqlite-effects.d.ts.map\ndist/adapters/storage/sqlite-effects.js\ndist/adapters/storage/sqlite-effects.js.map\ndist/adapters/storage/sqlite-errors.d.ts\ndist/adapters/storage/sqlite-errors.d.ts.map\ndist/adapters/storage/sqlite-errors.js\ndist/adapters/storage/sqlite-errors.js.map\ndist/adapters/storage/sqlite-initialization.d.ts\ndist/adapters/storage/sqlite-initialization.d.ts.map\ndist/adapters/storage/sqlite-initialization.js\ndist/adapters/storage/sqlite-initialization.js.map\ndist/adapters/storage/sqlite-journal.d.ts\ndist/adapters/storage/sqlite-journal.d.ts.map\ndist/adapters/storage/sqlite-journal.js\ndist/adapters/storage/sqlite-journal.js.map\ndist/adapters/storage/sqlite-lifecycle.d.ts\ndist/adapters/storage/sqlite-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-lifecycle.js\ndist/adapters/storage/sqlite-lifecycle.js.map\ndist/adapters/storage/sqlite-maintenance.d.ts\ndist/adapters/storage/sqlite-maintenance.d.ts.map\ndist/adapters/storage/sqlite-maintenance.js\ndist/adapters/storage/sqlite-maintenance.js.map\ndist/adapters/storage/sqlite-operations.d.ts\ndist/adapters/storage/sqlite-operations.d.ts.map\ndist/adapters/storage/sqlite-operations.js\ndist/adapters/storage/sqlite-operations.js.map\ndist/adapters/storage/sqlite-paths.d.ts\ndist/adapters/storage/sqlite-paths.d.ts.map\ndist/adapters/storage/sqlite-paths.js\ndist/adapters/storage/sqlite-paths.js.map\ndist/adapters/storage/sqlite-projection.d.ts\ndist/adapters/storage/sqlite-projection.d.ts.map\ndist/adapters/storage/sqlite-projection.js\ndist/adapters/storage/sqlite-projection.js.map\ndist/adapters/storage/sqlite-queue.d.ts\ndist/adapters/storage/sqlite-queue.d.ts.map\ndist/adapters/storage/sqlite-queue.js\ndist/adapters/storage/sqlite-queue.js.map\ndist/adapters/storage/sqlite-recovery.d.ts\ndist/adapters/storage/sqlite-recovery.d.ts.map\ndist/adapters/storage/sqlite-recovery.js\ndist/adapters/storage/sqlite-recovery.js.map\ndist/adapters/storage/sqlite-redaction.d.ts\ndist/adapters/storage/sqlite-redaction.d.ts.map\ndist/adapters/storage/sqlite-redaction.js\ndist/adapters/storage/sqlite-redaction.js.map\ndist/adapters/storage/sqlite-rows.d.ts\ndist/adapters/storage/sqlite-rows.d.ts.map\ndist/adapters/storage/sqlite-rows.js\ndist/adapters/storage/sqlite-rows.js.map\ndist/adapters/storage/sqlite-schema.d.ts\ndist/adapters/storage/sqlite-schema.d.ts.map\ndist/adapters/storage/sqlite-schema.js\ndist/adapters/storage/sqlite-schema.js.map\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-codec.js\ndist/adapters/storage/sqlite-state-snapshot-codec.js.map\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-keys.js\ndist/adapters/storage/sqlite-state-snapshot-keys.js.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js.map\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-read.js\ndist/adapters/storage/sqlite-state-snapshot-read.js.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.js\ndist/adapters/storage/sqlite-state-snapshot-transaction.js.map\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-types.js\ndist/adapters/storage/sqlite-state-snapshot-types.js.map\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-write.js\ndist/adapters/storage/sqlite-state-snapshot-write.js.map\ndist/adapters/storage/sqlite-state-snapshots.d.ts\ndist/adapters/storage/sqlite-state-snapshots.d.ts.map\ndist/adapters/storage/sqlite-state-snapshots.js\ndist/adapters/storage/sqlite-state-snapshots.js.map\ndist/adapters/storage/sqlite-types.d.ts\ndist/adapters/storage/sqlite-types.d.ts.map\ndist/adapters/storage/sqlite-types.js\ndist/adapters/storage/sqlite-types.js.map\ndist/adapters/storage/sqlite.d.ts\ndist/adapters/storage/sqlite.d.ts.map\ndist/adapters/storage/sqlite.js\ndist/adapters/storage/sqlite.js.map\ndist/adapters/storage/storage-validation.d.ts\ndist/adapters/storage/storage-validation.d.ts.map\ndist/adapters/storage/storage-validation.js\ndist/adapters/storage/storage-validation.js.map\ndist/adapters/tui/alternate-screen-terminal.d.ts\ndist/adapters/tui/alternate-screen-terminal.d.ts.map\ndist/adapters/tui/alternate-screen-terminal.js\ndist/adapters/tui/alternate-screen-terminal.js.map\ndist/adapters/tui/application-ui-controller.d.ts\ndist/adapters/tui/application-ui-controller.d.ts.map\ndist/adapters/tui/application-ui-controller.js\ndist/adapters/tui/application-ui-controller.js.map\ndist/adapters/tui/native-terminal-transport.d.ts\ndist/adapters/tui/native-terminal-transport.d.ts.map\ndist/adapters/tui/native-terminal-transport.js\ndist/adapters/tui/native-terminal-transport.js.map\ndist/adapters/tui/profile-connection-dispatch.d.ts\ndist/adapters/tui/profile-connection-dispatch.d.ts.map\ndist/adapters/tui/profile-connection-dispatch.js\ndist/adapters/tui/profile-connection-dispatch.js.map\ndist/adapters/tui/ui-automation-command.d.ts\ndist/adapters/tui/ui-automation-command.d.ts.map\ndist/adapters/tui/ui-automation-command.js\ndist/adapters/tui/ui-automation-command.js.map\ndist/adapters/tui/ui-automation-dispatch.d.ts\ndist/adapters/tui/ui-automation-dispatch.d.ts.map\ndist/adapters/tui/ui-automation-dispatch.js\ndist/adapters/tui/ui-automation-dispatch.js.map\ndist/adapters/tui/ui-capabilities.d.ts\ndist/adapters/tui/ui-capabilities.d.ts.map\ndist/adapters/tui/ui-capabilities.js\ndist/adapters/tui/ui-capabilities.js.map\ndist/adapters/tui/ui-command-dispatch.d.ts\ndist/adapters/tui/ui-command-dispatch.d.ts.map\ndist/adapters/tui/ui-command-dispatch.js\ndist/adapters/tui/ui-command-dispatch.js.map\ndist/adapters/tui/ui-conversation-dispatch.d.ts\ndist/adapters/tui/ui-conversation-dispatch.d.ts.map\ndist/adapters/tui/ui-conversation-dispatch.js\ndist/adapters/tui/ui-conversation-dispatch.js.map\ndist/adapters/tui/ui-core-dispatch.d.ts\ndist/adapters/tui/ui-core-dispatch.d.ts.map\ndist/adapters/tui/ui-core-dispatch.js\ndist/adapters/tui/ui-core-dispatch.js.map\ndist/adapters/tui/ui-dispatch-context.d.ts\ndist/adapters/tui/ui-dispatch-context.d.ts.map\ndist/adapters/tui/ui-dispatch-context.js\ndist/adapters/tui/ui-dispatch-context.js.map\ndist/adapters/tui/ui-dispatch-error.d.ts\ndist/adapters/tui/ui-dispatch-error.d.ts.map\ndist/adapters/tui/ui-dispatch-error.js\ndist/adapters/tui/ui-dispatch-error.js.map\ndist/adapters/tui/ui-dispatch.d.ts\ndist/adapters/tui/ui-dispatch.d.ts.map\ndist/adapters/tui/ui-dispatch.js\ndist/adapters/tui/ui-dispatch.js.map\ndist/adapters/tui/ui-entity-details.d.ts\ndist/adapters/tui/ui-entity-details.d.ts.map\ndist/adapters/tui/ui-entity-details.js\ndist/adapters/tui/ui-entity-details.js.map\ndist/adapters/tui/ui-fixtures.d.ts\ndist/adapters/tui/ui-fixtures.d.ts.map\ndist/adapters/tui/ui-fixtures.js\ndist/adapters/tui/ui-fixtures.js.map\ndist/adapters/tui/ui-headless-dispatch.d.ts\ndist/adapters/tui/ui-headless-dispatch.d.ts.map\ndist/adapters/tui/ui-headless-dispatch.js\ndist/adapters/tui/ui-headless-dispatch.js.map\ndist/adapters/tui/ui-intelligence-dispatch.d.ts\ndist/adapters/tui/ui-intelligence-dispatch.d.ts.map\ndist/adapters/tui/ui-intelligence-dispatch.js\ndist/adapters/tui/ui-intelligence-dispatch.js.map\ndist/adapters/tui/ui-intelligence-fixtures.d.ts\ndist/adapters/tui/ui-intelligence-fixtures.d.ts.map\ndist/adapters/tui/ui-intelligence-fixtures.js\ndist/adapters/tui/ui-intelligence-fixtures.js.map\ndist/adapters/tui/ui-intelligence-result-view.d.ts\ndist/adapters/tui/ui-intelligence-result-view.d.ts.map\ndist/adapters/tui/ui-intelligence-result-view.js\ndist/adapters/tui/ui-intelligence-result-view.js.map\ndist/adapters/tui/ui-interaction-receipt.d.ts\ndist/adapters/tui/ui-interaction-receipt.d.ts.map\ndist/adapters/tui/ui-interaction-receipt.js\ndist/adapters/tui/ui-interaction-receipt.js.map\ndist/adapters/tui/ui-projection.d.ts\ndist/adapters/tui/ui-projection.d.ts.map\ndist/adapters/tui/ui-projection.js\ndist/adapters/tui/ui-projection.js.map\ndist/adapters/tui/ui-semantic-state.d.ts\ndist/adapters/tui/ui-semantic-state.d.ts.map\ndist/adapters/tui/ui-semantic-state.js\ndist/adapters/tui/ui-semantic-state.js.map\ndist/adapters/tui/ui-subscriber-delivery.d.ts\ndist/adapters/tui/ui-subscriber-delivery.d.ts.map\ndist/adapters/tui/ui-subscriber-delivery.js\ndist/adapters/tui/ui-subscriber-delivery.js.map\ndist/adapters/tui/ui-view-model.d.ts\ndist/adapters/tui/ui-view-model.d.ts.map\ndist/adapters/tui/ui-view-model.js\ndist/adapters/tui/ui-view-model.js.map\ndist/app/action-host.d.ts\ndist/app/action-host.d.ts.map\ndist/app/action-host.js\ndist/app/action-host.js.map\ndist/app/action-serialization.d.ts\ndist/app/action-serialization.d.ts.map\ndist/app/action-serialization.js\ndist/app/action-serialization.js.map\ndist/app/analysis-comparison-contracts.d.ts\ndist/app/analysis-comparison-contracts.d.ts.map\ndist/app/analysis-comparison-contracts.js\ndist/app/analysis-comparison-contracts.js.map\ndist/app/analysis-comparison-evidence.d.ts\ndist/app/analysis-comparison-evidence.d.ts.map\ndist/app/analysis-comparison-evidence.js\ndist/app/analysis-comparison-evidence.js.map\ndist/app/analysis-comparison-facts.d.ts\ndist/app/analysis-comparison-facts.d.ts.map\ndist/app/analysis-comparison-facts.js\ndist/app/analysis-comparison-facts.js.map\ndist/app/analysis-comparison-graph.d.ts\ndist/app/analysis-comparison-graph.d.ts.map\ndist/app/analysis-comparison-graph.js\ndist/app/analysis-comparison-graph.js.map\ndist/app/analysis-comparison-lifecycle.d.ts\ndist/app/analysis-comparison-lifecycle.d.ts.map\ndist/app/analysis-comparison-lifecycle.js\ndist/app/analysis-comparison-lifecycle.js.map\ndist/app/analysis-comparison-record.d.ts\ndist/app/analysis-comparison-record.d.ts.map\ndist/app/analysis-comparison-record.js\ndist/app/analysis-comparison-record.js.map\ndist/app/analysis-comparison-request.d.ts\ndist/app/analysis-comparison-request.d.ts.map\ndist/app/analysis-comparison-request.js\ndist/app/analysis-comparison-request.js.map\ndist/app/analysis-comparison.d.ts\ndist/app/analysis-comparison.d.ts.map\ndist/app/analysis-comparison.js\ndist/app/analysis-comparison.js.map\ndist/app/analysis-execution-session.d.ts\ndist/app/analysis-execution-session.d.ts.map\ndist/app/analysis-execution-session.js\ndist/app/analysis-execution-session.js.map\ndist/app/analysis-execution-target.d.ts\ndist/app/analysis-execution-target.d.ts.map\ndist/app/analysis-execution-target.js\ndist/app/analysis-execution-target.js.map\ndist/app/analysis-graph-projector.d.ts\ndist/app/analysis-graph-projector.d.ts.map\ndist/app/analysis-graph-projector.js\ndist/app/analysis-graph-projector.js.map\ndist/app/analysis-lifecycle.d.ts\ndist/app/analysis-lifecycle.d.ts.map\ndist/app/analysis-lifecycle.js\ndist/app/analysis-lifecycle.js.map\ndist/app/analysis-model-call-records.d.ts\ndist/app/analysis-model-call-records.d.ts.map\ndist/app/analysis-model-call-records.js\ndist/app/analysis-model-call-records.js.map\ndist/app/analysis-operation.d.ts\ndist/app/analysis-operation.d.ts.map\ndist/app/analysis-operation.js\ndist/app/analysis-operation.js.map\ndist/app/analysis-persistence.d.ts\ndist/app/analysis-persistence.d.ts.map\ndist/app/analysis-persistence.js\ndist/app/analysis-persistence.js.map\ndist/app/analysis-promotion.d.ts\ndist/app/analysis-promotion.d.ts.map\ndist/app/analysis-promotion.js\ndist/app/analysis-promotion.js.map\ndist/app/analysis-request.d.ts\ndist/app/analysis-request.d.ts.map\ndist/app/analysis-request.js\ndist/app/analysis-request.js.map\ndist/app/analysis-result-mapper.d.ts\ndist/app/analysis-result-mapper.d.ts.map\ndist/app/analysis-result-mapper.js\ndist/app/analysis-result-mapper.js.map\ndist/app/analysis-retained-admission.d.ts\ndist/app/analysis-retained-admission.d.ts.map\ndist/app/analysis-retained-admission.js\ndist/app/analysis-retained-admission.js.map\ndist/app/analysis-service.d.ts\ndist/app/analysis-service.d.ts.map\ndist/app/analysis-service.js\ndist/app/analysis-service.js.map\ndist/app/analysis-source.d.ts\ndist/app/analysis-source.d.ts.map\ndist/app/analysis-source.js\ndist/app/analysis-source.js.map\ndist/app/analysis-types.d.ts\ndist/app/analysis-types.d.ts.map\ndist/app/analysis-types.js\ndist/app/analysis-types.js.map\ndist/app/application-guards.d.ts\ndist/app/application-guards.d.ts.map\ndist/app/application-guards.js\ndist/app/application-guards.js.map\ndist/app/application-interaction-actions.d.ts\ndist/app/application-interaction-actions.d.ts.map\ndist/app/application-interaction-actions.js\ndist/app/application-interaction-actions.js.map\ndist/app/application-lifecycle.d.ts\ndist/app/application-lifecycle.d.ts.map\ndist/app/application-lifecycle.js\ndist/app/application-lifecycle.js.map\ndist/app/application-options.d.ts\ndist/app/application-options.d.ts.map\ndist/app/application-options.js\ndist/app/application-options.js.map\ndist/app/application-port-builder.d.ts\ndist/app/application-port-builder.d.ts.map\ndist/app/application-port-builder.js\ndist/app/application-port-builder.js.map\ndist/app/application-port-runtime.d.ts\ndist/app/application-port-runtime.d.ts.map\ndist/app/application-port-runtime.js\ndist/app/application-port-runtime.js.map\ndist/app/application-ports.d.ts\ndist/app/application-ports.d.ts.map\ndist/app/application-ports.js\ndist/app/application-ports.js.map\ndist/app/application-runtime-wiring.d.ts\ndist/app/application-runtime-wiring.d.ts.map\ndist/app/application-runtime-wiring.js\ndist/app/application-runtime-wiring.js.map\ndist/app/application-support.d.ts\ndist/app/application-support.d.ts.map\ndist/app/application-support.js\ndist/app/application-support.js.map\ndist/app/application-transition.d.ts\ndist/app/application-transition.d.ts.map\ndist/app/application-transition.js\ndist/app/application-transition.js.map\ndist/app/application-types.d.ts\ndist/app/application-types.d.ts.map\ndist/app/application-types.js\ndist/app/application-types.js.map\ndist/app/application.d.ts\ndist/app/application.d.ts.map\ndist/app/application.js\ndist/app/application.js.map\ndist/app/automation-actions.d.ts\ndist/app/automation-actions.d.ts.map\ndist/app/automation-actions.js\ndist/app/automation-actions.js.map\ndist/app/automation-matching.d.ts\ndist/app/automation-matching.d.ts.map\ndist/app/automation-matching.js\ndist/app/automation-matching.js.map\ndist/app/automation-rule-audit.d.ts\ndist/app/automation-rule-audit.d.ts.map\ndist/app/automation-rule-audit.js\ndist/app/automation-rule-audit.js.map\ndist/app/automation-rule-persistence.d.ts\ndist/app/automation-rule-persistence.d.ts.map\ndist/app/automation-rule-persistence.js\ndist/app/automation-rule-persistence.js.map\ndist/app/automation-rule-store.d.ts\ndist/app/automation-rule-store.d.ts.map\ndist/app/automation-rule-store.js\ndist/app/automation-rule-store.js.map\ndist/app/automation-rule-types.d.ts\ndist/app/automation-rule-types.d.ts.map\ndist/app/automation-rule-types.js\ndist/app/automation-rule-types.js.map\ndist/app/automation-rule-update.d.ts\ndist/app/automation-rule-update.d.ts.map\ndist/app/automation-rule-update.js\ndist/app/automation-rule-update.js.map\ndist/app/automation-rule-validation.d.ts\ndist/app/automation-rule-validation.d.ts.map\ndist/app/automation-rule-validation.js\ndist/app/automation-rule-validation.js.map\ndist/app/automation-rules.d.ts\ndist/app/automation-rules.d.ts.map\ndist/app/automation-rules.js\ndist/app/automation-rules.js.map\ndist/app/composition-options.d.ts\ndist/app/composition-options.d.ts.map\ndist/app/composition-options.js\ndist/app/composition-options.js.map\ndist/app/composition.d.ts\ndist/app/composition.d.ts.map\ndist/app/composition.js\ndist/app/composition.js.map\ndist/app/configuration-action-transition.d.ts\ndist/app/configuration-action-transition.d.ts.map\ndist/app/configuration-action-transition.js\ndist/app/configuration-action-transition.js.map\ndist/app/configuration-session.d.ts\ndist/app/configuration-session.d.ts.map\ndist/app/configuration-session.js\ndist/app/configuration-session.js.map\ndist/app/connection-action-support.d.ts\ndist/app/connection-action-support.d.ts.map\ndist/app/connection-action-support.js\ndist/app/connection-action-support.js.map\ndist/app/connection-action-types.d.ts\ndist/app/connection-action-types.d.ts.map\ndist/app/connection-action-types.js\ndist/app/connection-action-types.js.map\ndist/app/connection-actions.d.ts\ndist/app/connection-actions.d.ts.map\ndist/app/connection-actions.js\ndist/app/connection-actions.js.map\ndist/app/connection-errors.d.ts\ndist/app/connection-errors.d.ts.map\ndist/app/connection-errors.js\ndist/app/connection-errors.js.map\ndist/app/connection-probe.d.ts\ndist/app/connection-probe.d.ts.map\ndist/app/connection-probe.js\ndist/app/connection-probe.js.map\ndist/app/connection-record-factory.d.ts\ndist/app/connection-record-factory.d.ts.map\ndist/app/connection-record-factory.js\ndist/app/connection-record-factory.js.map\ndist/app/connections.d.ts\ndist/app/connections.d.ts.map\ndist/app/connections.js\ndist/app/connections.js.map\ndist/app/control-effects.d.ts\ndist/app/control-effects.d.ts.map\ndist/app/control-effects.js\ndist/app/control-effects.js.map\ndist/app/conversation-branch-effects.d.ts\ndist/app/conversation-branch-effects.d.ts.map\ndist/app/conversation-branch-effects.js\ndist/app/conversation-branch-effects.js.map\ndist/app/conversation-branches.d.ts\ndist/app/conversation-branches.d.ts.map\ndist/app/conversation-branches.js\ndist/app/conversation-branches.js.map\ndist/app/conversation-composition.d.ts\ndist/app/conversation-composition.d.ts.map\ndist/app/conversation-composition.js\ndist/app/conversation-composition.js.map\ndist/app/conversation-context.d.ts\ndist/app/conversation-context.d.ts.map\ndist/app/conversation-context.js\ndist/app/conversation-context.js.map\ndist/app/conversation-drafts.d.ts\ndist/app/conversation-drafts.d.ts.map\ndist/app/conversation-drafts.js\ndist/app/conversation-drafts.js.map\ndist/app/conversation-exports.d.ts\ndist/app/conversation-exports.d.ts.map\ndist/app/conversation-exports.js\ndist/app/conversation-exports.js.map\ndist/app/conversation-import-analyses.d.ts\ndist/app/conversation-import-analyses.d.ts.map\ndist/app/conversation-import-analyses.js\ndist/app/conversation-import-analyses.js.map\ndist/app/conversation-import-builder.d.ts\ndist/app/conversation-import-builder.d.ts.map\ndist/app/conversation-import-builder.js\ndist/app/conversation-import-builder.js.map\ndist/app/conversation-import-document.d.ts\ndist/app/conversation-import-document.d.ts.map\ndist/app/conversation-import-document.js\ndist/app/conversation-import-document.js.map\ndist/app/conversation-import-graph.d.ts\ndist/app/conversation-import-graph.d.ts.map\ndist/app/conversation-import-graph.js\ndist/app/conversation-import-graph.js.map\ndist/app/conversation-import-messages.d.ts\ndist/app/conversation-import-messages.d.ts.map\ndist/app/conversation-import-messages.js\ndist/app/conversation-import-messages.js.map\ndist/app/conversation-import-runs.d.ts\ndist/app/conversation-import-runs.d.ts.map\ndist/app/conversation-import-runs.js\ndist/app/conversation-import-runs.js.map\ndist/app/conversation-import-validation.d.ts\ndist/app/conversation-import-validation.d.ts.map\ndist/app/conversation-import-validation.js\ndist/app/conversation-import-validation.js.map\ndist/app/conversation-import-values.d.ts\ndist/app/conversation-import-values.d.ts.map\ndist/app/conversation-import-values.js\ndist/app/conversation-import-values.js.map\ndist/app/conversation-imports.d.ts\ndist/app/conversation-imports.d.ts.map\ndist/app/conversation-imports.js\ndist/app/conversation-imports.js.map\ndist/app/conversation-lifecycle.d.ts\ndist/app/conversation-lifecycle.d.ts.map\ndist/app/conversation-lifecycle.js\ndist/app/conversation-lifecycle.js.map\ndist/app/conversation-operation-coordinator.d.ts\ndist/app/conversation-operation-coordinator.d.ts.map\ndist/app/conversation-operation-coordinator.js\ndist/app/conversation-operation-coordinator.js.map\ndist/app/conversation-records.d.ts\ndist/app/conversation-records.d.ts.map\ndist/app/conversation-records.js\ndist/app/conversation-records.js.map\ndist/app/conversation-support.d.ts\ndist/app/conversation-support.d.ts.map\ndist/app/conversation-support.js\ndist/app/conversation-support.js.map\ndist/app/conversation-types.d.ts\ndist/app/conversation-types.d.ts.map\ndist/app/conversation-types.js\ndist/app/conversation-types.js.map\ndist/app/conversation-visibility.d.ts\ndist/app/conversation-visibility.d.ts.map\ndist/app/conversation-visibility.js\ndist/app/conversation-visibility.js.map\ndist/app/conversations.d.ts\ndist/app/conversations.d.ts.map\ndist/app/conversations.js\ndist/app/conversations.js.map\ndist/app/default-profiles.d.ts\ndist/app/default-profiles.d.ts.map\ndist/app/default-profiles.js\ndist/app/default-profiles.js.map\ndist/app/durable-send.d.ts\ndist/app/durable-send.d.ts.map\ndist/app/durable-send.js\ndist/app/durable-send.js.map\ndist/app/effect-coordinator.d.ts\ndist/app/effect-coordinator.d.ts.map\ndist/app/effect-coordinator.js\ndist/app/effect-coordinator.js.map\ndist/app/effect-projection.d.ts\ndist/app/effect-projection.d.ts.map\ndist/app/effect-projection.js\ndist/app/effect-projection.js.map\ndist/app/effective-run-configuration.d.ts\ndist/app/effective-run-configuration.d.ts.map\ndist/app/effective-run-configuration.js\ndist/app/effective-run-configuration.js.map\ndist/app/errors.d.ts\ndist/app/errors.d.ts.map\ndist/app/errors.js\ndist/app/errors.js.map\ndist/app/fail-closed-journal.d.ts\ndist/app/fail-closed-journal.d.ts.map\ndist/app/fail-closed-journal.js\ndist/app/fail-closed-journal.js.map\ndist/app/intelligence-actions.d.ts\ndist/app/intelligence-actions.d.ts.map\ndist/app/intelligence-actions.js\ndist/app/intelligence-actions.js.map\ndist/app/interaction-automation-coordinator.d.ts\ndist/app/interaction-automation-coordinator.d.ts.map\ndist/app/interaction-automation-coordinator.js\ndist/app/interaction-automation-coordinator.js.map\ndist/app/interaction-controller.d.ts\ndist/app/interaction-controller.d.ts.map\ndist/app/interaction-controller.js\ndist/app/interaction-controller.js.map\ndist/app/interaction-effects.d.ts\ndist/app/interaction-effects.d.ts.map\ndist/app/interaction-effects.js\ndist/app/interaction-effects.js.map\ndist/app/interaction-request.d.ts\ndist/app/interaction-request.d.ts.map\ndist/app/interaction-request.js\ndist/app/interaction-request.js.map\ndist/app/interaction-response-replay.d.ts\ndist/app/interaction-response-replay.d.ts.map\ndist/app/interaction-response-replay.js\ndist/app/interaction-response-replay.js.map\ndist/app/interaction-response.d.ts\ndist/app/interaction-response.d.ts.map\ndist/app/interaction-response.js\ndist/app/interaction-response.js.map\ndist/app/journal.d.ts\ndist/app/journal.d.ts.map\ndist/app/journal.js\ndist/app/journal.js.map\ndist/app/legacy-cancel.d.ts\ndist/app/legacy-cancel.d.ts.map\ndist/app/legacy-cancel.js\ndist/app/legacy-cancel.js.map\ndist/app/operation-fingerprint.d.ts\ndist/app/operation-fingerprint.d.ts.map\ndist/app/operation-fingerprint.js\ndist/app/operation-fingerprint.js.map\ndist/app/operation-ledger.d.ts\ndist/app/operation-ledger.d.ts.map\ndist/app/operation-ledger.js\ndist/app/operation-ledger.js.map\ndist/app/production-composition.d.ts\ndist/app/production-composition.d.ts.map\ndist/app/production-composition.js\ndist/app/production-composition.js.map\ndist/app/profile-action-support.d.ts\ndist/app/profile-action-support.d.ts.map\ndist/app/profile-action-support.js\ndist/app/profile-action-support.js.map\ndist/app/profile-actions.d.ts\ndist/app/profile-actions.d.ts.map\ndist/app/profile-actions.js\ndist/app/profile-actions.js.map\ndist/app/profile-draft.d.ts\ndist/app/profile-draft.d.ts.map\ndist/app/profile-draft.js\ndist/app/profile-draft.js.map\ndist/app/profile-model-settings.d.ts\ndist/app/profile-model-settings.d.ts.map\ndist/app/profile-model-settings.js\ndist/app/profile-model-settings.js.map\ndist/app/profile-persistence.d.ts\ndist/app/profile-persistence.d.ts.map\ndist/app/profile-persistence.js\ndist/app/profile-persistence.js.map\ndist/app/profile-save-recovery.d.ts\ndist/app/profile-save-recovery.d.ts.map\ndist/app/profile-save-recovery.js\ndist/app/profile-save-recovery.js.map\ndist/app/profile-selection.d.ts\ndist/app/profile-selection.d.ts.map\ndist/app/profile-selection.js\ndist/app/profile-selection.js.map\ndist/app/profile-snapshots.d.ts\ndist/app/profile-snapshots.d.ts.map\ndist/app/profile-snapshots.js\ndist/app/profile-snapshots.js.map\ndist/app/profile-sources.d.ts\ndist/app/profile-sources.d.ts.map\ndist/app/profile-sources.js\ndist/app/profile-sources.js.map\ndist/app/profile-types.d.ts\ndist/app/profile-types.d.ts.map\ndist/app/profile-types.js\ndist/app/profile-types.js.map\ndist/app/profile-validation.d.ts\ndist/app/profile-validation.d.ts.map\ndist/app/profile-validation.js\ndist/app/profile-validation.js.map\ndist/app/profiles.d.ts\ndist/app/profiles.d.ts.map\ndist/app/profiles.js\ndist/app/profiles.js.map\ndist/app/provider-snapshot.d.ts\ndist/app/provider-snapshot.d.ts.map\ndist/app/provider-snapshot.js\ndist/app/provider-snapshot.js.map\ndist/app/provider-values.d.ts\ndist/app/provider-values.d.ts.map\ndist/app/provider-values.js\ndist/app/provider-values.js.map\ndist/app/run-admission-continuation.d.ts\ndist/app/run-admission-continuation.d.ts.map\ndist/app/run-admission-continuation.js\ndist/app/run-admission-continuation.js.map\ndist/app/run-admission-dispatch.d.ts\ndist/app/run-admission-dispatch.d.ts.map\ndist/app/run-admission-dispatch.js\ndist/app/run-admission-dispatch.js.map\ndist/app/run-admission-receipt.d.ts\ndist/app/run-admission-receipt.d.ts.map\ndist/app/run-admission-receipt.js\ndist/app/run-admission-receipt.js.map\ndist/app/run-admission-request.d.ts\ndist/app/run-admission-request.d.ts.map\ndist/app/run-admission-request.js\ndist/app/run-admission-request.js.map\ndist/app/run-admission-validation.d.ts\ndist/app/run-admission-validation.d.ts.map\ndist/app/run-admission-validation.js\ndist/app/run-admission-validation.js.map\ndist/app/run-admission.d.ts\ndist/app/run-admission.d.ts.map\ndist/app/run-admission.js\ndist/app/run-admission.js.map\ndist/app/run-continuation.d.ts\ndist/app/run-continuation.d.ts.map\ndist/app/run-continuation.js\ndist/app/run-continuation.js.map\ndist/app/run-controls.d.ts\ndist/app/run-controls.d.ts.map\ndist/app/run-controls.js\ndist/app/run-controls.js.map\ndist/app/run-event-mapper.d.ts\ndist/app/run-event-mapper.d.ts.map\ndist/app/run-event-mapper.js\ndist/app/run-event-mapper.js.map\ndist/app/run-execution-snapshot.d.ts\ndist/app/run-execution-snapshot.d.ts.map\ndist/app/run-execution-snapshot.js\ndist/app/run-execution-snapshot.js.map\ndist/app/run-execution.d.ts\ndist/app/run-execution.d.ts.map\ndist/app/run-execution.js\ndist/app/run-execution.js.map\ndist/app/run-ingestion.d.ts\ndist/app/run-ingestion.d.ts.map\ndist/app/run-ingestion.js\ndist/app/run-ingestion.js.map\ndist/app/run-ledger.d.ts\ndist/app/run-ledger.d.ts.map\ndist/app/run-ledger.js\ndist/app/run-ledger.js.map\ndist/app/run-recovery-context.d.ts\ndist/app/run-recovery-context.d.ts.map\ndist/app/run-recovery-context.js\ndist/app/run-recovery-context.js.map\ndist/app/run-replay.d.ts\ndist/app/run-replay.d.ts.map\ndist/app/run-replay.js\ndist/app/run-replay.js.map\ndist/app/run-status.d.ts\ndist/app/run-status.d.ts.map\ndist/app/run-status.js\ndist/app/run-status.js.map\ndist/app/run-stream-sanitizer.d.ts\ndist/app/run-stream-sanitizer.d.ts.map\ndist/app/run-stream-sanitizer.js\ndist/app/run-stream-sanitizer.js.map\ndist/app/runtime-selection.d.ts\ndist/app/runtime-selection.d.ts.map\ndist/app/runtime-selection.js\ndist/app/runtime-selection.js.map\ndist/app/shutdown-controller.d.ts\ndist/app/shutdown-controller.d.ts.map\ndist/app/shutdown-controller.js\ndist/app/shutdown-controller.js.map\ndist/app/storage-journal-support.d.ts\ndist/app/storage-journal-support.d.ts.map\ndist/app/storage-journal-support.js\ndist/app/storage-journal-support.js.map\ndist/app/storage-journal.d.ts\ndist/app/storage-journal.d.ts.map\ndist/app/storage-journal.js\ndist/app/storage-journal.js.map\ndist/app/supervisor-projection.d.ts\ndist/app/supervisor-projection.d.ts.map\ndist/app/supervisor-projection.js\ndist/app/supervisor-projection.js.map\ndist/app/supervisor-service.d.ts\ndist/app/supervisor-service.d.ts.map\ndist/app/supervisor-service.js\ndist/app/supervisor-service.js.map\ndist/app/unavailable-analyst.d.ts\ndist/app/unavailable-analyst.d.ts.map\ndist/app/unavailable-analyst.js\ndist/app/unavailable-analyst.js.map\ndist/bin/args.d.ts\ndist/bin/args.d.ts.map\ndist/bin/args.js\ndist/bin/args.js.map\ndist/bin/braid-runtime.d.ts\ndist/bin/braid-runtime.d.ts.map\ndist/bin/braid-runtime.js\ndist/bin/braid-runtime.js.map\ndist/bin/braid.d.ts\ndist/bin/braid.d.ts.map\ndist/bin/braid.js\ndist/bin/braid.js.map\ndist/bin/fixture-application.d.ts\ndist/bin/fixture-application.d.ts.map\ndist/bin/fixture-application.js\ndist/bin/fixture-application.js.map\ndist/bin/interface-runner.d.ts\ndist/bin/interface-runner.d.ts.map\ndist/bin/interface-runner.js\ndist/bin/interface-runner.js.map\ndist/bin/interface-signal-lifecycle.d.ts\ndist/bin/interface-signal-lifecycle.d.ts.map\ndist/bin/interface-signal-lifecycle.js\ndist/bin/interface-signal-lifecycle.js.map\ndist/bin/interface-state-recorder.d.ts\ndist/bin/interface-state-recorder.d.ts.map\ndist/bin/interface-state-recorder.js\ndist/bin/interface-state-recorder.js.map\ndist/bin/native-interactive-actions.d.ts\ndist/bin/native-interactive-actions.d.ts.map\ndist/bin/native-interactive-actions.js\ndist/bin/native-interactive-actions.js.map\ndist/bin/plain.d.ts\ndist/bin/plain.d.ts.map\ndist/bin/plain.js\ndist/bin/plain.js.map\ndist/bin/production-active-profile.d.ts\ndist/bin/production-active-profile.d.ts.map\ndist/bin/production-active-profile.js\ndist/bin/production-active-profile.js.map\ndist/bin/production-application.d.ts\ndist/bin/production-application.d.ts.map\ndist/bin/production-application.js\ndist/bin/production-application.js.map\ndist/bin/production-bridge-client.d.ts\ndist/bin/production-bridge-client.d.ts.map\ndist/bin/production-bridge-client.js\ndist/bin/production-bridge-client.js.map\ndist/bin/production-bridge-discovery.d.ts\ndist/bin/production-bridge-discovery.d.ts.map\ndist/bin/production-bridge-discovery.js\ndist/bin/production-bridge-discovery.js.map\ndist/bin/production-config-mutation-lock.d.ts\ndist/bin/production-config-mutation-lock.d.ts.map\ndist/bin/production-config-mutation-lock.js\ndist/bin/production-config-mutation-lock.js.map\ndist/bin/production-connection-action-options.d.ts\ndist/bin/production-connection-action-options.d.ts.map\ndist/bin/production-connection-action-options.js\ndist/bin/production-connection-action-options.js.map\ndist/bin/production-connection-actions.d.ts\ndist/bin/production-connection-actions.d.ts.map\ndist/bin/production-connection-actions.js\ndist/bin/production-connection-actions.js.map\ndist/bin/production-connection-catalog.d.ts\ndist/bin/production-connection-catalog.d.ts.map\ndist/bin/production-connection-catalog.js\ndist/bin/production-connection-catalog.js.map\ndist/bin/production-connection-credential-cleanup.d.ts\ndist/bin/production-connection-credential-cleanup.d.ts.map\ndist/bin/production-connection-credential-cleanup.js\ndist/bin/production-connection-credential-cleanup.js.map\ndist/bin/production-connection-credential-removal-record.d.ts\ndist/bin/production-connection-credential-removal-record.d.ts.map\ndist/bin/production-connection-credential-removal-record.js\ndist/bin/production-connection-credential-removal-record.js.map\ndist/bin/production-connection-removal.d.ts\ndist/bin/production-connection-removal.d.ts.map\ndist/bin/production-connection-removal.js\ndist/bin/production-connection-removal.js.map\ndist/bin/production-connection-replay.d.ts\ndist/bin/production-connection-replay.d.ts.map\ndist/bin/production-connection-replay.js\ndist/bin/production-connection-replay.js.map\ndist/bin/production-credential-context.d.ts\ndist/bin/production-credential-context.d.ts.map\ndist/bin/production-credential-context.js\ndist/bin/production-credential-context.js.map\ndist/bin/production-credential-reference.d.ts\ndist/bin/production-credential-reference.d.ts.map\ndist/bin/production-credential-reference.js\ndist/bin/production-credential-reference.js.map\ndist/bin/production-key-path.d.ts\ndist/bin/production-key-path.d.ts.map\ndist/bin/production-key-path.js\ndist/bin/production-key-path.js.map\ndist/bin/production-profile-projection.d.ts\ndist/bin/production-profile-projection.d.ts.map\ndist/bin/production-profile-projection.js\ndist/bin/production-profile-projection.js.map\ndist/bin/production-setup-credentials.d.ts\ndist/bin/production-setup-credentials.d.ts.map\ndist/bin/production-setup-credentials.js\ndist/bin/production-setup-credentials.js.map\ndist/bin/production-setup-discovery.d.ts\ndist/bin/production-setup-discovery.d.ts.map\ndist/bin/production-setup-discovery.js\ndist/bin/production-setup-discovery.js.map\ndist/bin/production-setup-persistence.d.ts\ndist/bin/production-setup-persistence.d.ts.map\ndist/bin/production-setup-persistence.js\ndist/bin/production-setup-persistence.js.map\ndist/bin/production-setup-transition.d.ts\ndist/bin/production-setup-transition.d.ts.map\ndist/bin/production-setup-transition.js\ndist/bin/production-setup-transition.js.map\ndist/bin/production-setup-types.d.ts\ndist/bin/production-setup-types.d.ts.map\ndist/bin/production-setup-types.js\ndist/bin/production-setup-types.js.map\ndist/bin/production-setup-validation.d.ts\ndist/bin/production-setup-validation.d.ts.map\ndist/bin/production-setup-validation.js\ndist/bin/production-setup-validation.js.map\ndist/bin/production-setup.d.ts\ndist/bin/production-setup.d.ts.map\ndist/bin/production-setup.js\ndist/bin/production-setup.js.map\ndist/bin/production-startup.d.ts\ndist/bin/production-startup.d.ts.map\ndist/bin/production-startup.js\ndist/bin/production-startup.js.map\ndist/bin/runtime-startup-options.d.ts\ndist/bin/runtime-startup-options.d.ts.map\ndist/bin/runtime-startup-options.js\ndist/bin/runtime-startup-options.js.map\ndist/bin/state-path.d.ts\ndist/bin/state-path.d.ts.map\ndist/bin/state-path.js\ndist/bin/state-path.js.map\ndist/domain/analysis-model-call.d.ts\ndist/domain/analysis-model-call.d.ts.map\ndist/domain/analysis-model-call.js\ndist/domain/analysis-model-call.js.map\ndist/domain/bounded-structured.d.ts\ndist/domain/bounded-structured.d.ts.map\ndist/domain/bounded-structured.js\ndist/domain/bounded-structured.js.map\ndist/domain/canonical-json.d.ts\ndist/domain/canonical-json.d.ts.map\ndist/domain/canonical-json.js\ndist/domain/canonical-json.js.map\ndist/domain/canonical.d.ts\ndist/domain/canonical.d.ts.map\ndist/domain/canonical.js\ndist/domain/canonical.js.map\ndist/domain/code-unit-order.d.ts\ndist/domain/code-unit-order.d.ts.map\ndist/domain/code-unit-order.js\ndist/domain/code-unit-order.js.map\ndist/domain/connection-removal.d.ts\ndist/domain/connection-removal.d.ts.map\ndist/domain/connection-removal.js\ndist/domain/connection-removal.js.map\ndist/domain/content-budget.d.ts\ndist/domain/content-budget.d.ts.map\ndist/domain/content-budget.js\ndist/domain/content-budget.js.map\ndist/domain/entities-base.d.ts\ndist/domain/entities-base.d.ts.map\ndist/domain/entities-base.js\ndist/domain/entities-base.js.map\ndist/domain/entities-core.d.ts\ndist/domain/entities-core.d.ts.map\ndist/domain/entities-core.js\ndist/domain/entities-core.js.map\ndist/domain/entities-graph.d.ts\ndist/domain/entities-graph.d.ts.map\ndist/domain/entities-graph.js\ndist/domain/entities-graph.js.map\ndist/domain/entities-interactions.d.ts\ndist/domain/entities-interactions.d.ts.map\ndist/domain/entities-interactions.js\ndist/domain/entities-interactions.js.map\ndist/domain/entities-messages.d.ts\ndist/domain/entities-messages.d.ts.map\ndist/domain/entities-messages.js\ndist/domain/entities-messages.js.map\ndist/domain/entities-runtime.d.ts\ndist/domain/entities-runtime.d.ts.map\ndist/domain/entities-runtime.js\ndist/domain/entities-runtime.js.map\ndist/domain/entities.d.ts\ndist/domain/entities.d.ts.map\ndist/domain/entities.js\ndist/domain/entities.js.map\ndist/domain/events-legacy.d.ts\ndist/domain/events-legacy.d.ts.map\ndist/domain/events-legacy.js\ndist/domain/events-legacy.js.map\ndist/domain/events.d.ts\ndist/domain/events.d.ts.map\ndist/domain/events.js\ndist/domain/events.js.map\ndist/domain/execution-observation.d.ts\ndist/domain/execution-observation.d.ts.map\ndist/domain/execution-observation.js\ndist/domain/execution-observation.js.map\ndist/domain/graph-records.d.ts\ndist/domain/graph-records.d.ts.map\ndist/domain/graph-records.js\ndist/domain/graph-records.js.map\ndist/domain/ids-core.d.ts\ndist/domain/ids-core.d.ts.map\ndist/domain/ids-core.js\ndist/domain/ids-core.js.map\ndist/domain/ids-types.d.ts\ndist/domain/ids-types.d.ts.map\ndist/domain/ids-types.js\ndist/domain/ids-types.js.map\ndist/domain/ids-values.d.ts\ndist/domain/ids-values.d.ts.map\ndist/domain/ids-values.js\ndist/domain/ids-values.js.map\ndist/domain/ids.d.ts\ndist/domain/ids.d.ts.map\ndist/domain/ids.js\ndist/domain/ids.js.map\ndist/domain/interaction-timeout.d.ts\ndist/domain/interaction-timeout.d.ts.map\ndist/domain/interaction-timeout.js\ndist/domain/interaction-timeout.js.map\ndist/domain/invariants-base.d.ts\ndist/domain/invariants-base.d.ts.map\ndist/domain/invariants-base.js\ndist/domain/invariants-base.js.map\ndist/domain/invariants-conversation.d.ts\ndist/domain/invariants-conversation.d.ts.map\ndist/domain/invariants-conversation.js\ndist/domain/invariants-conversation.js.map\ndist/domain/invariants-profile.d.ts\ndist/domain/invariants-profile.d.ts.map\ndist/domain/invariants-profile.js\ndist/domain/invariants-profile.js.map\ndist/domain/invariants-relations.d.ts\ndist/domain/invariants-relations.d.ts.map\ndist/domain/invariants-relations.js\ndist/domain/invariants-relations.js.map\ndist/domain/invariants-retained-admission.d.ts\ndist/domain/invariants-retained-admission.d.ts.map\ndist/domain/invariants-retained-admission.js\ndist/domain/invariants-retained-admission.js.map\ndist/domain/invariants-run.d.ts\ndist/domain/invariants-run.d.ts.map\ndist/domain/invariants-run.js\ndist/domain/invariants-run.js.map\ndist/domain/invariants-runtime.d.ts\ndist/domain/invariants-runtime.d.ts.map\ndist/domain/invariants-runtime.js\ndist/domain/invariants-runtime.js.map\ndist/domain/invariants-state.d.ts\ndist/domain/invariants-state.d.ts.map\ndist/domain/invariants-state.js\ndist/domain/invariants-state.js.map\ndist/domain/invariants.d.ts\ndist/domain/invariants.d.ts.map\ndist/domain/invariants.js\ndist/domain/invariants.js.map\ndist/domain/legacy-interaction-snapshot.d.ts\ndist/domain/legacy-interaction-snapshot.d.ts.map\ndist/domain/legacy-interaction-snapshot.js\ndist/domain/legacy-interaction-snapshot.js.map\ndist/domain/materialization-receipt.d.ts\ndist/domain/materialization-receipt.d.ts.map\ndist/domain/materialization-receipt.js\ndist/domain/materialization-receipt.js.map\ndist/domain/materialized-state-snapshot.d.ts\ndist/domain/materialized-state-snapshot.d.ts.map\ndist/domain/materialized-state-snapshot.js\ndist/domain/materialized-state-snapshot.js.map\ndist/domain/materialized-state.d.ts\ndist/domain/materialized-state.d.ts.map\ndist/domain/materialized-state.js\ndist/domain/materialized-state.js.map\ndist/domain/projection-checksum.d.ts\ndist/domain/projection-checksum.d.ts.map\ndist/domain/projection-checksum.js\ndist/domain/projection-checksum.js.map\ndist/domain/provider-values.d.ts\ndist/domain/provider-values.d.ts.map\ndist/domain/provider-values.js\ndist/domain/provider-values.js.map\ndist/domain/public-metadata.d.ts\ndist/domain/public-metadata.d.ts.map\ndist/domain/public-metadata.js\ndist/domain/public-metadata.js.map\ndist/domain/receipts.d.ts\ndist/domain/receipts.d.ts.map\ndist/domain/receipts.js\ndist/domain/receipts.js.map\ndist/domain/redaction.d.ts\ndist/domain/redaction.d.ts.map\ndist/domain/redaction.js\ndist/domain/redaction.js.map\ndist/domain/reducer-content.d.ts\ndist/domain/reducer-content.d.ts.map\ndist/domain/reducer-content.js\ndist/domain/reducer-content.js.map\ndist/domain/reducer-conversation-events.d.ts\ndist/domain/reducer-conversation-events.d.ts.map\ndist/domain/reducer-conversation-events.js\ndist/domain/reducer-conversation-events.js.map\ndist/domain/reducer-domain-events.d.ts\ndist/domain/reducer-domain-events.d.ts.map\ndist/domain/reducer-domain-events.js\ndist/domain/reducer-domain-events.js.map\ndist/domain/reducer-execution-observation.d.ts\ndist/domain/reducer-execution-observation.d.ts.map\ndist/domain/reducer-execution-observation.js\ndist/domain/reducer-execution-observation.js.map\ndist/domain/reducer-helpers.d.ts\ndist/domain/reducer-helpers.d.ts.map\ndist/domain/reducer-helpers.js\ndist/domain/reducer-helpers.js.map\ndist/domain/reducer-interactions.d.ts\ndist/domain/reducer-interactions.d.ts.map\ndist/domain/reducer-interactions.js\ndist/domain/reducer-interactions.js.map\ndist/domain/reducer-legacy.d.ts\ndist/domain/reducer-legacy.d.ts.map\ndist/domain/reducer-legacy.js\ndist/domain/reducer-legacy.js.map\ndist/domain/reducer-lifecycle.d.ts\ndist/domain/reducer-lifecycle.d.ts.map\ndist/domain/reducer-lifecycle.js\ndist/domain/reducer-lifecycle.js.map\ndist/domain/reducer-replay.d.ts\ndist/domain/reducer-replay.d.ts.map\ndist/domain/reducer-replay.js\ndist/domain/reducer-replay.js.map\ndist/domain/reducer-retained-admission.d.ts\ndist/domain/reducer-retained-admission.d.ts.map\ndist/domain/reducer-retained-admission.js\ndist/domain/reducer-retained-admission.js.map\ndist/domain/reducer-run-graph.d.ts\ndist/domain/reducer-run-graph.d.ts.map\ndist/domain/reducer-run-graph.js\ndist/domain/reducer-run-graph.js.map\ndist/domain/reducer-runtime.d.ts\ndist/domain/reducer-runtime.d.ts.map\ndist/domain/reducer-runtime.js\ndist/domain/reducer-runtime.js.map\ndist/domain/reducer-support.d.ts\ndist/domain/reducer-support.d.ts.map\ndist/domain/reducer-support.js\ndist/domain/reducer-support.js.map\ndist/domain/reducer.d.ts\ndist/domain/reducer.d.ts.map\ndist/domain/reducer.js\ndist/domain/reducer.js.map\ndist/domain/run-contracts.d.ts\ndist/domain/run-contracts.d.ts.map\ndist/domain/run-contracts.js\ndist/domain/run-contracts.js.map\ndist/domain/run-interactions.d.ts\ndist/domain/run-interactions.d.ts.map\ndist/domain/run-interactions.js\ndist/domain/run-interactions.js.map\ndist/domain/run-usage.d.ts\ndist/domain/run-usage.d.ts.map\ndist/domain/run-usage.js\ndist/domain/run-usage.js.map\ndist/domain/runtime-diagnostics.d.ts\ndist/domain/runtime-diagnostics.d.ts.map\ndist/domain/runtime-diagnostics.js\ndist/domain/runtime-diagnostics.js.map\ndist/domain/runtime-events.d.ts\ndist/domain/runtime-events.d.ts.map\ndist/domain/runtime-events.js\ndist/domain/runtime-events.js.map\ndist/domain/runtime-projection.d.ts\ndist/domain/runtime-projection.d.ts.map\ndist/domain/runtime-projection.js\ndist/domain/runtime-projection.js.map\ndist/domain/secret-sanitizer.d.ts\ndist/domain/secret-sanitizer.d.ts.map\ndist/domain/secret-sanitizer.js\ndist/domain/secret-sanitizer.js.map\ndist/domain/state.d.ts\ndist/domain/state.d.ts.map\ndist/domain/state.js\ndist/domain/state.js.map\ndist/domain/terminal-sanitizer.d.ts\ndist/domain/terminal-sanitizer.d.ts.map\ndist/domain/terminal-sanitizer.js\ndist/domain/terminal-sanitizer.js.map\ndist/domain/text.d.ts\ndist/domain/text.d.ts.map\ndist/domain/text.js\ndist/domain/text.js.map\ndist/eval/calibration.d.ts\ndist/eval/calibration.d.ts.map\ndist/eval/calibration.js\ndist/eval/calibration.js.map\ndist/eval/campaigns.d.ts\ndist/eval/campaigns.d.ts.map\ndist/eval/campaigns.js\ndist/eval/campaigns.js.map\ndist/eval/cases.d.ts\ndist/eval/cases.d.ts.map\ndist/eval/cases.js\ndist/eval/cases.js.map\ndist/eval/execution.d.ts\ndist/eval/execution.d.ts.map\ndist/eval/execution.js\ndist/eval/execution.js.map\ndist/eval/fixtures.d.ts\ndist/eval/fixtures.d.ts.map\ndist/eval/fixtures.js\ndist/eval/fixtures.js.map\ndist/eval/product-path.d.ts\ndist/eval/product-path.d.ts.map\ndist/eval/product-path.js\ndist/eval/product-path.js.map\ndist/eval/record-builder.d.ts\ndist/eval/record-builder.d.ts.map\ndist/eval/record-builder.js\ndist/eval/record-builder.js.map\ndist/eval/records.d.ts\ndist/eval/records.d.ts.map\ndist/eval/records.js\ndist/eval/records.js.map\ndist/eval/release-decision.d.ts\ndist/eval/release-decision.d.ts.map\ndist/eval/release-decision.js\ndist/eval/release-decision.js.map\ndist/eval/release-markers.d.ts\ndist/eval/release-markers.d.ts.map\ndist/eval/release-markers.js\ndist/eval/release-markers.js.map\ndist/eval/runner.d.ts\ndist/eval/runner.d.ts.map\ndist/eval/runner.js\ndist/eval/runner.js.map\ndist/eval/types.d.ts\ndist/eval/types.d.ts.map\ndist/eval/types.js\ndist/eval/types.js.map\ndist/index.d.ts\ndist/index.d.ts.map\ndist/index.js\ndist/index.js.map\ndist/installed-package-version.d.ts\ndist/installed-package-version.d.ts.map\ndist/installed-package-version.js\ndist/installed-package-version.js.map\ndist/ports/clock.d.ts\ndist/ports/clock.d.ts.map\ndist/ports/clock.js\ndist/ports/clock.js.map\ndist/ports/connection-lifecycle.d.ts\ndist/ports/connection-lifecycle.d.ts.map\ndist/ports/connection-lifecycle.js\ndist/ports/connection-lifecycle.js.map\ndist/ports/credentials.d.ts\ndist/ports/credentials.d.ts.map\ndist/ports/credentials.js\ndist/ports/credentials.js.map\ndist/ports/effect-storage.d.ts\ndist/ports/effect-storage.d.ts.map\ndist/ports/effect-storage.js\ndist/ports/effect-storage.js.map\ndist/ports/execution.d.ts\ndist/ports/execution.d.ts.map\ndist/ports/execution.js\ndist/ports/execution.js.map\ndist/ports/ids.d.ts\ndist/ports/ids.d.ts.map\ndist/ports/ids.js\ndist/ports/ids.js.map\ndist/ports/native-interactive-execution.d.ts\ndist/ports/native-interactive-execution.d.ts.map\ndist/ports/native-interactive-execution.js\ndist/ports/native-interactive-execution.js.map\ndist/ports/native-terminal-transport.d.ts\ndist/ports/native-terminal-transport.d.ts.map\ndist/ports/native-terminal-transport.js\ndist/ports/native-terminal-transport.js.map\ndist/ports/storage.d.ts\ndist/ports/storage.d.ts.map\ndist/ports/storage.js\ndist/ports/storage.js.map\ndist/startup/chunks/analysis-comparison-facts-4HBRMPC5.js\ndist/startup/chunks/analysis-comparison-facts-4HBRMPC5.js.map\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js.map\ndist/startup/chunks/chunk-23EX3F5F.js\ndist/startup/chunks/chunk-23EX3F5F.js.map\ndist/startup/chunks/chunk-2B6P3EZQ.js\ndist/startup/chunks/chunk-2B6P3EZQ.js.map\ndist/startup/chunks/chunk-3SLVNOQZ.js\ndist/startup/chunks/chunk-3SLVNOQZ.js.map\ndist/startup/chunks/chunk-4GTWJJDM.js\ndist/startup/chunks/chunk-4GTWJJDM.js.map\ndist/startup/chunks/chunk-5LULVGCK.js\ndist/startup/chunks/chunk-5LULVGCK.js.map\ndist/startup/chunks/chunk-5PAWXR2Q.js\ndist/startup/chunks/chunk-5PAWXR2Q.js.map\ndist/startup/chunks/chunk-67SGXJUO.js\ndist/startup/chunks/chunk-67SGXJUO.js.map\ndist/startup/chunks/chunk-6G7QKB6J.js\ndist/startup/chunks/chunk-6G7QKB6J.js.map\ndist/startup/chunks/chunk-ACDTVSAU.js\ndist/startup/chunks/chunk-ACDTVSAU.js.map\ndist/startup/chunks/chunk-AUQCJYW5.js\ndist/startup/chunks/chunk-AUQCJYW5.js.map\ndist/startup/chunks/chunk-CS5FUFHS.js\ndist/startup/chunks/chunk-CS5FUFHS.js.map\ndist/startup/chunks/chunk-D3IM3CS6.js\ndist/startup/chunks/chunk-D3IM3CS6.js.map\ndist/startup/chunks/chunk-DLR6FLQV.js\ndist/startup/chunks/chunk-DLR6FLQV.js.map\ndist/startup/chunks/chunk-EG7UPV4Q.js\ndist/startup/chunks/chunk-EG7UPV4Q.js.map\ndist/startup/chunks/chunk-EMKXHR2V.js\ndist/startup/chunks/chunk-EMKXHR2V.js.map\ndist/startup/chunks/chunk-EMP3DK5W.js\ndist/startup/chunks/chunk-EMP3DK5W.js.map\ndist/startup/chunks/chunk-EZFTDPNQ.js\ndist/startup/chunks/chunk-EZFTDPNQ.js.map\ndist/startup/chunks/chunk-H6G73VXZ.js\ndist/startup/chunks/chunk-H6G73VXZ.js.map\ndist/startup/chunks/chunk-HLJ57SGD.js\ndist/startup/chunks/chunk-HLJ57SGD.js.map\ndist/startup/chunks/chunk-HLP7TC7Z.js\ndist/startup/chunks/chunk-HLP7TC7Z.js.map\ndist/startup/chunks/chunk-IRPDBFFT.js\ndist/startup/chunks/chunk-IRPDBFFT.js.map\ndist/startup/chunks/chunk-JAKKUJKI.js\ndist/startup/chunks/chunk-JAKKUJKI.js.map\ndist/startup/chunks/chunk-L2HDP2QD.js\ndist/startup/chunks/chunk-L2HDP2QD.js.map\ndist/startup/chunks/chunk-PAPTIOCL.js\ndist/startup/chunks/chunk-PAPTIOCL.js.map\ndist/startup/chunks/chunk-PXRVFPRL.js\ndist/startup/chunks/chunk-PXRVFPRL.js.map\ndist/startup/chunks/chunk-QSPEMKTL.js\ndist/startup/chunks/chunk-QSPEMKTL.js.map\ndist/startup/chunks/chunk-SZE3RHE6.js\ndist/startup/chunks/chunk-SZE3RHE6.js.map\ndist/startup/chunks/chunk-TYQ67ZUK.js\ndist/startup/chunks/chunk-TYQ67ZUK.js.map\ndist/startup/chunks/chunk-UDYGU3OR.js\ndist/startup/chunks/chunk-UDYGU3OR.js.map\ndist/startup/chunks/chunk-UTHORCP6.js\ndist/startup/chunks/chunk-UTHORCP6.js.map\ndist/startup/chunks/chunk-V7LWVMBP.js\ndist/startup/chunks/chunk-V7LWVMBP.js.map\ndist/startup/chunks/chunk-V7ZXNCA7.js\ndist/startup/chunks/chunk-V7ZXNCA7.js.map\ndist/startup/chunks/chunk-VCOQDTVF.js\ndist/startup/chunks/chunk-VCOQDTVF.js.map\ndist/startup/chunks/chunk-VRWZ5M2N.js\ndist/startup/chunks/chunk-VRWZ5M2N.js.map\ndist/startup/chunks/chunk-VTNLVERY.js\ndist/startup/chunks/chunk-VTNLVERY.js.map\ndist/startup/chunks/chunk-XTBGNV4V.js\ndist/startup/chunks/chunk-XTBGNV4V.js.map\ndist/startup/chunks/chunk-Z7OGIFF2.js\ndist/startup/chunks/chunk-Z7OGIFF2.js.map\ndist/startup/chunks/configuration-wizard-DGU4QOC6.js\ndist/startup/chunks/configuration-wizard-DGU4QOC6.js.map\ndist/startup/chunks/production-composition-5DSH2KDK.js\ndist/startup/chunks/production-composition-5DSH2KDK.js.map\ndist/startup/chunks/production-connection-providers-UFLPUSBW.js\ndist/startup/chunks/production-connection-providers-UFLPUSBW.js.map\ndist/startup/chunks/production-connections-CMBTBCVI.js\ndist/startup/chunks/production-connections-CMBTBCVI.js.map\ndist/startup/chunks/profile-connection-dispatch-QQH6FNGB.js\ndist/startup/chunks/profile-connection-dispatch-QQH6FNGB.js.map\ndist/startup/chunks/supervisor-control-F4IMJYTH.js\ndist/startup/chunks/supervisor-control-F4IMJYTH.js.map\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js.map\ndist/startup/chunks/trace-store-ZBAU3RS3.js\ndist/startup/chunks/trace-store-ZBAU3RS3.js.map\ndist/startup/chunks/ui-dispatch-OIMRFHPQ.js\ndist/startup/chunks/ui-dispatch-OIMRFHPQ.js.map\ndist/startup/durable-runtime.d.ts\ndist/startup/durable-runtime.d.ts.map\ndist/startup/durable-runtime.js\ndist/startup/durable-runtime.js.map\ndist/startup/preview-runtime.d.ts\ndist/startup/preview-runtime.d.ts.map\ndist/startup/preview-runtime.js\ndist/startup/preview-runtime.js.map\ndist/startup/terminal-runtime.d.ts\ndist/startup/terminal-runtime.d.ts.map\ndist/startup/terminal-runtime.js\ndist/startup/terminal-runtime.js.map\ndist/startup/terminal-signal-latch.d.ts\ndist/startup/terminal-signal-latch.d.ts.map\ndist/startup/terminal-signal-latch.js\ndist/startup/terminal-signal-latch.js.map\ndist/testing/deterministic-backend.d.ts\ndist/testing/deterministic-backend.d.ts.map\ndist/testing/deterministic-backend.js\ndist/testing/deterministic-backend.js.map\ndist/testing/product-demo-fixture.d.ts\ndist/testing/product-demo-fixture.d.ts.map\ndist/testing/product-demo-fixture.js\ndist/testing/product-demo-fixture.js.map\ndist/testing/runtime-contract-fixtures.d.ts\ndist/testing/runtime-contract-fixtures.d.ts.map\ndist/testing/runtime-contract-fixtures.js\ndist/testing/runtime-contract-fixtures.js.map\ndist/testing/supervision-fixture.d.ts\ndist/testing/supervision-fixture.d.ts.map\ndist/testing/supervision-fixture.js\ndist/testing/supervision-fixture.js.map\ndist/testing/supervision-ui-fixture.d.ts\ndist/testing/supervision-ui-fixture.d.ts.map\ndist/testing/supervision-ui-fixture.js\ndist/testing/supervision-ui-fixture.js.map\ndist/version.d.ts\ndist/version.d.ts.map\ndist/version.js\ndist/version.js.map\ndist/views/headless/bounded-output.d.ts\ndist/views/headless/bounded-output.d.ts.map\ndist/views/headless/bounded-output.js\ndist/views/headless/bounded-output.js.map\ndist/views/headless/protocol-limits.d.ts\ndist/views/headless/protocol-limits.d.ts.map\ndist/views/headless/protocol-limits.js\ndist/views/headless/protocol-limits.js.map\ndist/views/headless/protocol.d.ts\ndist/views/headless/protocol.d.ts.map\ndist/views/headless/protocol.js\ndist/views/headless/protocol.js.map\ndist/views/headless/rpc-automation-commands.d.ts\ndist/views/headless/rpc-automation-commands.d.ts.map\ndist/views/headless/rpc-automation-commands.js\ndist/views/headless/rpc-automation-commands.js.map\ndist/views/headless/rpc-errors.d.ts\ndist/views/headless/rpc-errors.d.ts.map\ndist/views/headless/rpc-errors.js\ndist/views/headless/rpc-errors.js.map\ndist/views/headless/rpc-interaction-commands.d.ts\ndist/views/headless/rpc-interaction-commands.d.ts.map\ndist/views/headless/rpc-interaction-commands.js\ndist/views/headless/rpc-interaction-commands.js.map\ndist/views/headless/rpc-parser.d.ts\ndist/views/headless/rpc-parser.d.ts.map\ndist/views/headless/rpc-parser.js\ndist/views/headless/rpc-parser.js.map\ndist/views/headless/rpc-types.d.ts\ndist/views/headless/rpc-types.d.ts.map\ndist/views/headless/rpc-types.js\ndist/views/headless/rpc-types.js.map\ndist/views/headless/rpc.d.ts\ndist/views/headless/rpc.d.ts.map\ndist/views/headless/rpc.js\ndist/views/headless/rpc.js.map\ndist/views/shared/analysis-model-call-presentation.d.ts\ndist/views/shared/analysis-model-call-presentation.d.ts.map\ndist/views/shared/analysis-model-call-presentation.js\ndist/views/shared/analysis-model-call-presentation.js.map\ndist/views/shared/analysis-presentation.d.ts\ndist/views/shared/analysis-presentation.d.ts.map\ndist/views/shared/analysis-presentation.js\ndist/views/shared/analysis-presentation.js.map\ndist/views/shared/appearance.d.ts\ndist/views/shared/appearance.d.ts.map\ndist/views/shared/appearance.js\ndist/views/shared/appearance.js.map\ndist/views/shared/canonical.d.ts\ndist/views/shared/canonical.d.ts.map\ndist/views/shared/canonical.js\ndist/views/shared/canonical.js.map\ndist/views/shared/command-registry.d.ts\ndist/views/shared/command-registry.d.ts.map\ndist/views/shared/command-registry.js\ndist/views/shared/command-registry.js.map\ndist/views/shared/command-table.d.ts\ndist/views/shared/command-table.d.ts.map\ndist/views/shared/command-table.js\ndist/views/shared/command-table.js.map\ndist/views/shared/comparison-presentation.d.ts\ndist/views/shared/comparison-presentation.d.ts.map\ndist/views/shared/comparison-presentation.js\ndist/views/shared/comparison-presentation.js.map\ndist/views/shared/connection-lifecycle.d.ts\ndist/views/shared/connection-lifecycle.d.ts.map\ndist/views/shared/connection-lifecycle.js\ndist/views/shared/connection-lifecycle.js.map\ndist/views/shared/duration.d.ts\ndist/views/shared/duration.d.ts.map\ndist/views/shared/duration.js\ndist/views/shared/duration.js.map\ndist/views/shared/environment-presentation.d.ts\ndist/views/shared/environment-presentation.d.ts.map\ndist/views/shared/environment-presentation.js\ndist/views/shared/environment-presentation.js.map\ndist/views/shared/headless-commands.d.ts\ndist/views/shared/headless-commands.d.ts.map\ndist/views/shared/headless-commands.js\ndist/views/shared/headless-commands.js.map\ndist/views/shared/intents.d.ts\ndist/views/shared/intents.d.ts.map\ndist/views/shared/intents.js\ndist/views/shared/intents.js.map\ndist/views/shared/models.d.ts\ndist/views/shared/models.d.ts.map\ndist/views/shared/models.js\ndist/views/shared/models.js.map\ndist/views/shared/native-interactive-actions.d.ts\ndist/views/shared/native-interactive-actions.d.ts.map\ndist/views/shared/native-interactive-actions.js\ndist/views/shared/native-interactive-actions.js.map\ndist/views/shared/plain-accessibility.d.ts\ndist/views/shared/plain-accessibility.d.ts.map\ndist/views/shared/plain-accessibility.js\ndist/views/shared/plain-accessibility.js.map\ndist/views/shared/sanitize.d.ts\ndist/views/shared/sanitize.d.ts.map\ndist/views/shared/sanitize.js\ndist/views/shared/sanitize.js.map\ndist/views/shared/semantic-activity-limit.d.ts\ndist/views/shared/semantic-activity-limit.d.ts.map\ndist/views/shared/semantic-activity-limit.js\ndist/views/shared/semantic-activity-limit.js.map\ndist/views/shared/semantic-activity.d.ts\ndist/views/shared/semantic-activity.d.ts.map\ndist/views/shared/semantic-activity.js\ndist/views/shared/semantic-activity.js.map\ndist/views/shared/semantic-details.d.ts\ndist/views/shared/semantic-details.d.ts.map\ndist/views/shared/semantic-details.js\ndist/views/shared/semantic-details.js.map\ndist/views/shared/semantic-graph-edges.d.ts\ndist/views/shared/semantic-graph-edges.d.ts.map\ndist/views/shared/semantic-graph-edges.js\ndist/views/shared/semantic-graph-edges.js.map\ndist/views/shared/semantic-graph-filters.d.ts\ndist/views/shared/semantic-graph-filters.d.ts.map\ndist/views/shared/semantic-graph-filters.js\ndist/views/shared/semantic-graph-filters.js.map\ndist/views/shared/semantic-graph-nodes.d.ts\ndist/views/shared/semantic-graph-nodes.d.ts.map\ndist/views/shared/semantic-graph-nodes.js\ndist/views/shared/semantic-graph-nodes.js.map\ndist/views/shared/semantic-graph.d.ts\ndist/views/shared/semantic-graph.d.ts.map\ndist/views/shared/semantic-graph.js\ndist/views/shared/semantic-graph.js.map\ndist/views/shared/semantic-projection.d.ts\ndist/views/shared/semantic-projection.d.ts.map\ndist/views/shared/semantic-projection.js\ndist/views/shared/semantic-projection.js.map\ndist/views/shared/semantic-query-scope.d.ts\ndist/views/shared/semantic-query-scope.d.ts.map\ndist/views/shared/semantic-query-scope.js\ndist/views/shared/semantic-query-scope.js.map\ndist/views/shared/semantic-query-types.d.ts\ndist/views/shared/semantic-query-types.d.ts.map\ndist/views/shared/semantic-query-types.js\ndist/views/shared/semantic-query-types.js.map\ndist/views/shared/usage-projection.d.ts\ndist/views/shared/usage-projection.d.ts.map\ndist/views/shared/usage-projection.js\ndist/views/shared/usage-projection.js.map\ndist/views/tui/activity-browser.d.ts\ndist/views/tui/activity-browser.d.ts.map\ndist/views/tui/activity-browser.js\ndist/views/tui/activity-browser.js.map\ndist/views/tui/activity-document.d.ts\ndist/views/tui/activity-document.d.ts.map\ndist/views/tui/activity-document.js\ndist/views/tui/activity-document.js.map\ndist/views/tui/activity.d.ts\ndist/views/tui/activity.d.ts.map\ndist/views/tui/activity.js\ndist/views/tui/activity.js.map\ndist/views/tui/analysis.d.ts\ndist/views/tui/analysis.d.ts.map\ndist/views/tui/analysis.js\ndist/views/tui/analysis.js.map\ndist/views/tui/autocomplete-guard.d.ts\ndist/views/tui/autocomplete-guard.d.ts.map\ndist/views/tui/autocomplete-guard.js\ndist/views/tui/autocomplete-guard.js.map\ndist/views/tui/automation-overlay-workflow.d.ts\ndist/views/tui/automation-overlay-workflow.d.ts.map\ndist/views/tui/automation-overlay-workflow.js\ndist/views/tui/automation-overlay-workflow.js.map\ndist/views/tui/automation-rule-panel.d.ts\ndist/views/tui/automation-rule-panel.d.ts.map\ndist/views/tui/automation-rule-panel.js\ndist/views/tui/automation-rule-panel.js.map\ndist/views/tui/automation-rule-presentation.d.ts\ndist/views/tui/automation-rule-presentation.d.ts.map\ndist/views/tui/automation-rule-presentation.js\ndist/views/tui/automation-rule-presentation.js.map\ndist/views/tui/automation-rule-response-editor.d.ts\ndist/views/tui/automation-rule-response-editor.d.ts.map\ndist/views/tui/automation-rule-response-editor.js\ndist/views/tui/automation-rule-response-editor.js.map\ndist/views/tui/command-palette.d.ts\ndist/views/tui/command-palette.d.ts.map\ndist/views/tui/command-palette.js\ndist/views/tui/command-palette.js.map\ndist/views/tui/comparison.d.ts\ndist/views/tui/comparison.d.ts.map\ndist/views/tui/comparison.js\ndist/views/tui/comparison.js.map\ndist/views/tui/composer-view.d.ts\ndist/views/tui/composer-view.d.ts.map\ndist/views/tui/composer-view.js\ndist/views/tui/composer-view.js.map\ndist/views/tui/configuration-credential.d.ts\ndist/views/tui/configuration-credential.d.ts.map\ndist/views/tui/configuration-credential.js\ndist/views/tui/configuration-credential.js.map\ndist/views/tui/configuration-presenters.d.ts\ndist/views/tui/configuration-presenters.d.ts.map\ndist/views/tui/configuration-presenters.js\ndist/views/tui/configuration-presenters.js.map\ndist/views/tui/configuration-responsive-text.d.ts\ndist/views/tui/configuration-responsive-text.d.ts.map\ndist/views/tui/configuration-responsive-text.js\ndist/views/tui/configuration-responsive-text.js.map\ndist/views/tui/configuration-review.d.ts\ndist/views/tui/configuration-review.d.ts.map\ndist/views/tui/configuration-review.js\ndist/views/tui/configuration-review.js.map\ndist/views/tui/configuration-wizard-presentation.d.ts\ndist/views/tui/configuration-wizard-presentation.d.ts.map\ndist/views/tui/configuration-wizard-presentation.js\ndist/views/tui/configuration-wizard-presentation.js.map\ndist/views/tui/configuration-wizard.d.ts\ndist/views/tui/configuration-wizard.d.ts.map\ndist/views/tui/configuration-wizard.js\ndist/views/tui/configuration-wizard.js.map\ndist/views/tui/connection-metadata-editor-actions.d.ts\ndist/views/tui/connection-metadata-editor-actions.d.ts.map\ndist/views/tui/connection-metadata-editor-actions.js\ndist/views/tui/connection-metadata-editor-actions.js.map\ndist/views/tui/connection-metadata-editor-inputs.d.ts\ndist/views/tui/connection-metadata-editor-inputs.d.ts.map\ndist/views/tui/connection-metadata-editor-inputs.js\ndist/views/tui/connection-metadata-editor-inputs.js.map\ndist/views/tui/connection-metadata-editor-model.d.ts\ndist/views/tui/connection-metadata-editor-model.d.ts.map\ndist/views/tui/connection-metadata-editor-model.js\ndist/views/tui/connection-metadata-editor-model.js.map\ndist/views/tui/connection-metadata-editor-presentation.d.ts\ndist/views/tui/connection-metadata-editor-presentation.d.ts.map\ndist/views/tui/connection-metadata-editor-presentation.js\ndist/views/tui/connection-metadata-editor-presentation.js.map\ndist/views/tui/connection-metadata-editor-rendering.d.ts\ndist/views/tui/connection-metadata-editor-rendering.d.ts.map\ndist/views/tui/connection-metadata-editor-rendering.js\ndist/views/tui/connection-metadata-editor-rendering.js.map\ndist/views/tui/connection-metadata-editor.d.ts\ndist/views/tui/connection-metadata-editor.d.ts.map\ndist/views/tui/connection-metadata-editor.js\ndist/views/tui/connection-metadata-editor.js.map\ndist/views/tui/connection-overlay-workflow.d.ts\ndist/views/tui/connection-overlay-workflow.d.ts.map\ndist/views/tui/connection-overlay-workflow.js\ndist/views/tui/connection-overlay-workflow.js.map\ndist/views/tui/connection-setup-actions.d.ts\ndist/views/tui/connection-setup-actions.d.ts.map\ndist/views/tui/connection-setup-actions.js\ndist/views/tui/connection-setup-actions.js.map\ndist/views/tui/connection-setup-rendering.d.ts\ndist/views/tui/connection-setup-rendering.d.ts.map\ndist/views/tui/connection-setup-rendering.js\ndist/views/tui/connection-setup-rendering.js.map\ndist/views/tui/connection-setup.d.ts\ndist/views/tui/connection-setup.d.ts.map\ndist/views/tui/connection-setup.js\ndist/views/tui/connection-setup.js.map\ndist/views/tui/conversation-dialogs.d.ts\ndist/views/tui/conversation-dialogs.d.ts.map\ndist/views/tui/conversation-dialogs.js\ndist/views/tui/conversation-dialogs.js.map\ndist/views/tui/conversation-overlay-actions.d.ts\ndist/views/tui/conversation-overlay-actions.d.ts.map\ndist/views/tui/conversation-overlay-actions.js\ndist/views/tui/conversation-overlay-actions.js.map\ndist/views/tui/conversation-overlay-helpers.d.ts\ndist/views/tui/conversation-overlay-helpers.d.ts.map\ndist/views/tui/conversation-overlay-helpers.js\ndist/views/tui/conversation-overlay-helpers.js.map\ndist/views/tui/conversation-overlays.d.ts\ndist/views/tui/conversation-overlays.d.ts.map\ndist/views/tui/conversation-overlays.js\ndist/views/tui/conversation-overlays.js.map\ndist/views/tui/details.d.ts\ndist/views/tui/details.d.ts.map\ndist/views/tui/details.js\ndist/views/tui/details.js.map\ndist/views/tui/dynamic-autocomplete.d.ts\ndist/views/tui/dynamic-autocomplete.d.ts.map\ndist/views/tui/dynamic-autocomplete.js\ndist/views/tui/dynamic-autocomplete.js.map\ndist/views/tui/entity-browser-layout.d.ts\ndist/views/tui/entity-browser-layout.d.ts.map\ndist/views/tui/entity-browser-layout.js\ndist/views/tui/entity-browser-layout.js.map\ndist/views/tui/entity-browser.d.ts\ndist/views/tui/entity-browser.d.ts.map\ndist/views/tui/entity-browser.js\ndist/views/tui/entity-browser.js.map\ndist/views/tui/execution-target.d.ts\ndist/views/tui/execution-target.d.ts.map\ndist/views/tui/execution-target.js\ndist/views/tui/execution-target.js.map\ndist/views/tui/focused-surface.d.ts\ndist/views/tui/focused-surface.d.ts.map\ndist/views/tui/focused-surface.js\ndist/views/tui/focused-surface.js.map\ndist/views/tui/fork-preview.d.ts\ndist/views/tui/fork-preview.d.ts.map\ndist/views/tui/fork-preview.js\ndist/views/tui/fork-preview.js.map\ndist/views/tui/graph.d.ts\ndist/views/tui/graph.d.ts.map\ndist/views/tui/graph.js\ndist/views/tui/graph.js.map\ndist/views/tui/help.d.ts\ndist/views/tui/help.d.ts.map\ndist/views/tui/help.js\ndist/views/tui/help.js.map\ndist/views/tui/interaction-automation-response.d.ts\ndist/views/tui/interaction-automation-response.d.ts.map\ndist/views/tui/interaction-automation-response.js\ndist/views/tui/interaction-automation-response.js.map\ndist/views/tui/interaction-decisions.d.ts\ndist/views/tui/interaction-decisions.d.ts.map\ndist/views/tui/interaction-decisions.js\ndist/views/tui/interaction-decisions.js.map\ndist/views/tui/interaction-input-response.d.ts\ndist/views/tui/interaction-input-response.d.ts.map\ndist/views/tui/interaction-input-response.js\ndist/views/tui/interaction-input-response.js.map\ndist/views/tui/interaction-presentation.d.ts\ndist/views/tui/interaction-presentation.d.ts.map\ndist/views/tui/interaction-presentation.js\ndist/views/tui/interaction-presentation.js.map\ndist/views/tui/interaction.d.ts\ndist/views/tui/interaction.d.ts.map\ndist/views/tui/interaction.js\ndist/views/tui/interaction.js.map\ndist/views/tui/keyboard.d.ts\ndist/views/tui/keyboard.d.ts.map\ndist/views/tui/keyboard.js\ndist/views/tui/keyboard.js.map\ndist/views/tui/layout.d.ts\ndist/views/tui/layout.d.ts.map\ndist/views/tui/layout.js\ndist/views/tui/layout.js.map\ndist/views/tui/measurement-display.d.ts\ndist/views/tui/measurement-display.d.ts.map\ndist/views/tui/measurement-display.js\ndist/views/tui/measurement-display.js.map\ndist/views/tui/modal-coordinator.d.ts\ndist/views/tui/modal-coordinator.d.ts.map\ndist/views/tui/modal-coordinator.js\ndist/views/tui/modal-coordinator.js.map\ndist/views/tui/profile-compatibility.d.ts\ndist/views/tui/profile-compatibility.d.ts.map\ndist/views/tui/profile-compatibility.js\ndist/views/tui/profile-compatibility.js.map\ndist/views/tui/profile-editor-actions.d.ts\ndist/views/tui/profile-editor-actions.d.ts.map\ndist/views/tui/profile-editor-actions.js\ndist/views/tui/profile-editor-actions.js.map\ndist/views/tui/profile-editor-rendering.d.ts\ndist/views/tui/profile-editor-rendering.d.ts.map\ndist/views/tui/profile-editor-rendering.js\ndist/views/tui/profile-editor-rendering.js.map\ndist/views/tui/profile-editor.d.ts\ndist/views/tui/profile-editor.d.ts.map\ndist/views/tui/profile-editor.js\ndist/views/tui/profile-editor.js.map\ndist/views/tui/safe-markdown.d.ts\ndist/views/tui/safe-markdown.d.ts.map\ndist/views/tui/safe-markdown.js\ndist/views/tui/safe-markdown.js.map\ndist/views/tui/secret-input.d.ts\ndist/views/tui/secret-input.d.ts.map\ndist/views/tui/secret-input.js\ndist/views/tui/secret-input.js.map\ndist/views/tui/selector.d.ts\ndist/views/tui/selector.d.ts.map\ndist/views/tui/selector.js\ndist/views/tui/selector.js.map\ndist/views/tui/supervisor-actions.d.ts\ndist/views/tui/supervisor-actions.d.ts.map\ndist/views/tui/supervisor-actions.js\ndist/views/tui/supervisor-actions.js.map\ndist/views/tui/terminal-app.d.ts\ndist/views/tui/terminal-app.d.ts.map\ndist/views/tui/terminal-app.js\ndist/views/tui/terminal-app.js.map\ndist/views/tui/terminal-chrome.d.ts\ndist/views/tui/terminal-chrome.d.ts.map\ndist/views/tui/terminal-chrome.js\ndist/views/tui/terminal-chrome.js.map\ndist/views/tui/terminal-command-controller.d.ts\ndist/views/tui/terminal-command-controller.d.ts.map\ndist/views/tui/terminal-command-controller.js\ndist/views/tui/terminal-command-controller.js.map\ndist/views/tui/terminal-compatibility.d.ts\ndist/views/tui/terminal-compatibility.d.ts.map\ndist/views/tui/terminal-compatibility.js\ndist/views/tui/terminal-compatibility.js.map\ndist/views/tui/terminal-drafts.d.ts\ndist/views/tui/terminal-drafts.d.ts.map\ndist/views/tui/terminal-drafts.js\ndist/views/tui/terminal-drafts.js.map\ndist/views/tui/terminal-identity.d.ts\ndist/views/tui/terminal-identity.d.ts.map\ndist/views/tui/terminal-identity.js\ndist/views/tui/terminal-identity.js.map\ndist/views/tui/terminal-input-controller.d.ts\ndist/views/tui/terminal-input-controller.d.ts.map\ndist/views/tui/terminal-input-controller.js\ndist/views/tui/terminal-input-controller.js.map\ndist/views/tui/terminal-interaction-controller.d.ts\ndist/views/tui/terminal-interaction-controller.d.ts.map\ndist/views/tui/terminal-interaction-controller.js\ndist/views/tui/terminal-interaction-controller.js.map\ndist/views/tui/terminal-overlays.d.ts\ndist/views/tui/terminal-overlays.d.ts.map\ndist/views/tui/terminal-overlays.js\ndist/views/tui/terminal-overlays.js.map\ndist/views/tui/terminal-shell.d.ts\ndist/views/tui/terminal-shell.d.ts.map\ndist/views/tui/terminal-shell.js\ndist/views/tui/terminal-shell.js.map\ndist/views/tui/terminal-surface-overlays.d.ts\ndist/views/tui/terminal-surface-overlays.d.ts.map\ndist/views/tui/terminal-surface-overlays.js\ndist/views/tui/terminal-surface-overlays.js.map\ndist/views/tui/terminal-usage.d.ts\ndist/views/tui/terminal-usage.d.ts.map\ndist/views/tui/terminal-usage.js\ndist/views/tui/terminal-usage.js.map\ndist/views/tui/theme.d.ts\ndist/views/tui/theme.d.ts.map\ndist/views/tui/theme.js\ndist/views/tui/theme.js.map\ndist/views/tui/transcript.d.ts\ndist/views/tui/transcript.d.ts.map\ndist/views/tui/transcript.js\ndist/views/tui/transcript.js.map\nLICENSE\npackage.json\nREADME.md\nTHIRD_PARTY_LICENSES.json\nTHIRD_PARTY_NOTICES.md\n\u001b[94mTarball Details\u001b[39m\n/tmp/braid-live-pack-ZfeUUH/tangle-network-braid-0.3.0.tgz\n", + "stderr": "", + "durationMs": 1577, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "install": { + "command": "npm", + "args": [ + "install", + "--no-audit", + "--no-fund", + "/tmp/braid-live-pack-ZfeUUH/tangle-network-braid-0.3.0.tgz" + ], + "code": 0, + "signal": null, + "stdout": "\nadded 68 packages in 7s\n", + "stderr": "npm warn deprecated koffi@3.1.4: Unstable Windows builds\nnpm warn allow-scripts 2 packages have install scripts not yet covered by allowScripts:\nnpm warn allow-scripts @dataiku/uv@0.12.0 (postinstall: node install.cjs)\nnpm warn allow-scripts koffi@3.1.4 (install: node ./cnoke.cjs -P . -D src/koffi --prebuild --release)\nnpm warn allow-scripts\nnpm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts ` to allow.\n", + "durationMs": 7257, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "version": { + "command": "/home/drew/.nvm/versions/node/v24.18.0/bin/node", + "args": [ + "/tmp/braid-live-install-KIUvQZ/node_modules/@tangle-network/braid/dist/bin/braid.js", + "--version" + ], + "code": 0, + "signal": null, + "stdout": "0.3.0\n", + "stderr": "", + "durationMs": 71, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "artifact": { + "tarball": "tangle-network-braid-0.3.0.tgz", + "sha256": "88b3ad3b320350f25752e8161455cec9f7d752665992cb124a5685303b561237", + "binary": "node_modules/@tangle-network/braid/dist/bin/braid.js" + }, + "provider": { + "package": "@tangle-network/agent-provider-cli-bridge", + "capabilitiesByBackend": { + "pi": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": true + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + } + }, + "analysis": { + "claim": "packed-analysis-readiness-only", + "python": { + "status": "ready", + "readiness": "ready" + }, + "ask": { + "readiness": "ready", + "status": "engine-configured", + "diagnostics": [] + } + }, + "credentialState": { + "configured": false, + "facility": "none", + "targetCount": 1, + "storedCount": 0, + "removedCount": 1 + }, + "bridgeCleanup": { + "stopped": { + "termination": { + "strategy": "process-group", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": true, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 1826905, + 1826922, + 1826923, + 1826940 + ], + "roots": [ + 1826905 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "term", + "termSignal": { + "method": "process-group", + "sent": true + }, + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": null, + "signal": "SIGTERM" + }, + "stdout": "[cli-bridge] listening on http://127.0.0.1:3480 (host=127.0.0.1)\n[cli-bridge] backends: pi\n[cli-bridge] bearer: none (loopback only)\n[cli-bridge] host admission: maxActive=8 maxQueue=16/class reservedActive=2 (bulk ceiling 6) queueTimeoutMs=30000 bulkQueueTimeoutMs=240000\n[cli-bridge] reserved-lane clients: pr-reviewer\n[cli-bridge] traces: /home/drew/code/.worktrees/cli-bridge-continuation-control/data/traces/spans.jsonl (max 16777216 bytes × 2 files)\n[cli-bridge] jail default: fs-jail root=/.agent-home\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] SIGTERM — shutting down\n\u001b[41m\u001b[31m[\u001b[39m\u001b[49m\u001b[41m\u001b[30mELIFECYCLE\u001b[39m\u001b[49m\u001b[41m\u001b[31m]\u001b[39m\u001b[49m \u001b[31mCommand failed.\u001b[39m\n", + "stderr": "(node:1826905) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n\u001b[2m$ tsx src/server.ts\u001b[22m\n(node:1826923) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:1826940) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n[cli-bridge] admission maxActive=8 exceeds scoped-executor concurrency=4: the executor is the real ceiling. Lower BRIDGE_HOST_CHAT_MAX_ACTIVE or raise CLI_BRIDGE_SCOPE_MAX_CONCURRENCY so one gate owns the limit.\n" + } + }, + "cleanup": { + "ok": true, + "results": [ + { + "path": "/tmp/braid-live-pack-ZfeUUH", + "removed": true + }, + { + "path": "/tmp/braid-live-install-KIUvQZ", + "removed": true + }, + { + "path": "/tmp/braid-live-targets-hVb5BS", + "removed": true + } + ] + }, + "status": "passed", + "exitCode": 0, + "finishedAt": "2026-08-29T05:07:24.725Z" +} diff --git a/artifacts/verification/live/bridge/pi-interaction-current.json b/artifacts/verification/live/bridge/pi-interaction-current.json new file mode 100644 index 00000000..5ab9dc7d --- /dev/null +++ b/artifacts/verification/live/bridge/pi-interaction-current.json @@ -0,0 +1,1947 @@ +{ + "startedAt": "2026-08-29T05:40:54.248Z", + "temp": { + "packRoot": "/tmp/braid-live-pack-mIMgBK", + "installRoot": "/tmp/braid-live-install-MpZxkH" + }, + "build": { + "command": "pnpm", + "args": [ + "run", + "build" + ], + "code": 0, + "signal": null, + "stdout": "", + "stderr": "\u001b[2m$ node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/build-startup.mjs\u001b[22m\n", + "durationMs": 2172, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "packCommand": { + "command": "pnpm", + "args": [ + "pack", + "--pack-destination", + "/tmp/braid-live-pack-mIMgBK" + ], + "code": 0, + "signal": null, + "stdout": "package: @tangle-network/braid@0.3.0\n\u001b[94mTarball Contents\u001b[39m\ndist/adapters/agent-interface/harness-runtime.d.ts\ndist/adapters/agent-interface/harness-runtime.d.ts.map\ndist/adapters/agent-interface/harness-runtime.js\ndist/adapters/agent-interface/harness-runtime.js.map\ndist/adapters/agent-interface/interaction-runtime.d.ts\ndist/adapters/agent-interface/interaction-runtime.d.ts.map\ndist/adapters/agent-interface/interaction-runtime.js\ndist/adapters/agent-interface/interaction-runtime.js.map\ndist/adapters/agent-interface/module-url.d.ts\ndist/adapters/agent-interface/module-url.d.ts.map\ndist/adapters/agent-interface/module-url.js\ndist/adapters/agent-interface/module-url.js.map\ndist/adapters/agent-interface/profile-runtime.d.ts\ndist/adapters/agent-interface/profile-runtime.d.ts.map\ndist/adapters/agent-interface/profile-runtime.js\ndist/adapters/agent-interface/profile-runtime.js.map\ndist/adapters/analysis/agent-eval-version.d.ts\ndist/adapters/analysis/agent-eval-version.d.ts.map\ndist/adapters/analysis/agent-eval-version.js\ndist/adapters/analysis/agent-eval-version.js.map\ndist/adapters/analysis/citations.d.ts\ndist/adapters/analysis/citations.d.ts.map\ndist/adapters/analysis/citations.js\ndist/adapters/analysis/citations.js.map\ndist/adapters/analysis/eval-analyst.d.ts\ndist/adapters/analysis/eval-analyst.d.ts.map\ndist/adapters/analysis/eval-analyst.js\ndist/adapters/analysis/eval-analyst.js.map\ndist/adapters/analysis/managed-analysis-runtime.d.ts\ndist/adapters/analysis/managed-analysis-runtime.d.ts.map\ndist/adapters/analysis/managed-analysis-runtime.js\ndist/adapters/analysis/managed-analysis-runtime.js.map\ndist/adapters/analysis/model-execution-scope.d.ts\ndist/adapters/analysis/model-execution-scope.d.ts.map\ndist/adapters/analysis/model-execution-scope.js\ndist/adapters/analysis/model-execution-scope.js.map\ndist/adapters/analysis/production-analysis-analyst.d.ts\ndist/adapters/analysis/production-analysis-analyst.d.ts.map\ndist/adapters/analysis/production-analysis-analyst.js\ndist/adapters/analysis/production-analysis-analyst.js.map\ndist/adapters/analysis/python-runner.d.ts\ndist/adapters/analysis/python-runner.d.ts.map\ndist/adapters/analysis/python-runner.js\ndist/adapters/analysis/python-runner.js.map\ndist/adapters/analysis/question-analyst.d.ts\ndist/adapters/analysis/question-analyst.d.ts.map\ndist/adapters/analysis/question-analyst.js\ndist/adapters/analysis/question-analyst.js.map\ndist/adapters/analysis/runtime-model-owner.d.ts\ndist/adapters/analysis/runtime-model-owner.d.ts.map\ndist/adapters/analysis/runtime-model-owner.js\ndist/adapters/analysis/runtime-model-owner.js.map\ndist/adapters/analysis/runtime-retained-model-call.d.ts\ndist/adapters/analysis/runtime-retained-model-call.d.ts.map\ndist/adapters/analysis/runtime-retained-model-call.js\ndist/adapters/analysis/runtime-retained-model-call.js.map\ndist/adapters/analysis/trace-analysis-adapter.d.ts\ndist/adapters/analysis/trace-analysis-adapter.d.ts.map\ndist/adapters/analysis/trace-analysis-adapter.js\ndist/adapters/analysis/trace-analysis-adapter.js.map\ndist/adapters/analysis/trace-event-projection.d.ts\ndist/adapters/analysis/trace-event-projection.d.ts.map\ndist/adapters/analysis/trace-event-projection.js\ndist/adapters/analysis/trace-event-projection.js.map\ndist/adapters/analysis/trace-store.d.ts\ndist/adapters/analysis/trace-store.d.ts.map\ndist/adapters/analysis/trace-store.js\ndist/adapters/analysis/trace-store.js.map\ndist/adapters/connections/aws-nitro-root-g1.d.ts\ndist/adapters/connections/aws-nitro-root-g1.d.ts.map\ndist/adapters/connections/aws-nitro-root-g1.js\ndist/adapters/connections/aws-nitro-root-g1.js.map\ndist/adapters/connections/cli-bridge-health.d.ts\ndist/adapters/connections/cli-bridge-health.d.ts.map\ndist/adapters/connections/cli-bridge-health.js\ndist/adapters/connections/cli-bridge-health.js.map\ndist/adapters/connections/cli-bridge-model-route.d.ts\ndist/adapters/connections/cli-bridge-model-route.d.ts.map\ndist/adapters/connections/cli-bridge-model-route.js\ndist/adapters/connections/cli-bridge-model-route.js.map\ndist/adapters/connections/cli-bridge-model-validation.d.ts\ndist/adapters/connections/cli-bridge-model-validation.d.ts.map\ndist/adapters/connections/cli-bridge-model-validation.js\ndist/adapters/connections/cli-bridge-model-validation.js.map\ndist/adapters/connections/nitro-confidential-attestation.d.ts\ndist/adapters/connections/nitro-confidential-attestation.d.ts.map\ndist/adapters/connections/nitro-confidential-attestation.js\ndist/adapters/connections/nitro-confidential-attestation.js.map\ndist/adapters/connections/production-connection-credentials.d.ts\ndist/adapters/connections/production-connection-credentials.d.ts.map\ndist/adapters/connections/production-connection-credentials.js\ndist/adapters/connections/production-connection-credentials.js.map\ndist/adapters/connections/production-connection-endpoints.d.ts\ndist/adapters/connections/production-connection-endpoints.d.ts.map\ndist/adapters/connections/production-connection-endpoints.js\ndist/adapters/connections/production-connection-endpoints.js.map\ndist/adapters/connections/production-connection-health.d.ts\ndist/adapters/connections/production-connection-health.d.ts.map\ndist/adapters/connections/production-connection-health.js\ndist/adapters/connections/production-connection-health.js.map\ndist/adapters/connections/production-connection-providers.d.ts\ndist/adapters/connections/production-connection-providers.d.ts.map\ndist/adapters/connections/production-connection-providers.js\ndist/adapters/connections/production-connection-providers.js.map\ndist/adapters/connections/production-connection-types.d.ts\ndist/adapters/connections/production-connection-types.d.ts.map\ndist/adapters/connections/production-connection-types.js\ndist/adapters/connections/production-connection-types.js.map\ndist/adapters/connections/production-connections.d.ts\ndist/adapters/connections/production-connections.d.ts.map\ndist/adapters/connections/production-connections.js\ndist/adapters/connections/production-connections.js.map\ndist/adapters/connections/tangle-retained-control-lookup.d.ts\ndist/adapters/connections/tangle-retained-control-lookup.d.ts.map\ndist/adapters/connections/tangle-retained-control-lookup.js\ndist/adapters/connections/tangle-retained-control-lookup.js.map\ndist/adapters/credentials/headless-key.d.ts\ndist/adapters/credentials/headless-key.d.ts.map\ndist/adapters/credentials/headless-key.js\ndist/adapters/credentials/headless-key.js.map\ndist/adapters/credentials/headless-store.d.ts\ndist/adapters/credentials/headless-store.d.ts.map\ndist/adapters/credentials/headless-store.js\ndist/adapters/credentials/headless-store.js.map\ndist/adapters/credentials/memory.d.ts\ndist/adapters/credentials/memory.d.ts.map\ndist/adapters/credentials/memory.js\ndist/adapters/credentials/memory.js.map\ndist/adapters/credentials/os.d.ts\ndist/adapters/credentials/os.d.ts.map\ndist/adapters/credentials/os.js\ndist/adapters/credentials/os.js.map\ndist/adapters/persistence/posix-at.d.ts\ndist/adapters/persistence/posix-at.d.ts.map\ndist/adapters/persistence/posix-at.js\ndist/adapters/persistence/posix-at.js.map\ndist/adapters/persistence/safe-file-descriptor.d.ts\ndist/adapters/persistence/safe-file-descriptor.d.ts.map\ndist/adapters/persistence/safe-file-descriptor.js\ndist/adapters/persistence/safe-file-descriptor.js.map\ndist/adapters/persistence/safe-file-io.d.ts\ndist/adapters/persistence/safe-file-io.d.ts.map\ndist/adapters/persistence/safe-file-io.js\ndist/adapters/persistence/safe-file-io.js.map\ndist/adapters/persistence/safe-file.d.ts\ndist/adapters/persistence/safe-file.d.ts.map\ndist/adapters/persistence/safe-file.js\ndist/adapters/persistence/safe-file.js.map\ndist/adapters/runtime/agent-runtime-execution.d.ts\ndist/adapters/runtime/agent-runtime-execution.d.ts.map\ndist/adapters/runtime/agent-runtime-execution.js\ndist/adapters/runtime/agent-runtime-execution.js.map\ndist/adapters/runtime/agent-runtime-version.d.ts\ndist/adapters/runtime/agent-runtime-version.d.ts.map\ndist/adapters/runtime/agent-runtime-version.js\ndist/adapters/runtime/agent-runtime-version.js.map\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-execution.js\ndist/adapters/runtime/cli-bridge-retained-execution.js.map\ndist/adapters/runtime/cli-bridge-retained-run.d.ts\ndist/adapters/runtime/cli-bridge-retained-run.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-run.js\ndist/adapters/runtime/cli-bridge-retained-run.js.map\ndist/adapters/runtime/execution-observation-source.d.ts\ndist/adapters/runtime/execution-observation-source.d.ts.map\ndist/adapters/runtime/execution-observation-source.js\ndist/adapters/runtime/execution-observation-source.js.map\ndist/adapters/runtime/lazy-execution.d.ts\ndist/adapters/runtime/lazy-execution.d.ts.map\ndist/adapters/runtime/lazy-execution.js\ndist/adapters/runtime/lazy-execution.js.map\ndist/adapters/runtime/mode-routing-execution.d.ts\ndist/adapters/runtime/mode-routing-execution.d.ts.map\ndist/adapters/runtime/mode-routing-execution.js\ndist/adapters/runtime/mode-routing-execution.js.map\ndist/adapters/runtime/native-interactive-run-broker.d.ts\ndist/adapters/runtime/native-interactive-run-broker.d.ts.map\ndist/adapters/runtime/native-interactive-run-broker.js\ndist/adapters/runtime/native-interactive-run-broker.js.map\ndist/adapters/runtime/prepared-execution.d.ts\ndist/adapters/runtime/prepared-execution.d.ts.map\ndist/adapters/runtime/prepared-execution.js\ndist/adapters/runtime/prepared-execution.js.map\ndist/adapters/runtime/production-backend-common.d.ts\ndist/adapters/runtime/production-backend-common.d.ts.map\ndist/adapters/runtime/production-backend-common.js\ndist/adapters/runtime/production-backend-common.js.map\ndist/adapters/runtime/production-backend-resolver.d.ts\ndist/adapters/runtime/production-backend-resolver.d.ts.map\ndist/adapters/runtime/production-backend-resolver.js\ndist/adapters/runtime/production-backend-resolver.js.map\ndist/adapters/runtime/production-cli-bridge-backend.d.ts\ndist/adapters/runtime/production-cli-bridge-backend.d.ts.map\ndist/adapters/runtime/production-cli-bridge-backend.js\ndist/adapters/runtime/production-cli-bridge-backend.js.map\ndist/adapters/runtime/production-tangle-inference-backend.d.ts\ndist/adapters/runtime/production-tangle-inference-backend.d.ts.map\ndist/adapters/runtime/production-tangle-inference-backend.js\ndist/adapters/runtime/production-tangle-inference-backend.js.map\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts.map\ndist/adapters/runtime/production-tangle-sandbox-backend.js\ndist/adapters/runtime/production-tangle-sandbox-backend.js.map\ndist/adapters/runtime/retained-execution-contract.d.ts\ndist/adapters/runtime/retained-execution-contract.d.ts.map\ndist/adapters/runtime/retained-execution-contract.js\ndist/adapters/runtime/retained-execution-contract.js.map\ndist/adapters/runtime/retained-execution-projection.d.ts\ndist/adapters/runtime/retained-execution-projection.d.ts.map\ndist/adapters/runtime/retained-execution-projection.js\ndist/adapters/runtime/retained-execution-projection.js.map\ndist/adapters/runtime/retained-execution-state.d.ts\ndist/adapters/runtime/retained-execution-state.d.ts.map\ndist/adapters/runtime/retained-execution-state.js\ndist/adapters/runtime/retained-execution-state.js.map\ndist/adapters/runtime/retained-execution-stream.d.ts\ndist/adapters/runtime/retained-execution-stream.d.ts.map\ndist/adapters/runtime/retained-execution-stream.js\ndist/adapters/runtime/retained-execution-stream.js.map\ndist/adapters/runtime/retained-execution.d.ts\ndist/adapters/runtime/retained-execution.d.ts.map\ndist/adapters/runtime/retained-execution.js\ndist/adapters/runtime/retained-execution.js.map\ndist/adapters/runtime/retained-native-continuation.d.ts\ndist/adapters/runtime/retained-native-continuation.d.ts.map\ndist/adapters/runtime/retained-native-continuation.js\ndist/adapters/runtime/retained-native-continuation.js.map\ndist/adapters/runtime/sandbox-account-observation.d.ts\ndist/adapters/runtime/sandbox-account-observation.d.ts.map\ndist/adapters/runtime/sandbox-account-observation.js\ndist/adapters/runtime/sandbox-account-observation.js.map\ndist/adapters/runtime/sandbox-instance-observation.d.ts\ndist/adapters/runtime/sandbox-instance-observation.d.ts.map\ndist/adapters/runtime/sandbox-instance-observation.js\ndist/adapters/runtime/sandbox-instance-observation.js.map\ndist/adapters/runtime/sandbox-observation-types.d.ts\ndist/adapters/runtime/sandbox-observation-types.d.ts.map\ndist/adapters/runtime/sandbox-observation-types.js\ndist/adapters/runtime/sandbox-observation-types.js.map\ndist/adapters/runtime/sandbox-observation.d.ts\ndist/adapters/runtime/sandbox-observation.d.ts.map\ndist/adapters/runtime/sandbox-observation.js\ndist/adapters/runtime/sandbox-observation.js.map\ndist/adapters/runtime/supervisor-control.d.ts\ndist/adapters/runtime/supervisor-control.d.ts.map\ndist/adapters/runtime/supervisor-control.js\ndist/adapters/runtime/supervisor-control.js.map\ndist/adapters/runtime/supervisor-watch.d.ts\ndist/adapters/runtime/supervisor-watch.d.ts.map\ndist/adapters/runtime/supervisor-watch.js\ndist/adapters/runtime/supervisor-watch.js.map\ndist/adapters/runtime/tangle-retained-execution.d.ts\ndist/adapters/runtime/tangle-retained-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-execution.js\ndist/adapters/runtime/tangle-retained-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-contract.js\ndist/adapters/runtime/tangle-retained-interactive-contract.js.map\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-execution.js\ndist/adapters/runtime/tangle-retained-interactive-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-projection.js\ndist/adapters/runtime/tangle-retained-interactive-projection.js.map\ndist/adapters/runtime/tangle-retained-run.d.ts\ndist/adapters/runtime/tangle-retained-run.d.ts.map\ndist/adapters/runtime/tangle-retained-run.js\ndist/adapters/runtime/tangle-retained-run.js.map\ndist/adapters/runtime/tangle-sandbox-retention.d.ts\ndist/adapters/runtime/tangle-sandbox-retention.d.ts.map\ndist/adapters/runtime/tangle-sandbox-retention.js\ndist/adapters/runtime/tangle-sandbox-retention.js.map\ndist/adapters/runtime/unavailable-execution.d.ts\ndist/adapters/runtime/unavailable-execution.d.ts.map\ndist/adapters/runtime/unavailable-execution.js\ndist/adapters/runtime/unavailable-execution.js.map\ndist/adapters/storage/memory-base.d.ts\ndist/adapters/storage/memory-base.d.ts.map\ndist/adapters/storage/memory-base.js\ndist/adapters/storage/memory-base.js.map\ndist/adapters/storage/memory-effects.d.ts\ndist/adapters/storage/memory-effects.d.ts.map\ndist/adapters/storage/memory-effects.js\ndist/adapters/storage/memory-effects.js.map\ndist/adapters/storage/memory-journal.d.ts\ndist/adapters/storage/memory-journal.d.ts.map\ndist/adapters/storage/memory-journal.js\ndist/adapters/storage/memory-journal.js.map\ndist/adapters/storage/memory-maintenance.d.ts\ndist/adapters/storage/memory-maintenance.d.ts.map\ndist/adapters/storage/memory-maintenance.js\ndist/adapters/storage/memory-maintenance.js.map\ndist/adapters/storage/memory-operations.d.ts\ndist/adapters/storage/memory-operations.d.ts.map\ndist/adapters/storage/memory-operations.js\ndist/adapters/storage/memory-operations.js.map\ndist/adapters/storage/memory-retention.d.ts\ndist/adapters/storage/memory-retention.d.ts.map\ndist/adapters/storage/memory-retention.js\ndist/adapters/storage/memory-retention.js.map\ndist/adapters/storage/memory.d.ts\ndist/adapters/storage/memory.d.ts.map\ndist/adapters/storage/memory.js\ndist/adapters/storage/memory.js.map\ndist/adapters/storage/sqlite-base.d.ts\ndist/adapters/storage/sqlite-base.d.ts.map\ndist/adapters/storage/sqlite-base.js\ndist/adapters/storage/sqlite-base.js.map\ndist/adapters/storage/sqlite-bound-open.d.ts\ndist/adapters/storage/sqlite-bound-open.d.ts.map\ndist/adapters/storage/sqlite-bound-open.js\ndist/adapters/storage/sqlite-bound-open.js.map\ndist/adapters/storage/sqlite-content.d.ts\ndist/adapters/storage/sqlite-content.d.ts.map\ndist/adapters/storage/sqlite-content.js\ndist/adapters/storage/sqlite-content.js.map\ndist/adapters/storage/sqlite-crypto.d.ts\ndist/adapters/storage/sqlite-crypto.d.ts.map\ndist/adapters/storage/sqlite-crypto.js\ndist/adapters/storage/sqlite-crypto.js.map\ndist/adapters/storage/sqlite-driver.d.ts\ndist/adapters/storage/sqlite-driver.d.ts.map\ndist/adapters/storage/sqlite-driver.js\ndist/adapters/storage/sqlite-driver.js.map\ndist/adapters/storage/sqlite-effects.d.ts\ndist/adapters/storage/sqlite-effects.d.ts.map\ndist/adapters/storage/sqlite-effects.js\ndist/adapters/storage/sqlite-effects.js.map\ndist/adapters/storage/sqlite-errors.d.ts\ndist/adapters/storage/sqlite-errors.d.ts.map\ndist/adapters/storage/sqlite-errors.js\ndist/adapters/storage/sqlite-errors.js.map\ndist/adapters/storage/sqlite-initialization.d.ts\ndist/adapters/storage/sqlite-initialization.d.ts.map\ndist/adapters/storage/sqlite-initialization.js\ndist/adapters/storage/sqlite-initialization.js.map\ndist/adapters/storage/sqlite-journal.d.ts\ndist/adapters/storage/sqlite-journal.d.ts.map\ndist/adapters/storage/sqlite-journal.js\ndist/adapters/storage/sqlite-journal.js.map\ndist/adapters/storage/sqlite-lifecycle.d.ts\ndist/adapters/storage/sqlite-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-lifecycle.js\ndist/adapters/storage/sqlite-lifecycle.js.map\ndist/adapters/storage/sqlite-maintenance.d.ts\ndist/adapters/storage/sqlite-maintenance.d.ts.map\ndist/adapters/storage/sqlite-maintenance.js\ndist/adapters/storage/sqlite-maintenance.js.map\ndist/adapters/storage/sqlite-operations.d.ts\ndist/adapters/storage/sqlite-operations.d.ts.map\ndist/adapters/storage/sqlite-operations.js\ndist/adapters/storage/sqlite-operations.js.map\ndist/adapters/storage/sqlite-paths.d.ts\ndist/adapters/storage/sqlite-paths.d.ts.map\ndist/adapters/storage/sqlite-paths.js\ndist/adapters/storage/sqlite-paths.js.map\ndist/adapters/storage/sqlite-projection.d.ts\ndist/adapters/storage/sqlite-projection.d.ts.map\ndist/adapters/storage/sqlite-projection.js\ndist/adapters/storage/sqlite-projection.js.map\ndist/adapters/storage/sqlite-queue.d.ts\ndist/adapters/storage/sqlite-queue.d.ts.map\ndist/adapters/storage/sqlite-queue.js\ndist/adapters/storage/sqlite-queue.js.map\ndist/adapters/storage/sqlite-recovery.d.ts\ndist/adapters/storage/sqlite-recovery.d.ts.map\ndist/adapters/storage/sqlite-recovery.js\ndist/adapters/storage/sqlite-recovery.js.map\ndist/adapters/storage/sqlite-redaction.d.ts\ndist/adapters/storage/sqlite-redaction.d.ts.map\ndist/adapters/storage/sqlite-redaction.js\ndist/adapters/storage/sqlite-redaction.js.map\ndist/adapters/storage/sqlite-rows.d.ts\ndist/adapters/storage/sqlite-rows.d.ts.map\ndist/adapters/storage/sqlite-rows.js\ndist/adapters/storage/sqlite-rows.js.map\ndist/adapters/storage/sqlite-schema.d.ts\ndist/adapters/storage/sqlite-schema.d.ts.map\ndist/adapters/storage/sqlite-schema.js\ndist/adapters/storage/sqlite-schema.js.map\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-codec.js\ndist/adapters/storage/sqlite-state-snapshot-codec.js.map\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-keys.js\ndist/adapters/storage/sqlite-state-snapshot-keys.js.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js.map\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-read.js\ndist/adapters/storage/sqlite-state-snapshot-read.js.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.js\ndist/adapters/storage/sqlite-state-snapshot-transaction.js.map\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-types.js\ndist/adapters/storage/sqlite-state-snapshot-types.js.map\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-write.js\ndist/adapters/storage/sqlite-state-snapshot-write.js.map\ndist/adapters/storage/sqlite-state-snapshots.d.ts\ndist/adapters/storage/sqlite-state-snapshots.d.ts.map\ndist/adapters/storage/sqlite-state-snapshots.js\ndist/adapters/storage/sqlite-state-snapshots.js.map\ndist/adapters/storage/sqlite-types.d.ts\ndist/adapters/storage/sqlite-types.d.ts.map\ndist/adapters/storage/sqlite-types.js\ndist/adapters/storage/sqlite-types.js.map\ndist/adapters/storage/sqlite.d.ts\ndist/adapters/storage/sqlite.d.ts.map\ndist/adapters/storage/sqlite.js\ndist/adapters/storage/sqlite.js.map\ndist/adapters/storage/storage-validation.d.ts\ndist/adapters/storage/storage-validation.d.ts.map\ndist/adapters/storage/storage-validation.js\ndist/adapters/storage/storage-validation.js.map\ndist/adapters/tui/alternate-screen-terminal.d.ts\ndist/adapters/tui/alternate-screen-terminal.d.ts.map\ndist/adapters/tui/alternate-screen-terminal.js\ndist/adapters/tui/alternate-screen-terminal.js.map\ndist/adapters/tui/application-ui-controller.d.ts\ndist/adapters/tui/application-ui-controller.d.ts.map\ndist/adapters/tui/application-ui-controller.js\ndist/adapters/tui/application-ui-controller.js.map\ndist/adapters/tui/native-terminal-transport.d.ts\ndist/adapters/tui/native-terminal-transport.d.ts.map\ndist/adapters/tui/native-terminal-transport.js\ndist/adapters/tui/native-terminal-transport.js.map\ndist/adapters/tui/profile-connection-dispatch.d.ts\ndist/adapters/tui/profile-connection-dispatch.d.ts.map\ndist/adapters/tui/profile-connection-dispatch.js\ndist/adapters/tui/profile-connection-dispatch.js.map\ndist/adapters/tui/ui-automation-command.d.ts\ndist/adapters/tui/ui-automation-command.d.ts.map\ndist/adapters/tui/ui-automation-command.js\ndist/adapters/tui/ui-automation-command.js.map\ndist/adapters/tui/ui-automation-dispatch.d.ts\ndist/adapters/tui/ui-automation-dispatch.d.ts.map\ndist/adapters/tui/ui-automation-dispatch.js\ndist/adapters/tui/ui-automation-dispatch.js.map\ndist/adapters/tui/ui-capabilities.d.ts\ndist/adapters/tui/ui-capabilities.d.ts.map\ndist/adapters/tui/ui-capabilities.js\ndist/adapters/tui/ui-capabilities.js.map\ndist/adapters/tui/ui-command-dispatch.d.ts\ndist/adapters/tui/ui-command-dispatch.d.ts.map\ndist/adapters/tui/ui-command-dispatch.js\ndist/adapters/tui/ui-command-dispatch.js.map\ndist/adapters/tui/ui-conversation-dispatch.d.ts\ndist/adapters/tui/ui-conversation-dispatch.d.ts.map\ndist/adapters/tui/ui-conversation-dispatch.js\ndist/adapters/tui/ui-conversation-dispatch.js.map\ndist/adapters/tui/ui-core-dispatch.d.ts\ndist/adapters/tui/ui-core-dispatch.d.ts.map\ndist/adapters/tui/ui-core-dispatch.js\ndist/adapters/tui/ui-core-dispatch.js.map\ndist/adapters/tui/ui-dispatch-context.d.ts\ndist/adapters/tui/ui-dispatch-context.d.ts.map\ndist/adapters/tui/ui-dispatch-context.js\ndist/adapters/tui/ui-dispatch-context.js.map\ndist/adapters/tui/ui-dispatch-error.d.ts\ndist/adapters/tui/ui-dispatch-error.d.ts.map\ndist/adapters/tui/ui-dispatch-error.js\ndist/adapters/tui/ui-dispatch-error.js.map\ndist/adapters/tui/ui-dispatch.d.ts\ndist/adapters/tui/ui-dispatch.d.ts.map\ndist/adapters/tui/ui-dispatch.js\ndist/adapters/tui/ui-dispatch.js.map\ndist/adapters/tui/ui-entity-details.d.ts\ndist/adapters/tui/ui-entity-details.d.ts.map\ndist/adapters/tui/ui-entity-details.js\ndist/adapters/tui/ui-entity-details.js.map\ndist/adapters/tui/ui-fixtures.d.ts\ndist/adapters/tui/ui-fixtures.d.ts.map\ndist/adapters/tui/ui-fixtures.js\ndist/adapters/tui/ui-fixtures.js.map\ndist/adapters/tui/ui-headless-dispatch.d.ts\ndist/adapters/tui/ui-headless-dispatch.d.ts.map\ndist/adapters/tui/ui-headless-dispatch.js\ndist/adapters/tui/ui-headless-dispatch.js.map\ndist/adapters/tui/ui-intelligence-dispatch.d.ts\ndist/adapters/tui/ui-intelligence-dispatch.d.ts.map\ndist/adapters/tui/ui-intelligence-dispatch.js\ndist/adapters/tui/ui-intelligence-dispatch.js.map\ndist/adapters/tui/ui-intelligence-fixtures.d.ts\ndist/adapters/tui/ui-intelligence-fixtures.d.ts.map\ndist/adapters/tui/ui-intelligence-fixtures.js\ndist/adapters/tui/ui-intelligence-fixtures.js.map\ndist/adapters/tui/ui-intelligence-result-view.d.ts\ndist/adapters/tui/ui-intelligence-result-view.d.ts.map\ndist/adapters/tui/ui-intelligence-result-view.js\ndist/adapters/tui/ui-intelligence-result-view.js.map\ndist/adapters/tui/ui-interaction-receipt.d.ts\ndist/adapters/tui/ui-interaction-receipt.d.ts.map\ndist/adapters/tui/ui-interaction-receipt.js\ndist/adapters/tui/ui-interaction-receipt.js.map\ndist/adapters/tui/ui-projection.d.ts\ndist/adapters/tui/ui-projection.d.ts.map\ndist/adapters/tui/ui-projection.js\ndist/adapters/tui/ui-projection.js.map\ndist/adapters/tui/ui-semantic-state.d.ts\ndist/adapters/tui/ui-semantic-state.d.ts.map\ndist/adapters/tui/ui-semantic-state.js\ndist/adapters/tui/ui-semantic-state.js.map\ndist/adapters/tui/ui-subscriber-delivery.d.ts\ndist/adapters/tui/ui-subscriber-delivery.d.ts.map\ndist/adapters/tui/ui-subscriber-delivery.js\ndist/adapters/tui/ui-subscriber-delivery.js.map\ndist/adapters/tui/ui-view-model.d.ts\ndist/adapters/tui/ui-view-model.d.ts.map\ndist/adapters/tui/ui-view-model.js\ndist/adapters/tui/ui-view-model.js.map\ndist/app/action-host.d.ts\ndist/app/action-host.d.ts.map\ndist/app/action-host.js\ndist/app/action-host.js.map\ndist/app/action-serialization.d.ts\ndist/app/action-serialization.d.ts.map\ndist/app/action-serialization.js\ndist/app/action-serialization.js.map\ndist/app/analysis-comparison-contracts.d.ts\ndist/app/analysis-comparison-contracts.d.ts.map\ndist/app/analysis-comparison-contracts.js\ndist/app/analysis-comparison-contracts.js.map\ndist/app/analysis-comparison-evidence.d.ts\ndist/app/analysis-comparison-evidence.d.ts.map\ndist/app/analysis-comparison-evidence.js\ndist/app/analysis-comparison-evidence.js.map\ndist/app/analysis-comparison-facts.d.ts\ndist/app/analysis-comparison-facts.d.ts.map\ndist/app/analysis-comparison-facts.js\ndist/app/analysis-comparison-facts.js.map\ndist/app/analysis-comparison-graph.d.ts\ndist/app/analysis-comparison-graph.d.ts.map\ndist/app/analysis-comparison-graph.js\ndist/app/analysis-comparison-graph.js.map\ndist/app/analysis-comparison-lifecycle.d.ts\ndist/app/analysis-comparison-lifecycle.d.ts.map\ndist/app/analysis-comparison-lifecycle.js\ndist/app/analysis-comparison-lifecycle.js.map\ndist/app/analysis-comparison-record.d.ts\ndist/app/analysis-comparison-record.d.ts.map\ndist/app/analysis-comparison-record.js\ndist/app/analysis-comparison-record.js.map\ndist/app/analysis-comparison-request.d.ts\ndist/app/analysis-comparison-request.d.ts.map\ndist/app/analysis-comparison-request.js\ndist/app/analysis-comparison-request.js.map\ndist/app/analysis-comparison.d.ts\ndist/app/analysis-comparison.d.ts.map\ndist/app/analysis-comparison.js\ndist/app/analysis-comparison.js.map\ndist/app/analysis-execution-session.d.ts\ndist/app/analysis-execution-session.d.ts.map\ndist/app/analysis-execution-session.js\ndist/app/analysis-execution-session.js.map\ndist/app/analysis-execution-target.d.ts\ndist/app/analysis-execution-target.d.ts.map\ndist/app/analysis-execution-target.js\ndist/app/analysis-execution-target.js.map\ndist/app/analysis-graph-projector.d.ts\ndist/app/analysis-graph-projector.d.ts.map\ndist/app/analysis-graph-projector.js\ndist/app/analysis-graph-projector.js.map\ndist/app/analysis-lifecycle.d.ts\ndist/app/analysis-lifecycle.d.ts.map\ndist/app/analysis-lifecycle.js\ndist/app/analysis-lifecycle.js.map\ndist/app/analysis-model-call-records.d.ts\ndist/app/analysis-model-call-records.d.ts.map\ndist/app/analysis-model-call-records.js\ndist/app/analysis-model-call-records.js.map\ndist/app/analysis-operation.d.ts\ndist/app/analysis-operation.d.ts.map\ndist/app/analysis-operation.js\ndist/app/analysis-operation.js.map\ndist/app/analysis-persistence.d.ts\ndist/app/analysis-persistence.d.ts.map\ndist/app/analysis-persistence.js\ndist/app/analysis-persistence.js.map\ndist/app/analysis-promotion.d.ts\ndist/app/analysis-promotion.d.ts.map\ndist/app/analysis-promotion.js\ndist/app/analysis-promotion.js.map\ndist/app/analysis-request.d.ts\ndist/app/analysis-request.d.ts.map\ndist/app/analysis-request.js\ndist/app/analysis-request.js.map\ndist/app/analysis-result-mapper.d.ts\ndist/app/analysis-result-mapper.d.ts.map\ndist/app/analysis-result-mapper.js\ndist/app/analysis-result-mapper.js.map\ndist/app/analysis-retained-admission.d.ts\ndist/app/analysis-retained-admission.d.ts.map\ndist/app/analysis-retained-admission.js\ndist/app/analysis-retained-admission.js.map\ndist/app/analysis-service.d.ts\ndist/app/analysis-service.d.ts.map\ndist/app/analysis-service.js\ndist/app/analysis-service.js.map\ndist/app/analysis-source.d.ts\ndist/app/analysis-source.d.ts.map\ndist/app/analysis-source.js\ndist/app/analysis-source.js.map\ndist/app/analysis-types.d.ts\ndist/app/analysis-types.d.ts.map\ndist/app/analysis-types.js\ndist/app/analysis-types.js.map\ndist/app/application-guards.d.ts\ndist/app/application-guards.d.ts.map\ndist/app/application-guards.js\ndist/app/application-guards.js.map\ndist/app/application-interaction-actions.d.ts\ndist/app/application-interaction-actions.d.ts.map\ndist/app/application-interaction-actions.js\ndist/app/application-interaction-actions.js.map\ndist/app/application-lifecycle.d.ts\ndist/app/application-lifecycle.d.ts.map\ndist/app/application-lifecycle.js\ndist/app/application-lifecycle.js.map\ndist/app/application-options.d.ts\ndist/app/application-options.d.ts.map\ndist/app/application-options.js\ndist/app/application-options.js.map\ndist/app/application-port-builder.d.ts\ndist/app/application-port-builder.d.ts.map\ndist/app/application-port-builder.js\ndist/app/application-port-builder.js.map\ndist/app/application-port-runtime.d.ts\ndist/app/application-port-runtime.d.ts.map\ndist/app/application-port-runtime.js\ndist/app/application-port-runtime.js.map\ndist/app/application-ports.d.ts\ndist/app/application-ports.d.ts.map\ndist/app/application-ports.js\ndist/app/application-ports.js.map\ndist/app/application-runtime-wiring.d.ts\ndist/app/application-runtime-wiring.d.ts.map\ndist/app/application-runtime-wiring.js\ndist/app/application-runtime-wiring.js.map\ndist/app/application-support.d.ts\ndist/app/application-support.d.ts.map\ndist/app/application-support.js\ndist/app/application-support.js.map\ndist/app/application-transition.d.ts\ndist/app/application-transition.d.ts.map\ndist/app/application-transition.js\ndist/app/application-transition.js.map\ndist/app/application-types.d.ts\ndist/app/application-types.d.ts.map\ndist/app/application-types.js\ndist/app/application-types.js.map\ndist/app/application.d.ts\ndist/app/application.d.ts.map\ndist/app/application.js\ndist/app/application.js.map\ndist/app/automation-actions.d.ts\ndist/app/automation-actions.d.ts.map\ndist/app/automation-actions.js\ndist/app/automation-actions.js.map\ndist/app/automation-matching.d.ts\ndist/app/automation-matching.d.ts.map\ndist/app/automation-matching.js\ndist/app/automation-matching.js.map\ndist/app/automation-rule-audit.d.ts\ndist/app/automation-rule-audit.d.ts.map\ndist/app/automation-rule-audit.js\ndist/app/automation-rule-audit.js.map\ndist/app/automation-rule-persistence.d.ts\ndist/app/automation-rule-persistence.d.ts.map\ndist/app/automation-rule-persistence.js\ndist/app/automation-rule-persistence.js.map\ndist/app/automation-rule-store.d.ts\ndist/app/automation-rule-store.d.ts.map\ndist/app/automation-rule-store.js\ndist/app/automation-rule-store.js.map\ndist/app/automation-rule-types.d.ts\ndist/app/automation-rule-types.d.ts.map\ndist/app/automation-rule-types.js\ndist/app/automation-rule-types.js.map\ndist/app/automation-rule-update.d.ts\ndist/app/automation-rule-update.d.ts.map\ndist/app/automation-rule-update.js\ndist/app/automation-rule-update.js.map\ndist/app/automation-rule-validation.d.ts\ndist/app/automation-rule-validation.d.ts.map\ndist/app/automation-rule-validation.js\ndist/app/automation-rule-validation.js.map\ndist/app/automation-rules.d.ts\ndist/app/automation-rules.d.ts.map\ndist/app/automation-rules.js\ndist/app/automation-rules.js.map\ndist/app/composition-options.d.ts\ndist/app/composition-options.d.ts.map\ndist/app/composition-options.js\ndist/app/composition-options.js.map\ndist/app/composition.d.ts\ndist/app/composition.d.ts.map\ndist/app/composition.js\ndist/app/composition.js.map\ndist/app/configuration-action-transition.d.ts\ndist/app/configuration-action-transition.d.ts.map\ndist/app/configuration-action-transition.js\ndist/app/configuration-action-transition.js.map\ndist/app/configuration-session.d.ts\ndist/app/configuration-session.d.ts.map\ndist/app/configuration-session.js\ndist/app/configuration-session.js.map\ndist/app/connection-action-support.d.ts\ndist/app/connection-action-support.d.ts.map\ndist/app/connection-action-support.js\ndist/app/connection-action-support.js.map\ndist/app/connection-action-types.d.ts\ndist/app/connection-action-types.d.ts.map\ndist/app/connection-action-types.js\ndist/app/connection-action-types.js.map\ndist/app/connection-actions.d.ts\ndist/app/connection-actions.d.ts.map\ndist/app/connection-actions.js\ndist/app/connection-actions.js.map\ndist/app/connection-errors.d.ts\ndist/app/connection-errors.d.ts.map\ndist/app/connection-errors.js\ndist/app/connection-errors.js.map\ndist/app/connection-probe.d.ts\ndist/app/connection-probe.d.ts.map\ndist/app/connection-probe.js\ndist/app/connection-probe.js.map\ndist/app/connection-record-factory.d.ts\ndist/app/connection-record-factory.d.ts.map\ndist/app/connection-record-factory.js\ndist/app/connection-record-factory.js.map\ndist/app/connections.d.ts\ndist/app/connections.d.ts.map\ndist/app/connections.js\ndist/app/connections.js.map\ndist/app/control-effects.d.ts\ndist/app/control-effects.d.ts.map\ndist/app/control-effects.js\ndist/app/control-effects.js.map\ndist/app/conversation-branch-effects.d.ts\ndist/app/conversation-branch-effects.d.ts.map\ndist/app/conversation-branch-effects.js\ndist/app/conversation-branch-effects.js.map\ndist/app/conversation-branches.d.ts\ndist/app/conversation-branches.d.ts.map\ndist/app/conversation-branches.js\ndist/app/conversation-branches.js.map\ndist/app/conversation-composition.d.ts\ndist/app/conversation-composition.d.ts.map\ndist/app/conversation-composition.js\ndist/app/conversation-composition.js.map\ndist/app/conversation-context.d.ts\ndist/app/conversation-context.d.ts.map\ndist/app/conversation-context.js\ndist/app/conversation-context.js.map\ndist/app/conversation-drafts.d.ts\ndist/app/conversation-drafts.d.ts.map\ndist/app/conversation-drafts.js\ndist/app/conversation-drafts.js.map\ndist/app/conversation-exports.d.ts\ndist/app/conversation-exports.d.ts.map\ndist/app/conversation-exports.js\ndist/app/conversation-exports.js.map\ndist/app/conversation-import-analyses.d.ts\ndist/app/conversation-import-analyses.d.ts.map\ndist/app/conversation-import-analyses.js\ndist/app/conversation-import-analyses.js.map\ndist/app/conversation-import-builder.d.ts\ndist/app/conversation-import-builder.d.ts.map\ndist/app/conversation-import-builder.js\ndist/app/conversation-import-builder.js.map\ndist/app/conversation-import-document.d.ts\ndist/app/conversation-import-document.d.ts.map\ndist/app/conversation-import-document.js\ndist/app/conversation-import-document.js.map\ndist/app/conversation-import-graph.d.ts\ndist/app/conversation-import-graph.d.ts.map\ndist/app/conversation-import-graph.js\ndist/app/conversation-import-graph.js.map\ndist/app/conversation-import-messages.d.ts\ndist/app/conversation-import-messages.d.ts.map\ndist/app/conversation-import-messages.js\ndist/app/conversation-import-messages.js.map\ndist/app/conversation-import-runs.d.ts\ndist/app/conversation-import-runs.d.ts.map\ndist/app/conversation-import-runs.js\ndist/app/conversation-import-runs.js.map\ndist/app/conversation-import-validation.d.ts\ndist/app/conversation-import-validation.d.ts.map\ndist/app/conversation-import-validation.js\ndist/app/conversation-import-validation.js.map\ndist/app/conversation-import-values.d.ts\ndist/app/conversation-import-values.d.ts.map\ndist/app/conversation-import-values.js\ndist/app/conversation-import-values.js.map\ndist/app/conversation-imports.d.ts\ndist/app/conversation-imports.d.ts.map\ndist/app/conversation-imports.js\ndist/app/conversation-imports.js.map\ndist/app/conversation-lifecycle.d.ts\ndist/app/conversation-lifecycle.d.ts.map\ndist/app/conversation-lifecycle.js\ndist/app/conversation-lifecycle.js.map\ndist/app/conversation-operation-coordinator.d.ts\ndist/app/conversation-operation-coordinator.d.ts.map\ndist/app/conversation-operation-coordinator.js\ndist/app/conversation-operation-coordinator.js.map\ndist/app/conversation-records.d.ts\ndist/app/conversation-records.d.ts.map\ndist/app/conversation-records.js\ndist/app/conversation-records.js.map\ndist/app/conversation-support.d.ts\ndist/app/conversation-support.d.ts.map\ndist/app/conversation-support.js\ndist/app/conversation-support.js.map\ndist/app/conversation-types.d.ts\ndist/app/conversation-types.d.ts.map\ndist/app/conversation-types.js\ndist/app/conversation-types.js.map\ndist/app/conversation-visibility.d.ts\ndist/app/conversation-visibility.d.ts.map\ndist/app/conversation-visibility.js\ndist/app/conversation-visibility.js.map\ndist/app/conversations.d.ts\ndist/app/conversations.d.ts.map\ndist/app/conversations.js\ndist/app/conversations.js.map\ndist/app/default-profiles.d.ts\ndist/app/default-profiles.d.ts.map\ndist/app/default-profiles.js\ndist/app/default-profiles.js.map\ndist/app/durable-send.d.ts\ndist/app/durable-send.d.ts.map\ndist/app/durable-send.js\ndist/app/durable-send.js.map\ndist/app/effect-coordinator.d.ts\ndist/app/effect-coordinator.d.ts.map\ndist/app/effect-coordinator.js\ndist/app/effect-coordinator.js.map\ndist/app/effect-projection.d.ts\ndist/app/effect-projection.d.ts.map\ndist/app/effect-projection.js\ndist/app/effect-projection.js.map\ndist/app/effective-run-configuration.d.ts\ndist/app/effective-run-configuration.d.ts.map\ndist/app/effective-run-configuration.js\ndist/app/effective-run-configuration.js.map\ndist/app/errors.d.ts\ndist/app/errors.d.ts.map\ndist/app/errors.js\ndist/app/errors.js.map\ndist/app/fail-closed-journal.d.ts\ndist/app/fail-closed-journal.d.ts.map\ndist/app/fail-closed-journal.js\ndist/app/fail-closed-journal.js.map\ndist/app/intelligence-actions.d.ts\ndist/app/intelligence-actions.d.ts.map\ndist/app/intelligence-actions.js\ndist/app/intelligence-actions.js.map\ndist/app/interaction-automation-coordinator.d.ts\ndist/app/interaction-automation-coordinator.d.ts.map\ndist/app/interaction-automation-coordinator.js\ndist/app/interaction-automation-coordinator.js.map\ndist/app/interaction-controller.d.ts\ndist/app/interaction-controller.d.ts.map\ndist/app/interaction-controller.js\ndist/app/interaction-controller.js.map\ndist/app/interaction-effects.d.ts\ndist/app/interaction-effects.d.ts.map\ndist/app/interaction-effects.js\ndist/app/interaction-effects.js.map\ndist/app/interaction-request.d.ts\ndist/app/interaction-request.d.ts.map\ndist/app/interaction-request.js\ndist/app/interaction-request.js.map\ndist/app/interaction-response-replay.d.ts\ndist/app/interaction-response-replay.d.ts.map\ndist/app/interaction-response-replay.js\ndist/app/interaction-response-replay.js.map\ndist/app/interaction-response.d.ts\ndist/app/interaction-response.d.ts.map\ndist/app/interaction-response.js\ndist/app/interaction-response.js.map\ndist/app/journal.d.ts\ndist/app/journal.d.ts.map\ndist/app/journal.js\ndist/app/journal.js.map\ndist/app/legacy-cancel.d.ts\ndist/app/legacy-cancel.d.ts.map\ndist/app/legacy-cancel.js\ndist/app/legacy-cancel.js.map\ndist/app/operation-fingerprint.d.ts\ndist/app/operation-fingerprint.d.ts.map\ndist/app/operation-fingerprint.js\ndist/app/operation-fingerprint.js.map\ndist/app/operation-ledger.d.ts\ndist/app/operation-ledger.d.ts.map\ndist/app/operation-ledger.js\ndist/app/operation-ledger.js.map\ndist/app/production-composition.d.ts\ndist/app/production-composition.d.ts.map\ndist/app/production-composition.js\ndist/app/production-composition.js.map\ndist/app/profile-action-support.d.ts\ndist/app/profile-action-support.d.ts.map\ndist/app/profile-action-support.js\ndist/app/profile-action-support.js.map\ndist/app/profile-actions.d.ts\ndist/app/profile-actions.d.ts.map\ndist/app/profile-actions.js\ndist/app/profile-actions.js.map\ndist/app/profile-draft.d.ts\ndist/app/profile-draft.d.ts.map\ndist/app/profile-draft.js\ndist/app/profile-draft.js.map\ndist/app/profile-model-settings.d.ts\ndist/app/profile-model-settings.d.ts.map\ndist/app/profile-model-settings.js\ndist/app/profile-model-settings.js.map\ndist/app/profile-persistence.d.ts\ndist/app/profile-persistence.d.ts.map\ndist/app/profile-persistence.js\ndist/app/profile-persistence.js.map\ndist/app/profile-save-recovery.d.ts\ndist/app/profile-save-recovery.d.ts.map\ndist/app/profile-save-recovery.js\ndist/app/profile-save-recovery.js.map\ndist/app/profile-selection.d.ts\ndist/app/profile-selection.d.ts.map\ndist/app/profile-selection.js\ndist/app/profile-selection.js.map\ndist/app/profile-snapshots.d.ts\ndist/app/profile-snapshots.d.ts.map\ndist/app/profile-snapshots.js\ndist/app/profile-snapshots.js.map\ndist/app/profile-sources.d.ts\ndist/app/profile-sources.d.ts.map\ndist/app/profile-sources.js\ndist/app/profile-sources.js.map\ndist/app/profile-types.d.ts\ndist/app/profile-types.d.ts.map\ndist/app/profile-types.js\ndist/app/profile-types.js.map\ndist/app/profile-validation.d.ts\ndist/app/profile-validation.d.ts.map\ndist/app/profile-validation.js\ndist/app/profile-validation.js.map\ndist/app/profiles.d.ts\ndist/app/profiles.d.ts.map\ndist/app/profiles.js\ndist/app/profiles.js.map\ndist/app/provider-snapshot.d.ts\ndist/app/provider-snapshot.d.ts.map\ndist/app/provider-snapshot.js\ndist/app/provider-snapshot.js.map\ndist/app/provider-values.d.ts\ndist/app/provider-values.d.ts.map\ndist/app/provider-values.js\ndist/app/provider-values.js.map\ndist/app/run-admission-continuation.d.ts\ndist/app/run-admission-continuation.d.ts.map\ndist/app/run-admission-continuation.js\ndist/app/run-admission-continuation.js.map\ndist/app/run-admission-dispatch.d.ts\ndist/app/run-admission-dispatch.d.ts.map\ndist/app/run-admission-dispatch.js\ndist/app/run-admission-dispatch.js.map\ndist/app/run-admission-receipt.d.ts\ndist/app/run-admission-receipt.d.ts.map\ndist/app/run-admission-receipt.js\ndist/app/run-admission-receipt.js.map\ndist/app/run-admission-request.d.ts\ndist/app/run-admission-request.d.ts.map\ndist/app/run-admission-request.js\ndist/app/run-admission-request.js.map\ndist/app/run-admission-validation.d.ts\ndist/app/run-admission-validation.d.ts.map\ndist/app/run-admission-validation.js\ndist/app/run-admission-validation.js.map\ndist/app/run-admission.d.ts\ndist/app/run-admission.d.ts.map\ndist/app/run-admission.js\ndist/app/run-admission.js.map\ndist/app/run-continuation.d.ts\ndist/app/run-continuation.d.ts.map\ndist/app/run-continuation.js\ndist/app/run-continuation.js.map\ndist/app/run-controls.d.ts\ndist/app/run-controls.d.ts.map\ndist/app/run-controls.js\ndist/app/run-controls.js.map\ndist/app/run-event-mapper.d.ts\ndist/app/run-event-mapper.d.ts.map\ndist/app/run-event-mapper.js\ndist/app/run-event-mapper.js.map\ndist/app/run-execution-snapshot.d.ts\ndist/app/run-execution-snapshot.d.ts.map\ndist/app/run-execution-snapshot.js\ndist/app/run-execution-snapshot.js.map\ndist/app/run-execution.d.ts\ndist/app/run-execution.d.ts.map\ndist/app/run-execution.js\ndist/app/run-execution.js.map\ndist/app/run-ingestion.d.ts\ndist/app/run-ingestion.d.ts.map\ndist/app/run-ingestion.js\ndist/app/run-ingestion.js.map\ndist/app/run-ledger.d.ts\ndist/app/run-ledger.d.ts.map\ndist/app/run-ledger.js\ndist/app/run-ledger.js.map\ndist/app/run-recovery-context.d.ts\ndist/app/run-recovery-context.d.ts.map\ndist/app/run-recovery-context.js\ndist/app/run-recovery-context.js.map\ndist/app/run-replay.d.ts\ndist/app/run-replay.d.ts.map\ndist/app/run-replay.js\ndist/app/run-replay.js.map\ndist/app/run-status.d.ts\ndist/app/run-status.d.ts.map\ndist/app/run-status.js\ndist/app/run-status.js.map\ndist/app/run-stream-sanitizer.d.ts\ndist/app/run-stream-sanitizer.d.ts.map\ndist/app/run-stream-sanitizer.js\ndist/app/run-stream-sanitizer.js.map\ndist/app/runtime-selection.d.ts\ndist/app/runtime-selection.d.ts.map\ndist/app/runtime-selection.js\ndist/app/runtime-selection.js.map\ndist/app/shutdown-controller.d.ts\ndist/app/shutdown-controller.d.ts.map\ndist/app/shutdown-controller.js\ndist/app/shutdown-controller.js.map\ndist/app/storage-journal-support.d.ts\ndist/app/storage-journal-support.d.ts.map\ndist/app/storage-journal-support.js\ndist/app/storage-journal-support.js.map\ndist/app/storage-journal.d.ts\ndist/app/storage-journal.d.ts.map\ndist/app/storage-journal.js\ndist/app/storage-journal.js.map\ndist/app/supervisor-projection.d.ts\ndist/app/supervisor-projection.d.ts.map\ndist/app/supervisor-projection.js\ndist/app/supervisor-projection.js.map\ndist/app/supervisor-service.d.ts\ndist/app/supervisor-service.d.ts.map\ndist/app/supervisor-service.js\ndist/app/supervisor-service.js.map\ndist/app/unavailable-analyst.d.ts\ndist/app/unavailable-analyst.d.ts.map\ndist/app/unavailable-analyst.js\ndist/app/unavailable-analyst.js.map\ndist/bin/args.d.ts\ndist/bin/args.d.ts.map\ndist/bin/args.js\ndist/bin/args.js.map\ndist/bin/braid-runtime.d.ts\ndist/bin/braid-runtime.d.ts.map\ndist/bin/braid-runtime.js\ndist/bin/braid-runtime.js.map\ndist/bin/braid.d.ts\ndist/bin/braid.d.ts.map\ndist/bin/braid.js\ndist/bin/braid.js.map\ndist/bin/fixture-application.d.ts\ndist/bin/fixture-application.d.ts.map\ndist/bin/fixture-application.js\ndist/bin/fixture-application.js.map\ndist/bin/interface-runner.d.ts\ndist/bin/interface-runner.d.ts.map\ndist/bin/interface-runner.js\ndist/bin/interface-runner.js.map\ndist/bin/interface-signal-lifecycle.d.ts\ndist/bin/interface-signal-lifecycle.d.ts.map\ndist/bin/interface-signal-lifecycle.js\ndist/bin/interface-signal-lifecycle.js.map\ndist/bin/interface-state-recorder.d.ts\ndist/bin/interface-state-recorder.d.ts.map\ndist/bin/interface-state-recorder.js\ndist/bin/interface-state-recorder.js.map\ndist/bin/native-interactive-actions.d.ts\ndist/bin/native-interactive-actions.d.ts.map\ndist/bin/native-interactive-actions.js\ndist/bin/native-interactive-actions.js.map\ndist/bin/plain.d.ts\ndist/bin/plain.d.ts.map\ndist/bin/plain.js\ndist/bin/plain.js.map\ndist/bin/production-active-profile.d.ts\ndist/bin/production-active-profile.d.ts.map\ndist/bin/production-active-profile.js\ndist/bin/production-active-profile.js.map\ndist/bin/production-application.d.ts\ndist/bin/production-application.d.ts.map\ndist/bin/production-application.js\ndist/bin/production-application.js.map\ndist/bin/production-bridge-client.d.ts\ndist/bin/production-bridge-client.d.ts.map\ndist/bin/production-bridge-client.js\ndist/bin/production-bridge-client.js.map\ndist/bin/production-bridge-discovery.d.ts\ndist/bin/production-bridge-discovery.d.ts.map\ndist/bin/production-bridge-discovery.js\ndist/bin/production-bridge-discovery.js.map\ndist/bin/production-config-mutation-lock.d.ts\ndist/bin/production-config-mutation-lock.d.ts.map\ndist/bin/production-config-mutation-lock.js\ndist/bin/production-config-mutation-lock.js.map\ndist/bin/production-connection-action-options.d.ts\ndist/bin/production-connection-action-options.d.ts.map\ndist/bin/production-connection-action-options.js\ndist/bin/production-connection-action-options.js.map\ndist/bin/production-connection-actions.d.ts\ndist/bin/production-connection-actions.d.ts.map\ndist/bin/production-connection-actions.js\ndist/bin/production-connection-actions.js.map\ndist/bin/production-connection-catalog.d.ts\ndist/bin/production-connection-catalog.d.ts.map\ndist/bin/production-connection-catalog.js\ndist/bin/production-connection-catalog.js.map\ndist/bin/production-connection-credential-cleanup.d.ts\ndist/bin/production-connection-credential-cleanup.d.ts.map\ndist/bin/production-connection-credential-cleanup.js\ndist/bin/production-connection-credential-cleanup.js.map\ndist/bin/production-connection-credential-removal-record.d.ts\ndist/bin/production-connection-credential-removal-record.d.ts.map\ndist/bin/production-connection-credential-removal-record.js\ndist/bin/production-connection-credential-removal-record.js.map\ndist/bin/production-connection-removal.d.ts\ndist/bin/production-connection-removal.d.ts.map\ndist/bin/production-connection-removal.js\ndist/bin/production-connection-removal.js.map\ndist/bin/production-connection-replay.d.ts\ndist/bin/production-connection-replay.d.ts.map\ndist/bin/production-connection-replay.js\ndist/bin/production-connection-replay.js.map\ndist/bin/production-credential-context.d.ts\ndist/bin/production-credential-context.d.ts.map\ndist/bin/production-credential-context.js\ndist/bin/production-credential-context.js.map\ndist/bin/production-credential-reference.d.ts\ndist/bin/production-credential-reference.d.ts.map\ndist/bin/production-credential-reference.js\ndist/bin/production-credential-reference.js.map\ndist/bin/production-key-path.d.ts\ndist/bin/production-key-path.d.ts.map\ndist/bin/production-key-path.js\ndist/bin/production-key-path.js.map\ndist/bin/production-profile-projection.d.ts\ndist/bin/production-profile-projection.d.ts.map\ndist/bin/production-profile-projection.js\ndist/bin/production-profile-projection.js.map\ndist/bin/production-setup-credentials.d.ts\ndist/bin/production-setup-credentials.d.ts.map\ndist/bin/production-setup-credentials.js\ndist/bin/production-setup-credentials.js.map\ndist/bin/production-setup-discovery.d.ts\ndist/bin/production-setup-discovery.d.ts.map\ndist/bin/production-setup-discovery.js\ndist/bin/production-setup-discovery.js.map\ndist/bin/production-setup-persistence.d.ts\ndist/bin/production-setup-persistence.d.ts.map\ndist/bin/production-setup-persistence.js\ndist/bin/production-setup-persistence.js.map\ndist/bin/production-setup-transition.d.ts\ndist/bin/production-setup-transition.d.ts.map\ndist/bin/production-setup-transition.js\ndist/bin/production-setup-transition.js.map\ndist/bin/production-setup-types.d.ts\ndist/bin/production-setup-types.d.ts.map\ndist/bin/production-setup-types.js\ndist/bin/production-setup-types.js.map\ndist/bin/production-setup-validation.d.ts\ndist/bin/production-setup-validation.d.ts.map\ndist/bin/production-setup-validation.js\ndist/bin/production-setup-validation.js.map\ndist/bin/production-setup.d.ts\ndist/bin/production-setup.d.ts.map\ndist/bin/production-setup.js\ndist/bin/production-setup.js.map\ndist/bin/production-startup.d.ts\ndist/bin/production-startup.d.ts.map\ndist/bin/production-startup.js\ndist/bin/production-startup.js.map\ndist/bin/runtime-startup-options.d.ts\ndist/bin/runtime-startup-options.d.ts.map\ndist/bin/runtime-startup-options.js\ndist/bin/runtime-startup-options.js.map\ndist/bin/state-path.d.ts\ndist/bin/state-path.d.ts.map\ndist/bin/state-path.js\ndist/bin/state-path.js.map\ndist/domain/analysis-model-call.d.ts\ndist/domain/analysis-model-call.d.ts.map\ndist/domain/analysis-model-call.js\ndist/domain/analysis-model-call.js.map\ndist/domain/bounded-structured.d.ts\ndist/domain/bounded-structured.d.ts.map\ndist/domain/bounded-structured.js\ndist/domain/bounded-structured.js.map\ndist/domain/canonical-json.d.ts\ndist/domain/canonical-json.d.ts.map\ndist/domain/canonical-json.js\ndist/domain/canonical-json.js.map\ndist/domain/canonical.d.ts\ndist/domain/canonical.d.ts.map\ndist/domain/canonical.js\ndist/domain/canonical.js.map\ndist/domain/code-unit-order.d.ts\ndist/domain/code-unit-order.d.ts.map\ndist/domain/code-unit-order.js\ndist/domain/code-unit-order.js.map\ndist/domain/connection-removal.d.ts\ndist/domain/connection-removal.d.ts.map\ndist/domain/connection-removal.js\ndist/domain/connection-removal.js.map\ndist/domain/content-budget.d.ts\ndist/domain/content-budget.d.ts.map\ndist/domain/content-budget.js\ndist/domain/content-budget.js.map\ndist/domain/entities-base.d.ts\ndist/domain/entities-base.d.ts.map\ndist/domain/entities-base.js\ndist/domain/entities-base.js.map\ndist/domain/entities-core.d.ts\ndist/domain/entities-core.d.ts.map\ndist/domain/entities-core.js\ndist/domain/entities-core.js.map\ndist/domain/entities-graph.d.ts\ndist/domain/entities-graph.d.ts.map\ndist/domain/entities-graph.js\ndist/domain/entities-graph.js.map\ndist/domain/entities-interactions.d.ts\ndist/domain/entities-interactions.d.ts.map\ndist/domain/entities-interactions.js\ndist/domain/entities-interactions.js.map\ndist/domain/entities-messages.d.ts\ndist/domain/entities-messages.d.ts.map\ndist/domain/entities-messages.js\ndist/domain/entities-messages.js.map\ndist/domain/entities-runtime.d.ts\ndist/domain/entities-runtime.d.ts.map\ndist/domain/entities-runtime.js\ndist/domain/entities-runtime.js.map\ndist/domain/entities.d.ts\ndist/domain/entities.d.ts.map\ndist/domain/entities.js\ndist/domain/entities.js.map\ndist/domain/events-legacy.d.ts\ndist/domain/events-legacy.d.ts.map\ndist/domain/events-legacy.js\ndist/domain/events-legacy.js.map\ndist/domain/events.d.ts\ndist/domain/events.d.ts.map\ndist/domain/events.js\ndist/domain/events.js.map\ndist/domain/execution-observation.d.ts\ndist/domain/execution-observation.d.ts.map\ndist/domain/execution-observation.js\ndist/domain/execution-observation.js.map\ndist/domain/graph-records.d.ts\ndist/domain/graph-records.d.ts.map\ndist/domain/graph-records.js\ndist/domain/graph-records.js.map\ndist/domain/ids-core.d.ts\ndist/domain/ids-core.d.ts.map\ndist/domain/ids-core.js\ndist/domain/ids-core.js.map\ndist/domain/ids-types.d.ts\ndist/domain/ids-types.d.ts.map\ndist/domain/ids-types.js\ndist/domain/ids-types.js.map\ndist/domain/ids-values.d.ts\ndist/domain/ids-values.d.ts.map\ndist/domain/ids-values.js\ndist/domain/ids-values.js.map\ndist/domain/ids.d.ts\ndist/domain/ids.d.ts.map\ndist/domain/ids.js\ndist/domain/ids.js.map\ndist/domain/interaction-identity.d.ts\ndist/domain/interaction-identity.d.ts.map\ndist/domain/interaction-identity.js\ndist/domain/interaction-identity.js.map\ndist/domain/interaction-timeout.d.ts\ndist/domain/interaction-timeout.d.ts.map\ndist/domain/interaction-timeout.js\ndist/domain/interaction-timeout.js.map\ndist/domain/invariants-base.d.ts\ndist/domain/invariants-base.d.ts.map\ndist/domain/invariants-base.js\ndist/domain/invariants-base.js.map\ndist/domain/invariants-conversation.d.ts\ndist/domain/invariants-conversation.d.ts.map\ndist/domain/invariants-conversation.js\ndist/domain/invariants-conversation.js.map\ndist/domain/invariants-profile.d.ts\ndist/domain/invariants-profile.d.ts.map\ndist/domain/invariants-profile.js\ndist/domain/invariants-profile.js.map\ndist/domain/invariants-relations.d.ts\ndist/domain/invariants-relations.d.ts.map\ndist/domain/invariants-relations.js\ndist/domain/invariants-relations.js.map\ndist/domain/invariants-retained-admission.d.ts\ndist/domain/invariants-retained-admission.d.ts.map\ndist/domain/invariants-retained-admission.js\ndist/domain/invariants-retained-admission.js.map\ndist/domain/invariants-run.d.ts\ndist/domain/invariants-run.d.ts.map\ndist/domain/invariants-run.js\ndist/domain/invariants-run.js.map\ndist/domain/invariants-runtime.d.ts\ndist/domain/invariants-runtime.d.ts.map\ndist/domain/invariants-runtime.js\ndist/domain/invariants-runtime.js.map\ndist/domain/invariants-state.d.ts\ndist/domain/invariants-state.d.ts.map\ndist/domain/invariants-state.js\ndist/domain/invariants-state.js.map\ndist/domain/invariants.d.ts\ndist/domain/invariants.d.ts.map\ndist/domain/invariants.js\ndist/domain/invariants.js.map\ndist/domain/legacy-interaction-snapshot.d.ts\ndist/domain/legacy-interaction-snapshot.d.ts.map\ndist/domain/legacy-interaction-snapshot.js\ndist/domain/legacy-interaction-snapshot.js.map\ndist/domain/materialization-receipt.d.ts\ndist/domain/materialization-receipt.d.ts.map\ndist/domain/materialization-receipt.js\ndist/domain/materialization-receipt.js.map\ndist/domain/materialized-state-snapshot.d.ts\ndist/domain/materialized-state-snapshot.d.ts.map\ndist/domain/materialized-state-snapshot.js\ndist/domain/materialized-state-snapshot.js.map\ndist/domain/materialized-state.d.ts\ndist/domain/materialized-state.d.ts.map\ndist/domain/materialized-state.js\ndist/domain/materialized-state.js.map\ndist/domain/projection-checksum.d.ts\ndist/domain/projection-checksum.d.ts.map\ndist/domain/projection-checksum.js\ndist/domain/projection-checksum.js.map\ndist/domain/provider-values.d.ts\ndist/domain/provider-values.d.ts.map\ndist/domain/provider-values.js\ndist/domain/provider-values.js.map\ndist/domain/public-metadata.d.ts\ndist/domain/public-metadata.d.ts.map\ndist/domain/public-metadata.js\ndist/domain/public-metadata.js.map\ndist/domain/receipts.d.ts\ndist/domain/receipts.d.ts.map\ndist/domain/receipts.js\ndist/domain/receipts.js.map\ndist/domain/redaction.d.ts\ndist/domain/redaction.d.ts.map\ndist/domain/redaction.js\ndist/domain/redaction.js.map\ndist/domain/reducer-content.d.ts\ndist/domain/reducer-content.d.ts.map\ndist/domain/reducer-content.js\ndist/domain/reducer-content.js.map\ndist/domain/reducer-conversation-events.d.ts\ndist/domain/reducer-conversation-events.d.ts.map\ndist/domain/reducer-conversation-events.js\ndist/domain/reducer-conversation-events.js.map\ndist/domain/reducer-domain-events.d.ts\ndist/domain/reducer-domain-events.d.ts.map\ndist/domain/reducer-domain-events.js\ndist/domain/reducer-domain-events.js.map\ndist/domain/reducer-execution-observation.d.ts\ndist/domain/reducer-execution-observation.d.ts.map\ndist/domain/reducer-execution-observation.js\ndist/domain/reducer-execution-observation.js.map\ndist/domain/reducer-helpers.d.ts\ndist/domain/reducer-helpers.d.ts.map\ndist/domain/reducer-helpers.js\ndist/domain/reducer-helpers.js.map\ndist/domain/reducer-interactions.d.ts\ndist/domain/reducer-interactions.d.ts.map\ndist/domain/reducer-interactions.js\ndist/domain/reducer-interactions.js.map\ndist/domain/reducer-legacy.d.ts\ndist/domain/reducer-legacy.d.ts.map\ndist/domain/reducer-legacy.js\ndist/domain/reducer-legacy.js.map\ndist/domain/reducer-lifecycle.d.ts\ndist/domain/reducer-lifecycle.d.ts.map\ndist/domain/reducer-lifecycle.js\ndist/domain/reducer-lifecycle.js.map\ndist/domain/reducer-replay.d.ts\ndist/domain/reducer-replay.d.ts.map\ndist/domain/reducer-replay.js\ndist/domain/reducer-replay.js.map\ndist/domain/reducer-retained-admission.d.ts\ndist/domain/reducer-retained-admission.d.ts.map\ndist/domain/reducer-retained-admission.js\ndist/domain/reducer-retained-admission.js.map\ndist/domain/reducer-run-graph.d.ts\ndist/domain/reducer-run-graph.d.ts.map\ndist/domain/reducer-run-graph.js\ndist/domain/reducer-run-graph.js.map\ndist/domain/reducer-runtime.d.ts\ndist/domain/reducer-runtime.d.ts.map\ndist/domain/reducer-runtime.js\ndist/domain/reducer-runtime.js.map\ndist/domain/reducer-support.d.ts\ndist/domain/reducer-support.d.ts.map\ndist/domain/reducer-support.js\ndist/domain/reducer-support.js.map\ndist/domain/reducer.d.ts\ndist/domain/reducer.d.ts.map\ndist/domain/reducer.js\ndist/domain/reducer.js.map\ndist/domain/run-contracts.d.ts\ndist/domain/run-contracts.d.ts.map\ndist/domain/run-contracts.js\ndist/domain/run-contracts.js.map\ndist/domain/run-interactions.d.ts\ndist/domain/run-interactions.d.ts.map\ndist/domain/run-interactions.js\ndist/domain/run-interactions.js.map\ndist/domain/run-usage.d.ts\ndist/domain/run-usage.d.ts.map\ndist/domain/run-usage.js\ndist/domain/run-usage.js.map\ndist/domain/runtime-diagnostics.d.ts\ndist/domain/runtime-diagnostics.d.ts.map\ndist/domain/runtime-diagnostics.js\ndist/domain/runtime-diagnostics.js.map\ndist/domain/runtime-events.d.ts\ndist/domain/runtime-events.d.ts.map\ndist/domain/runtime-events.js\ndist/domain/runtime-events.js.map\ndist/domain/runtime-projection.d.ts\ndist/domain/runtime-projection.d.ts.map\ndist/domain/runtime-projection.js\ndist/domain/runtime-projection.js.map\ndist/domain/secret-sanitizer.d.ts\ndist/domain/secret-sanitizer.d.ts.map\ndist/domain/secret-sanitizer.js\ndist/domain/secret-sanitizer.js.map\ndist/domain/state.d.ts\ndist/domain/state.d.ts.map\ndist/domain/state.js\ndist/domain/state.js.map\ndist/domain/terminal-sanitizer.d.ts\ndist/domain/terminal-sanitizer.d.ts.map\ndist/domain/terminal-sanitizer.js\ndist/domain/terminal-sanitizer.js.map\ndist/domain/text.d.ts\ndist/domain/text.d.ts.map\ndist/domain/text.js\ndist/domain/text.js.map\ndist/eval/calibration.d.ts\ndist/eval/calibration.d.ts.map\ndist/eval/calibration.js\ndist/eval/calibration.js.map\ndist/eval/campaigns.d.ts\ndist/eval/campaigns.d.ts.map\ndist/eval/campaigns.js\ndist/eval/campaigns.js.map\ndist/eval/cases.d.ts\ndist/eval/cases.d.ts.map\ndist/eval/cases.js\ndist/eval/cases.js.map\ndist/eval/execution.d.ts\ndist/eval/execution.d.ts.map\ndist/eval/execution.js\ndist/eval/execution.js.map\ndist/eval/fixtures.d.ts\ndist/eval/fixtures.d.ts.map\ndist/eval/fixtures.js\ndist/eval/fixtures.js.map\ndist/eval/product-path.d.ts\ndist/eval/product-path.d.ts.map\ndist/eval/product-path.js\ndist/eval/product-path.js.map\ndist/eval/record-builder.d.ts\ndist/eval/record-builder.d.ts.map\ndist/eval/record-builder.js\ndist/eval/record-builder.js.map\ndist/eval/records.d.ts\ndist/eval/records.d.ts.map\ndist/eval/records.js\ndist/eval/records.js.map\ndist/eval/release-decision.d.ts\ndist/eval/release-decision.d.ts.map\ndist/eval/release-decision.js\ndist/eval/release-decision.js.map\ndist/eval/release-markers.d.ts\ndist/eval/release-markers.d.ts.map\ndist/eval/release-markers.js\ndist/eval/release-markers.js.map\ndist/eval/runner.d.ts\ndist/eval/runner.d.ts.map\ndist/eval/runner.js\ndist/eval/runner.js.map\ndist/eval/types.d.ts\ndist/eval/types.d.ts.map\ndist/eval/types.js\ndist/eval/types.js.map\ndist/index.d.ts\ndist/index.d.ts.map\ndist/index.js\ndist/index.js.map\ndist/installed-package-version.d.ts\ndist/installed-package-version.d.ts.map\ndist/installed-package-version.js\ndist/installed-package-version.js.map\ndist/ports/clock.d.ts\ndist/ports/clock.d.ts.map\ndist/ports/clock.js\ndist/ports/clock.js.map\ndist/ports/connection-lifecycle.d.ts\ndist/ports/connection-lifecycle.d.ts.map\ndist/ports/connection-lifecycle.js\ndist/ports/connection-lifecycle.js.map\ndist/ports/credentials.d.ts\ndist/ports/credentials.d.ts.map\ndist/ports/credentials.js\ndist/ports/credentials.js.map\ndist/ports/effect-storage.d.ts\ndist/ports/effect-storage.d.ts.map\ndist/ports/effect-storage.js\ndist/ports/effect-storage.js.map\ndist/ports/execution.d.ts\ndist/ports/execution.d.ts.map\ndist/ports/execution.js\ndist/ports/execution.js.map\ndist/ports/ids.d.ts\ndist/ports/ids.d.ts.map\ndist/ports/ids.js\ndist/ports/ids.js.map\ndist/ports/native-interactive-execution.d.ts\ndist/ports/native-interactive-execution.d.ts.map\ndist/ports/native-interactive-execution.js\ndist/ports/native-interactive-execution.js.map\ndist/ports/native-terminal-transport.d.ts\ndist/ports/native-terminal-transport.d.ts.map\ndist/ports/native-terminal-transport.js\ndist/ports/native-terminal-transport.js.map\ndist/ports/storage.d.ts\ndist/ports/storage.d.ts.map\ndist/ports/storage.js\ndist/ports/storage.js.map\ndist/startup/chunks/analysis-comparison-facts-IOBARSYV.js\ndist/startup/chunks/analysis-comparison-facts-IOBARSYV.js.map\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js.map\ndist/startup/chunks/chunk-2B6P3EZQ.js\ndist/startup/chunks/chunk-2B6P3EZQ.js.map\ndist/startup/chunks/chunk-2LMYRCIG.js\ndist/startup/chunks/chunk-2LMYRCIG.js.map\ndist/startup/chunks/chunk-3SLVNOQZ.js\ndist/startup/chunks/chunk-3SLVNOQZ.js.map\ndist/startup/chunks/chunk-4GTWJJDM.js\ndist/startup/chunks/chunk-4GTWJJDM.js.map\ndist/startup/chunks/chunk-5DZCAB7D.js\ndist/startup/chunks/chunk-5DZCAB7D.js.map\ndist/startup/chunks/chunk-5PAWXR2Q.js\ndist/startup/chunks/chunk-5PAWXR2Q.js.map\ndist/startup/chunks/chunk-6G7QKB6J.js\ndist/startup/chunks/chunk-6G7QKB6J.js.map\ndist/startup/chunks/chunk-AUQCJYW5.js\ndist/startup/chunks/chunk-AUQCJYW5.js.map\ndist/startup/chunks/chunk-AW7EVAP4.js\ndist/startup/chunks/chunk-AW7EVAP4.js.map\ndist/startup/chunks/chunk-BG5Y2J53.js\ndist/startup/chunks/chunk-BG5Y2J53.js.map\ndist/startup/chunks/chunk-CS5FUFHS.js\ndist/startup/chunks/chunk-CS5FUFHS.js.map\ndist/startup/chunks/chunk-DLR6FLQV.js\ndist/startup/chunks/chunk-DLR6FLQV.js.map\ndist/startup/chunks/chunk-GAAK54Z5.js\ndist/startup/chunks/chunk-GAAK54Z5.js.map\ndist/startup/chunks/chunk-HJIA4IFJ.js\ndist/startup/chunks/chunk-HJIA4IFJ.js.map\ndist/startup/chunks/chunk-J3SNVD3E.js\ndist/startup/chunks/chunk-J3SNVD3E.js.map\ndist/startup/chunks/chunk-J4OIG5BQ.js\ndist/startup/chunks/chunk-J4OIG5BQ.js.map\ndist/startup/chunks/chunk-MY6OJCTQ.js\ndist/startup/chunks/chunk-MY6OJCTQ.js.map\ndist/startup/chunks/chunk-O6K46SFN.js\ndist/startup/chunks/chunk-O6K46SFN.js.map\ndist/startup/chunks/chunk-ONLHSYEO.js\ndist/startup/chunks/chunk-ONLHSYEO.js.map\ndist/startup/chunks/chunk-PAPTIOCL.js\ndist/startup/chunks/chunk-PAPTIOCL.js.map\ndist/startup/chunks/chunk-PEOEX5QP.js\ndist/startup/chunks/chunk-PEOEX5QP.js.map\ndist/startup/chunks/chunk-PXRVFPRL.js\ndist/startup/chunks/chunk-PXRVFPRL.js.map\ndist/startup/chunks/chunk-QBLXCLCU.js\ndist/startup/chunks/chunk-QBLXCLCU.js.map\ndist/startup/chunks/chunk-STK3FQ4H.js\ndist/startup/chunks/chunk-STK3FQ4H.js.map\ndist/startup/chunks/chunk-TUHBQUZU.js\ndist/startup/chunks/chunk-TUHBQUZU.js.map\ndist/startup/chunks/chunk-TYQ67ZUK.js\ndist/startup/chunks/chunk-TYQ67ZUK.js.map\ndist/startup/chunks/chunk-UTHORCP6.js\ndist/startup/chunks/chunk-UTHORCP6.js.map\ndist/startup/chunks/chunk-V7LWVMBP.js\ndist/startup/chunks/chunk-V7LWVMBP.js.map\ndist/startup/chunks/chunk-V7ZXNCA7.js\ndist/startup/chunks/chunk-V7ZXNCA7.js.map\ndist/startup/chunks/chunk-VPNFJK5P.js\ndist/startup/chunks/chunk-VPNFJK5P.js.map\ndist/startup/chunks/chunk-VRWZ5M2N.js\ndist/startup/chunks/chunk-VRWZ5M2N.js.map\ndist/startup/chunks/chunk-VTNLVERY.js\ndist/startup/chunks/chunk-VTNLVERY.js.map\ndist/startup/chunks/chunk-XQHJBQV6.js\ndist/startup/chunks/chunk-XQHJBQV6.js.map\ndist/startup/chunks/chunk-Z2S4GNUU.js\ndist/startup/chunks/chunk-Z2S4GNUU.js.map\ndist/startup/chunks/chunk-ZFNRSBQG.js\ndist/startup/chunks/chunk-ZFNRSBQG.js.map\ndist/startup/chunks/chunk-ZM4JCKGK.js\ndist/startup/chunks/chunk-ZM4JCKGK.js.map\ndist/startup/chunks/chunk-ZW6RVXC2.js\ndist/startup/chunks/chunk-ZW6RVXC2.js.map\ndist/startup/chunks/configuration-wizard-CDE3TSVK.js\ndist/startup/chunks/configuration-wizard-CDE3TSVK.js.map\ndist/startup/chunks/production-composition-NJF25AMK.js\ndist/startup/chunks/production-composition-NJF25AMK.js.map\ndist/startup/chunks/production-connection-providers-4ZGCO4CP.js\ndist/startup/chunks/production-connection-providers-4ZGCO4CP.js.map\ndist/startup/chunks/production-connections-6PC7MQEH.js\ndist/startup/chunks/production-connections-6PC7MQEH.js.map\ndist/startup/chunks/profile-connection-dispatch-KOESUM2H.js\ndist/startup/chunks/profile-connection-dispatch-KOESUM2H.js.map\ndist/startup/chunks/supervisor-control-F4IMJYTH.js\ndist/startup/chunks/supervisor-control-F4IMJYTH.js.map\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js.map\ndist/startup/chunks/trace-store-3NMWKT6T.js\ndist/startup/chunks/trace-store-3NMWKT6T.js.map\ndist/startup/chunks/ui-dispatch-ABDBUPTD.js\ndist/startup/chunks/ui-dispatch-ABDBUPTD.js.map\ndist/startup/durable-runtime.d.ts\ndist/startup/durable-runtime.d.ts.map\ndist/startup/durable-runtime.js\ndist/startup/durable-runtime.js.map\ndist/startup/preview-runtime.d.ts\ndist/startup/preview-runtime.d.ts.map\ndist/startup/preview-runtime.js\ndist/startup/preview-runtime.js.map\ndist/startup/terminal-runtime.d.ts\ndist/startup/terminal-runtime.d.ts.map\ndist/startup/terminal-runtime.js\ndist/startup/terminal-runtime.js.map\ndist/startup/terminal-signal-latch.d.ts\ndist/startup/terminal-signal-latch.d.ts.map\ndist/startup/terminal-signal-latch.js\ndist/startup/terminal-signal-latch.js.map\ndist/testing/deterministic-backend.d.ts\ndist/testing/deterministic-backend.d.ts.map\ndist/testing/deterministic-backend.js\ndist/testing/deterministic-backend.js.map\ndist/testing/product-demo-fixture.d.ts\ndist/testing/product-demo-fixture.d.ts.map\ndist/testing/product-demo-fixture.js\ndist/testing/product-demo-fixture.js.map\ndist/testing/runtime-contract-fixtures.d.ts\ndist/testing/runtime-contract-fixtures.d.ts.map\ndist/testing/runtime-contract-fixtures.js\ndist/testing/runtime-contract-fixtures.js.map\ndist/testing/supervision-fixture.d.ts\ndist/testing/supervision-fixture.d.ts.map\ndist/testing/supervision-fixture.js\ndist/testing/supervision-fixture.js.map\ndist/testing/supervision-ui-fixture.d.ts\ndist/testing/supervision-ui-fixture.d.ts.map\ndist/testing/supervision-ui-fixture.js\ndist/testing/supervision-ui-fixture.js.map\ndist/version.d.ts\ndist/version.d.ts.map\ndist/version.js\ndist/version.js.map\ndist/views/headless/bounded-output.d.ts\ndist/views/headless/bounded-output.d.ts.map\ndist/views/headless/bounded-output.js\ndist/views/headless/bounded-output.js.map\ndist/views/headless/protocol-limits.d.ts\ndist/views/headless/protocol-limits.d.ts.map\ndist/views/headless/protocol-limits.js\ndist/views/headless/protocol-limits.js.map\ndist/views/headless/protocol.d.ts\ndist/views/headless/protocol.d.ts.map\ndist/views/headless/protocol.js\ndist/views/headless/protocol.js.map\ndist/views/headless/rpc-automation-commands.d.ts\ndist/views/headless/rpc-automation-commands.d.ts.map\ndist/views/headless/rpc-automation-commands.js\ndist/views/headless/rpc-automation-commands.js.map\ndist/views/headless/rpc-errors.d.ts\ndist/views/headless/rpc-errors.d.ts.map\ndist/views/headless/rpc-errors.js\ndist/views/headless/rpc-errors.js.map\ndist/views/headless/rpc-interaction-commands.d.ts\ndist/views/headless/rpc-interaction-commands.d.ts.map\ndist/views/headless/rpc-interaction-commands.js\ndist/views/headless/rpc-interaction-commands.js.map\ndist/views/headless/rpc-parser.d.ts\ndist/views/headless/rpc-parser.d.ts.map\ndist/views/headless/rpc-parser.js\ndist/views/headless/rpc-parser.js.map\ndist/views/headless/rpc-types.d.ts\ndist/views/headless/rpc-types.d.ts.map\ndist/views/headless/rpc-types.js\ndist/views/headless/rpc-types.js.map\ndist/views/headless/rpc.d.ts\ndist/views/headless/rpc.d.ts.map\ndist/views/headless/rpc.js\ndist/views/headless/rpc.js.map\ndist/views/shared/analysis-model-call-presentation.d.ts\ndist/views/shared/analysis-model-call-presentation.d.ts.map\ndist/views/shared/analysis-model-call-presentation.js\ndist/views/shared/analysis-model-call-presentation.js.map\ndist/views/shared/analysis-presentation.d.ts\ndist/views/shared/analysis-presentation.d.ts.map\ndist/views/shared/analysis-presentation.js\ndist/views/shared/analysis-presentation.js.map\ndist/views/shared/appearance.d.ts\ndist/views/shared/appearance.d.ts.map\ndist/views/shared/appearance.js\ndist/views/shared/appearance.js.map\ndist/views/shared/canonical.d.ts\ndist/views/shared/canonical.d.ts.map\ndist/views/shared/canonical.js\ndist/views/shared/canonical.js.map\ndist/views/shared/command-registry.d.ts\ndist/views/shared/command-registry.d.ts.map\ndist/views/shared/command-registry.js\ndist/views/shared/command-registry.js.map\ndist/views/shared/command-table.d.ts\ndist/views/shared/command-table.d.ts.map\ndist/views/shared/command-table.js\ndist/views/shared/command-table.js.map\ndist/views/shared/comparison-presentation.d.ts\ndist/views/shared/comparison-presentation.d.ts.map\ndist/views/shared/comparison-presentation.js\ndist/views/shared/comparison-presentation.js.map\ndist/views/shared/connection-lifecycle.d.ts\ndist/views/shared/connection-lifecycle.d.ts.map\ndist/views/shared/connection-lifecycle.js\ndist/views/shared/connection-lifecycle.js.map\ndist/views/shared/duration.d.ts\ndist/views/shared/duration.d.ts.map\ndist/views/shared/duration.js\ndist/views/shared/duration.js.map\ndist/views/shared/environment-presentation.d.ts\ndist/views/shared/environment-presentation.d.ts.map\ndist/views/shared/environment-presentation.js\ndist/views/shared/environment-presentation.js.map\ndist/views/shared/headless-commands.d.ts\ndist/views/shared/headless-commands.d.ts.map\ndist/views/shared/headless-commands.js\ndist/views/shared/headless-commands.js.map\ndist/views/shared/intents.d.ts\ndist/views/shared/intents.d.ts.map\ndist/views/shared/intents.js\ndist/views/shared/intents.js.map\ndist/views/shared/models.d.ts\ndist/views/shared/models.d.ts.map\ndist/views/shared/models.js\ndist/views/shared/models.js.map\ndist/views/shared/native-interactive-actions.d.ts\ndist/views/shared/native-interactive-actions.d.ts.map\ndist/views/shared/native-interactive-actions.js\ndist/views/shared/native-interactive-actions.js.map\ndist/views/shared/plain-accessibility.d.ts\ndist/views/shared/plain-accessibility.d.ts.map\ndist/views/shared/plain-accessibility.js\ndist/views/shared/plain-accessibility.js.map\ndist/views/shared/sanitize.d.ts\ndist/views/shared/sanitize.d.ts.map\ndist/views/shared/sanitize.js\ndist/views/shared/sanitize.js.map\ndist/views/shared/semantic-activity-limit.d.ts\ndist/views/shared/semantic-activity-limit.d.ts.map\ndist/views/shared/semantic-activity-limit.js\ndist/views/shared/semantic-activity-limit.js.map\ndist/views/shared/semantic-activity.d.ts\ndist/views/shared/semantic-activity.d.ts.map\ndist/views/shared/semantic-activity.js\ndist/views/shared/semantic-activity.js.map\ndist/views/shared/semantic-details.d.ts\ndist/views/shared/semantic-details.d.ts.map\ndist/views/shared/semantic-details.js\ndist/views/shared/semantic-details.js.map\ndist/views/shared/semantic-graph-edges.d.ts\ndist/views/shared/semantic-graph-edges.d.ts.map\ndist/views/shared/semantic-graph-edges.js\ndist/views/shared/semantic-graph-edges.js.map\ndist/views/shared/semantic-graph-filters.d.ts\ndist/views/shared/semantic-graph-filters.d.ts.map\ndist/views/shared/semantic-graph-filters.js\ndist/views/shared/semantic-graph-filters.js.map\ndist/views/shared/semantic-graph-nodes.d.ts\ndist/views/shared/semantic-graph-nodes.d.ts.map\ndist/views/shared/semantic-graph-nodes.js\ndist/views/shared/semantic-graph-nodes.js.map\ndist/views/shared/semantic-graph.d.ts\ndist/views/shared/semantic-graph.d.ts.map\ndist/views/shared/semantic-graph.js\ndist/views/shared/semantic-graph.js.map\ndist/views/shared/semantic-projection.d.ts\ndist/views/shared/semantic-projection.d.ts.map\ndist/views/shared/semantic-projection.js\ndist/views/shared/semantic-projection.js.map\ndist/views/shared/semantic-query-scope.d.ts\ndist/views/shared/semantic-query-scope.d.ts.map\ndist/views/shared/semantic-query-scope.js\ndist/views/shared/semantic-query-scope.js.map\ndist/views/shared/semantic-query-types.d.ts\ndist/views/shared/semantic-query-types.d.ts.map\ndist/views/shared/semantic-query-types.js\ndist/views/shared/semantic-query-types.js.map\ndist/views/shared/usage-projection.d.ts\ndist/views/shared/usage-projection.d.ts.map\ndist/views/shared/usage-projection.js\ndist/views/shared/usage-projection.js.map\ndist/views/tui/activity-browser.d.ts\ndist/views/tui/activity-browser.d.ts.map\ndist/views/tui/activity-browser.js\ndist/views/tui/activity-browser.js.map\ndist/views/tui/activity-document.d.ts\ndist/views/tui/activity-document.d.ts.map\ndist/views/tui/activity-document.js\ndist/views/tui/activity-document.js.map\ndist/views/tui/activity.d.ts\ndist/views/tui/activity.d.ts.map\ndist/views/tui/activity.js\ndist/views/tui/activity.js.map\ndist/views/tui/analysis.d.ts\ndist/views/tui/analysis.d.ts.map\ndist/views/tui/analysis.js\ndist/views/tui/analysis.js.map\ndist/views/tui/autocomplete-guard.d.ts\ndist/views/tui/autocomplete-guard.d.ts.map\ndist/views/tui/autocomplete-guard.js\ndist/views/tui/autocomplete-guard.js.map\ndist/views/tui/automation-overlay-workflow.d.ts\ndist/views/tui/automation-overlay-workflow.d.ts.map\ndist/views/tui/automation-overlay-workflow.js\ndist/views/tui/automation-overlay-workflow.js.map\ndist/views/tui/automation-rule-panel.d.ts\ndist/views/tui/automation-rule-panel.d.ts.map\ndist/views/tui/automation-rule-panel.js\ndist/views/tui/automation-rule-panel.js.map\ndist/views/tui/automation-rule-presentation.d.ts\ndist/views/tui/automation-rule-presentation.d.ts.map\ndist/views/tui/automation-rule-presentation.js\ndist/views/tui/automation-rule-presentation.js.map\ndist/views/tui/automation-rule-response-editor.d.ts\ndist/views/tui/automation-rule-response-editor.d.ts.map\ndist/views/tui/automation-rule-response-editor.js\ndist/views/tui/automation-rule-response-editor.js.map\ndist/views/tui/command-palette.d.ts\ndist/views/tui/command-palette.d.ts.map\ndist/views/tui/command-palette.js\ndist/views/tui/command-palette.js.map\ndist/views/tui/comparison.d.ts\ndist/views/tui/comparison.d.ts.map\ndist/views/tui/comparison.js\ndist/views/tui/comparison.js.map\ndist/views/tui/composer-view.d.ts\ndist/views/tui/composer-view.d.ts.map\ndist/views/tui/composer-view.js\ndist/views/tui/composer-view.js.map\ndist/views/tui/configuration-credential.d.ts\ndist/views/tui/configuration-credential.d.ts.map\ndist/views/tui/configuration-credential.js\ndist/views/tui/configuration-credential.js.map\ndist/views/tui/configuration-presenters.d.ts\ndist/views/tui/configuration-presenters.d.ts.map\ndist/views/tui/configuration-presenters.js\ndist/views/tui/configuration-presenters.js.map\ndist/views/tui/configuration-responsive-text.d.ts\ndist/views/tui/configuration-responsive-text.d.ts.map\ndist/views/tui/configuration-responsive-text.js\ndist/views/tui/configuration-responsive-text.js.map\ndist/views/tui/configuration-review.d.ts\ndist/views/tui/configuration-review.d.ts.map\ndist/views/tui/configuration-review.js\ndist/views/tui/configuration-review.js.map\ndist/views/tui/configuration-wizard-presentation.d.ts\ndist/views/tui/configuration-wizard-presentation.d.ts.map\ndist/views/tui/configuration-wizard-presentation.js\ndist/views/tui/configuration-wizard-presentation.js.map\ndist/views/tui/configuration-wizard.d.ts\ndist/views/tui/configuration-wizard.d.ts.map\ndist/views/tui/configuration-wizard.js\ndist/views/tui/configuration-wizard.js.map\ndist/views/tui/connection-metadata-editor-actions.d.ts\ndist/views/tui/connection-metadata-editor-actions.d.ts.map\ndist/views/tui/connection-metadata-editor-actions.js\ndist/views/tui/connection-metadata-editor-actions.js.map\ndist/views/tui/connection-metadata-editor-inputs.d.ts\ndist/views/tui/connection-metadata-editor-inputs.d.ts.map\ndist/views/tui/connection-metadata-editor-inputs.js\ndist/views/tui/connection-metadata-editor-inputs.js.map\ndist/views/tui/connection-metadata-editor-model.d.ts\ndist/views/tui/connection-metadata-editor-model.d.ts.map\ndist/views/tui/connection-metadata-editor-model.js\ndist/views/tui/connection-metadata-editor-model.js.map\ndist/views/tui/connection-metadata-editor-presentation.d.ts\ndist/views/tui/connection-metadata-editor-presentation.d.ts.map\ndist/views/tui/connection-metadata-editor-presentation.js\ndist/views/tui/connection-metadata-editor-presentation.js.map\ndist/views/tui/connection-metadata-editor-rendering.d.ts\ndist/views/tui/connection-metadata-editor-rendering.d.ts.map\ndist/views/tui/connection-metadata-editor-rendering.js\ndist/views/tui/connection-metadata-editor-rendering.js.map\ndist/views/tui/connection-metadata-editor.d.ts\ndist/views/tui/connection-metadata-editor.d.ts.map\ndist/views/tui/connection-metadata-editor.js\ndist/views/tui/connection-metadata-editor.js.map\ndist/views/tui/connection-overlay-workflow.d.ts\ndist/views/tui/connection-overlay-workflow.d.ts.map\ndist/views/tui/connection-overlay-workflow.js\ndist/views/tui/connection-overlay-workflow.js.map\ndist/views/tui/connection-setup-actions.d.ts\ndist/views/tui/connection-setup-actions.d.ts.map\ndist/views/tui/connection-setup-actions.js\ndist/views/tui/connection-setup-actions.js.map\ndist/views/tui/connection-setup-rendering.d.ts\ndist/views/tui/connection-setup-rendering.d.ts.map\ndist/views/tui/connection-setup-rendering.js\ndist/views/tui/connection-setup-rendering.js.map\ndist/views/tui/connection-setup.d.ts\ndist/views/tui/connection-setup.d.ts.map\ndist/views/tui/connection-setup.js\ndist/views/tui/connection-setup.js.map\ndist/views/tui/conversation-dialogs.d.ts\ndist/views/tui/conversation-dialogs.d.ts.map\ndist/views/tui/conversation-dialogs.js\ndist/views/tui/conversation-dialogs.js.map\ndist/views/tui/conversation-overlay-actions.d.ts\ndist/views/tui/conversation-overlay-actions.d.ts.map\ndist/views/tui/conversation-overlay-actions.js\ndist/views/tui/conversation-overlay-actions.js.map\ndist/views/tui/conversation-overlay-helpers.d.ts\ndist/views/tui/conversation-overlay-helpers.d.ts.map\ndist/views/tui/conversation-overlay-helpers.js\ndist/views/tui/conversation-overlay-helpers.js.map\ndist/views/tui/conversation-overlays.d.ts\ndist/views/tui/conversation-overlays.d.ts.map\ndist/views/tui/conversation-overlays.js\ndist/views/tui/conversation-overlays.js.map\ndist/views/tui/details.d.ts\ndist/views/tui/details.d.ts.map\ndist/views/tui/details.js\ndist/views/tui/details.js.map\ndist/views/tui/dynamic-autocomplete.d.ts\ndist/views/tui/dynamic-autocomplete.d.ts.map\ndist/views/tui/dynamic-autocomplete.js\ndist/views/tui/dynamic-autocomplete.js.map\ndist/views/tui/entity-browser-layout.d.ts\ndist/views/tui/entity-browser-layout.d.ts.map\ndist/views/tui/entity-browser-layout.js\ndist/views/tui/entity-browser-layout.js.map\ndist/views/tui/entity-browser.d.ts\ndist/views/tui/entity-browser.d.ts.map\ndist/views/tui/entity-browser.js\ndist/views/tui/entity-browser.js.map\ndist/views/tui/execution-target.d.ts\ndist/views/tui/execution-target.d.ts.map\ndist/views/tui/execution-target.js\ndist/views/tui/execution-target.js.map\ndist/views/tui/focused-surface.d.ts\ndist/views/tui/focused-surface.d.ts.map\ndist/views/tui/focused-surface.js\ndist/views/tui/focused-surface.js.map\ndist/views/tui/fork-preview.d.ts\ndist/views/tui/fork-preview.d.ts.map\ndist/views/tui/fork-preview.js\ndist/views/tui/fork-preview.js.map\ndist/views/tui/graph.d.ts\ndist/views/tui/graph.d.ts.map\ndist/views/tui/graph.js\ndist/views/tui/graph.js.map\ndist/views/tui/help.d.ts\ndist/views/tui/help.d.ts.map\ndist/views/tui/help.js\ndist/views/tui/help.js.map\ndist/views/tui/interaction-automation-response.d.ts\ndist/views/tui/interaction-automation-response.d.ts.map\ndist/views/tui/interaction-automation-response.js\ndist/views/tui/interaction-automation-response.js.map\ndist/views/tui/interaction-decisions.d.ts\ndist/views/tui/interaction-decisions.d.ts.map\ndist/views/tui/interaction-decisions.js\ndist/views/tui/interaction-decisions.js.map\ndist/views/tui/interaction-input-response.d.ts\ndist/views/tui/interaction-input-response.d.ts.map\ndist/views/tui/interaction-input-response.js\ndist/views/tui/interaction-input-response.js.map\ndist/views/tui/interaction-presentation.d.ts\ndist/views/tui/interaction-presentation.d.ts.map\ndist/views/tui/interaction-presentation.js\ndist/views/tui/interaction-presentation.js.map\ndist/views/tui/interaction.d.ts\ndist/views/tui/interaction.d.ts.map\ndist/views/tui/interaction.js\ndist/views/tui/interaction.js.map\ndist/views/tui/keyboard.d.ts\ndist/views/tui/keyboard.d.ts.map\ndist/views/tui/keyboard.js\ndist/views/tui/keyboard.js.map\ndist/views/tui/layout.d.ts\ndist/views/tui/layout.d.ts.map\ndist/views/tui/layout.js\ndist/views/tui/layout.js.map\ndist/views/tui/measurement-display.d.ts\ndist/views/tui/measurement-display.d.ts.map\ndist/views/tui/measurement-display.js\ndist/views/tui/measurement-display.js.map\ndist/views/tui/modal-coordinator.d.ts\ndist/views/tui/modal-coordinator.d.ts.map\ndist/views/tui/modal-coordinator.js\ndist/views/tui/modal-coordinator.js.map\ndist/views/tui/profile-compatibility.d.ts\ndist/views/tui/profile-compatibility.d.ts.map\ndist/views/tui/profile-compatibility.js\ndist/views/tui/profile-compatibility.js.map\ndist/views/tui/profile-editor-actions.d.ts\ndist/views/tui/profile-editor-actions.d.ts.map\ndist/views/tui/profile-editor-actions.js\ndist/views/tui/profile-editor-actions.js.map\ndist/views/tui/profile-editor-rendering.d.ts\ndist/views/tui/profile-editor-rendering.d.ts.map\ndist/views/tui/profile-editor-rendering.js\ndist/views/tui/profile-editor-rendering.js.map\ndist/views/tui/profile-editor.d.ts\ndist/views/tui/profile-editor.d.ts.map\ndist/views/tui/profile-editor.js\ndist/views/tui/profile-editor.js.map\ndist/views/tui/safe-markdown.d.ts\ndist/views/tui/safe-markdown.d.ts.map\ndist/views/tui/safe-markdown.js\ndist/views/tui/safe-markdown.js.map\ndist/views/tui/secret-input.d.ts\ndist/views/tui/secret-input.d.ts.map\ndist/views/tui/secret-input.js\ndist/views/tui/secret-input.js.map\ndist/views/tui/selector.d.ts\ndist/views/tui/selector.d.ts.map\ndist/views/tui/selector.js\ndist/views/tui/selector.js.map\ndist/views/tui/supervisor-actions.d.ts\ndist/views/tui/supervisor-actions.d.ts.map\ndist/views/tui/supervisor-actions.js\ndist/views/tui/supervisor-actions.js.map\ndist/views/tui/terminal-app.d.ts\ndist/views/tui/terminal-app.d.ts.map\ndist/views/tui/terminal-app.js\ndist/views/tui/terminal-app.js.map\ndist/views/tui/terminal-chrome.d.ts\ndist/views/tui/terminal-chrome.d.ts.map\ndist/views/tui/terminal-chrome.js\ndist/views/tui/terminal-chrome.js.map\ndist/views/tui/terminal-command-controller.d.ts\ndist/views/tui/terminal-command-controller.d.ts.map\ndist/views/tui/terminal-command-controller.js\ndist/views/tui/terminal-command-controller.js.map\ndist/views/tui/terminal-compatibility.d.ts\ndist/views/tui/terminal-compatibility.d.ts.map\ndist/views/tui/terminal-compatibility.js\ndist/views/tui/terminal-compatibility.js.map\ndist/views/tui/terminal-drafts.d.ts\ndist/views/tui/terminal-drafts.d.ts.map\ndist/views/tui/terminal-drafts.js\ndist/views/tui/terminal-drafts.js.map\ndist/views/tui/terminal-identity.d.ts\ndist/views/tui/terminal-identity.d.ts.map\ndist/views/tui/terminal-identity.js\ndist/views/tui/terminal-identity.js.map\ndist/views/tui/terminal-input-controller.d.ts\ndist/views/tui/terminal-input-controller.d.ts.map\ndist/views/tui/terminal-input-controller.js\ndist/views/tui/terminal-input-controller.js.map\ndist/views/tui/terminal-interaction-controller.d.ts\ndist/views/tui/terminal-interaction-controller.d.ts.map\ndist/views/tui/terminal-interaction-controller.js\ndist/views/tui/terminal-interaction-controller.js.map\ndist/views/tui/terminal-overlays.d.ts\ndist/views/tui/terminal-overlays.d.ts.map\ndist/views/tui/terminal-overlays.js\ndist/views/tui/terminal-overlays.js.map\ndist/views/tui/terminal-shell.d.ts\ndist/views/tui/terminal-shell.d.ts.map\ndist/views/tui/terminal-shell.js\ndist/views/tui/terminal-shell.js.map\ndist/views/tui/terminal-surface-overlays.d.ts\ndist/views/tui/terminal-surface-overlays.d.ts.map\ndist/views/tui/terminal-surface-overlays.js\ndist/views/tui/terminal-surface-overlays.js.map\ndist/views/tui/terminal-usage.d.ts\ndist/views/tui/terminal-usage.d.ts.map\ndist/views/tui/terminal-usage.js\ndist/views/tui/terminal-usage.js.map\ndist/views/tui/theme.d.ts\ndist/views/tui/theme.d.ts.map\ndist/views/tui/theme.js\ndist/views/tui/theme.js.map\ndist/views/tui/transcript.d.ts\ndist/views/tui/transcript.d.ts.map\ndist/views/tui/transcript.js\ndist/views/tui/transcript.js.map\nLICENSE\npackage.json\nREADME.md\nTHIRD_PARTY_LICENSES.json\nTHIRD_PARTY_NOTICES.md\n\u001b[94mTarball Details\u001b[39m\n/tmp/braid-live-pack-mIMgBK/tangle-network-braid-0.3.0.tgz\n", + "stderr": "", + "durationMs": 1167, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "install": { + "command": "npm", + "args": [ + "install", + "--no-audit", + "--no-fund", + "/tmp/braid-live-pack-mIMgBK/tangle-network-braid-0.3.0.tgz" + ], + "code": 0, + "signal": null, + "stdout": "\nadded 68 packages in 8s\n", + "stderr": "npm warn deprecated koffi@3.1.4: Unstable Windows builds\nnpm warn allow-scripts 2 packages have install scripts not yet covered by allowScripts:\nnpm warn allow-scripts @dataiku/uv@0.12.0 (postinstall: node install.cjs)\nnpm warn allow-scripts koffi@3.1.4 (install: node ./cnoke.cjs -P . -D src/koffi --prebuild --release)\nnpm warn allow-scripts\nnpm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts ` to allow.\n", + "durationMs": 7673, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "version": { + "command": "/home/drew/.nvm/versions/node/v24.18.0/bin/node", + "args": [ + "/tmp/braid-live-install-MpZxkH/node_modules/@tangle-network/braid/dist/bin/braid.js", + "--version" + ], + "code": 0, + "signal": null, + "stdout": "0.3.0\n", + "stderr": "", + "durationMs": 90, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "artifact": { + "tarball": "tangle-network-braid-0.3.0.tgz", + "sha256": "47602edb3f5f2226dd82d61d78d87018fa9b0e9acb37681cb439f99dae042721", + "binary": "node_modules/@tangle-network/braid/dist/bin/braid.js" + }, + "operation": { + "operationNamespace": "3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5", + "label": "Pi with Tangle Router DeepSeek V4 Flash", + "target": "pi/tangle-router/deepseek-v4-flash", + "profile": { + "path": ".braid/profiles/profile-pi-tangle-router-deepseek-v4-flash.json", + "harness": "pi", + "model": "deepseek-v4-flash", + "provider": "tangle-router" + }, + "connection": { + "id": "connection-live-cli-bridge", + "kind": "cli-bridge", + "endpoint": "http://127.0.0.1:3482", + "credentialConfigured": false + }, + "providerCapabilities": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": true + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "requests": [ + { + "version": 1, + "requestId": "interactive-protocol-init-pi-tangle-router-deepseek-v4-flash", + "command": "initialize", + "params": { + "workspace": "/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash", + "subscribe": true + } + }, + { + "version": 1, + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK." + } + }, + { + "version": 1, + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-state-active-pi-tangle-router-deepseek-v4-flash", + "command": "get_state", + "params": { + "projection": "full" + } + }, + { + "version": 1, + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash", + "command": "respond_interaction", + "params": { + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "interactionId": "interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2", + "response": { + "id": "interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2", + "outcome": "declined" + } + } + }, + { + "version": 1, + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-duplicate-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-duplicate-pi-tangle-router-deepseek-v4-flash", + "command": "respond_interaction", + "params": { + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "interactionId": "interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2", + "response": { + "id": "interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2", + "outcome": "declined" + } + } + }, + { + "version": 1, + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-state-post-response-pi-tangle-router-deepseek-v4-flash", + "command": "get_state", + "params": { + "projection": "full" + } + }, + { + "version": 1, + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "params": { + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "reason": "live interactive proof completed" + } + }, + { + "version": 1, + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-state-poll-0-pi-tangle-router-deepseek-v4-flash", + "command": "get_state", + "params": { + "projection": "full" + } + }, + { + "version": 1, + "requestId": "interactive-protocol-final-state-pi-tangle-router-deepseek-v4-flash", + "command": "get_state", + "params": { + "projection": "full" + } + }, + { + "version": 1, + "requestId": "interactive-protocol-shutdown-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-interactive-protocol-shutdown-pi-tangle-router-deepseek-v4-flash", + "command": "shutdown", + "params": { + "mode": "wait" + } + } + ], + "operation": "cli-bridge.interactive-protocol", + "credentialLifecycle": { + "configured": false, + "stored": false, + "removed": true + }, + "initialize": { + "version": 1, + "type": "ack", + "requestId": "interactive-protocol-init-pi-tangle-router-deepseek-v4-flash", + "revision": 4, + "command": "initialize" + }, + "conversationId": "conv-1", + "branchId": "branch-1", + "initialCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "targetProof": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "materializationDigest": "f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301" + }, + "runIds": [ + "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + ], + "finalState": { + "version": 1, + "type": "state", + "requestId": "interactive-protocol-final-state-pi-tangle-router-deepseek-v4-flash", + "revision": 130, + "projection": "full", + "state": { + "schemaVersion": 2, + "revision": 130, + "sequence": 130, + "workspace": "/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "updatedAt": "2026-08-29T05:41:10.698Z" + } + ], + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "runConfiguration": { + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "connectionId": "connection-live-cli-bridge", + "overrides": {} + }, + "draft": "", + "messages": [ + { + "id": "message-65eb78ac-9876-4a42-a93d-366442211c96", + "role": "user", + "text": "Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.", + "status": "complete", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "parts": [ + { + "id": "part-message-65eb78ac-9876-4a42-a93d-366442211c96", + "kind": "text", + "text": "Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK." + } + ] + }, + { + "id": "message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "parts": [ + { + "id": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning", + "kind": "reasoning", + "text": "The user is asking me to \"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"\n\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\n\nLet me inspect the workspace first.", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96" + }, + { + "id": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367", + "kind": "result", + "text": "", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102", + "toolName": "bash", + "callId": "call_00_Rgw8zii2BbEF3AJWeXmw7367", + "input": {}, + "result": { + "content": [ + "[depth-limited]" + ], + "details": {} + }, + "error": "RUNTIME_TOOL_ERROR" + } + ] + } + ], + "runs": [ + { + "id": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "turnId": "turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822", + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T05:41:10.698Z", + "updatedAt": "2026-08-29T05:41:17.262Z", + "terminalAt": "2026-08-29T05:41:17.262Z", + "durationMs": 6564, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "environmentId": "environment-a166528e64ed0873fc9d36864eabfead", + "controlRef": { + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ", + "sessionId": "session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "executionId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "requestDigest": "sha256:e96ba51a1dadab4289c3e219fd1812c5d3eef0dc6d5afd9330d08e557e6c4390" + }, + "materializationDigest": "f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301", + "cursor": "107", + "cursorCommittedSequence": 123, + "contentBytes": 1051 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-a166528e64ed0873fc9d36864eabfead", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T05:41:09.789Z", + "updatedAt": "2026-08-29T05:41:13.057Z" + } + ], + "interactions": [], + "queue": [], + "activeRunId": null, + "focusedRunId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "activeRuns": [], + "lastError": null + }, + "view": { + "revision": 130, + "workspace": "/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "runOverrides": {}, + "connection": "Live local CLI Bridge", + "conversationId": "conv-1", + "conversationTitle": "New conversation", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "active": true, + "updatedAt": "2026-08-29T05:41:10.698Z" + } + ], + "branch": "branch-1", + "status": "cancelled", + "statusText": "cancelled", + "queueCount": 0, + "queue": [], + "messages": [ + { + "id": "message-65eb78ac-9876-4a42-a93d-366442211c96", + "role": "user", + "text": "Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.", + "status": "complete", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "parts": [ + { + "id": "part-message-65eb78ac-9876-4a42-a93d-366442211c96", + "kind": "text", + "text": "Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK." + } + ] + }, + { + "id": "message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "parts": [ + { + "id": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning", + "kind": "reasoning", + "text": "The user is asking me to \"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"\n\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\n\nLet me inspect the workspace first.", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96" + }, + { + "id": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367", + "kind": "result", + "text": "", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102", + "toolName": "bash", + "callId": "call_00_Rgw8zii2BbEF3AJWeXmw7367", + "input": {}, + "result": { + "content": [ + "[depth-limited]" + ], + "details": {} + }, + "error": "RUNTIME_TOOL_ERROR" + } + ] + } + ], + "hiddenMessageCount": 0, + "runs": [ + { + "id": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "turnId": "turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash", + "status": "cancelled", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "model": "deepseek-v4-flash", + "effort": "none", + "cursor": "107", + "providerSessionId": "session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "usage": { + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "elapsedMs": 6564 + }, + "runner": "pi", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-a166528e64ed0873fc9d36864eabfead", + "completeness": "complete", + "contentBytes": 1051 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-a166528e64ed0873fc9d36864eabfead", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T05:41:09.789Z", + "updatedAt": "2026-08-29T05:41:13.057Z" + } + ], + "focusedRunId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "interactions": [], + "activity": [ + { + "id": "run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "kind": "run", + "title": "run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "status": "cancelled", + "elapsedMs": 6564, + "startedAt": "2026-08-29T05:41:10.698Z", + "occurredAt": "2026-08-29T05:41:10.698Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "environment:environment-a166528e64ed0873fc9d36864eabfead", + "kind": "environment", + "title": "cli-bridge execution", + "status": "complete", + "detail": "local-process · local · explicit", + "startedAt": "2026-08-29T05:41:09.789Z", + "occurredAt": "2026-08-29T05:41:13.057Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "environment", + "entityId": "environment-a166528e64ed0873fc9d36864eabfead" + }, + { + "id": "activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:interaction:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100:permission", + "kind": "interaction", + "title": "permission", + "status": "cancelled", + "detail": "Permission: bash", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "interaction:interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2", + "kind": "interaction", + "title": "Permission: bash", + "status": "cancelled", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "cancelled", + "detail": "profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "occurredAt": "2026-08-29T05:41:17.262Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting", + "kind": "system", + "title": "starting", + "status": "cancelled", + "occurredAt": "2026-08-29T05:41:17.262Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting", + "kind": "system", + "title": "starting", + "status": "cancelled", + "occurredAt": "2026-08-29T05:41:17.262Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "cancelled", + "occurredAt": "2026-08-29T05:41:17.262Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "cancelled", + "occurredAt": "2026-08-29T05:41:17.262Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "live interactive proof completed", + "occurredAt": "2026-08-29T05:41:17.262Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:lifecycle:local:reconnecting", + "kind": "system", + "title": "reconnecting", + "status": "cancelled", + "detail": "107", + "occurredAt": "2026-08-29T05:41:17.262Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control.ack:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "accepted", + "occurredAt": "2026-08-29T05:41:17.262Z", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 5", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 6", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 7", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 99", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 102", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 104", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 105", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 106", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + }, + { + "id": "event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106", + "kind": "system", + "title": "event model-processing", + "status": "cancelled", + "detail": "sequence 107", + "occurredAt": "2026-08-29T05:41:17.262Z", + "sourceEventId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "entityType": "run", + "entityId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + } + ], + "graph": [ + { + "id": "conv-1", + "type": "conversation", + "title": "New conversation", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-29T05:41:06.708Z" + }, + { + "id": "branch-1", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conv-1" + ], + "startedAt": "2026-08-29T05:41:06.708Z" + }, + { + "id": "environment-a166528e64ed0873fc9d36864eabfead", + "type": "environment", + "title": "cli-bridge execution", + "status": "complete", + "depth": 4, + "edgeLabel": "attached", + "parentIds": [ + "run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee" + ], + "runner": "cli-bridge", + "startedAt": "2026-08-29T05:41:09.789Z" + }, + { + "id": "turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822", + "type": "turn", + "title": "Turn", + "status": "cancelled", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T05:41:10.698Z" + }, + { + "id": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "type": "run", + "title": "Run", + "status": "cancelled", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822" + ], + "runner": "pi", + "elapsedMs": 6564, + "startedAt": "2026-08-29T05:41:10.698Z" + } + ], + "graphQuery": "", + "entityDetails": [ + { + "entityType": "environment", + "entityId": "environment-a166528e64ed0873fc9d36864eabfead", + "title": "cli-bridge execution", + "status": "ready", + "lines": [ + "provider: cli-bridge", + "execution: local-process · local", + "connection: connection-live-cli-bridge", + "lifecycle: ready · retained · cleanup explicit", + "continuity: session", + "runtime endpoint host: 127.0.0.1", + "placement: requested not specified · verified unavailable", + "machine: unavailable · physical IP is not exposed", + "created: 2026-08-29T05:41:09.789Z", + "observed: 2026-08-29T05:41:13.057Z", + "unavailable: cli-subscription-and-quota:not-exposed-by-provider", + "unavailable: effective-resources:not-exposed-by-provider", + "unavailable: machine-specs:not-exposed-by-provider", + "unavailable: runtime-cpu-memory-usage:not-exposed-by-provider" + ] + } + ], + "details": { + "title": "run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "fields": [ + { + "label": "status", + "value": "aborted" + }, + { + "label": "input tokens", + "value": "0" + }, + { + "label": "output tokens", + "value": "0" + }, + { + "label": "model", + "value": "deepseek-v4-flash" + } + ] + }, + "capabilities": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "draft": "", + "selectedSurface": "transcript", + "appearance": { + "color": "none", + "highContrast": false, + "reducedMotion": false + } + } + }, + "shutdown": { + "version": 1, + "type": "ack", + "requestId": "interactive-protocol-shutdown-pi-tangle-router-deepseek-v4-flash", + "revision": 130, + "operationId": "op-interactive-protocol-shutdown-pi-tangle-router-deepseek-v4-flash", + "command": "shutdown" + }, + "operationEvidence": { + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "interactionId": "interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2", + "interaction": { + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "interactionId": "interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2", + "request": { + "id": "interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2", + "kind": "permission", + "title": "Permission: bash", + "answerSpec": { + "fields": [ + { + "type": "select", + "name": "grant", + "label": "Decision", + "required": true, + "options": [ + { + "value": "allow_once", + "label": "Allow once" + }, + { + "value": "deny", + "label": "Deny" + } + ] + } + ] + }, + "responseScopes": [ + "interaction" + ] + } + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash", + "revision": 114, + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash", + "command": "respond_interaction", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "control": "respond_interaction", + "outcome": "accepted", + "replayed": false + }, + "staleDuplicate": { + "version": 1, + "type": "error", + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-duplicate-pi-tangle-router-deepseek-v4-flash", + "code": "INTERACTION_STALE", + "message": "The interaction is already declined", + "retryable": false + }, + "providerProgress": { + "kind": "run.provider.event", + "sequence": 117, + "revision": 117, + "providerSequence": 102, + "cursor": "101" + }, + "postResponseStatus": "streaming", + "cleanupCancel": { + "version": 1, + "type": "ack", + "requestId": "interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash", + "revision": 128, + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "terminalRun": { + "id": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "turnId": "turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822", + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T05:41:10.698Z", + "updatedAt": "2026-08-29T05:41:17.262Z", + "terminalAt": "2026-08-29T05:41:17.262Z", + "durationMs": 6564, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "environmentId": "environment-a166528e64ed0873fc9d36864eabfead", + "controlRef": { + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ", + "sessionId": "session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "executionId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "requestDigest": "sha256:e96ba51a1dadab4289c3e219fd1812c5d3eef0dc6d5afd9330d08e557e6c4390" + }, + "materializationDigest": "f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301", + "cursor": "107", + "cursorCommittedSequence": 123, + "contentBytes": 1051, + "receipt": { + "version": 1, + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "turnId": "turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822", + "operationId": "op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T05:41:10.683Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": true + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": false, + "instructions": true, + "tools": false, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "unavailable", + "workspace": "/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "42d3e92a9fdf81b4ceef9a6d480ca77c0a60b8dba499dbad56f4f29a612f4afc", + "capabilitiesDigest": "ddc6284b3633f963459e1d4573baf9f16d2db828706ec2603a7ae9d4c0771559", + "materializationDigest": "f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301", + "digest": "f46b776b7cb48b74ffe1df4390f67c91727646eaf5a3486856aec3b40c82023d" + } + }, + "interactionStatus": "declined", + "responseOutcome": "declined", + "usage": { + "terminalStatus": "aborted", + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "settled": false, + "reason": "The interactive proof cancels after provider progress" + } + }, + "operationReceipt": { + "operation": "cli-bridge.interactive-protocol", + "packed": true, + "runId": "run-3c64ec41-ec5d-4681-bf86-7280f808b3ee", + "status": "passed" + }, + "status": "passed", + "stderr": "", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"interactive-protocol-init-pi-tangle-router-deepseek-v4-flash\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"interactive-protocol-init-pi-tangle-router-deepseek-v4-flash\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:41:06.708Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:41:06.708Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:41:06.708Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":4,\"replayed\":false,\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"admission\":{\"version\":1,\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T05:41:10.683Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"model\":\"deepseek-v4-flash\",\"route\":\"pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"providerRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"42d3e92a9fdf81b4ceef9a6d480ca77c0a60b8dba499dbad56f4f29a612f4afc\",\"capabilitiesDigest\":\"ddc6284b3633f963459e1d4573baf9f16d2db828706ec2603a7ae9d4c0771559\",\"materializationDigest\":\"f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301\",\"digest\":\"f46b776b7cb48b74ffe1df4390f67c91727646eaf5a3486856aec3b40c82023d\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"admission\":{\"version\":1,\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T05:41:10.683Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"__braidTruncated\":true},\"__braidTruncated\":true},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash-2251a154c5551c7c86dda8e7\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"2251a154c5551c7c86dda8e703fc57dde3249dbcf4bf79c10eef8046748911ff\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T05:41:10.717Z\",\"updatedAt\":\"2026-08-29T05:41:10.717Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"executionId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"runId\":\"retained-intent-run:a9efc7b892eb6546e11b667ab0f04715543e9479cdc9e9a392dbebad456e4bd0\",\"requestedProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requestDigest\":\"sha256:a9efc7b892eb6546e11b667ab0f04715543e9479cdc9e9a392dbebad456e4bd0\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[]}],\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"updatedAt\":\"2026-08-29T05:41:10.698Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"materializationDigest\":\"f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"activeRuns\":[{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"running\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\"},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"kind\":\"run\",\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"running\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"occurredAt\":\"2026-08-29T05:41:10.698Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:41:10.698Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:41:10.698Z\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\"],\"runner\":\"pi\",\"startedAt\":\"2026-08-29T05:41:10.698Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect while another run is active\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile while another run is active\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-state-active-pi-tangle-router-deepseek-v4-flash\",\"revision\":8,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":8,\"sequence\":8,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[]}],\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"updatedAt\":\"2026-08-29T05:41:10.738Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"materializationDigest\":\"f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"activeRuns\":[{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":8,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"running\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\"},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"kind\":\"run\",\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"running\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"occurredAt\":\"2026-08-29T05:41:10.698Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:41:10.738Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:41:10.698Z\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\"],\"runner\":\"pi\",\"startedAt\":\"2026-08-29T05:41:10.698Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect while another run is active\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile while another run is active\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"executionId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"executionId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"requestDigest\":\"sha256:e96ba51a1dadab4289c3e219fd1812c5d3eef0dc6d5afd9330d08e557e6c4390\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T05:41:13.057Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T05:41:13.057Z\"},\"controlRef\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"executionId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"requestDigest\":\"sha256:e96ba51a1dadab4289c3e219fd1812c5d3eef0dc6d5afd9330d08e557e6c4390\"},\"provider\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T05:41:13.057Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T05:41:13.081Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T05:41:13.081Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T05:41:13.492Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T05:41:13.492Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T05:41:13.501Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"streaming\",\"provider\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T05:41:13.501Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"providerSequence\":5,\"cursor\":\"4\",\"receivedAt\":\"2026-08-29T05:41:13.509Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"providerSequence\":6,\"cursor\":\"5\",\"receivedAt\":\"2026-08-29T05:41:13.517Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"providerSequence\":7,\"cursor\":\"6\",\"receivedAt\":\"2026-08-29T05:41:15.306Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:7\",\"providerSequence\":8,\"cursor\":\"7\",\"receivedAt\":\"2026-08-29T05:41:15.559Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:7\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:8\",\"providerSequence\":9,\"cursor\":\"8\",\"receivedAt\":\"2026-08-29T05:41:15.567Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:8\"},\"delta\":\"T\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:9\",\"providerSequence\":10,\"cursor\":\"9\",\"receivedAt\":\"2026-08-29T05:41:15.609Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:9\"},\"delta\":\"he user\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:10\",\"providerSequence\":11,\"cursor\":\"10\",\"receivedAt\":\"2026-08-29T05:41:15.617Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:10\"},\"delta\":\" i\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:11\",\"providerSequence\":12,\"cursor\":\"11\",\"receivedAt\":\"2026-08-29T05:41:15.667Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:11\"},\"delta\":\"s askin\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:12\",\"providerSequence\":13,\"cursor\":\"12\",\"receivedAt\":\"2026-08-29T05:41:15.677Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:12\"},\"delta\":\"g me\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:13\",\"providerSequence\":14,\"cursor\":\"13\",\"receivedAt\":\"2026-08-29T05:41:15.685Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:13\"},\"delta\":\" \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:14\",\"providerSequence\":15,\"cursor\":\"14\",\"receivedAt\":\"2026-08-29T05:41:15.692Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:14\"},\"delta\":\"to \\\"\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:15\",\"providerSequence\":16,\"cursor\":\"15\",\"receivedAt\":\"2026-08-29T05:41:15.700Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:15\"},\"delta\":\"A\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:16\",\"providerSequence\":17,\"cursor\":\"16\",\"receivedAt\":\"2026-08-29T05:41:15.707Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:16\"},\"delta\":\"sk one\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:17\",\"providerSequence\":18,\"cursor\":\"17\",\"receivedAt\":\"2026-08-29T05:41:15.714Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:17\"},\"delta\":\" user\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:18\",\"providerSequence\":19,\"cursor\":\"18\",\"receivedAt\":\"2026-08-29T05:41:15.722Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:18\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":30,\"revision\":30,\"event\":{\"sequence\":30,\"revision\":30,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:19\",\"providerSequence\":20,\"cursor\":\"19\",\"receivedAt\":\"2026-08-29T05:41:15.729Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:19\"},\"delta\":\"visible\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":31,\"revision\":31,\"event\":{\"sequence\":31,\"revision\":31,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:20\",\"providerSequence\":21,\"cursor\":\"20\",\"receivedAt\":\"2026-08-29T05:41:15.737Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:20\"},\"delta\":\" permission\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":32,\"revision\":32,\"event\":{\"sequence\":32,\"revision\":32,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:21\",\"providerSequence\":22,\"cursor\":\"21\",\"receivedAt\":\"2026-08-29T05:41:15.744Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:21\"},\"delta\":\" question\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":33,\"revision\":33,\"event\":{\"sequence\":33,\"revision\":33,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:22\",\"providerSequence\":23,\"cursor\":\"22\",\"receivedAt\":\"2026-08-29T05:41:15.752Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:22\"},\"delta\":\" before\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":34,\"revision\":34,\"event\":{\"sequence\":34,\"revision\":34,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:23\",\"providerSequence\":24,\"cursor\":\"23\",\"receivedAt\":\"2026-08-29T05:41:15.760Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:23\"},\"delta\":\" completin\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":35,\"revision\":35,\"event\":{\"sequence\":35,\"revision\":35,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:24\",\"providerSequence\":25,\"cursor\":\"24\",\"receivedAt\":\"2026-08-29T05:41:15.767Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:24\"},\"delta\":\"g LIVE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":36,\"revision\":36,\"event\":{\"sequence\":36,\"revision\":36,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:25\",\"providerSequence\":26,\"cursor\":\"25\",\"receivedAt\":\"2026-08-29T05:41:15.775Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_B\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:25\"},\"delta\":\"_\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":37,\"revision\":37,\"event\":{\"sequence\":37,\"revision\":37,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:26\",\"providerSequence\":27,\"cursor\":\"26\",\"receivedAt\":\"2026-08-29T05:41:15.783Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRA\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:26\"},\"delta\":\"BR\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":38,\"revision\":38,\"event\":{\"sequence\":38,\"revision\":38,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:27\",\"providerSequence\":28,\"cursor\":\"27\",\"receivedAt\":\"2026-08-29T05:41:15.790Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:27\"},\"delta\":\"AID\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":39,\"revision\":39,\"event\":{\"sequence\":39,\"revision\":39,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:28\",\"providerSequence\":29,\"cursor\":\"28\",\"receivedAt\":\"2026-08-29T05:41:15.798Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_P\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:28\"},\"delta\":\"_\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":40,\"revision\":40,\"event\":{\"sequence\":40,\"revision\":40,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:29\",\"providerSequence\":30,\"cursor\":\"29\",\"receivedAt\":\"2026-08-29T05:41:15.805Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:29\"},\"delta\":\"PI\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":41,\"revision\":41,\"event\":{\"sequence\":41,\"revision\":41,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:30\",\"providerSequence\":31,\"cursor\":\"30\",\"receivedAt\":\"2026-08-29T05:41:15.813Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-T\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:30\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":42,\"revision\":42,\"event\":{\"sequence\":42,\"revision\":42,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:31\",\"providerSequence\":32,\"cursor\":\"31\",\"receivedAt\":\"2026-08-29T05:41:15.824Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANG\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:31\"},\"delta\":\"TANG\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":43,\"revision\":43,\"event\":{\"sequence\":43,\"revision\":43,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:32\",\"providerSequence\":33,\"cursor\":\"32\",\"receivedAt\":\"2026-08-29T05:41:15.831Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:32\"},\"delta\":\"LE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":44,\"revision\":44,\"event\":{\"sequence\":44,\"revision\":44,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:33\",\"providerSequence\":34,\"cursor\":\"33\",\"receivedAt\":\"2026-08-29T05:41:15.839Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:33\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":45,\"revision\":45,\"event\":{\"sequence\":45,\"revision\":45,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:34\",\"providerSequence\":35,\"cursor\":\"34\",\"receivedAt\":\"2026-08-29T05:41:15.850Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-RO\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:34\"},\"delta\":\"RO\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":46,\"revision\":46,\"event\":{\"sequence\":46,\"revision\":46,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:35\",\"providerSequence\":36,\"cursor\":\"35\",\"receivedAt\":\"2026-08-29T05:41:15.858Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUT\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:35\"},\"delta\":\"U\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":47,\"revision\":47,\"event\":{\"sequence\":47,\"revision\":47,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:36\",\"providerSequence\":37,\"cursor\":\"36\",\"receivedAt\":\"2026-08-29T05:41:15.869Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:36\"},\"delta\":\"TER\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":48,\"revision\":48,\"event\":{\"sequence\":48,\"revision\":48,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:37\",\"providerSequence\":38,\"cursor\":\"37\",\"receivedAt\":\"2026-08-29T05:41:15.877Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-D\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:37\"},\"delta\":\"-D\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":49,\"revision\":49,\"event\":{\"sequence\":49,\"revision\":49,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:38\",\"providerSequence\":39,\"cursor\":\"38\",\"receivedAt\":\"2026-08-29T05:41:15.884Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEP\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:38\"},\"delta\":\"EE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":50,\"revision\":50,\"event\":{\"sequence\":50,\"revision\":50,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:39\",\"providerSequence\":40,\"cursor\":\"39\",\"receivedAt\":\"2026-08-29T05:41:15.892Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEE\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:39\"},\"delta\":\"PSEE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":51,\"revision\":51,\"event\":{\"sequence\":51,\"revision\":51,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:40\",\"providerSequence\":41,\"cursor\":\"40\",\"receivedAt\":\"2026-08-29T05:41:15.899Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:40\"},\"delta\":\"\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":52,\"revision\":52,\"event\":{\"sequence\":52,\"revision\":52,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:41\",\"providerSequence\":42,\"cursor\":\"41\",\"receivedAt\":\"2026-08-29T05:41:15.907Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:41\"},\"delta\":\"K-V\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":53,\"revision\":53,\"event\":{\"sequence\":53,\"revision\":53,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:42\",\"providerSequence\":43,\"cursor\":\"42\",\"receivedAt\":\"2026-08-29T05:41:15.914Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:42\"},\"delta\":\"4\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":54,\"revision\":54,\"event\":{\"sequence\":54,\"revision\":54,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:43\",\"providerSequence\":44,\"cursor\":\"43\",\"receivedAt\":\"2026-08-29T05:41:15.921Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-F\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:43\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":55,\"revision\":55,\"event\":{\"sequence\":55,\"revision\":55,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:44\",\"providerSequence\":45,\"cursor\":\"44\",\"receivedAt\":\"2026-08-29T05:41:15.928Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FL\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:44\"},\"delta\":\"FL\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":56,\"revision\":56,\"event\":{\"sequence\":56,\"revision\":56,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:45\",\"providerSequence\":46,\"cursor\":\"45\",\"receivedAt\":\"2026-08-29T05:41:15.940Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:45\"},\"delta\":\"AS\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":57,\"revision\":57,\"event\":{\"sequence\":57,\"revision\":57,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:46\",\"providerSequence\":47,\"cursor\":\"46\",\"receivedAt\":\"2026-08-29T05:41:15.947Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_IN\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:46\"},\"delta\":\"H_IN\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":58,\"revision\":58,\"event\":{\"sequence\":58,\"revision\":58,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:47\",\"providerSequence\":48,\"cursor\":\"47\",\"receivedAt\":\"2026-08-29T05:41:15.954Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTER\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:47\"},\"delta\":\"TER\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":59,\"revision\":59,\"event\":{\"sequence\":59,\"revision\":59,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:48\",\"providerSequence\":49,\"cursor\":\"48\",\"receivedAt\":\"2026-08-29T05:41:15.962Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACT\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:48\"},\"delta\":\"AC\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":60,\"revision\":60,\"event\":{\"sequence\":60,\"revision\":60,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:49\",\"providerSequence\":50,\"cursor\":\"49\",\"receivedAt\":\"2026-08-29T05:41:15.969Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:49\"},\"delta\":\"TIVE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":61,\"revision\":61,\"event\":{\"sequence\":61,\"revision\":61,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:50\",\"providerSequence\":51,\"cursor\":\"50\",\"receivedAt\":\"2026-08-29T05:41:15.976Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:50\"},\"delta\":\"_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":62,\"revision\":62,\"event\":{\"sequence\":62,\"revision\":62,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:51\",\"providerSequence\":52,\"cursor\":\"51\",\"receivedAt\":\"2026-08-29T05:41:15.984Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\n\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:51\"},\"delta\":\"K.\\\"\\n\\n\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":63,\"revision\":63,\"event\":{\"sequence\":63,\"revision\":63,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:52\",\"providerSequence\":53,\"cursor\":\"52\",\"receivedAt\":\"2026-08-29T05:41:15.994Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:52\"},\"delta\":\"Thi\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":64,\"revision\":64,\"event\":{\"sequence\":64,\"revision\":64,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:53\",\"providerSequence\":54,\"cursor\":\"53\",\"receivedAt\":\"2026-08-29T05:41:16.001Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:53\"},\"delta\":\"s appear\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":65,\"revision\":65,\"event\":{\"sequence\":65,\"revision\":65,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:54\",\"providerSequence\":55,\"cursor\":\"54\",\"receivedAt\":\"2026-08-29T05:41:16.009Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:54\"},\"delta\":\"s \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":66,\"revision\":66,\"event\":{\"sequence\":66,\"revision\":66,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:55\",\"providerSequence\":56,\"cursor\":\"55\",\"receivedAt\":\"2026-08-29T05:41:16.016Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:55\"},\"delta\":\"to \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":67,\"revision\":67,\"event\":{\"sequence\":67,\"revision\":67,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:56\",\"providerSequence\":57,\"cursor\":\"56\",\"receivedAt\":\"2026-08-29T05:41:16.023Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:56\"},\"delta\":\"be \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":68,\"revision\":68,\"event\":{\"sequence\":68,\"revision\":68,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:57\",\"providerSequence\":58,\"cursor\":\"57\",\"receivedAt\":\"2026-08-29T05:41:16.032Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:57\"},\"delta\":\"a ta\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":69,\"revision\":69,\"event\":{\"sequence\":69,\"revision\":69,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:58\",\"providerSequence\":59,\"cursor\":\"58\",\"receivedAt\":\"2026-08-29T05:41:16.038Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:58\"},\"delta\":\"sk in\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":70,\"revision\":70,\"event\":{\"sequence\":70,\"revision\":70,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:59\",\"providerSequence\":60,\"cursor\":\"59\",\"receivedAt\":\"2026-08-29T05:41:16.046Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:59\"},\"delta\":\" \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":71,\"revision\":71,\"event\":{\"sequence\":71,\"revision\":71,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:60\",\"providerSequence\":61,\"cursor\":\"60\",\"receivedAt\":\"2026-08-29T05:41:16.053Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:60\"},\"delta\":\"a harnes\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":72,\"revision\":72,\"event\":{\"sequence\":72,\"revision\":72,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:61\",\"providerSequence\":62,\"cursor\":\"61\",\"receivedAt\":\"2026-08-29T05:41:16.061Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:61\"},\"delta\":\"s where\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":73,\"revision\":73,\"event\":{\"sequence\":73,\"revision\":73,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:62\",\"providerSequence\":63,\"cursor\":\"62\",\"receivedAt\":\"2026-08-29T05:41:16.079Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:62\"},\"delta\":\" I\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":74,\"revision\":74,\"event\":{\"sequence\":74,\"revision\":74,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:63\",\"providerSequence\":64,\"cursor\":\"63\",\"receivedAt\":\"2026-08-29T05:41:16.089Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:63\"},\"delta\":\" need\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":75,\"revision\":75,\"event\":{\"sequence\":75,\"revision\":75,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:64\",\"providerSequence\":65,\"cursor\":\"64\",\"receivedAt\":\"2026-08-29T05:41:16.096Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:64\"},\"delta\":\" \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":76,\"revision\":76,\"event\":{\"sequence\":76,\"revision\":76,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:65\",\"providerSequence\":66,\"cursor\":\"65\",\"receivedAt\":\"2026-08-29T05:41:16.103Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:65\"},\"delta\":\"to a\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":77,\"revision\":77,\"event\":{\"sequence\":77,\"revision\":77,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:66\",\"providerSequence\":67,\"cursor\":\"66\",\"receivedAt\":\"2026-08-29T05:41:16.111Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:66\"},\"delta\":\"sk \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":78,\"revision\":78,\"event\":{\"sequence\":78,\"revision\":78,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:67\",\"providerSequence\":68,\"cursor\":\"67\",\"receivedAt\":\"2026-08-29T05:41:16.118Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:67\"},\"delta\":\"a permission\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":79,\"revision\":79,\"event\":{\"sequence\":79,\"revision\":79,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:68\",\"providerSequence\":69,\"cursor\":\"68\",\"receivedAt\":\"2026-08-29T05:41:16.125Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:68\"},\"delta\":\" question\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":80,\"revision\":80,\"event\":{\"sequence\":80,\"revision\":80,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:69\",\"providerSequence\":70,\"cursor\":\"69\",\"receivedAt\":\"2026-08-29T05:41:16.137Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:69\"},\"delta\":\" before\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":81,\"revision\":81,\"event\":{\"sequence\":81,\"revision\":81,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:70\",\"providerSequence\":71,\"cursor\":\"70\",\"receivedAt\":\"2026-08-29T05:41:16.144Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:70\"},\"delta\":\" completin\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":82,\"revision\":82,\"event\":{\"sequence\":82,\"revision\":82,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:71\",\"providerSequence\":72,\"cursor\":\"71\",\"receivedAt\":\"2026-08-29T05:41:16.151Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:71\"},\"delta\":\"g some\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":83,\"revision\":83,\"event\":{\"sequence\":83,\"revision\":83,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:72\",\"providerSequence\":73,\"cursor\":\"72\",\"receivedAt\":\"2026-08-29T05:41:16.163Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:72\"},\"delta\":\" ta\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":84,\"revision\":84,\"event\":{\"sequence\":84,\"revision\":84,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:73\",\"providerSequence\":74,\"cursor\":\"73\",\"receivedAt\":\"2026-08-29T05:41:16.174Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:73\"},\"delta\":\"sk.\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":85,\"revision\":85,\"event\":{\"sequence\":85,\"revision\":85,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:74\",\"providerSequence\":75,\"cursor\":\"74\",\"receivedAt\":\"2026-08-29T05:41:16.181Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:74\"},\"delta\":\" Le\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":86,\"revision\":86,\"event\":{\"sequence\":86,\"revision\":86,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:75\",\"providerSequence\":76,\"cursor\":\"75\",\"receivedAt\":\"2026-08-29T05:41:16.188Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:75\"},\"delta\":\"t me\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":87,\"revision\":87,\"event\":{\"sequence\":87,\"revision\":87,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:76\",\"providerSequence\":77,\"cursor\":\"76\",\"receivedAt\":\"2026-08-29T05:41:16.195Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:76\"},\"delta\":\" loo\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":88,\"revision\":88,\"event\":{\"sequence\":88,\"revision\":88,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:77\",\"providerSequence\":78,\"cursor\":\"77\",\"receivedAt\":\"2026-08-29T05:41:16.202Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:77\"},\"delta\":\"k a\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":89,\"revision\":89,\"event\":{\"sequence\":89,\"revision\":89,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:78\",\"providerSequence\":79,\"cursor\":\"78\",\"receivedAt\":\"2026-08-29T05:41:16.209Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:78\"},\"delta\":\"t t\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":90,\"revision\":90,\"event\":{\"sequence\":90,\"revision\":90,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:79\",\"providerSequence\":80,\"cursor\":\"79\",\"receivedAt\":\"2026-08-29T05:41:16.216Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:79\"},\"delta\":\"he curren\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":91,\"revision\":91,\"event\":{\"sequence\":91,\"revision\":91,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:80\",\"providerSequence\":81,\"cursor\":\"80\",\"receivedAt\":\"2026-08-29T05:41:16.222Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:80\"},\"delta\":\"t workin\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":92,\"revision\":92,\"event\":{\"sequence\":92,\"revision\":92,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:81\",\"providerSequence\":82,\"cursor\":\"81\",\"receivedAt\":\"2026-08-29T05:41:16.229Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:81\"},\"delta\":\"g directory\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":93,\"revision\":93,\"event\":{\"sequence\":93,\"revision\":93,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:82\",\"providerSequence\":83,\"cursor\":\"82\",\"receivedAt\":\"2026-08-29T05:41:16.236Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:82\"},\"delta\":\" \"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":94,\"revision\":94,\"event\":{\"sequence\":94,\"revision\":94,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:83\",\"providerSequence\":84,\"cursor\":\"83\",\"receivedAt\":\"2026-08-29T05:41:16.243Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:83\"},\"delta\":\"to understand\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":95,\"revision\":95,\"event\":{\"sequence\":95,\"revision\":95,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:84\",\"providerSequence\":85,\"cursor\":\"84\",\"receivedAt\":\"2026-08-29T05:41:16.250Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:84\"},\"delta\":\" wha\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":96,\"revision\":96,\"event\":{\"sequence\":96,\"revision\":96,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:85\",\"providerSequence\":86,\"cursor\":\"85\",\"receivedAt\":\"2026-08-29T05:41:16.258Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:85\"},\"delta\":\"t'\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":97,\"revision\":97,\"event\":{\"sequence\":97,\"revision\":97,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:86\",\"providerSequence\":87,\"cursor\":\"86\",\"receivedAt\":\"2026-08-29T05:41:16.265Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:86\"},\"delta\":\"s goin\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":98,\"revision\":98,\"event\":{\"sequence\":98,\"revision\":98,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:87\",\"providerSequence\":88,\"cursor\":\"87\",\"receivedAt\":\"2026-08-29T05:41:16.274Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:87\"},\"delta\":\"g on\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":99,\"revision\":99,\"event\":{\"sequence\":99,\"revision\":99,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:88\",\"providerSequence\":89,\"cursor\":\"88\",\"receivedAt\":\"2026-08-29T05:41:16.281Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\n\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:88\"},\"delta\":\".\\n\\n\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":100,\"revision\":100,\"event\":{\"sequence\":100,\"revision\":100,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:89\",\"providerSequence\":90,\"cursor\":\"89\",\"receivedAt\":\"2026-08-29T05:41:16.288Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:89\"},\"delta\":\"Le\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":101,\"revision\":101,\"event\":{\"sequence\":101,\"revision\":101,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:90\",\"providerSequence\":91,\"cursor\":\"90\",\"receivedAt\":\"2026-08-29T05:41:16.296Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:90\"},\"delta\":\"t me\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":102,\"revision\":102,\"event\":{\"sequence\":102,\"revision\":102,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:91\",\"providerSequence\":92,\"cursor\":\"91\",\"receivedAt\":\"2026-08-29T05:41:16.302Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:91\"},\"delta\":\" inspec\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":103,\"revision\":103,\"event\":{\"sequence\":103,\"revision\":103,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:92\",\"providerSequence\":93,\"cursor\":\"92\",\"receivedAt\":\"2026-08-29T05:41:16.308Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:92\"},\"delta\":\"t t\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":104,\"revision\":104,\"event\":{\"sequence\":104,\"revision\":104,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:93\",\"providerSequence\":94,\"cursor\":\"93\",\"receivedAt\":\"2026-08-29T05:41:16.314Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:93\"},\"delta\":\"he workspace\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":105,\"revision\":105,\"event\":{\"sequence\":105,\"revision\":105,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:94\",\"providerSequence\":95,\"cursor\":\"94\",\"receivedAt\":\"2026-08-29T05:41:16.320Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:94\"},\"delta\":\" firs\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":106,\"revision\":106,\"event\":{\"sequence\":106,\"revision\":106,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:95\",\"providerSequence\":96,\"cursor\":\"95\",\"receivedAt\":\"2026-08-29T05:41:16.327Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:95\"},\"delta\":\"t.\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":107,\"revision\":107,\"event\":{\"sequence\":107,\"revision\":107,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\",\"providerSequence\":97,\"cursor\":\"96\",\"receivedAt\":\"2026-08-29T05:41:16.939Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":108,\"revision\":108,\"event\":{\"sequence\":108,\"revision\":108,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:97\",\"providerSequence\":98,\"cursor\":\"97\",\"receivedAt\":\"2026-08-29T05:41:16.953Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"tool\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:97\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{\"command\":\"pwd && ls -la && echo \\\"---\\\" && ls -la /tmp/braid-live-interaction-9WT2lr/ 2>/dev/null | head -50\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":109,\"revision\":109,\"event\":{\"sequence\":109,\"revision\":109,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"providerSequence\":99,\"cursor\":\"98\",\"receivedAt\":\"2026-08-29T05:41:16.965Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":110,\"revision\":110,\"event\":{\"sequence\":110,\"revision\":110,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:99\",\"providerSequence\":100,\"cursor\":\"99\",\"receivedAt\":\"2026-08-29T05:41:16.972Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"tool\",\"text\":\"\",\"status\":\"running\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:99\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{\"command\":\"pwd && ls -la && echo \\\"---\\\" && ls -la /tmp/braid-live-interaction-9WT2lr/ 2>/dev/null | head -50\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":111,\"revision\":111,\"event\":{\"sequence\":111,\"revision\":111,\"kind\":\"run.interaction\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"providerSequence\":101,\"cursor\":\"100\",\"receivedAt\":\"2026-08-29T05:41:16.981Z\"},\"interaction\":{\"id\":\"interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2\",\"kind\":\"permission\",\"title\":\"Permission: bash\",\"answerSpec\":{\"fields\":[{\"type\":\"select\",\"name\":\"grant\",\"label\":\"Decision\",\"required\":true,\"options\":[{\"value\":\"allow_once\",\"label\":\"Allow once\"},{\"value\":\"deny\",\"label\":\"Deny\"}]}]},\"responseScopes\":[\"interaction\"]}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":112,\"revision\":112,\"event\":{\"sequence\":112,\"revision\":112,\"kind\":\"run.interaction.response.requested\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"value\":{\"kind\":\"run.interaction.response.requested\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"interactionId\":\"interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash\",\"outcome\":\"declined\",\"containsSecret\":false}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":113,\"revision\":113,\"event\":{\"sequence\":113,\"revision\":113,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash-98a68ff2adb18a9ea0a181f1\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"interaction.respond\",\"requestDigest\":\"98a68ff2adb18a9ea0a181f1fe98c874eb5432b6ecbf4dd629fce8b1a98161a4\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T05:41:17.017Z\",\"updatedAt\":\"2026-08-29T05:41:17.017Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":114,\"revision\":114,\"event\":{\"sequence\":114,\"revision\":114,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash-98a68ff2adb18a9ea0a181f1\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"interaction.respond\",\"requestDigest\":\"98a68ff2adb18a9ea0a181f1fe98c874eb5432b6ecbf4dd629fce8b1a98161a4\",\"kind\":\"custom\",\"status\":\"acknowledged\",\"attempt\":1,\"outcomeDigest\":\"26b992cc8aa12fe24a2603f4be22d30c1268dcc824e7088079cfbf0cef8d3263\",\"createdAt\":\"2026-08-29T05:41:17.017Z\",\"updatedAt\":\"2026-08-29T05:41:17.050Z\"}}}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash\",\"revision\":114,\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash\",\"command\":\"respond_interaction\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"control\":\"respond_interaction\",\"outcome\":\"accepted\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":115,\"revision\":115,\"event\":{\"sequence\":115,\"revision\":115,\"kind\":\"run.interaction.responded\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"value\":{\"kind\":\"run.interaction.responded\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"interactionId\":\"interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-respond-pi-tangle-router-deepseek-v4-flash\",\"outcome\":\"declined\",\"containsSecret\":false,\"detail\":\"INTERACTION_RESPONSE_ACCEPTED\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":116,\"revision\":116,\"event\":{\"sequence\":116,\"revision\":116,\"kind\":\"feedback.decision.recorded\",\"payload\":{\"value\":{\"kind\":\"feedback.decision.recorded\",\"decision\":{\"id\":\"feedback-fbcae506f3d5d4fd76ecc08b40123afa8de7276e909a9109\",\"conversationId\":\"conv-1\",\"category\":\"rejection\",\"chosenOption\":\"declined\",\"automated\":false,\"createdAt\":\"2026-08-29T05:41:17.077Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":117,\"revision\":117,\"event\":{\"sequence\":117,\"revision\":117,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"providerSequence\":102,\"cursor\":\"101\",\"receivedAt\":\"2026-08-29T05:41:17.089Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"error\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-duplicate-pi-tangle-router-deepseek-v4-flash\",\"code\":\"INTERACTION_STALE\",\"message\":\"The interaction is already declined\",\"retryable\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":118,\"revision\":118,\"event\":{\"sequence\":118,\"revision\":118,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"providerSequence\":103,\"cursor\":\"102\",\"receivedAt\":\"2026-08-29T05:41:17.102Z\"},\"part\":{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":119,\"revision\":119,\"event\":{\"sequence\":119,\"revision\":119,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"providerSequence\":104,\"cursor\":\"103\",\"receivedAt\":\"2026-08-29T05:41:17.111Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":120,\"revision\":120,\"event\":{\"sequence\":120,\"revision\":120,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"providerSequence\":105,\"cursor\":\"104\",\"receivedAt\":\"2026-08-29T05:41:17.119Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":121,\"revision\":121,\"event\":{\"sequence\":121,\"revision\":121,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"providerSequence\":106,\"cursor\":\"105\",\"receivedAt\":\"2026-08-29T05:41:17.126Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":122,\"revision\":122,\"event\":{\"sequence\":122,\"revision\":122,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"providerSequence\":107,\"cursor\":\"106\",\"receivedAt\":\"2026-08-29T05:41:17.134Z\"},\"unknown\":{\"type\":\"model-processing\",\"phase\":\"generating\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":123,\"revision\":123,\"event\":{\"sequence\":123,\"revision\":123,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"source\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:107\",\"providerSequence\":108,\"cursor\":\"107\",\"receivedAt\":\"2026-08-29T05:41:17.141Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"streaming\",\"provider\":{\"eventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:107\",\"providerSequence\":108,\"cursor\":\"107\",\"receivedAt\":\"2026-08-29T05:41:17.141Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-state-post-response-pi-tangle-router-deepseek-v4-flash\",\"revision\":123,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":123,\"sequence\":123,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"updatedAt\":\"2026-08-29T05:41:17.142Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"controlRef\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"executionId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"requestDigest\":\"sha256:e96ba51a1dadab4289c3e219fd1812c5d3eef0dc6d5afd9330d08e557e6c4390\"},\"materializationDigest\":\"f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301\",\"cursor\":\"107\",\"cursorCommittedSequence\":123,\"contentBytes\":1037}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"activeRuns\":[{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":123,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"running\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"107\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\"},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"completeness\":\"incomplete\",\"contentBytes\":1037}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"activeRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"kind\":\"run\",\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"running\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"occurredAt\":\"2026-08-29T05:41:10.698Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"environment:environment-a166528e64ed0873fc9d36864eabfead\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:41:09.789Z\",\"occurredAt\":\"2026-08-29T05:41:13.057Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:interaction:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100:permission\",\"kind\":\"interaction\",\"title\":\"permission\",\"status\":\"running\",\"detail\":\"Permission: bash\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"interaction:interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2\",\"kind\":\"interaction\",\"title\":\"Permission: bash\",\"status\":\"running\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"running\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"running\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"running\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"running\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"running\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"running\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"running\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"running\",\"detail\":\"sequence 99\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"running\",\"detail\":\"sequence 102\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"running\",\"detail\":\"sequence 104\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"running\",\"detail\":\"sequence 105\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"running\",\"detail\":\"sequence 106\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"running\",\"detail\":\"sequence 107\",\"occurredAt\":\"2026-08-29T05:41:17.142Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:41:09.789Z\"},{\"id\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:41:10.698Z\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\"],\"runner\":\"pi\",\"startedAt\":\"2026-08-29T05:41:10.698Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:41:09.789Z\",\"observed: 2026-08-29T05:41:13.057Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect while another run is active\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile while another run is active\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash\",\"revision\":128,\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash\",\"command\":\"cancel_run\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"control\":\"cancel\",\"outcome\":\"accepted\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":124,\"revision\":124,\"event\":{\"sequence\":124,\"revision\":124,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"control\":{\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live interactive proof completed\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":125,\"revision\":125,\"event\":{\"sequence\":125,\"revision\":125,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"control\":{\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live interactive proof completed\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":126,\"revision\":126,\"event\":{\"sequence\":126,\"revision\":126,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash-10b04e21cfa3afb087c48139\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"10b04e21cfa3afb087c481393e4ee2950b2916b1a3b917561edb6c912846a154\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T05:41:17.173Z\",\"updatedAt\":\"2026-08-29T05:41:17.173Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":127,\"revision\":127,\"event\":{\"sequence\":127,\"revision\":127,\"kind\":\"run.reconnecting\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"reconnecting\",\"completeness\":\"streaming\",\"cursor\":\"107\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":128,\"revision\":128,\"event\":{\"sequence\":128,\"revision\":128,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash-10b04e21cfa3afb087c48139\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"10b04e21cfa3afb087c481393e4ee2950b2916b1a3b917561edb6c912846a154\",\"kind\":\"custom\",\"status\":\"acknowledged\",\"attempt\":1,\"outcomeDigest\":\"f430d9c9c101fec536eed9da90bf212be94a7c138332862d1e9774b1266d9187\",\"createdAt\":\"2026-08-29T05:41:17.173Z\",\"updatedAt\":\"2026-08-29T05:41:17.228Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":129,\"revision\":129,\"event\":{\"sequence\":129,\"revision\":129,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"control\":{\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"control\":\"cancel\",\"status\":\"accepted\",\"detail\":\"CONTROL_DETAIL\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":130,\"revision\":130,\"event\":{\"sequence\":130,\"revision\":130,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"aborted\",\"completeness\":\"complete\",\"finalText\":\"\",\"usage\":{\"input\":0,\"output\":0,\"tokensKnown\":false,\"usdKnown\":false,\"model\":\"deepseek-v4-flash\"},\"reason\":\"CONTROL_DETAIL\"}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-cleanup-cancel-pi-tangle-router-deepseek-v4-flash\",\"revision\":130,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":130,\"sequence\":130,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"updatedAt\":\"2026-08-29T05:41:17.262Z\",\"terminalAt\":\"2026-08-29T05:41:17.262Z\",\"durationMs\":6564,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"controlRef\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"executionId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"requestDigest\":\"sha256:e96ba51a1dadab4289c3e219fd1812c5d3eef0dc6d5afd9330d08e557e6c4390\"},\"materializationDigest\":\"f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301\",\"cursor\":\"107\",\"cursorCommittedSequence\":123,\"contentBytes\":1051}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":130,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"107\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":6564},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"completeness\":\"complete\",\"contentBytes\":1051}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"kind\":\"run\",\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"cancelled\",\"elapsedMs\":6564,\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"occurredAt\":\"2026-08-29T05:41:10.698Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"environment:environment-a166528e64ed0873fc9d36864eabfead\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:41:09.789Z\",\"occurredAt\":\"2026-08-29T05:41:13.057Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:interaction:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100:permission\",\"kind\":\"interaction\",\"title\":\"permission\",\"status\":\"cancelled\",\"detail\":\"Permission: bash\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"interaction:interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2\",\"kind\":\"interaction\",\"title\":\"Permission: bash\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live interactive proof completed\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"107\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 99\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 102\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 104\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 105\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 106\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"cancelled\",\"detail\":\"sequence 107\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:41:09.789Z\"},{\"id\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:41:10.698Z\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\"],\"runner\":\"pi\",\"elapsedMs\":6564,\"startedAt\":\"2026-08-29T05:41:10.698Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:41:09.789Z\",\"observed: 2026-08-29T05:41:13.057Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-state-poll-0-pi-tangle-router-deepseek-v4-flash\",\"revision\":130,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":130,\"sequence\":130,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"updatedAt\":\"2026-08-29T05:41:17.262Z\",\"terminalAt\":\"2026-08-29T05:41:17.262Z\",\"durationMs\":6564,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"controlRef\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"executionId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"requestDigest\":\"sha256:e96ba51a1dadab4289c3e219fd1812c5d3eef0dc6d5afd9330d08e557e6c4390\"},\"materializationDigest\":\"f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301\",\"cursor\":\"107\",\"cursorCommittedSequence\":123,\"contentBytes\":1051}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":130,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"107\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":6564},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"completeness\":\"complete\",\"contentBytes\":1051}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"kind\":\"run\",\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"cancelled\",\"elapsedMs\":6564,\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"occurredAt\":\"2026-08-29T05:41:10.698Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"environment:environment-a166528e64ed0873fc9d36864eabfead\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:41:09.789Z\",\"occurredAt\":\"2026-08-29T05:41:13.057Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:interaction:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100:permission\",\"kind\":\"interaction\",\"title\":\"permission\",\"status\":\"cancelled\",\"detail\":\"Permission: bash\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"interaction:interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2\",\"kind\":\"interaction\",\"title\":\"Permission: bash\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live interactive proof completed\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"107\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 99\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 102\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 104\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 105\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 106\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"cancelled\",\"detail\":\"sequence 107\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:41:09.789Z\"},{\"id\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:41:10.698Z\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\"],\"runner\":\"pi\",\"elapsedMs\":6564,\"startedAt\":\"2026-08-29T05:41:10.698Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:41:09.789Z\",\"observed: 2026-08-29T05:41:13.057Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"interactive-protocol-final-state-pi-tangle-router-deepseek-v4-flash\",\"revision\":130,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":130,\"sequence\":130,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"updatedAt\":\"2026-08-29T05:41:17.262Z\",\"terminalAt\":\"2026-08-29T05:41:17.262Z\",\"durationMs\":6564,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"controlRef\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"executionId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"requestDigest\":\"sha256:e96ba51a1dadab4289c3e219fd1812c5d3eef0dc6d5afd9330d08e557e6c4390\"},\"materializationDigest\":\"f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301\",\"cursor\":\"107\",\"cursorCommittedSequence\":123,\"contentBytes\":1051}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":130,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"107\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":6564},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"completeness\":\"complete\",\"contentBytes\":1051}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"kind\":\"run\",\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"cancelled\",\"elapsedMs\":6564,\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"occurredAt\":\"2026-08-29T05:41:10.698Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"environment:environment-a166528e64ed0873fc9d36864eabfead\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:41:09.789Z\",\"occurredAt\":\"2026-08-29T05:41:13.057Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:interaction:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100:permission\",\"kind\":\"interaction\",\"title\":\"permission\",\"status\":\"cancelled\",\"detail\":\"Permission: bash\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"interaction:interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2\",\"kind\":\"interaction\",\"title\":\"Permission: bash\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live interactive proof completed\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"107\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 99\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 102\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 104\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 105\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 106\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"cancelled\",\"detail\":\"sequence 107\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:41:09.789Z\"},{\"id\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:41:10.698Z\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\"],\"runner\":\"pi\",\"elapsedMs\":6564,\"startedAt\":\"2026-08-29T05:41:10.698Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:41:09.789Z\",\"observed: 2026-08-29T05:41:13.057Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"interactive-protocol-shutdown-pi-tangle-router-deepseek-v4-flash\",\"revision\":130,\"operationId\":\"op-interactive-protocol-shutdown-pi-tangle-router-deepseek-v4-flash\",\"command\":\"shutdown\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":131,\"revision\":131,\"event\":{\"sequence\":131,\"revision\":131,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-interactive-protocol-shutdown-pi-tangle-router-deepseek-v4-flash\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":132,\"revision\":132,\"event\":{\"sequence\":132,\"revision\":132,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash-2251a154c5551c7c86dda8e7\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"2251a154c5551c7c86dda8e703fc57dde3249dbcf4bf79c10eef8046748911ff\",\"kind\":\"send\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"709050be156660bc04bed3766c3160fcc713b9a8ebb19bfd0cd66bbe285c86e9\",\"createdAt\":\"2026-08-29T05:41:10.717Z\",\"updatedAt\":\"2026-08-29T05:41:18.530Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":132,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":132,\"sequence\":132,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"updatedAt\":\"2026-08-29T05:41:17.262Z\",\"terminalAt\":\"2026-08-29T05:41:17.262Z\",\"durationMs\":6564,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"controlRef\":{\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YTdmZjg1M2ZjY2ZlNGI1NmIzMDY4NDMxN2NkNDBjNjQ1MDg1ZmFjNjNmY2NlZjA5YzM4YWY2ODNlOGExMWE1MiIsImIzQUlvTENhakxWbVV3eXV3TkFtX2twUjB6eEdHRThPOUJMeEdST0doSkkiXQ\",\"sessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"executionId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"requestDigest\":\"sha256:e96ba51a1dadab4289c3e219fd1812c5d3eef0dc6d5afd9330d08e557e6c4390\"},\"materializationDigest\":\"f6e8d9ef838a829b2fa4a6ce7a625b7d981a977b4f8a6973ed9a4992ed43a301\",\"cursor\":\"107\",\"cursorCommittedSequence\":123,\"contentBytes\":1051}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":132,\"workspace\":\"/tmp/braid-live-interaction-9WT2lr/workspace-pi-tangle-router-deepseek-v4-flash\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T05:41:10.698Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-65eb78ac-9876-4a42-a93d-366442211c96\",\"role\":\"user\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\",\"status\":\"complete\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"part-message-65eb78ac-9876-4a42-a93d-366442211c96\",\"kind\":\"text\",\"text\":\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\"}]},{\"id\":\"message-ae13afc6-a5c4-4a9e-b68e-306c6a54f3a7\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"parts\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:message:0:reasoning\",\"kind\":\"reasoning\",\"text\":\"The user is asking me to \\\"Ask one user-visible permission question before completing LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_INTERACTIVE_OK.\\\"\\n\\nThis appears to be a task in a harness where I need to ask a permission question before completing some task. Let me look at the current working directory to understand what's going on.\\n\\nLet me inspect the workspace first.\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:96\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:tool:call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"kind\":\"result\",\"text\":\"\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:102\",\"toolName\":\"bash\",\"callId\":\"call_00_Rgw8zii2BbEF3AJWeXmw7367\",\"input\":{},\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"permission denied\"}],\"details\":{}},\"error\":\"RUNTIME_TOOL_ERROR\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"turnId\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-interactive-protocol-3b3ed1e2-96c3-4b7b-9bf6-f413c140e8d5-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"107\",\"providerSessionId\":\"session-braid-run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":6564},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"completeness\":\"complete\",\"contentBytes\":1051}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T05:41:09.789Z\",\"updatedAt\":\"2026-08-29T05:41:13.057Z\"}],\"focusedRunId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"kind\":\"run\",\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"status\":\"cancelled\",\"elapsedMs\":6564,\"startedAt\":\"2026-08-29T05:41:10.698Z\",\"occurredAt\":\"2026-08-29T05:41:10.698Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"environment:environment-a166528e64ed0873fc9d36864eabfead\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T05:41:09.789Z\",\"occurredAt\":\"2026-08-29T05:41:13.057Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:interaction:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100:permission\",\"kind\":\"interaction\",\"title\":\"permission\",\"status\":\"cancelled\",\"detail\":\"Permission: bash\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"interaction:interaction-3761c1a6b76a902e8670b44b83510b0d5b40ab928a7f2cc2\",\"kind\":\"interaction\",\"title\":\"Permission: bash\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:100\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live interactive proof completed\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"107\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"activity:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:4\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:5\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:6\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 99\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:98\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 102\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:101\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 104\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:103\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 105\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:104\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 106\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:105\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"},{\"id\":\"event:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"cancelled\",\"detail\":\"sequence 107\",\"occurredAt\":\"2026-08-29T05:41:17.262Z\",\"sourceEventId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee:106\",\"runId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"entityType\":\"run\",\"entityId\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T05:41:06.708Z\"},{\"id\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T05:41:09.789Z\"},{\"id\":\"turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T05:41:10.698Z\"},{\"id\":\"run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4b9d9c45-8687-4bf2-8537-2ddb683b9822\"],\"runner\":\"pi\",\"elapsedMs\":6564,\"startedAt\":\"2026-08-29T05:41:10.698Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-a166528e64ed0873fc9d36864eabfead\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T05:41:09.789Z\",\"observed: 2026-08-29T05:41:13.057Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-3c64ec41-ec5d-4681-bf86-7280f808b3ee\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n", + "process": { + "processIdentity": { + "instanceId": "56e250bf-463c-480d-af68-8db32d4e1e3d", + "pid": 2654747, + "startedAt": 1787982065619 + }, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2654747 + ], + "roots": [ + 2654747 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "natural": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 2654747 + ], + "roots": [ + 2654747 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": 0, + "signal": null + } + } + }, + "status": "passed", + "cleanup": [ + { + "path": "/tmp/braid-live-interaction-9WT2lr", + "removed": true + }, + { + "path": "/tmp/braid-live-install-MpZxkH", + "removed": true + }, + { + "path": "/tmp/braid-live-pack-mIMgBK", + "removed": true + } + ], + "completedAt": "2026-08-29T05:41:18.738Z" +} diff --git a/artifacts/verification/live/tangle-sandbox-braid-multirun-production-1787978842355.json b/artifacts/verification/live/tangle-sandbox-braid-multirun-production-1787978842355.json new file mode 100644 index 00000000..edc1af48 --- /dev/null +++ b/artifacts/verification/live/tangle-sandbox-braid-multirun-production-1787978842355.json @@ -0,0 +1 @@ +{"schemaVersion":"braid.live-required.multirun.v2","status":"passed","proofId":"braid-multirun-1787978842355-69bfbe423a29412ea2bd1c4e9660ca18","startedAt":"2026-08-29T04:47:22.354Z","completedAt":"2026-08-29T04:51:13.012Z","elapsedMs":230658.223399,"config":{"endpoint":"https://sandbox.tangle.tools","connectionId":"connection-live-tangle-sandbox","connectionKind":"tangle-sandbox","credentialConfigured":true,"model":"tangle-router/glm-5.2","runner":"opencode","lifecycle":"retained","idleTtlSeconds":1800},"provider":{"endpoint":"https://sandbox.tangle.tools","runner":"opencode","model":"tangle-router/glm-5.2","lifecycle":"retained","credentialConfigured":true},"conversations":{"first":{"conversationId":"conv-1","branchId":"branch-1"},"second":{"conversationId":"conversation-8c1237bc659b77b369aaf1656ed908bb","branchId":"branch-8c1237bc659b77b369aaf1656ed908bb"}},"runs":[{"runId":"run-42b272cb-6953-4778-aab3-31684d2a9ace","conversationId":"conv-1","branchId":"branch-1","turnId":"turn-b6efdc94-d7a3-4757-a013-f71bcd238bbf","operationId":"op-0f74d829-1f6b-4a79-8fab-12ee36f18e77","status":"completed","provider":"tangle-sandbox","runner":"opencode","model":"tangle-router/glm-5.2","localEnvironmentId":"environment-1183ac255d402259966ee23725deb822","providerEnvironmentId":"sandbox-04b63585c0cf","materializationDigest":null,"cursor":"84","contentBytes":3209,"eventCount":44,"eventIdsUnique":true,"identifiers":[{"kind":"provider-environment","id":"sandbox-04b63585c0cf"},{"kind":"provider-session","id":"session-braid-run-42b272cb-6953-4778-aab3-31684d2a9ace"},{"kind":"provider-execution","id":"run-42b272cb-6953-4778-aab3-31684d2a9ace"},{"kind":"provider-run","id":"run-42b272cb-6953-4778-aab3-31684d2a9ace"}]},{"runId":"run-125939e4-97de-4151-bccc-10768bcb0084","conversationId":"conversation-8c1237bc659b77b369aaf1656ed908bb","branchId":"branch-8c1237bc659b77b369aaf1656ed908bb","turnId":"turn-36009a7c-b7ab-48e3-b005-5616fd0ed926","operationId":"op-80ca8b6a-99b7-4c34-89f1-3debd8f9f8a2","status":"aborted","provider":"tangle-sandbox","runner":"opencode","model":"tangle-router/glm-5.2","localEnvironmentId":"environment-84a588c55f49801b839a1ee962f851f1","providerEnvironmentId":"sandbox-78ece38207d0","materializationDigest":null,"cursor":"10","contentBytes":null,"eventCount":2,"eventIdsUnique":true,"identifiers":[{"kind":"provider-environment","id":"sandbox-78ece38207d0"},{"kind":"provider-session","id":"session-braid-run-125939e4-97de-4151-bccc-10768bcb0084"},{"kind":"provider-execution","id":"run-125939e4-97de-4151-bccc-10768bcb0084"},{"kind":"provider-run","id":"run-125939e4-97de-4151-bccc-10768bcb0084"}]}],"overlap":{"activeRunCount":2,"streamEventCounts":[{"runId":"run-42b272cb-6953-4778-aab3-31684d2a9ace","count":8},{"runId":"run-125939e4-97de-4151-bccc-10768bcb0084","count":1}],"workStripCount":2,"renderedWorkStripCount":2,"independentConversations":true},"focus":{"beforeRunId":"run-125939e4-97de-4151-bccc-10768bcb0084","firstSwitchRunId":"run-42b272cb-6953-4778-aab3-31684d2a9ace","secondSwitchRunId":"run-125939e4-97de-4151-bccc-10768bcb0084","firstSwitchPreservedStatuses":true,"secondSwitchPreservedStatuses":true},"cancellation":{"dispatch":{"eventKind":"run.control.requested","control":"cancel","runId":"run-125939e4-97de-4151-bccc-10768bcb0084","operationId":"op-f74a0af2-66d8-46db-978c-3f0952aa40c2","sequence":51},"targetRunId":"run-125939e4-97de-4151-bccc-10768bcb0084","targetStatus":"aborted","unaffectedRunId":"run-42b272cb-6953-4778-aab3-31684d2a9ace","unaffectedStatusAtAck":"streaming","unaffectedFinalStatus":"completed"},"replay":{"restartedRunCount":2,"noDuplicateEventIds":true,"eventSetsStable":true},"terminal":{"columns":120,"rows":40,"phases":{"concurrent":{"screen":" › Use the current Tangle Sandbox working directory for every command in this turn. Write exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B followed by a newline to .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt. Read .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt and print the result. Run git -C . rev-parse --is-inside-work-tree and print its result. Run sleep 180 before the final response so another branch can stream concurrently. Reply with exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B. working… ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › queue #1 ─────────────────────────────────── type / for commands · Alt+Enter newline · paste ──────────────────────────────────── profile Braid live tangle-sandbox · runner opencode · model tangle-router/glm-5.2 starting · Ctrl+C cancel work New conversation · running · opencode/tangle-router/glm-5.2 actions switch/!ask/!steer/cancel focus BRAID_MULTIRUN_BRAID-MULTI… conversation · starting actions switch/!ask/!steer/cancel host sandbox-78ece38207d0.tangle.sh ","outputBytes":281358},"focusA":{"screen":" › Use the current Tangle Sandbox working directory for every command in this turn. Write exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B followed by a newline to .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt. Read .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt and print the result. Run git -C . rev-parse --is-inside-work-tree and print its result. Run sleep 180 before the final response so another branch can stream concurrently. Reply with exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B. working… ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › queue #1 ─────────────────────────────────── type / for commands · Alt+Enter newline · paste ──────────────────────────────────── profile Braid live tangle-sandbox · runner opencode · model tangle-router/glm-5.2 starting · Ctrl+C cancel focus New conversation · running · opencode/tangle-router/glm-5.2 actions switch/!ask/!steer/cancel work BRAID_MULTIRUN_BRAID-MULTI… conversation · starting actions switch/!ask/!steer/cancel host sandbox-78ece38207d0.tangle.sh ","outputBytes":301651},"focusB":{"screen":" › Use the current Tangle Sandbox working directory for every command in this turn. Write exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B followed by a newline to .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt. Read .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt and print the result. Run git -C . rev-parse --is-inside-work-tree and print its result. Run sleep 180 before the final response so another branch can stream concurrently. Reply with exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B. working… ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › queue #1 ─────────────────────────────────── type / for commands · Alt+Enter newline · paste ──────────────────────────────────── profile Braid live tangle-sandbox · runner opencode · model tangle-router/glm-5.2 · backend Sandbox Ctrl+C cancel work New conversation · running · opencode/tangle-router/glm-5.2 actions switch/!ask/!steer/cancel focus BRAID_MULTIRUN_BRAID-MULTI… conversation · running actions switch/!ask/!steer/cancel host sandbox-78ece38207d0.tangle.sh ","outputBytes":320017},"cancelDispatch":{"screen":" › Use the current Tangle Sandbox working directory for every command in this turn. Write exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B followed by a newline to .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt. Read .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt and print the result. Run git -C . rev-parse --is-inside-work-tree and print its result. Run sleep 180 before the final response so another branch can stream concurrently. Reply with exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B. working… ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › queue #1 ─────────────────────────────────── type / for commands · Alt+Enter newline · paste ──────────────────────────────────── profile Braid live tangle-sandbox · runner opencode · model tangle-router/glm-5.2 · backend Sandbox stopping work New conversation · running · opencode/tangle-router/glm-5.2 actions switch/!ask/!steer/cancel focus BRAID_MULTIRUN_BRAID-MULTI… conversation · cancelling actions switch/!ask/!steer/cancel host sandbox-78ece38207d0.tangle.sh ","outputBytes":320451},"cancel":{"screen":" › Use the current Tangle Sandbox working directory for every command in this turn. Write exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B followed by a newline to .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt. Read .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt and print the result. Run git -C . rev-parse --is-inside-work-tree and print its result. Run sleep 180 before the final response so another branch can stream concurrently. Reply with exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B. cancelled ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › new message ─────────────────────────────────── type / for commands · Alt+Enter newline · paste ──────────────────────────────────── profile Braid live tangle-sandbox · runner opencode · model tangle-router/glm-5.2 cancelled · / commands · Ctrl+P ","outputBytes":329706},"final":{"screen":" › Use the current Tangle Sandbox working directory for every command in this turn. Write exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B followed by a newline to .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt. Read .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt and print the result. Run git -C . rev-parse --is-inside-work-tree and print its result. Run sleep 180 before the final response so another branch can stream concurrently. Reply with exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B. cancelled ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › new message ─────────────────────────────────── type / for commands · Alt+Enter newline · paste ──────────────────────────────────── profile Braid live tangle-sandbox · runner opencode · model tangle-router/glm-5.2 Ctrl+C again to quit ","outputBytes":330360},"restart":{"screen":" › Use the current Tangle Sandbox working directory for every command in this turn. Write exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B followed by a newline to .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt. Read .braid-live/BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B/marker.txt and print the result. Run git -C . rev-parse --is-inside-work-tree and print its result. Run sleep 180 before the final response so another branch can stream concurrently. Reply with exactly BRAID_MULTIRUN_BRAID-MULTIRUN-1787978842355-69BFBE423A29412EA2BD1C4E9660CA18_B. cancelled ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › new message ─────────────────────────────────── type / for commands · Alt+Enter newline · paste ──────────────────────────────────── profile Braid live tangle-sandbox · runner opencode · model tangle-router/glm-5.2 cancelled · / commands · Ctrl+P ","outputBytes":7708}}},"identifiers":[{"kind":"provider-environment","id":"sandbox-04b63585c0cf"},{"kind":"provider-session","id":"session-braid-run-42b272cb-6953-4778-aab3-31684d2a9ace"},{"kind":"provider-execution","id":"run-42b272cb-6953-4778-aab3-31684d2a9ace"},{"kind":"provider-run","id":"run-42b272cb-6953-4778-aab3-31684d2a9ace"},{"kind":"provider-environment","id":"sandbox-78ece38207d0"},{"kind":"provider-session","id":"session-braid-run-125939e4-97de-4151-bccc-10768bcb0084"},{"kind":"provider-execution","id":"run-125939e4-97de-4151-bccc-10768bcb0084"},{"kind":"provider-run","id":"run-125939e4-97de-4151-bccc-10768bcb0084"}],"timings":{"account.before":1352.318951,"binary.resolve":0.19033500000000458,"workspace.prepare":111.23024699999996,"terminal.start":723.4877479999998,"branch-a.send":7883.013297,"branch-a.stream":7905.2617119999995,"conversation-b.create":728.2122789999994,"branch-b.send":7721.235503,"concurrent.stream":7415.946176999998,"focus-a":721.0769930000024,"focus-b":747.353492000002,"cancel-b.dispatch":153.14499599999544,"cancel-b":1433.907392000001,"branch-a.complete":177420.26962700003,"remote.status":2614.214994000009,"terminal.first.close":1137.2593940000224,"terminal.restart":427.710368,"replay.restart":0.76604899999802,"terminal.restart.close":1197.8104199999943,"provider.observe":706.0492609999783},"phases":{"account.before":{"status":"passed","elapsedMs":1352.307609},"binary.resolve":{"status":"passed","elapsedMs":0.1882309999998597},"workspace.prepare":{"status":"passed","elapsedMs":111.22528800000009},"terminal.start":{"status":"passed","elapsedMs":723.480624},"branch-a.send":{"status":"passed","elapsedMs":7883.006423},"branch-a.stream":{"status":"passed","elapsedMs":7905.2552289999985},"conversation-b.create":{"status":"passed","elapsedMs":728.2021989999994},"branch-b.send":{"status":"passed","elapsedMs":7721.228418999999},"concurrent.stream":{"status":"passed","elapsedMs":7415.936588000004},"focus-a":{"status":"passed","elapsedMs":721.0667529999992},"focus-b":{"status":"passed","elapsedMs":747.3394939999998},"cancel-b.dispatch":{"status":"passed","elapsedMs":153.1412779999955},"cancel-b":{"status":"passed","elapsedMs":1433.8994559999992},"branch-a.complete":{"status":"passed","elapsedMs":177420.256521},"remote.status":{"status":"passed","elapsedMs":2614.2094429999997},"terminal.first.close":{"status":"passed","elapsedMs":1137.248653000017},"terminal.restart":{"status":"passed","elapsedMs":427.6942659999768},"replay.restart":{"status":"passed","elapsedMs":0.7594160000153352},"terminal.restart.close":{"status":"passed","elapsedMs":1197.790531000006},"provider.observe":{"status":"passed","elapsedMs":706.0416059999843}},"account":{"before":{"phase":"before","identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","usage":{"activeSandboxes":6,"totalSandboxes":14481,"computeMinutes":1677,"gpuSeconds":0,"gpuCostUsd":0},"resources":[{"id":"sandbox-0f86bdcec11a-branch-mtdnbzqk-0","providerSessionId":"[REDACTED]","displayName":"braid-[REDACTED]","createdAt":{}},{"id":"sandbox-0f86bdcec11a","providerSessionId":"[REDACTED]","displayName":"braid-[REDACTED]","createdAt":{}},{"id":"sandbox-b40d3fb66dc9-branch-mtdnaz53-0","providerSessionId":"[REDACTED]","displayName":"braid-[REDACTED]","createdAt":{}},{"id":"sandbox-b40d3fb66dc9","providerSessionId":"[REDACTED]","displayName":"braid-[REDACTED]","createdAt":{}}]},"after":{"phase":"after","identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","usage":{"activeSandboxes":6,"totalSandboxes":14483,"computeMinutes":1705,"gpuSeconds":0,"gpuCostUsd":0},"resources":[{"id":"sandbox-0f86bdcec11a-branch-mtdnbzqk-0","providerSessionId":"[REDACTED]","displayName":"braid-[REDACTED]","createdAt":{}},{"id":"sandbox-0f86bdcec11a","providerSessionId":"[REDACTED]","displayName":"braid-[REDACTED]","createdAt":{}},{"id":"sandbox-b40d3fb66dc9-branch-mtdnaz53-0","providerSessionId":"[REDACTED]","displayName":"braid-[REDACTED]","createdAt":{}},{"id":"sandbox-b40d3fb66dc9","providerSessionId":"[REDACTED]","displayName":"braid-[REDACTED]","createdAt":{}}]}},"cleanup":{"resources":[{"runId":"run-42b272cb-6953-4778-aab3-31684d2a9ace","providerEnvironmentId":"sandbox-04b63585c0cf","id":"sandbox-04b63585c0cf","attempts":[{"attempt":1,"deleted":true}],"confirmed":true},{"runId":"run-125939e4-97de-4151-bccc-10768bcb0084","providerEnvironmentId":"sandbox-78ece38207d0","id":"sandbox-78ece38207d0","attempts":[{"attempt":1,"deleted":true}],"confirmed":true}],"errors":[],"exact":true,"activeResourceDelta":0,"accountStable":true,"workspace":{"protectedStoreClean":true,"temporaryRootRemoved":true}},"error":null} diff --git a/artifacts/verification/live/tangle-sandbox-braid-stress-current-canary-proc-fixed.json b/artifacts/verification/live/tangle-sandbox-braid-stress-current-canary-proc-fixed.json new file mode 100644 index 00000000..a19a879a --- /dev/null +++ b/artifacts/verification/live/tangle-sandbox-braid-stress-current-canary-proc-fixed.json @@ -0,0 +1 @@ +{"schemaVersion":"braid.tangle-sandbox-braid-soak.v1","status":"passed","startedAt":"2026-08-29T04:39:15.107Z","completedAt":"2026-08-29T04:40:58.588Z","requestedRuns":1,"attemptedRuns":1,"concurrency":1,"stoppedAfterCanary":false,"failures":[],"cleanup":{"exactProofs":1,"exactResourcesRemaining":0,"resourceProofsUnavailable":0,"activeResourceDelta":0,"activeResourceDeltas":[0]},"accountUsage":{"complete":true,"before":{"computeMinutes":1619,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":6,"totalSandboxes":14475,"periodStart":{},"periodEnd":{}},"after":{"computeMinutes":1633,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":6,"totalSandboxes":14476,"periodStart":{},"periodEnd":{}},"delta":{"activeSandboxes":0,"totalSandboxes":1,"computeMinutes":14,"gpuSeconds":0,"gpuCostUsd":0,"unknownFields":[]}},"latency":{"totalMs":{"n":1,"min":103478.361886,"median":103478.361886,"p90":103478.361886,"max":103478.361886},"phases":{"cancel.first":{"n":1,"min":1316.3715419999935,"median":1316.3715419999935,"p90":1316.3715419999935,"max":1316.3715419999935},"cancel.observeControl":{"n":1,"min":4722.709656999999,"median":4722.709656999999,"p90":4722.709656999999,"max":4722.709656999999},"cancel.restart.closeFirstProcess":{"n":1,"min":77.09555700000783,"median":77.09555700000783,"p90":77.09555700000783,"max":77.09555700000783},"cancel.restart.closeRetryProcess":{"n":1,"min":76.6919329999946,"median":76.6919329999946,"p90":76.6919329999946,"max":76.6919329999946},"cancel.restart.initialize":{"n":1,"min":406.76111399999354,"median":406.76111399999354,"p90":406.76111399999354,"max":406.76111399999354},"cancel.retryChangedBody":{"n":1,"min":1.488152000005357,"median":1.488152000005357,"p90":1.488152000005357,"max":1.488152000005357},"cancel.retrySameBody":{"n":1,"min":18.133082000000286,"median":18.133082000000286,"p90":18.133082000000286,"max":18.133082000000286},"cancel.send":{"n":1,"min":1326.6062390000006,"median":1326.6062390000006,"p90":1326.6062390000006,"max":1326.6062390000006},"cancel.verifyRemote":{"n":1,"min":2887.3814199999906,"median":2887.3814199999906,"p90":2887.3814199999906,"max":2887.3814199999906},"cancel.waitCompletion":{"n":1,"min":51.0732330000028,"median":51.0732330000028,"p90":51.0732330000028,"max":51.0732330000028},"firstProcess.initialize":{"n":1,"min":487.18293800000015,"median":487.18293800000015,"p90":487.18293800000015,"max":487.18293800000015},"firstProcess.observeControl":{"n":1,"min":6829.522201,"median":6829.522201,"p90":6829.522201,"max":6829.522201},"firstProcess.send":{"n":1,"min":1520.441691,"median":1520.441691,"p90":1520.441691,"max":1520.441691},"firstProcess.sigkill":{"n":1,"min":67.82232600000134,"median":67.82232600000134,"p90":67.82232600000134,"max":67.82232600000134},"firstProcess.waitVisible":{"n":1,"min":10280.848214000001,"median":10280.848214000001,"p90":10280.848214000001,"max":10280.848214000001},"followUp.observeControl":{"n":1,"min":0.23437200000626035,"median":0.23437200000626035,"p90":0.23437200000626035,"max":0.23437200000626035},"followUp.prepareContinuityChallenge":{"n":1,"min":1457.6963579999938,"median":1457.6963579999938,"p90":1457.6963579999938,"max":1457.6963579999938},"followUp.send":{"n":1,"min":601.1853370000026,"median":601.1853370000026,"p90":601.1853370000026,"max":601.1853370000026},"followUp.verifyWorkspace":{"n":1,"min":2756.312380999996,"median":2756.312380999996,"p90":2756.312380999996,"max":2756.312380999996},"followUp.waitTerminal":{"n":1,"min":17749.502548999997,"median":17749.502548999997,"p90":17749.502548999997,"max":17749.502548999997},"freshProcess.initialize":{"n":1,"min":401.67595000000074,"median":401.67595000000074,"p90":401.67595000000074,"max":401.67595000000074},"freshProcess.observeControl":{"n":1,"min":0.15602700000454206,"median":0.15602700000454206,"p90":0.15602700000454206,"max":0.15602700000454206},"freshProcess.reconnect":{"n":1,"min":42717.053567,"median":42717.053567,"p90":42717.053567,"max":42717.053567},"freshProcess.waitTerminal":{"n":1,"min":18.181256000003486,"median":18.181256000003486,"p90":18.181256000003486,"max":18.181256000003486},"workspace":{"n":1,"min":29.673814999999877,"median":29.673814999999877,"p90":29.673814999999877,"max":29.673814999999877}}},"sessionSpend":"[REDACTED]","attempts":[{"index":0,"completionSequence":0,"startedAt":"2026-08-29T04:39:15.108Z","completedAt":"2026-08-29T04:40:58.587Z","requireZeroActiveResourceDelta":false,"proof":{"schemaVersion":"braid.tangle-sandbox-braid-stress.v1","status":"passed","proofId":"braid-cloud-stress-1787978355109-594335-3c725ae5","resourceIdentity":{"observed":true,"id":"sandbox-8a7c7179df0c","name":"braid-session-braid-[REDACTED]","metadata":{"owner":"braid","lifecycle":"retained","providerSessionId":"[REDACTED]"}},"config":{"endpoint":"https://sandbox.tangle.tools","connectionId":"connection-live-tangle-sandbox","connectionKind":"tangle-sandbox","credentialConfigured":true,"model":"[REDACTED]","runner":"[REDACTED]","lifecycle":"retained","idleTtlSeconds":1800},"processes":{"first":{"signal":"SIGKILL","code":null,"sent":true,"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":null,"signal":"SIGKILL"}}},"cancelled":{"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":0,"signal":null}}},"retry":{"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":0,"signal":null}}},"localRunCountAfterReconnect":1,"binarySha256":"141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f"},"runs":{"first":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"streaming","environmentId":"environment-2141a56a9f43ec034144be719f37f1bd","providerSessionId":"[REDACTED]","materializationDigest":"7a194ac672e429a2b1f9268fc587a9ef5886a31697110438c913a78c2afdc6e6","cursor":"13","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-8a7c7179df0c","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:7b96801a7ebf1057f60c57b80b0b58a0ff111601eac0cbeaa3872b2aa4ed2ce2"},"observations":{"localEnvironmentId":"environment-2141a56a9f43ec034144be719f37f1bd","providerEnvironmentId":"sandbox-8a7c7179df0c","environmentRecord":{"id":"environment-2141a56a9f43ec034144be719f37f1bd","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-8a7c7179df0c","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-8a7c7179df0c.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:39:20.286Z","updatedAt":"2026-08-29T04:39:23.203Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"resumed":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","environmentId":"environment-2141a56a9f43ec034144be719f37f1bd","providerSessionId":"[REDACTED]","materializationDigest":"7a194ac672e429a2b1f9268fc587a9ef5886a31697110438c913a78c2afdc6e6","cursor":"62","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-8a7c7179df0c","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:7b96801a7ebf1057f60c57b80b0b58a0ff111601eac0cbeaa3872b2aa4ed2ce2"},"observations":{"localEnvironmentId":"environment-2141a56a9f43ec034144be719f37f1bd","providerEnvironmentId":"sandbox-8a7c7179df0c","environmentRecord":{"id":"environment-2141a56a9f43ec034144be719f37f1bd","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-8a7c7179df0c","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-8a7c7179df0c.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:39:20.286Z","updatedAt":"2026-08-29T04:39:23.203Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"followUp":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","environmentId":"environment-2141a56a9f43ec034144be719f37f1bd","providerSessionId":"[REDACTED]","materializationDigest":"e0195b648390dd540add39c689c0e9b36287fdc8a442e57f0a12a9f2d82d8427","cursor":"89","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-8a7c7179df0c","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:3517133c5a629c7c3b36d573c8a315da5cd0ee874f99f7545e624790bee6d348"},"observations":{"localEnvironmentId":"environment-2141a56a9f43ec034144be719f37f1bd","providerEnvironmentId":"sandbox-8a7c7179df0c","environmentRecord":{"id":"environment-2141a56a9f43ec034144be719f37f1bd","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-8a7c7179df0c","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-8a7c7179df0c.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:39:20.286Z","updatedAt":"2026-08-29T04:40:24.443Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"cancelled":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"aborted","environmentId":"environment-2141a56a9f43ec034144be719f37f1bd","providerSessionId":"[REDACTED]","materializationDigest":"479eff7fffbc868a1d52463b3b39dc0840b40ed3b905b72e2052a62f3f9719c8","cursor":"96","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-8a7c7179df0c","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:6a692c578aeceb4518edbea3e26860b6332272d1ee472c6bf82c1561b8b8778c"},"observations":{"localEnvironmentId":"environment-2141a56a9f43ec034144be719f37f1bd","providerEnvironmentId":"sandbox-8a7c7179df0c","environmentRecord":{"id":"environment-2141a56a9f43ec034144be719f37f1bd","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-8a7c7179df0c","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-8a7c7179df0c.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:39:20.286Z","updatedAt":"2026-08-29T04:40:45.940Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}}},"replay":{"firstVisibleEventCount":6,"freshVisibleEventCount":24,"freshVisibleEventIdsUnique":true,"resumeFromCursor":"13","finalCursor":"62","acknowledgedBeforeKillEventIds":["5","6","8","10","11","13"],"freshVisibleEventIds":["17","19","20","22","23","25","29","31","32","34","36","38","42","44","45","47","48","49","50","51","52","53","57","59"],"acknowledgedAndFreshIntersection":[],"progress":{"acknowledgedSequence":9,"firstFreshSequence":11},"reconnectRequest":{"version":1,"requestId":"braid-live-reconnect-e12373dc-73c2-4b70-bdfc-7423ed2633e5","operationId":"op-braid-cloud-stress-1787978355109-594335-3c725ae5-reconnect-1","command":"reconnect","params":{"runId":"[REDACTED]"}}},"cancellation":{"first":{"version":1,"type":"ack","requestId":"braid-live-cancel_run-26fceda2-4bd5-4dc8-a02d-53cbf4c3acab","revision":85,"operationId":"op-braid-cloud-stress-1787978355109-594335-3c725ae5-cancel-1","command":"cancel_run","runId":"[REDACTED]","control":"cancel","outcome":"accepted","replayed":false},"sameBody":{"version":1,"type":"ack","requestId":"braid-live-cancel_run-47a89573-5c84-4a15-bfe0-bbab4867ce8c","revision":89,"operationId":"op-braid-cloud-stress-1787978355109-594335-3c725ae5-cancel-1","command":"cancel_run","runId":"[REDACTED]","control":"cancel","outcome":"accepted","replayed":true},"changedBody":{"version":1,"type":"error","requestId":"braid-live-cancel_run-e5ec9aab-c853-4903-b7f4-17b5755d67cf","code":"OPERATION_CONFLICT","message":"Operation op-braid-cloud-stress-1787978355109-594335-3c725ae5-cancel-1 has different input","retryable":false},"remote":{"controlRef":"[CIRCULAR]","samples":[{"status":"cancelled","activeExecutionId":null,"latestExecutionId":"[REDACTED]","observedAt":"2026-08-29T04:40:50.835Z"}],"settledStatus":"cancelled","exactResult":{"executionId":"[REDACTED]","status":"failed","success":false},"messageCount":5,"lateResult":false}},"account":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","usage":{"computeMinutes":1629,"gpuSeconds":0,"gpuCostUsd":0,"activeSandboxes":7,"totalSandboxes":14476},"sampledAt":"2026-08-29T04:40:22.293Z"},"telemetry":{"completeDisclosure":true,"fields":{"tokens":{"status":"[REDACTED]","input":8375,"output":249},"cost":{"status":"[REDACTED]","usd":0},"endToEndDuration":{"status":"[REDACTED]","milliseconds":17694},"model":{"status":"[REDACTED]","value":"[REDACTED]"},"environment":{"status":"[REDACTED]","value":"sandbox-8a7c7179df0c"},"runtimeEndpoint":{"status":"[REDACTED]","host":"sandbox-8a7c7179df0c.tangle.sh"},"machine":{"status":"[REDACTED]"},"region":{"status":"[REDACTED]"},"requestedResources":{"status":"provider-default"},"resourceSample":{"status":"[REDACTED]","value":{"cgroupVersion":2,"memoryCurrentMb":228,"memoryPeakMb":694,"memoryLimitMb":2048,"cpuUsageUsec":62239102,"sampledAtMs":1787978442291}},"account":{"status":"[REDACTED]","value":"[CIRCULAR]"}},"unavailable":"[CIRCULAR]","runs":{"first":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"},"resumed":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]","input":"[TRUNCATED]","output":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]","usd":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"},"followUp":{"completeDisclosure":true,"fields":"[CIRCULAR]","unavailable":"[CIRCULAR]"},"cancelled":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"}}},"spend":{"scope":"all unique local runs in this cloud proof","rows":[{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]","input":3740,"output":587},"cost":{"status":"[REDACTED]","usd":0,"provenance":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":61028}},{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]","input":8375,"output":249},"cost":{"status":"[REDACTED]","usd":0,"provenance":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":17694}},{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"aborted","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]"},"cost":{"status":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":6073}}],"totals":{"tokens":{"observedRuns":2,"unavailableRuns":1,"missingRuns":0,"input":12115,"output":836},"cost":{"observedRuns":2,"unavailableRuns":1,"missingRuns":0,"usd":0}}},"followUpEvidence":{"visibleProviderEvents":9,"continuity":{"challengePath":".braid-live/braid-cloud-stress-1787978355109-594335-3c725ae5/continuity-challenge.txt","responsePath":".braid-live/braid-cloud-stress-1787978355109-594335-3c725ae5/continuity-response.txt","challengeBytes":65,"expectedDigest":"2323f38ac6eccebcecc57edfec4761929a35ed20c2d11f21f41116dabda660e5","responseDigest":"2323f38ac6eccebcecc57edfec4761929a35ed20c2d11f21f41116dabda660e5","matched":true}},"workspaceVerification":{"environmentId":"sandbox-8a7c7179df0c","markerPath":".braid-live/braid-cloud-stress-1787978355109-594335-3c725ae5/marker.txt","readValue":"BRAID_CLOUD_1787978355109_594335_3c725ae5 ","readMatched":true,"executionAttempt":{"path":".braid-live/braid-cloud-stress-1787978355109-594335-3c725ae5/execution-attempts.log","lineCount":1,"expectedDigest":"sha256:09e7687e48307643e091468bf86a0359c9891621d4ab3e8a604e4be9aa7c6614","observedDigest":"sha256:09e7687e48307643e091468bf86a0359c9891621d4ab3e8a604e4be9aa7c6614","matched":true},"continuity":"[CIRCULAR]","git":{"exitCode":0,"stdout":""},"resourceSample":"[CIRCULAR]"},"timing":{"workspace":{"elapsedMs":29.673814999999877},"firstProcess.initialize":{"elapsedMs":487.18293800000015},"firstProcess.send":{"elapsedMs":1520.441691},"firstProcess.observeControl":{"elapsedMs":6829.522201},"firstProcess.waitVisible":{"elapsedMs":10280.848214000001},"firstProcess.sigkill":{"elapsedMs":67.82232600000134},"freshProcess.initialize":{"elapsedMs":401.67595000000074},"freshProcess.reconnect":{"elapsedMs":42717.053567},"freshProcess.waitTerminal":{"elapsedMs":18.181256000003486},"freshProcess.observeControl":{"elapsedMs":0.15602700000454206},"followUp.prepareContinuityChallenge":{"elapsedMs":1457.6963579999938},"followUp.send":{"elapsedMs":601.1853370000026},"followUp.waitTerminal":{"elapsedMs":17749.502548999997},"followUp.observeControl":{"elapsedMs":0.23437200000626035},"followUp.verifyWorkspace":{"elapsedMs":2756.312380999996},"cancel.send":{"elapsedMs":1326.6062390000006},"cancel.observeControl":{"elapsedMs":4722.709656999999},"cancel.first":{"elapsedMs":1316.3715419999935},"cancel.waitCompletion":{"elapsedMs":51.0732330000028},"cancel.verifyRemote":{"elapsedMs":2887.3814199999906},"cancel.restart.closeFirstProcess":{"elapsedMs":77.09555700000783},"cancel.restart.initialize":{"elapsedMs":406.76111399999354},"cancel.retrySameBody":{"elapsedMs":18.133082000000286},"cancel.retryChangedBody":{"elapsedMs":1.488152000005357},"cancel.restart.closeRetryProcess":{"elapsedMs":76.6919329999946},"totalMs":103478.361886},"cleanup":{"exactResource":true,"mode":"exact-owned-resource-set","identity":{"confirmed":true,"mode":"exact-owned-resource-set","matchedCount":1,"removedIds":["sandbox-8a7c7179df0c"],"deletions":[{"id":"sandbox-8a7c7179df0c","attempts":["[TRUNCATED]"],"confirmed":true}],"remainingIds":[]},"activeResourceDelta":0,"activeResourceDeltaRequired":false,"accountUsageScope":"account-wide","accountUsageAttribution":"unattributed-shared-usage","usageObservationComplete":true,"usageDelta":{"activeSandboxes":0,"totalSandboxes":1,"computeMinutes":14,"gpuSeconds":0,"gpuCostUsd":0,"unknownFields":[]}},"usage":[{"phase":"before","status":"[REDACTED]","value":"[CIRCULAR]"},{"phase":"after","status":"[REDACTED]","value":"[CIRCULAR]"}],"accountIdentities":[{"phase":"before","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}},{"phase":"after","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}}],"accountIdentityConsistency":{"stable":true,"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46"},"progress":{"firstRunId":"[REDACTED]","cancelRunId":"[REDACTED]","providerEnvironmentId":"sandbox-8a7c7179df0c","firstControlRef":"[CIRCULAR]","resumeFromCursor":"13","freshControlRef":"[CIRCULAR]","finalCursor":"62"}}}]} diff --git a/artifacts/verification/live/tangle-sandbox-braid-stress-current-cohort-proc-fixed.json b/artifacts/verification/live/tangle-sandbox-braid-stress-current-cohort-proc-fixed.json new file mode 100644 index 00000000..87d14813 --- /dev/null +++ b/artifacts/verification/live/tangle-sandbox-braid-stress-current-cohort-proc-fixed.json @@ -0,0 +1 @@ +{"schemaVersion":"braid.tangle-sandbox-braid-soak.v1","status":"passed","startedAt":"2026-08-29T04:41:26.261Z","completedAt":"2026-08-29T04:45:09.555Z","requestedRuns":3,"attemptedRuns":3,"concurrency":2,"stoppedAfterCanary":false,"failures":[],"cleanup":{"exactProofs":3,"exactResourcesRemaining":0,"resourceProofsUnavailable":0,"activeResourceDelta":0,"activeResourceDeltas":[0,1,0]},"accountUsage":{"complete":true,"before":{"computeMinutes":1636,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":6,"totalSandboxes":14476,"periodStart":{},"periodEnd":{}},"after":{"computeMinutes":1662,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":6,"totalSandboxes":14481,"periodStart":{},"periodEnd":{}},"delta":{"activeSandboxes":0,"totalSandboxes":5,"computeMinutes":26,"gpuSeconds":0,"gpuCostUsd":0,"unknownFields":[]}},"latency":{"totalMs":{"n":3,"min":100638.65110399999,"median":108511.577914,"p90":114778.965921,"max":114778.965921},"phases":{"cancel.first":{"n":3,"min":1369.863360999996,"median":1390.1583870000031,"p90":1447.6587350000045,"max":1447.6587350000045},"cancel.observeControl":{"n":3,"min":4543.886706999998,"median":4562.294001000002,"p90":5088.457620000001,"max":5088.457620000001},"cancel.restart.closeFirstProcess":{"n":3,"min":78.10680399999546,"median":79.5632859999896,"p90":117.41563800000586,"max":117.41563800000586},"cancel.restart.closeRetryProcess":{"n":3,"min":69.44933899999887,"median":77.6836829999811,"p90":107.88045300001977,"max":107.88045300001977},"cancel.restart.initialize":{"n":3,"min":411.6954550000082,"median":437.07934700000624,"p90":761.8758670000243,"max":761.8758670000243},"cancel.retryChangedBody":{"n":3,"min":1.230875000008382,"median":4.132320999997319,"p90":17.793123999988893,"max":17.793123999988893},"cancel.retrySameBody":{"n":3,"min":5.7078050000127405,"median":15.151038999989396,"p90":22.831900999997742,"max":22.831900999997742},"cancel.send":{"n":3,"min":125.76695099999779,"median":130.38721299997997,"p90":271.05052100001194,"max":271.05052100001194},"cancel.verifyRemote":{"n":3,"min":2995.3996590000024,"median":3067.5181879999873,"p90":3105.6106410000066,"max":3105.6106410000066},"cancel.waitCompletion":{"n":3,"min":49.367528000002494,"median":49.79504799999995,"p90":102.92078300000867,"max":102.92078300000867},"firstProcess.initialize":{"n":3,"min":486.70759800000815,"median":488.34459000000015,"p90":512.4130389999918,"max":512.4130389999918},"firstProcess.observeControl":{"n":3,"min":5971.305828000011,"median":6517.56878,"p90":6565.403333000009,"max":6565.403333000009},"firstProcess.send":{"n":3,"min":259.08415600000035,"median":321.246742000003,"p90":1071.1765619999933,"max":1071.1765619999933},"firstProcess.sigkill":{"n":3,"min":53.602006999997684,"median":54.131472000008216,"p90":57.32763899999554,"max":57.32763899999554},"firstProcess.waitVisible":{"n":3,"min":14551.70257200001,"median":18501.463623000003,"p90":22881.919364,"max":22881.919364},"followUp.observeControl":{"n":3,"min":0.17704899999080226,"median":0.1880599999858532,"p90":0.26050299999769777,"max":0.26050299999769777},"followUp.prepareContinuityChallenge":{"n":3,"min":1301.8622120000073,"median":1420.0105029999977,"p90":1430.7034649999987,"max":1430.7034649999987},"followUp.send":{"n":3,"min":115.12191799998982,"median":130.3075550000067,"p90":1295.0027110000083,"max":1295.0027110000083},"followUp.verifyWorkspace":{"n":3,"min":1931.2702069999941,"median":2086.7500859999855,"p90":2952.133624000009,"max":2952.133624000009},"followUp.waitTerminal":{"n":3,"min":18232.775288999983,"median":20727.527894000013,"p90":22803.777100000007,"max":22803.777100000007},"freshProcess.initialize":{"n":3,"min":429.2705309999983,"median":431.6718390000169,"p90":432.6593540000031,"max":432.6593540000031},"freshProcess.observeControl":{"n":3,"min":0.08001800000783987,"median":0.10725100000854582,"p90":0.1830210000043735,"max":0.1830210000043735},"freshProcess.reconnect":{"n":3,"min":36038.479315000004,"median":41807.498239,"p90":42427.32603200001,"max":42427.32603200001},"freshProcess.waitTerminal":{"n":3,"min":6.248559999992722,"median":13.952366999990772,"p90":15.183192000025883,"max":15.183192000025883},"workspace":{"n":3,"min":8.756439999997383,"median":11.65107400000852,"p90":24.727975000000015,"max":24.727975000000015}}},"sessionSpend":"[REDACTED]","attempts":[{"index":0,"completionSequence":0,"startedAt":"2026-08-29T04:41:26.261Z","completedAt":"2026-08-29T04:43:21.041Z","requireZeroActiveResourceDelta":false,"proof":{"schemaVersion":"braid.tangle-sandbox-braid-stress.v1","status":"passed","proofId":"braid-cloud-stress-1787978486262-681810-fbee6642","resourceIdentity":{"observed":true,"id":"sandbox-f8b511132bfe","name":"braid-session-braid-[REDACTED]","metadata":{"owner":"braid","lifecycle":"retained","providerSessionId":"[REDACTED]"}},"config":{"endpoint":"https://sandbox.tangle.tools","connectionId":"connection-live-tangle-sandbox","connectionKind":"tangle-sandbox","credentialConfigured":true,"model":"[REDACTED]","runner":"[REDACTED]","lifecycle":"retained","idleTtlSeconds":1800},"processes":{"first":{"signal":"SIGKILL","code":null,"sent":true,"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":null,"signal":"SIGKILL"}}},"cancelled":{"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":0,"signal":null}}},"retry":{"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":0,"signal":null}}},"localRunCountAfterReconnect":1,"binarySha256":"141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f"},"runs":{"first":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"streaming","environmentId":"environment-98bfa83033b96e374a4c92f36a4e9b82","providerSessionId":"[REDACTED]","materializationDigest":"ab445c9771b7d1850bb2dfa02ac95d90c4dc07558b05479bdbe15574f3ca2ebb","cursor":"16","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-f8b511132bfe","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:5e663eb9bc1231d3430bca4cd061e7dd250728948dce930c231db34cee795230"},"observations":{"localEnvironmentId":"environment-98bfa83033b96e374a4c92f36a4e9b82","providerEnvironmentId":"sandbox-f8b511132bfe","environmentRecord":{"id":"environment-98bfa83033b96e374a4c92f36a4e9b82","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-f8b511132bfe","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-f8b511132bfe.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:41:29.508Z","updatedAt":"2026-08-29T04:41:31.963Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"resumed":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","environmentId":"environment-98bfa83033b96e374a4c92f36a4e9b82","providerSessionId":"[REDACTED]","materializationDigest":"ab445c9771b7d1850bb2dfa02ac95d90c4dc07558b05479bdbe15574f3ca2ebb","cursor":"61","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-f8b511132bfe","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:5e663eb9bc1231d3430bca4cd061e7dd250728948dce930c231db34cee795230"},"observations":{"localEnvironmentId":"environment-98bfa83033b96e374a4c92f36a4e9b82","providerEnvironmentId":"sandbox-f8b511132bfe","environmentRecord":{"id":"environment-98bfa83033b96e374a4c92f36a4e9b82","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-f8b511132bfe","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-f8b511132bfe.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:41:29.508Z","updatedAt":"2026-08-29T04:41:31.963Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"followUp":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","environmentId":"environment-98bfa83033b96e374a4c92f36a4e9b82","providerSessionId":"[REDACTED]","materializationDigest":"058c0f718d6a40c0aeb0cb72d35e7b8ce0f804c41e93701956d79e3eb00ac631","cursor":"88","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-f8b511132bfe","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:32e942b006c89188d4d9b7efe0b2e1478706f15d5690183aec941edc4bbbc410"},"observations":{"localEnvironmentId":"environment-98bfa83033b96e374a4c92f36a4e9b82","providerEnvironmentId":"sandbox-f8b511132bfe","environmentRecord":{"id":"environment-98bfa83033b96e374a4c92f36a4e9b82","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-f8b511132bfe","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-f8b511132bfe.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:41:29.508Z","updatedAt":"2026-08-29T04:42:46.108Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"cancelled":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"aborted","environmentId":"environment-98bfa83033b96e374a4c92f36a4e9b82","providerSessionId":"[REDACTED]","materializationDigest":"acfdeb12b226b10ad10fc4c91d52395225e89156c0201700ca770414f9552c95","cursor":"95","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-f8b511132bfe","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:3b0ec3438780b1312f849a8d6da49e90c07bc024305daa5ccfaaba0c4c785c85"},"observations":{"localEnvironmentId":"environment-98bfa83033b96e374a4c92f36a4e9b82","providerEnvironmentId":"sandbox-f8b511132bfe","environmentRecord":{"id":"environment-98bfa83033b96e374a4c92f36a4e9b82","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-f8b511132bfe","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-f8b511132bfe.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:41:29.508Z","updatedAt":"2026-08-29T04:43:08.559Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}}},"replay":{"firstVisibleEventCount":9,"freshVisibleEventCount":21,"freshVisibleEventIdsUnique":true,"resumeFromCursor":"16","finalCursor":"61","acknowledgedBeforeKillEventIds":["5","6","8","10","11","12","13","14","16"],"freshVisibleEventIds":["20","22","23","25","26","28","30","34","36","37","39","41","45","47","48","49","50","51","52","56","58"],"acknowledgedAndFreshIntersection":[],"progress":{"acknowledgedSequence":12,"firstFreshSequence":14},"reconnectRequest":{"version":1,"requestId":"braid-live-reconnect-0a7309df-52ab-43b4-8b47-545f0ba1c17e","operationId":"op-braid-cloud-stress-1787978486262-681810-fbee6642-reconnect-1","command":"reconnect","params":{"runId":"[REDACTED]"}}},"cancellation":{"first":{"version":1,"type":"ack","requestId":"braid-live-cancel_run-8d38c5d0-3f79-4386-9559-b89e826687a1","revision":85,"operationId":"op-braid-cloud-stress-1787978486262-681810-fbee6642-cancel-1","command":"cancel_run","runId":"[REDACTED]","control":"cancel","outcome":"accepted","replayed":false},"sameBody":{"version":1,"type":"ack","requestId":"braid-live-cancel_run-621e5e9f-d90c-4ea9-a288-f8333df7d6ea","revision":89,"operationId":"op-braid-cloud-stress-1787978486262-681810-fbee6642-cancel-1","command":"cancel_run","runId":"[REDACTED]","control":"cancel","outcome":"accepted","replayed":true},"changedBody":{"version":1,"type":"error","requestId":"braid-live-cancel_run-fb8a0368-7004-4cf0-a623-f3a3e1484d26","code":"OPERATION_CONFLICT","message":"Operation op-braid-cloud-stress-1787978486262-681810-fbee6642-cancel-1 has different input","retryable":false},"remote":{"controlRef":"[CIRCULAR]","samples":[{"status":"cancelled","activeExecutionId":null,"latestExecutionId":"[REDACTED]","observedAt":"2026-08-29T04:43:13.913Z"}],"settledStatus":"cancelled","exactResult":{"executionId":"[REDACTED]","status":"failed","success":false},"messageCount":5,"lateResult":false}},"account":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","usage":{"computeMinutes":1643,"gpuSeconds":0,"gpuCostUsd":0,"activeSandboxes":8,"totalSandboxes":14478},"sampledAt":"2026-08-29T04:42:42.812Z"},"telemetry":{"completeDisclosure":true,"fields":{"tokens":{"status":"[REDACTED]","input":6917,"output":214},"cost":{"status":"[REDACTED]","usd":0},"endToEndDuration":{"status":"[REDACTED]","milliseconds":20655},"model":{"status":"[REDACTED]","value":"[REDACTED]"},"environment":{"status":"[REDACTED]","value":"sandbox-f8b511132bfe"},"runtimeEndpoint":{"status":"[REDACTED]","host":"sandbox-f8b511132bfe.tangle.sh"},"machine":{"status":"[REDACTED]"},"region":{"status":"[REDACTED]"},"requestedResources":{"status":"provider-default"},"resourceSample":{"status":"[REDACTED]","value":{"cgroupVersion":2,"memoryCurrentMb":169,"memoryPeakMb":640,"memoryLimitMb":2048,"cpuUsageUsec":58883134,"sampledAtMs":1787978585977}},"account":{"status":"[REDACTED]","value":"[CIRCULAR]"}},"unavailable":"[CIRCULAR]","runs":{"first":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"},"resumed":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]","input":"[TRUNCATED]","output":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]","usd":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"},"followUp":{"completeDisclosure":true,"fields":"[CIRCULAR]","unavailable":"[CIRCULAR]"},"cancelled":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"}}},"spend":{"scope":"all unique local runs in this cloud proof","rows":[{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]","input":3812,"output":574},"cost":{"status":"[REDACTED]","usd":0,"provenance":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":72268}},{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]","input":6917,"output":214},"cost":{"status":"[REDACTED]","usd":0,"provenance":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":20655}},{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"aborted","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]"},"cost":{"status":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":6575}}],"totals":{"tokens":{"observedRuns":2,"unavailableRuns":1,"missingRuns":0,"input":10729,"output":788},"cost":{"observedRuns":2,"unavailableRuns":1,"missingRuns":0,"usd":0}}},"followUpEvidence":{"visibleProviderEvents":9,"continuity":{"challengePath":".braid-live/braid-cloud-stress-1787978486262-681810-fbee6642/continuity-challenge.txt","responsePath":".braid-live/braid-cloud-stress-1787978486262-681810-fbee6642/continuity-response.txt","challengeBytes":65,"expectedDigest":"fb031aa67353d4d6476519e8d6df8ebd2f3ad75f0ec5d70e0f467a620fd7fe02","responseDigest":"fb031aa67353d4d6476519e8d6df8ebd2f3ad75f0ec5d70e0f467a620fd7fe02","matched":true}},"workspaceVerification":{"environmentId":"sandbox-f8b511132bfe","markerPath":".braid-live/braid-cloud-stress-1787978486262-681810-fbee6642/marker.txt","readValue":"BRAID_CLOUD_1787978486262_681810_fbee6642 ","readMatched":true,"executionAttempt":{"path":".braid-live/braid-cloud-stress-1787978486262-681810-fbee6642/execution-attempts.log","lineCount":1,"expectedDigest":"sha256:d212326cfb95b19bfc4d613ba2bac023ed4eaba0c43df3c30cf643dd05857622","observedDigest":"sha256:d212326cfb95b19bfc4d613ba2bac023ed4eaba0c43df3c30cf643dd05857622","matched":true},"continuity":"[CIRCULAR]","git":{"exitCode":0,"stdout":""},"resourceSample":"[CIRCULAR]"},"timing":{"workspace":{"elapsedMs":24.727975000000015},"firstProcess.initialize":{"elapsedMs":488.34459000000015},"firstProcess.send":{"elapsedMs":259.08415600000035},"firstProcess.observeControl":{"elapsedMs":6517.56878},"firstProcess.waitVisible":{"elapsedMs":22881.919364},"firstProcess.sigkill":{"elapsedMs":53.602006999997684},"freshProcess.initialize":{"elapsedMs":429.2705309999983},"freshProcess.reconnect":{"elapsedMs":41807.498239},"freshProcess.waitTerminal":{"elapsedMs":6.248559999992722},"freshProcess.observeControl":{"elapsedMs":0.1830210000043735},"followUp.prepareContinuityChallenge":{"elapsedMs":1430.7034649999987},"followUp.send":{"elapsedMs":1295.0027110000083},"followUp.waitTerminal":{"elapsedMs":20727.527894000013},"followUp.observeControl":{"elapsedMs":0.26050299999769777},"followUp.verifyWorkspace":{"elapsedMs":1931.2702069999941},"cancel.send":{"elapsedMs":271.05052100001194},"cancel.observeControl":{"elapsedMs":5088.457620000001},"cancel.first":{"elapsedMs":1447.6587350000045},"cancel.waitCompletion":{"elapsedMs":49.79504799999995},"cancel.verifyRemote":{"elapsedMs":2995.3996590000024},"cancel.restart.closeFirstProcess":{"elapsedMs":78.10680399999546},"cancel.restart.initialize":{"elapsedMs":437.07934700000624},"cancel.retrySameBody":{"elapsedMs":5.7078050000127405},"cancel.retryChangedBody":{"elapsedMs":4.132320999997319},"cancel.restart.closeRetryProcess":{"elapsedMs":69.44933899999887},"totalMs":114778.965921},"cleanup":{"exactResource":true,"mode":"exact-owned-resource-set","identity":{"confirmed":true,"mode":"exact-owned-resource-set","matchedCount":1,"removedIds":["sandbox-f8b511132bfe"],"deletions":[{"id":"sandbox-f8b511132bfe","attempts":["[TRUNCATED]"],"confirmed":true}],"remainingIds":[]},"activeResourceDelta":0,"activeResourceDeltaRequired":false,"accountUsageScope":"account-wide","accountUsageAttribution":"unattributed-shared-usage","usageObservationComplete":true,"usageDelta":{"activeSandboxes":0,"totalSandboxes":2,"computeMinutes":11,"gpuSeconds":0,"gpuCostUsd":0,"unknownFields":[]}},"usage":[{"phase":"before","status":"[REDACTED]","value":"[CIRCULAR]"},{"phase":"after","status":"[REDACTED]","value":{"computeMinutes":1647,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":6,"totalSandboxes":14478,"periodStart":{},"periodEnd":{}}}],"accountIdentities":[{"phase":"before","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}},{"phase":"after","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}}],"accountIdentityConsistency":{"stable":true,"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46"},"progress":{"firstRunId":"[REDACTED]","cancelRunId":"[REDACTED]","providerEnvironmentId":"sandbox-f8b511132bfe","firstControlRef":"[CIRCULAR]","resumeFromCursor":"16","freshControlRef":"[CIRCULAR]","finalCursor":"61"}}},{"index":1,"completionSequence":1,"startedAt":"2026-08-29T04:43:21.042Z","completedAt":"2026-08-29T04:45:01.681Z","requireZeroActiveResourceDelta":false,"proof":{"schemaVersion":"braid.tangle-sandbox-braid-stress.v1","status":"passed","proofId":"braid-cloud-stress-1787978601042-681810-c1e7a152","resourceIdentity":{"observed":true,"id":"sandbox-3049cbe59267","name":"braid-session-braid-[REDACTED]","metadata":{"owner":"braid","lifecycle":"retained","providerSessionId":"[REDACTED]"}},"config":{"endpoint":"https://sandbox.tangle.tools","connectionId":"connection-live-tangle-sandbox","connectionKind":"tangle-sandbox","credentialConfigured":true,"model":"[REDACTED]","runner":"[REDACTED]","lifecycle":"retained","idleTtlSeconds":1800},"processes":{"first":{"signal":"SIGKILL","code":null,"sent":true,"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":null,"signal":"SIGKILL"}}},"cancelled":{"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":0,"signal":null}}},"retry":{"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":0,"signal":null}}},"localRunCountAfterReconnect":1,"binarySha256":"141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f"},"runs":{"first":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"streaming","environmentId":"environment-5b570df89fb3fb080f1087b87341514a","providerSessionId":"[REDACTED]","materializationDigest":"66594ba7ef166d1c4262ceb54583d7a84ac856c6fea6062cda3492327ce8db96","cursor":"17","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-3049cbe59267","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:1c9db1e28307f78ecb7c9d8a47d3dcf1e50ae9b8d9fdd7658c0376b741c72216"},"observations":{"localEnvironmentId":"environment-5b570df89fb3fb080f1087b87341514a","providerEnvironmentId":"sandbox-3049cbe59267","environmentRecord":{"id":"environment-5b570df89fb3fb080f1087b87341514a","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-3049cbe59267","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-3049cbe59267.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:43:23.222Z","updatedAt":"2026-08-29T04:43:25.622Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"resumed":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","environmentId":"environment-5b570df89fb3fb080f1087b87341514a","providerSessionId":"[REDACTED]","materializationDigest":"66594ba7ef166d1c4262ceb54583d7a84ac856c6fea6062cda3492327ce8db96","cursor":"40","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-3049cbe59267","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:1c9db1e28307f78ecb7c9d8a47d3dcf1e50ae9b8d9fdd7658c0376b741c72216"},"observations":{"localEnvironmentId":"environment-5b570df89fb3fb080f1087b87341514a","providerEnvironmentId":"sandbox-3049cbe59267","environmentRecord":{"id":"environment-5b570df89fb3fb080f1087b87341514a","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-3049cbe59267","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-3049cbe59267.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:43:23.222Z","updatedAt":"2026-08-29T04:43:25.622Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"followUp":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","environmentId":"environment-5b570df89fb3fb080f1087b87341514a","providerSessionId":"[REDACTED]","materializationDigest":"061c889d3d7fe19c91c907631138934a8b1e1316b90e977791d97f55b1d2f89e","cursor":"70","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-3049cbe59267","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:57c013c414c7d50feabbdb39280c2d0fbc86482a695fa03fb5b2f657aed082e7"},"observations":{"localEnvironmentId":"environment-5b570df89fb3fb080f1087b87341514a","providerEnvironmentId":"sandbox-3049cbe59267","environmentRecord":{"id":"environment-5b570df89fb3fb080f1087b87341514a","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-3049cbe59267","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-3049cbe59267.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:43:23.222Z","updatedAt":"2026-08-29T04:44:27.496Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"cancelled":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"aborted","environmentId":"environment-5b570df89fb3fb080f1087b87341514a","providerSessionId":"[REDACTED]","materializationDigest":"283f84213813398c1435487de55a8d20a956e6d13af40e5b9078a081ec4da105","cursor":"77","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-3049cbe59267","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:f25159ba327cb7de672eeaf91328392d5675ea98550ed6a93bed58a79c1569ba"},"observations":{"localEnvironmentId":"environment-5b570df89fb3fb080f1087b87341514a","providerEnvironmentId":"sandbox-3049cbe59267","environmentRecord":{"id":"environment-5b570df89fb3fb080f1087b87341514a","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-3049cbe59267","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-3049cbe59267.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:43:23.222Z","updatedAt":"2026-08-29T04:44:48.761Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}}},"replay":{"firstVisibleEventCount":9,"freshVisibleEventCount":11,"freshVisibleEventIdsUnique":true,"resumeFromCursor":"17","finalCursor":"40","acknowledgedBeforeKillEventIds":["5","6","8","10","11","12","13","15","17"],"freshVisibleEventIds":["21","23","24","26","27","28","29","30","31","35","37"],"acknowledgedAndFreshIntersection":[],"progress":{"acknowledgedSequence":12,"firstFreshSequence":14},"reconnectRequest":{"version":1,"requestId":"braid-live-reconnect-8fcf11ab-ef7c-4e09-bd51-b61407df4b1e","operationId":"op-braid-cloud-stress-1787978601042-681810-c1e7a152-reconnect-1","command":"reconnect","params":{"runId":"[REDACTED]"}}},"cancellation":{"first":{"version":1,"type":"ack","requestId":"braid-live-cancel_run-28f80f9f-fdf8-457a-97ed-4befc48c0f2e","revision":75,"operationId":"op-braid-cloud-stress-1787978601042-681810-c1e7a152-cancel-1","command":"cancel_run","runId":"[REDACTED]","control":"cancel","outcome":"accepted","replayed":false},"sameBody":{"version":1,"type":"ack","requestId":"braid-live-cancel_run-0e88341a-b1d4-4bb6-91f4-6fc3fd1af8c2","revision":79,"operationId":"op-braid-cloud-stress-1787978601042-681810-c1e7a152-cancel-1","command":"cancel_run","runId":"[REDACTED]","control":"cancel","outcome":"accepted","replayed":true},"changedBody":{"version":1,"type":"error","requestId":"braid-live-cancel_run-877fd548-667f-404b-bef5-9e69f89a4583","code":"OPERATION_CONFLICT","message":"Operation op-braid-cloud-stress-1787978601042-681810-c1e7a152-cancel-1 has different input","retryable":false},"remote":{"controlRef":"[CIRCULAR]","samples":[{"status":"cancelled","activeExecutionId":null,"latestExecutionId":"[REDACTED]","observedAt":"2026-08-29T04:44:53.715Z"}],"settledStatus":"cancelled","exactResult":{"executionId":"[REDACTED]","status":"failed","success":false},"messageCount":5,"lateResult":false}},"account":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","usage":{"computeMinutes":1658,"gpuSeconds":0,"gpuCostUsd":0,"activeSandboxes":8,"totalSandboxes":14481},"sampledAt":"2026-08-29T04:44:26.068Z"},"telemetry":{"completeDisclosure":true,"fields":{"tokens":{"status":"[REDACTED]","input":5891,"output":251},"cost":{"status":"[REDACTED]","usd":0},"endToEndDuration":{"status":"[REDACTED]","milliseconds":18195},"model":{"status":"[REDACTED]","value":"[REDACTED]"},"environment":{"status":"[REDACTED]","value":"sandbox-3049cbe59267"},"runtimeEndpoint":{"status":"[REDACTED]","host":"sandbox-3049cbe59267.tangle.sh"},"machine":{"status":"[REDACTED]"},"region":{"status":"[REDACTED]"},"requestedResources":{"status":"provider-default"},"resourceSample":{"status":"[REDACTED]","value":{"cgroupVersion":2,"memoryCurrentMb":164,"memoryPeakMb":623,"memoryLimitMb":2048,"cpuUsageUsec":51831686,"sampledAtMs":1787978686330}},"account":{"status":"[REDACTED]","value":"[CIRCULAR]"}},"unavailable":"[CIRCULAR]","runs":{"first":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"},"resumed":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]","input":"[TRUNCATED]","output":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]","usd":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"},"followUp":{"completeDisclosure":true,"fields":"[CIRCULAR]","unavailable":"[CIRCULAR]"},"cancelled":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"}}},"spend":{"scope":"all unique local runs in this cloud proof","rows":[{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]","input":3301,"output":415},"cost":{"status":"[REDACTED]","usd":0,"provenance":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":61627}},{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]","input":5891,"output":251},"cost":{"status":"[REDACTED]","usd":0,"provenance":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":18195}},{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"aborted","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]"},"cost":{"status":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":5994}}],"totals":{"tokens":{"observedRuns":2,"unavailableRuns":1,"missingRuns":0,"input":9192,"output":666},"cost":{"observedRuns":2,"unavailableRuns":1,"missingRuns":0,"usd":0}}},"followUpEvidence":{"visibleProviderEvents":11,"continuity":{"challengePath":".braid-live/braid-cloud-stress-1787978601042-681810-c1e7a152/continuity-challenge.txt","responsePath":".braid-live/braid-cloud-stress-1787978601042-681810-c1e7a152/continuity-response.txt","challengeBytes":65,"expectedDigest":"7d1e4167403af1e85a35b7961edb1521366f6bebce894ce8b9d57d19fc108033","responseDigest":"7d1e4167403af1e85a35b7961edb1521366f6bebce894ce8b9d57d19fc108033","matched":true}},"workspaceVerification":{"environmentId":"sandbox-3049cbe59267","markerPath":".braid-live/braid-cloud-stress-1787978601042-681810-c1e7a152/marker.txt","readValue":"BRAID_CLOUD_1787978601042_681810_c1e7a152 ","readMatched":true,"executionAttempt":{"path":".braid-live/braid-cloud-stress-1787978601042-681810-c1e7a152/execution-attempts.log","lineCount":1,"expectedDigest":"sha256:8b7cb913e23198b14abb689d7f876dab44ca1eee640f26db213569a284319479","observedDigest":"sha256:8b7cb913e23198b14abb689d7f876dab44ca1eee640f26db213569a284319479","matched":true},"continuity":"[CIRCULAR]","git":{"exitCode":0,"stdout":""},"resourceSample":"[CIRCULAR]"},"timing":{"workspace":{"elapsedMs":8.756439999997383},"firstProcess.initialize":{"elapsedMs":512.4130389999918},"firstProcess.send":{"elapsedMs":321.246742000003},"firstProcess.observeControl":{"elapsedMs":5971.305828000011},"firstProcess.waitVisible":{"elapsedMs":18501.463623000003},"firstProcess.sigkill":{"elapsedMs":54.131472000008216},"freshProcess.initialize":{"elapsedMs":432.6593540000031},"freshProcess.reconnect":{"elapsedMs":36038.479315000004},"freshProcess.waitTerminal":{"elapsedMs":13.952366999990772},"freshProcess.observeControl":{"elapsedMs":0.08001800000783987},"followUp.prepareContinuityChallenge":{"elapsedMs":1420.0105029999977},"followUp.send":{"elapsedMs":115.12191799998982},"followUp.waitTerminal":{"elapsedMs":18232.775288999983},"followUp.observeControl":{"elapsedMs":0.17704899999080226},"followUp.verifyWorkspace":{"elapsedMs":2952.133624000009},"cancel.send":{"elapsedMs":130.38721299997997},"cancel.observeControl":{"elapsedMs":4562.294001000002},"cancel.first":{"elapsedMs":1369.863360999996},"cancel.waitCompletion":{"elapsedMs":49.367528000002494},"cancel.verifyRemote":{"elapsedMs":3067.5181879999873},"cancel.restart.closeFirstProcess":{"elapsedMs":117.41563800000586},"cancel.restart.initialize":{"elapsedMs":761.8758670000243},"cancel.retrySameBody":{"elapsedMs":22.831900999997742},"cancel.retryChangedBody":{"elapsedMs":17.793123999988893},"cancel.restart.closeRetryProcess":{"elapsedMs":107.88045300001977},"totalMs":100638.65110399999},"cleanup":{"exactResource":true,"mode":"exact-owned-resource-set","identity":{"confirmed":true,"mode":"exact-owned-resource-set","matchedCount":1,"removedIds":["sandbox-3049cbe59267"],"deletions":[{"id":"sandbox-3049cbe59267","attempts":["[TRUNCATED]"],"confirmed":true}],"remainingIds":[]},"activeResourceDelta":1,"activeResourceDeltaRequired":false,"accountUsageScope":"account-wide","accountUsageAttribution":"unattributed-shared-usage","usageObservationComplete":true,"usageDelta":{"activeSandboxes":1,"totalSandboxes":3,"computeMinutes":13,"gpuSeconds":0,"gpuCostUsd":0,"unknownFields":[]}},"usage":[{"phase":"before","status":"[REDACTED]","value":{"computeMinutes":1649,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":6,"totalSandboxes":14478,"periodStart":{},"periodEnd":{}}},{"phase":"after","status":"[REDACTED]","value":{"computeMinutes":1662,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":7,"totalSandboxes":14481,"periodStart":{},"periodEnd":{}}}],"accountIdentities":[{"phase":"before","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}},{"phase":"after","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}}],"accountIdentityConsistency":{"stable":true,"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46"},"progress":{"firstRunId":"[REDACTED]","cancelRunId":"[REDACTED]","providerEnvironmentId":"sandbox-3049cbe59267","firstControlRef":"[CIRCULAR]","resumeFromCursor":"17","freshControlRef":"[CIRCULAR]","finalCursor":"40"}}},{"index":2,"completionSequence":2,"startedAt":"2026-08-29T04:43:21.043Z","completedAt":"2026-08-29T04:45:09.554Z","requireZeroActiveResourceDelta":false,"proof":{"schemaVersion":"braid.tangle-sandbox-braid-stress.v1","status":"passed","proofId":"braid-cloud-stress-1787978601043-681810-e62b05c3","resourceIdentity":{"observed":true,"id":"sandbox-b954c767ac46","name":"braid-session-braid-[REDACTED]","metadata":{"owner":"braid","lifecycle":"retained","providerSessionId":"[REDACTED]"}},"config":{"endpoint":"https://sandbox.tangle.tools","connectionId":"connection-live-tangle-sandbox","connectionKind":"tangle-sandbox","credentialConfigured":true,"model":"[REDACTED]","runner":"[REDACTED]","lifecycle":"retained","idleTtlSeconds":1800},"processes":{"first":{"signal":"SIGKILL","code":null,"sent":true,"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":null,"signal":"SIGKILL"}}},"cancelled":{"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":0,"signal":null}}},"retry":{"cleanup":{"cleanupStatus":"natural-exit","exited":true,"descendantsVerified":true,"exit":{"code":0,"signal":null}}},"localRunCountAfterReconnect":1,"binarySha256":"141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f"},"runs":{"first":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"streaming","environmentId":"environment-55f66f4ea658a6fbee97b01987c97d90","providerSessionId":"[REDACTED]","materializationDigest":"e5ed1a954bbb479eec8c8291288cf3a8a984390e265277f23ba1008e1d7dd404","cursor":"14","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-b954c767ac46","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:e7386ec9c7fd561b1495bc80fa37e8050b448571af29f6c29505c26df61e562e"},"observations":{"localEnvironmentId":"environment-55f66f4ea658a6fbee97b01987c97d90","providerEnvironmentId":"sandbox-b954c767ac46","environmentRecord":{"id":"environment-55f66f4ea658a6fbee97b01987c97d90","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-b954c767ac46","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-b954c767ac46.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:43:24.381Z","updatedAt":"2026-08-29T04:43:26.946Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"resumed":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","environmentId":"environment-55f66f4ea658a6fbee97b01987c97d90","providerSessionId":"[REDACTED]","materializationDigest":"e5ed1a954bbb479eec8c8291288cf3a8a984390e265277f23ba1008e1d7dd404","cursor":"61","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-b954c767ac46","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:e7386ec9c7fd561b1495bc80fa37e8050b448571af29f6c29505c26df61e562e"},"observations":{"localEnvironmentId":"environment-55f66f4ea658a6fbee97b01987c97d90","providerEnvironmentId":"sandbox-b954c767ac46","environmentRecord":{"id":"environment-55f66f4ea658a6fbee97b01987c97d90","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-b954c767ac46","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-b954c767ac46.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:43:24.381Z","updatedAt":"2026-08-29T04:43:26.946Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"followUp":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","environmentId":"environment-55f66f4ea658a6fbee97b01987c97d90","providerSessionId":"[REDACTED]","materializationDigest":"4d838f50a6d455e4d5713825cd0a0e994bbd5892109322535bf303a1939ad916","cursor":"104","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-b954c767ac46","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:dd3a118481f0d1441c790424897bc183a75488246667a270a4ae853b69b21e9b"},"observations":{"localEnvironmentId":"environment-55f66f4ea658a6fbee97b01987c97d90","providerEnvironmentId":"sandbox-b954c767ac46","environmentRecord":{"id":"environment-55f66f4ea658a6fbee97b01987c97d90","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-b954c767ac46","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-b954c767ac46.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:43:24.381Z","updatedAt":"2026-08-29T04:44:31.359Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}},"cancelled":{"id":"[REDACTED]","operationId":"[REDACTED]","status":"aborted","environmentId":"environment-55f66f4ea658a6fbee97b01987c97d90","providerSessionId":"[REDACTED]","materializationDigest":"d7e256a993a264e81796ce48fcd122e2372e6b3f6422a9a989a8c2f720022cc5","cursor":"111","controlRef":{"runId":"[REDACTED]","provider":"tangle-sandbox","environmentId":"sandbox-b954c767ac46","sessionId":"[REDACTED]","executionId":"[REDACTED]","requestDigest":"sha256:ecf16c17d6a41bccc63c19563ab1f0423ee042930d10d8c1e51ebc3f6bb269c9"},"observations":{"localEnvironmentId":"environment-55f66f4ea658a6fbee97b01987c97d90","providerEnvironmentId":"sandbox-b954c767ac46","environmentRecord":{"id":"environment-55f66f4ea658a6fbee97b01987c97d90","connectionId":"connection-live-tangle-sandbox","kind":"sandbox","provider":"tangle-sandbox","providerEnvironmentId":"sandbox-b954c767ac46","lifecycle":"ready","lifecycleMode":"retained","cleanup":"explicit","continuity":"session","location":"remote","runtimeEndpointHost":"sandbox-b954c767ac46.tangle.sh","storagePersistence":"persistent-home","accountUsage":{"completeness":"[TRUNCATED]","customerId":"[TRUNCATED]","billingOwnerId":"[TRUNCATED]","computeMinutes":"[TRUNCATED]","gpuSeconds":"[TRUNCATED]","gpuCostUsd":"[TRUNCATED]","activeSandboxes":"[TRUNCATED]","totalSandboxes":"[TRUNCATED]","creditsAvailableUsd":"[TRUNCATED]","creditsUsedUsd":"[TRUNCATED]","monthlyBalanceUsd":"[TRUNCATED]","plan":"[TRUNCATED]","subscriptionStatus":"[TRUNCATED]","maximumConcurrentSandboxes":"[TRUNCATED]","maximumCpuCores":"[TRUNCATED]","maximumRamGB":"[TRUNCATED]","maximumStorageGB":"[TRUNCATED]","usagePeriodStart":"[TRUNCATED]","usagePeriodEnd":"[TRUNCATED]","subscriptionPeriodEnd":"[TRUNCATED]","sampledAt":"[TRUNCATED]"},"unavailableTelemetry":["[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]","[TRUNCATED]"],"createdAt":"2026-08-29T04:43:24.381Z","updatedAt":"2026-08-29T04:44:56.404Z"},"run":{"inputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"outputTokens":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"reasoningTokens":{"status":"[TRUNCATED]"},"cacheReadTokens":{"status":"[TRUNCATED]"},"cacheWriteTokens":{"status":"[TRUNCATED]"},"costUsd":{"status":"[TRUNCATED]"},"costStatus":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usage":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"tokensKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usdKnown":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"usageCompleteness":{"status":"[TRUNCATED]"},"latencyMs":{"status":"[TRUNCATED]"},"durationMs":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runner":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"operationId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"profileSnapshotId":{"status":"[TRUNCATED]"},"connectionId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerSessionId":"[REDACTED]","environmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"replayCursor":{"status":"[TRUNCATED]"},"lastCursor":{"status":"[TRUNCATED]"},"lastProviderSequence":{"status":"[TRUNCATED]"},"eventCount":{"status":"[TRUNCATED]"},"contentBytes":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"contentTruncated":{"status":"[TRUNCATED]"},"missingSequence":{"status":"[TRUNCATED]"},"terminalReason":{"status":"[TRUNCATED]"},"materializationDigest":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"complete":{"status":"[TRUNCATED]"},"status":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"error":{"status":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"terminalAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"}},"environment":{"kind":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"providerEnvironmentId":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"provider":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"name":{"status":"[TRUNCATED]"},"lifecycle":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"lifecycleMode":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"cleanup":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"continuity":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"location":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"runtimeEndpointHost":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"machineId":{"status":"[TRUNCATED]"},"requestedRegion":{"status":"[TRUNCATED]"},"verifiedRegion":{"status":"[TRUNCATED]"},"storagePersistence":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":{"status":"[TRUNCATED]"},"gpu":{"status":"[TRUNCATED]"},"accountUsage":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"unavailableTelemetry":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"placement":{"status":"[TRUNCATED]"},"repository":{"status":"[TRUNCATED]"},"gitRef":{"status":"[TRUNCATED]"},"workingDirectory":{"status":"[TRUNCATED]"},"image":{"status":"[TRUNCATED]"},"createdAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"startedAt":{"status":"[TRUNCATED]"},"lastActivityAt":{"status":"[TRUNCATED]"},"expiresAt":{"status":"[TRUNCATED]"},"updatedAt":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}}}}},"replay":{"firstVisibleEventCount":7,"freshVisibleEventCount":23,"freshVisibleEventIdsUnique":true,"resumeFromCursor":"14","finalCursor":"61","acknowledgedBeforeKillEventIds":["5","6","8","10","11","12","14"],"freshVisibleEventIds":["18","20","21","23","24","26","30","32","33","35","37","41","43","44","46","47","48","49","50","51","52","56","58"],"acknowledgedAndFreshIntersection":[],"progress":{"acknowledgedSequence":10,"firstFreshSequence":12},"reconnectRequest":{"version":1,"requestId":"braid-live-reconnect-f42d3d82-3217-4e31-92ca-c44374494ba6","operationId":"op-braid-cloud-stress-1787978601043-681810-e62b05c3-reconnect-1","command":"reconnect","params":{"runId":"[REDACTED]"}}},"cancellation":{"first":{"version":1,"type":"ack","requestId":"braid-live-cancel_run-caa3b08d-3678-4d4e-840d-c5fc7364a9de","revision":94,"operationId":"op-braid-cloud-stress-1787978601043-681810-e62b05c3-cancel-1","command":"cancel_run","runId":"[REDACTED]","control":"cancel","outcome":"accepted","replayed":false},"sameBody":{"version":1,"type":"ack","requestId":"braid-live-cancel_run-8cdd28a1-1ca8-4c22-a474-2995b9a89c02","revision":98,"operationId":"op-braid-cloud-stress-1787978601043-681810-e62b05c3-cancel-1","command":"cancel_run","runId":"[REDACTED]","control":"cancel","outcome":"accepted","replayed":true},"changedBody":{"version":1,"type":"error","requestId":"braid-live-cancel_run-b5522387-79cd-4140-abe1-ce1bb191448e","code":"OPERATION_CONFLICT","message":"Operation op-braid-cloud-stress-1787978601043-681810-e62b05c3-cancel-1 has different input","retryable":false},"remote":{"controlRef":"[CIRCULAR]","samples":[{"status":"cancelled","activeExecutionId":null,"latestExecutionId":"[REDACTED]","observedAt":"2026-08-29T04:45:01.503Z"}],"settledStatus":"cancelled","exactResult":{"executionId":"[REDACTED]","status":"failed","success":false},"messageCount":5,"lateResult":false}},"account":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","usage":{"computeMinutes":1658,"gpuSeconds":0,"gpuCostUsd":0,"activeSandboxes":8,"totalSandboxes":14481},"sampledAt":"2026-08-29T04:44:30.420Z"},"telemetry":{"completeDisclosure":true,"fields":{"tokens":{"status":"[REDACTED]","input":6145,"output":495},"cost":{"status":"[REDACTED]","usd":0},"endToEndDuration":{"status":"[REDACTED]","milliseconds":22760},"model":{"status":"[REDACTED]","value":"[REDACTED]"},"environment":{"status":"[REDACTED]","value":"sandbox-b954c767ac46"},"runtimeEndpoint":{"status":"[REDACTED]","host":"sandbox-b954c767ac46.tangle.sh"},"machine":{"status":"[REDACTED]"},"region":{"status":"[REDACTED]"},"requestedResources":{"status":"provider-default"},"resourceSample":{"status":"[REDACTED]","value":{"cgroupVersion":2,"memoryCurrentMb":165,"memoryPeakMb":633,"memoryLimitMb":2048,"cpuUsageUsec":67773326,"sampledAtMs":1787978693996}},"account":{"status":"[REDACTED]","value":"[CIRCULAR]"}},"unavailable":"[CIRCULAR]","runs":{"first":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"},"resumed":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]","input":"[TRUNCATED]","output":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]","usd":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"},"followUp":{"completeDisclosure":true,"fields":"[CIRCULAR]","unavailable":"[CIRCULAR]"},"cancelled":{"completeDisclosure":true,"fields":{"tokens":{"status":"[TRUNCATED]"},"cost":{"status":"[TRUNCATED]"},"endToEndDuration":{"status":"[TRUNCATED]","milliseconds":"[TRUNCATED]"},"model":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"environment":{"status":"[TRUNCATED]","value":"[TRUNCATED]"},"runtimeEndpoint":{"status":"[TRUNCATED]","host":"[TRUNCATED]"},"machine":{"status":"[TRUNCATED]"},"region":{"status":"[TRUNCATED]"},"requestedResources":{"status":"[TRUNCATED]"},"resourceSample":"[CIRCULAR]","account":{"status":"[TRUNCATED]","value":"[TRUNCATED]"}},"unavailable":"[CIRCULAR]"}}},"spend":{"scope":"all unique local runs in this cloud proof","rows":[{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]","input":3822,"output":698},"cost":{"status":"[REDACTED]","usd":0,"provenance":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":64508}},{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"[REDACTED]","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]","input":6145,"output":495},"cost":{"status":"[REDACTED]","usd":0,"provenance":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":22760}},{"label":"[REDACTED]","runId":"[REDACTED]","operationId":"[REDACTED]","status":"aborted","model":"[REDACTED]","runner":"[REDACTED]","providerSessionId":"[REDACTED]","tokens":{"status":"[REDACTED]"},"cost":{"status":"[REDACTED]"},"duration":{"status":"[REDACTED]","milliseconds":5994}}],"totals":{"tokens":{"observedRuns":2,"unavailableRuns":1,"missingRuns":0,"input":9967,"output":1193},"cost":{"observedRuns":2,"unavailableRuns":1,"missingRuns":0,"usd":0}}},"followUpEvidence":{"visibleProviderEvents":16,"continuity":{"challengePath":".braid-live/braid-cloud-stress-1787978601043-681810-e62b05c3/continuity-challenge.txt","responsePath":".braid-live/braid-cloud-stress-1787978601043-681810-e62b05c3/continuity-response.txt","challengeBytes":65,"expectedDigest":"079f804882302fd33c8fa98c07f8f002933ad00aaafd28e7dc8c04b2e440145c","responseDigest":"079f804882302fd33c8fa98c07f8f002933ad00aaafd28e7dc8c04b2e440145c","matched":true}},"workspaceVerification":{"environmentId":"sandbox-b954c767ac46","markerPath":".braid-live/braid-cloud-stress-1787978601043-681810-e62b05c3/marker.txt","readValue":"BRAID_CLOUD_1787978601043_681810_e62b05c3 ","readMatched":true,"executionAttempt":{"path":".braid-live/braid-cloud-stress-1787978601043-681810-e62b05c3/execution-attempts.log","lineCount":1,"expectedDigest":"sha256:0d9a0e7f50bbbb2ff26c123c96d70724d20fa3f7b2d0f74793dab7a6a87ba946","observedDigest":"sha256:0d9a0e7f50bbbb2ff26c123c96d70724d20fa3f7b2d0f74793dab7a6a87ba946","matched":true},"continuity":"[CIRCULAR]","git":{"exitCode":0,"stdout":""},"resourceSample":"[CIRCULAR]"},"timing":{"workspace":{"elapsedMs":11.65107400000852},"firstProcess.initialize":{"elapsedMs":486.70759800000815},"firstProcess.send":{"elapsedMs":1071.1765619999933},"firstProcess.observeControl":{"elapsedMs":6565.403333000009},"firstProcess.waitVisible":{"elapsedMs":14551.70257200001},"firstProcess.sigkill":{"elapsedMs":57.32763899999554},"freshProcess.initialize":{"elapsedMs":431.6718390000169},"freshProcess.reconnect":{"elapsedMs":42427.32603200001},"freshProcess.waitTerminal":{"elapsedMs":15.183192000025883},"freshProcess.observeControl":{"elapsedMs":0.10725100000854582},"followUp.prepareContinuityChallenge":{"elapsedMs":1301.8622120000073},"followUp.send":{"elapsedMs":130.3075550000067},"followUp.waitTerminal":{"elapsedMs":22803.777100000007},"followUp.observeControl":{"elapsedMs":0.1880599999858532},"followUp.verifyWorkspace":{"elapsedMs":2086.7500859999855},"cancel.send":{"elapsedMs":125.76695099999779},"cancel.observeControl":{"elapsedMs":4543.886706999998},"cancel.first":{"elapsedMs":1390.1583870000031},"cancel.waitCompletion":{"elapsedMs":102.92078300000867},"cancel.verifyRemote":{"elapsedMs":3105.6106410000066},"cancel.restart.closeFirstProcess":{"elapsedMs":79.5632859999896},"cancel.restart.initialize":{"elapsedMs":411.6954550000082},"cancel.retrySameBody":{"elapsedMs":15.151038999989396},"cancel.retryChangedBody":{"elapsedMs":1.230875000008382},"cancel.restart.closeRetryProcess":{"elapsedMs":77.6836829999811},"totalMs":108511.577914},"cleanup":{"exactResource":true,"mode":"exact-owned-resource-set","identity":{"confirmed":true,"mode":"exact-owned-resource-set","matchedCount":1,"removedIds":["sandbox-b954c767ac46"],"deletions":[{"id":"sandbox-b954c767ac46","attempts":["[TRUNCATED]"],"confirmed":true}],"remainingIds":[]},"activeResourceDelta":0,"activeResourceDeltaRequired":false,"accountUsageScope":"account-wide","accountUsageAttribution":"unattributed-shared-usage","usageObservationComplete":true,"usageDelta":{"activeSandboxes":0,"totalSandboxes":3,"computeMinutes":13,"gpuSeconds":0,"gpuCostUsd":0,"unknownFields":[]}},"usage":[{"phase":"before","status":"[REDACTED]","value":{"computeMinutes":1649,"gpuSeconds":0,"gpuCostUsd":0,"gpuProviderCostUsd":0,"activeSandboxes":6,"totalSandboxes":14478,"periodStart":{},"periodEnd":{}}},{"phase":"after","status":"[REDACTED]","value":"[CIRCULAR]"}],"accountIdentities":[{"phase":"before","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}},{"phase":"after","status":"[REDACTED]","value":{"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46","billingDelegationAuthorized":false}}],"accountIdentityConsistency":{"stable":true,"identityDigest":"46505ff5225e7d5c46dcafdfa3142412c4746e7b317b166f6bafa7f443923c46"},"progress":{"firstRunId":"[REDACTED]","cancelRunId":"[REDACTED]","providerEnvironmentId":"sandbox-b954c767ac46","firstControlRef":"[CIRCULAR]","resumeFromCursor":"14","freshControlRef":"[CIRCULAR]","finalCursor":"61"}}}]} diff --git a/artifacts/verification/w6/120x40-plain.txt b/artifacts/verification/w6/120x40-plain.txt index daaddb7b..5b8f928d 100644 --- a/artifacts/verification/w6/120x40-plain.txt +++ b/artifacts/verification/w6/120x40-plain.txt @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-606b068d-d6f6-4216-ad63-1be74dc80a37","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"2479430b-264d-409f-be78-d3d185addaba","backend":"executor","status":"active","createdAt":"2026-08-28T23:29:10.911Z","updatedAt":"2026-08-28T23:29:10.911Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-bdd8f87d-4114-498b-ade0-c03c06d9748a","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"0435fb92-96a3-4b83-ae59-50ddf5aad260","backend":"executor","status":"active","createdAt":"2026-08-29T04:15:02.043Z","updatedAt":"2026-08-29T04:15:02.043Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/120x40.png b/artifacts/verification/w6/120x40.png index 57d3f93709ee7ce9048839cb150a7c6934237682..f8cadc3cb9d5558d1484517b25f80ac816685930 100644 GIT binary patch literal 22649 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�sY0D8}o*8|e-!qzMBYSnR{&34~(s;g;!y3%#;|sSmCuF5{g;@3Hq6l+Zr9 ze;Iv-L3uH<-B%7~CV|SOD}8_OO8AtpYCy+#?9!c?1ax0~XZ>h}zQO~6q9gf(jo(I* z6ixycGNBZy=r5Ej6K_@oGHi@Hg3@F@R}i*vV#LV25Tt$5SCib#sC`QoAz$+{|f?h9cTZ~cVHEwWMK9~u}aaN@B= zn{-p{lIuDetTv0h)i|pW=DE-?49lXN5z4yRs=ZG^uTnJzF^)ku;>q##bJ$OAGFVF4 z?Z=7PDwp2dhYt!0ox^C5SWDFWP8ZEw)n!9K!oJSr`zR>(8wg%yj1&0ln<<{ejZvSY z;kb}L9wTps7*W8+tsN<@32-+@t#9TB`8bT`<|->GQ3Tzbn3Q5TXop(DD{Fsn@uw~G znom;#`rocV?$<6qX5FzZMTUmPo|*6Elelj01(WpP zU35d%H4ma)A>N$>+ABKonGKaxQd=esd?Se>SncoLolfv>=L$b|dQb*UwB1G`Tp%`H zvzA2Zd)&sgJ@0jVnFd<#?~QRy;c_@@^(yEj6E}7qx{M+8-_j3?zJ)ue!Bu5tEScp1_MFIrpEA&K|KS=yCn%0q%C7#J}l1 z1CWtA_iy5F2TB^t;qMpUFj4}01d-u41P?AS^fmQocA8d_)L=TS3$xdwYv+bM;08gR z@rnZfC0Ht&ztaKA+nSseUWz!R#K^l7v99OG?W={h{jFY>tDosJOpO110!ocIRBD?z z=xX^OrN^n-57gnd1Gh(f!MinFKsjASH6I924=Z7i$9@djt#2)jtAavS-+06yIo|ea zDK}HAaw%`Ca_(KJ5EP!?FmX26Ej_>81PlO46%1F=tHYNxv7m`gf0gcpJ0{Kh)g=>% zp7Le(jZd%P2hL?0N3*$xV-^PIk&|7)IZ)g07 zAGgkn4;zTK`(kca>FJS*CN?)3mjqdIRkO|CYNg=)oC(&HXibcPpr|)?d8FvUgV|*i zZWqldKEKfQicLD9N4lPtbU5-Zf4=h+j>O(+60Vs%PPANl(3pYiix5pHxxuMjmK;=(Ep}f^}_}};SOJc z&x4;JV2Udv!xe4u9?w8Sxg!wXRFx_2!9$8lbgQKk6&Q+CS6;W{%iVbnTlC=0tbLlC zM=!jBH*(Cle?5{MwlA#l<-d01 zJ~=8E;#~o!CL8T8G)o^UbU`_EMd#5Fu(eP$#?xvbTxYvD>THIs;p{j8mtdL=66N_4rLaF|;m|&YBsHNZL zVb|_#;xJ|>{r6_sw5q%+7LdrJ`@|km)cV!VsAdMtcN($jha)fMyB635#C&6~p_e-b z6y@y0&wvtVd=9a*`4?ypHIm(&CBWo|KltV1U>*ccPZ97g{s@WhK!^D2=!w;D4rBGf zo)Zkg15>0w|IMfWyB}*t|KH>~;eY8=-~Ya_|Nqq||H4|`CnlL8ki{F$cVdX!zjE9U zo>ta1C%l)BTSnWqcn2k#Ckxk>%+cxGEh_adT28oy{zDSKRv1#nb8q1jj9zS!ib9zq zO*tyc9N}O|7$LZ+$qfn(w-?MfQa-IBs|~kCR+%Tb(@))q{5IFgZ;>~C=51H{xY8P? zQ}^|`RO7`Du0gM~?5lr2xGMp(M67Y2DzC0SW;CB{gBu~ZUz(3HTcgt!jn~U3P#~Dsfex;aTo*XCG!)j%ULbO|#x*Yj*s#)zO zv20d+OL2X@sWu*(Pd+GhhQ;e7U~^Qw!R%4-xa&FoEJ;2fqVxjK&iPWv36b-MnpQ@+a@TKjqfFLsUeZNd`n3Rux#>|FfE!iy0gr}kr>RLD(iCH?Br0~MeNbPYdALAS3H;ugn| zQ*4;Ru;6`VL6CzwR?y=VGDmD1p8HEnVs*4IA~(HD+A>3bK4Vqq7qAPaS)rG=94*Q# zAcBiq6F(|K%Z&oP&MQ6;<#!Te2MZYb819$vlD(OlAIw-*X{E6dZtOwnf4HWCEVa^)Zi%V4x~)mYG9P>C^tzI#l!U z)uBYP{LZ5NR$e@JioR>RhqM`_(GIii6btAJ;hT=>JX32M#wXSJGb3IPhmxid3%#xd z-9{F1x`NfVULl>biua`i*p$+9-n~~sOy54~)!DKJ3HurWp(;2tFo zg&iHR%|1$rb7U|P;03aR?oySwrI~7KN~ZIgNHy4w1C;HQ zTty#8-+cwEyVG9@Q)D<091=ZDv$i@>E-;O>uuyv8cbRte{nksos-5Mk3>>j+*GD4r zwR1stK8%zQ@1bq`Dh!IyT$XA52JU}oDR$LhASe2 z>wacEf0tAk8c-_Za8~$MR^u@hhe5NE)6VRNU9IQ##bXa} zm78CCz6hLLsGEvI90vMaa#)oF+UsJYPOLrCt(yT|y|OX_-P0(N!-RU?eedCoZIT#e<$yj z&F7I1X}ML3;rw|u>Ap;@`NC{O`)_S7HMc1REb3~#s!vaWl2&8`1`&IyCjhTTPKjMH ziQunsyK`5xQV;Xi9#7(jHf)JDJtOiO$G3J92Zf{IYCWKxyKlGUsld6d+6js0FixX=SFb-V!Dw2FOTnhLvPN9WaYVfn*nS&0{R zp7KUYTpMmvqSt8+e}M0@k$eH<51Tu#F_`pox4*=IK|6u}jHg!X;r4p=a^)1Ai;A)$KoOe4kB0k#ePCU5>=p6^&quu$SM=(wjfT<*uM zTydU6++!)z=Y*+XjP)yyYXsP(`tXM>idLE08d!ZJ6e;EJoFS12?*cQEqKnmk)tCG* zd+m?u!*BWM1IGSvRb##JnE6z>M$3G#OMHWn&(SSf5(b;(qe&)_Sq7e+p-rOG*rI2Yv?CnM3XF+1ap~zei5MM=7PK0oJKHEUNsrf543iWBGO<+pMkRWt!6rJOlGUPqK)53H;8iO$>-y$X z@kY#JSC|VtX)N!147>d(;@IYh{QQ9TP!V}qK!T=+ET{CyvC&cOt%pcS7R4u&lyZ~Q zXhl88d&V#? zS{45|*}V9KvGquuz41*iS0%HQGY!a;LRoYTR#8P5ma) zqLD6*~(+gkyoxRl(`G{s@%I}|Qu zE1JrLw@JGje0!$(q~ttD4Kz5`lqP*vTzy8d$#ea+L|56P<5||xTl#~h1k6JYR9koP zPqX2b5*NZl>gLI?yp%I8@2^B9)OuRGcRGxI^s`S&tWfn?eRsR`5bz0~iys2lciJ@5 zXik8{>%-4h_Q;Ww)nVs39s&7Db2hmU4|hM#N6-Yw7`WpmsJ3$4!V+6vO__z*H;pKR z5KJvvCuPMue7K=iwi}>R$OaVS_m%H+I6BW;(S85^2)A!4rYrI zi->C}!5IKxw?L=}Zpw+-;0OSY3-bHc`9T}R*0iBYS@?tV9dUk%g3B|wn`Q4n?NP1e z>Vi5%PRC`q@AyLZclIlHhYatvi*r~M!;kt5KI{)k;{ybn@4_l&g3Ynv`=Zw5lN(FM z%2n0+4j@IhftwpUO1c-Z*dbLgl&-UZZNQ}Jy*Hsey(9C^zQ7fl>%8mE&I67Ah}JJC zxf5B5iMBN>C!O%5(81^M_i>>WKd_lYU=_=evQ7vW#YjhUb^9)qlM2-O?ZvXL4Y5Vn)8tuWAs)qC2HYx~4o9z4jYn z$d2=gk3K1y>8^T&-%JFTv$5FJ>&Jzy=-7D6LPyWekC5t&O7Ja$^Jvzj&7C4X?ppyMlc92M~SHQFP5;2dNbX?A#tvmBhZ^+ zRk8}TPB89Z5<*sfoDjacklUGr7~AFxG8A!BFJ_5hZ#@VO>JwS;g6q2ir(nOKIwxxW zR(kL~%m^HSlq}~nxi(we*u#2W!WXyeRj0F63dW|^k^<)G7IK+LE8r;(dc=(~bNqq$ z#z63oaT9(VJf$V{uh$2n%?5G)C??h%lYRpLlL2=dn0lI?=LQ)7R38Ah3(>;!>nNv& z*)h}xPfD@{mHSITr3jtnGlhxd%sg_@67V2C4Dw8KmKE^E&cMB|3YjBMjyH{n%I~yf zEA9nH$_o$#aUlF_m7sEffRv!IqA8Y4vxcuD2r+UP{jI-B$XS82;vKnNXW^Soo3B{C z8R=i}7S#stO?#`0k482)zL2ZA|7lJFM_gPhA!ydpdBsjTJ!usp=< zl<>n?^D4L{BKO^)X@n(?z2N7v^io1m<(2btlA6f=Lha_~u~Veb-S-W+uVdV%yQkp| z0qkj)5~GDAr&RS!9WFaB4)pTdyMm~1R-8ng&O`!GK3aqBv9cu|*O@A9*^#`ThaQ{- z{fyE)??hVbxz&1ZPh4R+Vs_F>MNoc6C{w!W75F*G6c-T)CUCNtfe)xLuvtaCzsAe@ z8rqiz2%D&M4373W+qn;}yH2jz$twd0uMfNJ0!HuAvKfT1*@W6zJd$-UkGC!AMgGK6 zCf>oQ`);Q8Nrvv5&Z6x)0kymz_qNyK8FrfUZ8 z+r-zSxJguYP~`;kT!0>$lYT@ncO^!}ZjZ^6o``M#46>(|)4)@m&zszfGB=MJ zjqNY&qLweEWk_gn1H{BWXU{yE>EBM8aFh?3F37DAH^Q_qd4EZYiIsc+qgej}EzN)b z`k$B(@1T~}MR-SZ&~lSg{vuqmq~bxCFHJp4?|0~g{i@Ysy-C1DK)&<+k{J{K%WIq%t}Dn9g%O( zN~2-HG|e>HgxS7Z`l(cIo*J`ZHMb3CP`mqEh;zX1k8M>xm;laX{xf~4voj=rPet@Y zaF0L{a+M_-rRcvM?F$WQBW-llBQ=|0hB+p+0rRK7SFCk6-?oH=mcHX`LI@~5Ni3l}UeaXMYWzJ|HYeNl;K@;JjUYGHN@ zM0!mjIchcJ*QZD>l()Vah3iQVW|6Y2N^R>O@N(^z25Loe7%lT;GbT9irZyvtTwyg& zfv)3oSH?VvI{bP~G=F+2o<<{i%{E7p8DB0dgz>iG^QX>aQ;ryo}xjw z=1kPn=_Qw{B6hEs$a!kbYU&8H;xR87r+14tC)JRs^;wB9&K!8Htm5REU@e_0i^y$F zG<(;x;=Q40x6uSlni%N{hj!Xrr-Ogz!{By*!py86UYf1k6VFVWq5_H&8y+jWK!s2F zfY}f~!`>dk)!7*+rDibZV%?T5r?6H_KQqGSXP%BQ(PlCAMub1QqGhc6%C>|U!`P+w zl3Uk;IxS*tV&V@lZIdH@DDH@^)TA06>E8?$Z)XiaV`bPENflX@li&H!wkXlW0 z5QJkyixl;-G0c715<|zgVx$lA+4<3HI zcT=%fKYLY4L=I!TysexW=)fF`<0*~;v(u#UZneJas6`l-I@RmwR5kX4G2nHXjP@+r z(wz|e??sh%OE!7%fPQsM%^FxFx2g4vm0|(HYO0Y{5U5Xnkc#%Sy?N50crrw;E*A4Up${l=hSR# zhET}7)>7z>O0d;qo(@Sl_lsuP&Wy+-rXnq>fh%@P(>vfnp)q^Gce2K-?b^E4fj}v4 z1S|IwTxMoJVmAtN_y_t>_Fu{a&-Bm7VEk~nKhJ2WsxC$8^VGBS5x{=qDQH;FrK))5 zzF?1?Cw&uk~yxHE@Y@@fE-gW0~MBs_t03}u7cq-XwU0iI~r29>K+xe zX-BUtjam0)AUYlKLZMHI6L@dBl$ruzw=cQSe&vA~=WEZ>tXB$!bco4e-!Jbvd}Unf zz&P1gkigA1pW-Js=s1sVP{~0qWw&TTx9@Jf*xa8k!xwRJl$C^~qo;}BARTa^ki5a# zAi_xY<&^GGfCUIgc5+}t#T|JBlZ@!pqPU=$WX z+%Ik@6CejZPxEK6`Y84E9cvTx7WS#QIBAcK~J*Ib&h0nOC zzxnbjPq0^iEZ!Zp5GBblCyn|MkhJr+e`iEK3q(6+?3y<%^lVtl*Hs{tyoL(qhsySF zfo#3rF7FjEH!2o3Qf;){e*S6XoKPeV4wvNd|)4uNhQJ?cxZ+r z-}wM@f}fT2JE?glMwFpW^^o2UIUvS3uQw48eSyc+rA;s=EZ)CRu$?-)-nZ{N-1qf# z+{S0@g!03x>DEIa%jLC?cXxLV3ugm=QcF2Y**h6(p6uZvtbQ4r0Zz^8%ClFQ30}wp zDck(unTLieFG@VI>xw*gYJ-c*(4OMgRItvwToO#DtBE4k-Pa)%ZNsq58g3^NNjvAa z_65v4>D(Ki+wFsDSeL&surw>MtLoJB8JVM&%{mSEKM&!x5cV7+Qnc#~j>>C&fnxN9 z^kiL9e-(E0_^KtOViAdk$z*`h>M<}Dt2x>5?8XwP5(Zd(!B83vc%FH-N1=NTO%f>b9U>!_2?CTUn{C2Alu)=~YeO^eUgO zyj(%`%L{)WU!{dn1(Njy^cB!S!QwnQi@Lh97=E8e0!&5Qa^afrRqmGMr&pT0mg;&iZ1gCnRNtKpcM`|R~FU%y8T{A zU7G(dHT006vX(n-$$k{BVjfS`y;BmU9;JwUHu~)WB6s`afNE}6(zT95wUuVc7et0x zKw$Srr3ztP-HE@32?R{i_Ytc-B+O1!w>ZBsA{(y zhvGZXp#pemgyS>CJPXYSDaVhV*6~F>U_#DcgwCviDff8Xjk6hb8thbXDrBy(P5-sq z^Y8T++fPONARG$Q%7m#;GAgc*mCIF((5VLRee%9eh5B?3ofZkbn^mII<;TNerZwQC zj!*lcD9$sPLUQ*gljl)B;+agniIWVkT$gcbK%()E6#@23NdsOYql1V)uG5@qoH)Op zbVb$MGhqqu$oW`@{F&|!l2Cqa$CTVWeF_|R6}ObYI+@|)>u@~Kc~7E7 z6Gg2pP;r&Dp*s-lRhb%b03}!|Z=<`w%omqA;WI)h1!#3RgjNlt5u6Ne-pfO=`><-|eBL*~r+@+~S_Txqdfby!BhU$}DN(&X*>hw!zeMai#@; zaG(MWK$CL_4L+Xr#T_Q&TIM}`u!K}?DG1;18b)XokLP=QSuhkoy0n3A{Ea1NlgYUPJs7#sZ8p7#ge3W7L-T!?L^2kOVrs*{6q;|ugF+AvR8m@)M8iL7U^Ks= zVJx0pR1dFO9xho5p_eO}2a@7-h5c0z`)BZ3C{Q1P1%s3U;F5ylOO)`;3GYbS+ZcK; zvW`V?>AQ3)ge4VDljbT(R}8{0SpW97QU44^^BukuLpE;uAEmB}N(*_^{_Q_Cz>rXdU%@k?=ZU(IG!29F$&#WC4*nJPHS5;vAgwPZEB$9Va15J6keN2i~kO@vStge{P7nPa1S zgL+BH$=Zm8A~bBPmuDQd8&*dnC?%Q;S7Tvjxk*{)W_Ua#EtCde`(3Bg-;0FA6~DTv zIvO`YEGrJb4$Ny_S2($sW@h~Fj`9s(6f*tW&-$fx3I8|{~k z;SA=)et%a~6kuRo92`a-!Qk<+p5uRh3&A4M%;Bs93NBWhdc=CefjrmH-&ja)$<8jl zj~2!ngwQDdQa}}pd)8MGHKHu9+1An<<&|G})d0@D#tIXnj_mZL(Ef{Qc^de)Q35@C zFNx9%{ZN~T!W2!#&2{B4QH1l}e*PswOz!&X&q3T6EOWZ-+OiymH(0z*mJ*$K(`Xy> z8JJw?ofMkF)wxNu={48rR4WpPyP=Q`<*)g literal 22570 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 literal 10412 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 Q1K;o0)i%(=-+vPEZ%s0f`2YX_ diff --git a/artifacts/verification/w6/200x60.txt b/artifacts/verification/w6/200x60.txt index 5982f5f5..ea826f5c 100644 --- a/artifacts/verification/w6/200x60.txt +++ b/artifacts/verification/w6/200x60.txt @@ -57,4 +57,4 @@ ─────────────────────────────────────────────────────────────────────────── type / for commands · Alt+Enter newline · paste ──────────────────────────────────────────────────────────────────────────── -profile Braid starter · harness pi · backend local Ctrl+E details +profile Braid starter · runner pi · backend local Ctrl+E details diff --git a/artifacts/verification/w6/40x12-plain.txt b/artifacts/verification/w6/40x12-plain.txt index daaddb7b..5b8f928d 100644 --- a/artifacts/verification/w6/40x12-plain.txt +++ b/artifacts/verification/w6/40x12-plain.txt @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-606b068d-d6f6-4216-ad63-1be74dc80a37","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"2479430b-264d-409f-be78-d3d185addaba","backend":"executor","status":"active","createdAt":"2026-08-28T23:29:10.911Z","updatedAt":"2026-08-28T23:29:10.911Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-bdd8f87d-4114-498b-ade0-c03c06d9748a","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"0435fb92-96a3-4b83-ae59-50ddf5aad260","backend":"executor","status":"active","createdAt":"2026-08-29T04:15:02.043Z","updatedAt":"2026-08-29T04:15:02.043Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/40x12.png b/artifacts/verification/w6/40x12.png index d4d7ba15596e3b545c7927dfca80461bd2a65e0d..03876ebc8a2e1eb0dd36026fa91e2170e2243610 100644 GIT binary patch delta 19 acmX?{e>i_a7KbbgKl}H;<>ecT0?h$a@dzsb delta 19 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 z­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

    z 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 i7rH za`+yDPRap8&Bv?k`hK(@Bk9|^Q`nzpx-8CqETqcR%cGY}Y_rDlo!X)lP0sXx{_DRl zH&Btv`sCT4Ghul&HAzG2Yl!FR@Ds&(GMc(Bt<9dfou$q8TKWO4cY``RPhMC})iR9I z8x5WAEbH#mGCt5c8eVQEfl*+Yy^B_U*ocN02Xqzr1L6{l9IfFDn-@n2o&$Pp3(phr zCM|4Oy*Ovff6-OEnl`sOZyi5NZ)URJq6(mq^q>wd*RXl@*s-G)8}^sWkb| z?Lhi2DJOcwi!>6_?oAnnh<@0IBRsH>+LwYUMT8D zqkQqxzuIy(H0hQczl~{Ljwd;ddfZCiw5bkSrz=0c5Rkp_MO%)RRudydK#_H{ty%^p zSiewK?WNQmElwNs&XzRYNNA>aEUo%hJ-S`ZyIh3+`|Md3>5|6u{g!p<3t%mstsNaH zwzYj1j>a}shD8tyLyVVh=WtxZ*cY_#8EpT%dt=&cy|@iLp!>lECM;6%TYsdfc*@Q8 z%XROD!xeCgUcO!QqUg;PY1(%EnG@lL9v2g;Up&nsl6fGhHRyaO1mQ$a0o6}lp`($(UEqh2!?-%m#@>n0L(dfVv}8?MMo*vVd)c_2cfvK1w31}3yvu*h4|V=Op6>h|s>hEX{+ZR7g|V+OBRdJnmTG3~yM!b%WDnVr zeFkHV5ZST}*|!jpwy_fxWvk>pNs^FCC8@d3=l*{0`yV*hxvulexn8g5>-q4ih8@Ud zh??Bg7!Vf*#6kv-c5TCg7W+H=7cbE`Do9{~z%{YP;?)l2y1fbrc#D$tP@FtX2p63d za%_uFVSVWaF%fFmewxV6*O`PTJ~UDvK%o^JrjA1-Xk}P><~-7a1KsshtowXGb4v5W z9K#gG8!IPKVF8ZyPXx&-+zbqwaP|KzK^|( zel9(6Hm1aAJ^tlojfYN5hWfOMrkb`q1jZUd%G1rbDL|=DM*tm3x@3Mg%hgI05XTRM zph+~qCnTr~uF;iuP+YsnMJB~Ff0O=j_W7; zKJ&VMT;6tenVE6Oa75tePsAr17p%zr2uJSfxs%{*5pU*NlDB)2bKSpGZ16}8l(%>8 z@b!Z5*a9k2LTTRM*2U*=yo&jcOs-PC*HbhuHIzs6>{`zFxj4PuBnp2bHxL29^cx@- zd7JTeT`J&Iays>*+v$R!zdtXNEDvlHX#Bo* z=*2)_3*ahIfbDRTShIK9h)ky^Fs3eI+X0}myc^AS-BJ&;c>%o74a)^>` z%M+>T61r~~q+IfUrsChSeiW}P3v8WF7FlQOUD$x*ldMGkJ}A7$NyNv#Nr^b%{xfN1 z|NjPq!AQxC$rT}eNPFbZuG#D0|l=$!$eu0#HmK=W-%}q4-PThpA6=!><7JRKg)$mbkMY zOr^&7YBCq;SXA?XTczD@=B2172OoXQ>fX;hoD&U9O2(6mRm4-}8 zXFT6eJ|pf@gk0bO96zb1A9p~@a6>LHVF3-!uF3R7K}pWrEdm`ZH2&k3GwKRJ9suKU zLcDv-aXokB4QkEw+keJ1savmHCbE)1HaMc6V7)`IS{ab-dewP|0BA7{{fI$%R$qs~ zDq~kf7<0<1TwqyhGv0O+vCP$HiTWlXTsMjCO_a?A-~|+P-&=&t(spasp%p-<1x)Ti z4uGj)Eyw|N82182CW}IrU6#?7!Q7=w*d@XGaZltCd(zQ1G z{vpCR$hXN-Sw|;b6Z1p|qo1Odvkoz#YN&nzc0VHnBE>u{JJla0$RNwqP*$Jv6(mXE zSy8T8qH+Dg1+o{Fp0%z#Y0J%$OQ&2DddiIgV~-aOCjQ6$jx0kZ$*OwJ)~tYNDA_=k zKikVZQWk=fI1X{W=x7su{7l5B(?&L4#!lj78eYzlpMi{nsI9OR6{&#g&48dXiejyK zu(wH_fN9%&%&Rj;w>-9rZ@Ox_#kRgVxo2-U%|IFeXA~{n{}s^Kug*)Y_F{dy;$Hm4 zrhCZ9dj(weR9ltS_MxwNdHK}&1astlBkOz<XuyjypX z_Q>aQx`0^$gAxSH?bp%*!lB6Bd{PX$Pk&7Aau%2)Np072`nVj8csgEO9$Zn zo{ZC{Sx>NIK&#@=QSX=9{dIR%j2$P9LZKJP3=&+6=)d7(B{VEq^6?U~J^=giRF;CB zq_3TIAB8nt91g9&f#H|U)?$CXXJ31(>U9nHGV!R9zSCq`+RuCM5 zjMV{I^w(Z%;Fb;6V0~VTLy{h&V_68YLn1tV0BZ$#qakml-k4AEpMukpxD){_p6n1x zhxS5IqKQgcg{j-*0tRpk07A4$heXLDWxyh}u`tYk!tPVPyf}KZA#ksuR0_D+r&P9# zph)^(FZ@(e=U*vol*^+8cqO4F0TD%yD=q#vA2nJ>DHUga`Z?VYiYBENlX&q}<&?%V znUtl68Q%Nm@>z*A(5$XH0h9{ExgSu_lPnmM{%E)^Pp0uYlqE~etW&SIQmhKJ@FkZu zP&Vi#1Io9u`WuBAcU~BI3&MTy?=JQ$cF`4HO(~FD=z^+HAd7{|g)a7fd;&D)@;3q@ zWa%05ff`O?1~_in1g#3Pl*4PJKI6f8$ivqcYd)LH1Ins{1MnX7`s8bPvSJdib4AeP#fR5af!#!B z8s3O&mxY9LVHoMS2M|=T*<@S#klLu2Ai%9lQfPMxyt{F~bSyOx$k`oBcrkQE(8N&J zXrXf~nqpX~IE0SMw8~|eGZ`+uqFLjjclj;PkFDwm4NW6SP-ikUDiOWim{Rfao)iZd zUkC(Nh9x4Vgh=A#EV`JhYx(ey5G`(Vtx%1ON&>Wk$#g*l*GUA5C5>l@v*>pqK==l| zREkG0Zon+MT-XSqZG;=6NfIvFGAB*g&38>N!D8l)-w+%#$ zbYOJ3;(qB}Kj8&b#sK_;$dIJ^M^gsF&>%!{aL7c!Naq~f#1C#NIAnn_BBReU^0p1!|M5((+Ys{f0R!?KYFY1Hn5g) z?l4mN*N}t5uw${Y$1%nky78=L7`aAM$u`tgkh4~UTEFb~jrWRXE*=RVH1ejYATQ`5 zz08o_5hmTiCcXg67kjzAq20qZa) zl6ciSfXQHhnh59yh3y;&*Bw1u|6@e4=h!;(-q~xxS8|V!uKE$Ne=mCwKH;Q*PJ6f8d{JR?XDTot5a*2M)69E zjqSARjUY2jO|SPv>zc;2n8rRZjhi%$*G=>}L^^a^JCKukH&a1cLWOL`!mW)CD^hqv zlDK?a#S8k?8b~1uq%kv8iZd#;;pWmdCo09&EY+xAY@3dBfC%)`(7$m(^G&4M0~rg- z<~V`xC#9pWAC4xY?&Zv<-t6xU&$o)2zf3lZzAgyQexrMhxAAkp07{Dveb94~>!+#S zZwZnfSvvB3*J114jARn3NFcfsO-e)Q&RLv5qP!P;iS5agr zS1=>5W~|__dA@-;t-#9shO2p@ApB5*d2##cjAnE3V?z;R@@HoHVPLUD0u0?H#$79UURO*y#BDnGe?usn)NBTw`|Cv|d;oQX}_#{h|Fo2BxghXX3x!yFD$*k6; zj5tIC3#v8b`(3B+Q&j(SeDRuH;q0~jQY2^TB}<@tDlKT_-9A1bvHeH@zrnf|@Js4J z?8&RKzm-|t(xkihby`G*DxRk%JT@sq=B#SdDvJF z12b3u@b&HEZ+afSd3=0v^x@+3<8S95zWwj`(#MBOU*eapG}y)|raSdn=_*8sH*?u3 zoOV`-T+hI6E9!kczLJ*u-!C{jhhvhyWJGJy@00=8gxC9KRN!VEZYwz_?5$4NIy~}o zO|Z^d(@6ViU*i|w-r(pV^lARzsom%XHUIo2|Hcy+71|k1odI&a>&+ugcV0HNE;kME zD&O8iv=_!%JJhEEaC&(5z&~lGb!y>IaRP1l688 zH0=>&e95*oJ!-RfWpjZiucuc+czg39U^5FUofFV04_dxBXD90OW^`1ren9b zQg{%VM!G0m`hXBlTHb*O@eqS}NbzfE%6M589rhS0D4KGDiqaBO1x&BW!y&?RyY2LC z4jRSJWm;?=HdR7D$Thz(4WlN`CriWC^&61L0XQ_0u_#CH?}tK{3{(rC9vMlRV)}8S zr-; zb|gQToEFtjzjFii{A#jSI}VU$>5lOq`A4HFVIcfWwaheU(kG@~FN{NnaDBHMyWcNs z(J;s$8TcV7k@xx^ItAX;=o9A^Z>-4|gi=x=Ray2=lp4W`FqLG_r$SQR_<953*d$Nrig5TggH8nK77+YAH-c&awB>pUk@ScWJYV8wtomQ2(o z0ojMFGa^yGCm$h$~+@ljPy4O@zfv$yNyv9yO$A@CL8}A%H!U z&gCf%feR*#QP9T(l&kHpWT?GfyOn37Ul+}{z5)nX!u^?Re?TR{QjKG>$WppJHxsvVP@<0WA^N&x0i3GwnKTO z&fk9f^G)dUBG)SjUD|*9Gf=aWK;_Jt$8x_QevkiFuehJA|Lxm!GX5r8A%Mf!zH$P> z6XL)*oeuG~fBfs!7vf(`=09MJwQr7>=XsEU5Q!qArQnJ19X40}44Ef*N>0>(i85U~ z36sI69QOAxvogyUt-vcDhQGtrbM*`T<4w}|Wvq1mWyx?0Rk_H2vT6aJ z`@zcxe@krQum7oHW7kU9(~_rDoBWE#=2g|`^yk)lowV{vS9t>kb7O|HePxNmy8{Yh zQ#MlJ8RIox1dO;%1|_`mM_0qz*4dG`>)&o>FV-LZx^_xAK&!gKz)yFgWGdy`ovKjT zdb8LPd;RkTb*&Q(+LoCX(I>)g`m}s7=+@;7Mz0Um;~hV#pM8BQLRhHCxb?kWn#<`% z<;{BC4~p7KSN5Kr9Qb;@dhwHEhWTU5CCz%lx3b5?GEUY#3CoEa`s7?Me&*gc+4AtB zd=x^7R@ix?d&67f>ang!0XKaD%QsdgnakK0M~ud70)*Gog+CL53!_4!sIAjb3*Kml!YeW$pB?9zj{2{zAbzPAcpUUq(1`fB#5M$@UMIjHM@@FETb z1xY-Mi(;Qa=^DDv4rxC*LR!&qemXrW}$`@ z_eC|42K@0SF0CqVle0o44*czuz1VyS2N~JK_E|%DgZ{mxC%En7VAdG#zBRYfFMwdh zU#WI4F%oS#q7-^EkKfu%Jf#)u*#6mbVRBdR|7MNZZ?IHS{Qt7XJen)=R2mG-8UyCA zu?y0$S3O++H*1{rnehK*jTbJB8K3CHcVJFpw}0O8kZC@4@+aCaG6_?a^__n+%GioZ zho5mha&u4+P~zy0Nm?B__cd*~MScZQ%VG)q!@H_nI6L8rWK~8>$ZL$f%7N6! zZ|@Q-A$WCO+C!|5hG{1)U_;6E4%((6tdKLeKC_k`ZtCXxZI`=bjl?BOOx3*oe9R0< zLN12j4(*d9uF${j!>#G(IrTHEL+KZ)G1EBLCI_5vFs3ic=^foN82icJ%h)CTO+&E>=s+d(^pM6uV0sAN4h_} z7=4dk{7y75G1-&U4g{Eg7U1fK0TkW6&_qHESiAGLFz;&aK?{_-64(pT(XT1ZSc5+g z7NmVpu}njfj!Y?bi)6A#JGoAOZ0AI{%SHgx?cb+9X70o&&0Y!l^{Mcwu9@t9?pHV= zf&Ai>wC=0sYhT0vH}%EqHGV()jpJ4>rgrG_f4IO4`6CaOtm75CDuce?Jbm=_!M4LW zU#X-jfdj8l8k#YM*J5N=*%)qfxI8cg!LHGm$Y7f=N?&jQ)U5NdM7II3^^zW!z~U}p zdVG6j1H7#Kwi)_sZE->|w!-4yT+Dx!167R^huA0L59exa2Ia&u+KZD{&5U>=Z>A_g zqf)M$rf)?bF1uXV^`XReeN`bdE2?R3vMDDZa0mUVHl}S<*6+u&jRkeq52^OT8Z3>r zuyM!k9if!Xy~x6Ky<3~iURySO%Q0!#4aVjF95v^$O$Q51o!ZkK)Qk6@$N#k6GRfMC zncQO7=9RsJa+6Rts-JS#X^V6`-A_dJDc6yZzja>-|41kX83tv;P=uiw-<9=CyH0+v zW81Lq%xqFlO;+PuO>`r}pMz{)rTrVNNhTPdSHAf8dv{=n|WUhhO+)Fk>> z&L8`+KXY9BZR@lV-tD1P$Br2MxL*PY7HyJcaZ)(pdy&D z#uVFbW4@?&1yns=6$D}? z@zxiyNa8mGpcYl)PXl@HbfCYE3WMaJ6PWv>^DrPlDIJV(!2^kWCJ-XkUf!Qy;v5U7 z*niyw#kVIu&XCtB&d7P9-6W6OU=q}0ifY}az$Q!b(pfw z6TxJ=PaNTA3F6Nr2{y~D6oq(x#S~3qi+vz}lEhu6dnZH$su|yIm$drgAYZj&j;4}n zzv%dOt0%7bTIOs(R^j-SPSG<=;W$)NIx%_Bf0 zj4BwY0ibf8mK`R}9MSuguXEwE&hb0nX_OZ&UhOH)HmwWltrUwLlkaW(Epl3H$e64f zM}KB$$Iwt`$7tHy=&f_DxRSD792SuK>MGlX>-9U z4Qd&i+}vcNa{~fFQUc{<6YMm%_q~^}8-PCd-yv&NP$a8#UrfUnM@dXm`BU z?st8PeD^7`;mERi%MhL@Pn)Hy-O!4>d{X;{g8oshr2?<>19&*qIAlfffpIT~P{pNs zh^U$6$la~)GC=O!0Tn?W$y5RSGGJl}ILm-AA#_b9VXGRlM?!j0ZN3>pjXaQb>^0{d zViU{l-4B?kBHn-mS%C!rbeJGZh{Qr!y&K1Sa_zExD1;z@MzxY)3TH7fqVV*c8}1o| znT`7M{~bLqJ)Q7C$hQ9nK~mULPMG-YsN4Jxs=!Z(urP6?+Z93(a9{(yOjoG4*TG0n zcPJH6NEPA(T8>&*E)%SnT$;6RI&%-SNP>F=qP~aUf|kGt8&IwS9GpDF=02S#B7E2o zJK*O|4UK45=%$buys>(E{KL6T2a4HIB3}3+go-V7BChT*NKJsMqRhkBx+s> zKlUq}m%=MZ<=Y|f__2(^dJq{F5Xi*)t3ds4MYUQ=@>NI4=JL2MH_sFie(V<3|(O))=_WiAL^+W&d!u~0Xj67pUF z(n5edAR(3y#fSZ%jm#wU>4bf)E=U;k=#)9*qeg6krgtwB;AFsAl=$GPz>AMiIGcA4 zibV1NOEPNfd_c_tWLY7Dc6K2?Q&iB3o0)8AX?9<&*IPbh=w*Cgv>yKOrURw9hmO@0tp zqV*+0KZLJsTgntCstN_Q(;C@w%GY zL6(98sp6nGiit7&_wO=t(G(GNu-k%7i&^nLq6ZYdrlFnbm`+wg^;wdq<(>_oRQUIw)t70bDQ#n+c4Ti2KJRz#sphAcePV5-unP(y*UDe6Xs4W*_@ z-bNO1z=q*`?S`=*!o+OE3=WtJ%M=J)C=iHkHC!=G@-oY0nBbEb5SFap2SS-_op+zU z-z!=?46Li5V|=I(EoCPGiogabeg!DLTAKrpIneDuOnQ@~MdcX*%p0O<@IBqm5`z&( zlgzc={F`Nlf?|Arp-)TOJbv~JUZ@7^z%L)u-Mn|}W6U*=Ik|=s?Y48Le(uTl!GTAz zR!M(|lW^;w^Hs!{<0dgS>nk?e@`1-z3AC-V$JBPcv|^KQM;jDhI3@n!l#I81DiZkS zbXqs1yBQvm-%zN;_UB|qikP7IUbLNsv$V+p0k7yJS8h_tMeqMWRtz(lZy9G{r^vH>K|S4?g#f<7)Gj#gT`u`OX3+Oo$-+!Dq3Fam*Z7)SS>j%3x%!JH>hv z;ZA=$^R|$RU8TZ{J=!R*rSi&N_xbH90%6LSG_A%rQZ{rr9O1?)3v0K z`sclJ+{UFTA#o>Y#1l&>I(6kp$t51DxLq7CQ|e*IaoOM#AFup-dT_}L0W7+Co-RiQ zTwnUY5ujWYOtOB648#fm4HY5nNkNOq;F|Nq)wF$gb5ohN`gg^5cWblBJWRH zab31Jc_(D%q`iB@Digy);MHaQ3ikZ<>tLkM$DiQs`wiOflE=TxIlrq;?)|T@`|(~Y zXRqVrpYH!G5*!th9G!n0Z~NF~^F^yAhhqD?>l=j1V-KLIZ1lC@KOZVBQwvYOnK_M< zc9?Z9$Qf`D;5*?6k%3@%4xR`(RRy6Bq+lhAc(mX$v>ZI#8Fh~|{v-_t7j5t}BNe1c zz#AAVH7OLc<4%gQG65cVh^dc$Jo;$UOrt}y%frm0%}#}CLZxeDLk}VDY9FiLOuOWU z6WC+@5d4vs#jqP_^~L_tv1I%;;p|MIyGvof&cY~H_xBha>>kPi5()v%aojs7}H2)+t0at2&O1KdhGERZWt9HEG#riv+T zEC|9UOiPK*&10UY2;@5`P2V`H$!M&DYDFdiDaX~}z(<0{sgi3fRs&E7C8Qm=Dd=T! z$a`%(@XoUnn4qrHoQ?}mX_ZjXL<+BhD&uUAqH0$nzxck6vTG!3J%yqvil*~Y6}>XV zXjuSB7%EFzx50Igswm+OBFkkLA*|i6~d2EBQ%bBW@uLQ z3%W=!X+-OP%wXU_$5bjpcbkZ~7S_>PYE`3O;i<^e#Rn7R4Aaf|yiB|bB|KI&`k-yhZRKI}z2x=2kJf0kRd@ird@fKyI$O-Z9H& z)F1kex9etV-5-7?f6;RquXw>++G)0X^Ln0zE^M!{zUlF_bRi?+NYkB&K(FWb7JBPy z>g{i|c%Q_~4t36Tx;;E(ZHaM3hzob5$1A(Mb(wzcHCM#xPH7Ih zb#?J+)AxIg-Hn&OiZ5=D1ox_XHwPMDbjS^h=(gDm^bWF|DC;b$W)BBDx{bejaQ<%3 zm*D{8VGOnF>94}oZj~6hzD17qToY0|n09K}4t_4YFL#P+;P<%`(AV+YDBB8Bl}X;d&$pHqXt_YIW+7F0TVrDq}BRtNg@WPIl|ML)aVIDS&@nNY=@(>YE2wAK^a&+q)-7(hS4#TM-FgDZ2<*X_!#W0Q4F)D1$pNi&^%m7+t3 z#?%2fMd7M%Kfbxgm$PgB_0+KD6mLgozxF&F@sM%iHaJCcTb7FL!?gWupOy&nte@|B z^`Wg&>_BT!FRa*wwx9(h@Ll!WUFPfWHLBwZ!8q9^i@zX{D_?4$LL!`=G+#?OMyg6V zHziZ}IUS+j6q@C@5;MR1x1sZwN>G69pVy1m8cb*Z*gtbwxV`bW%`>^_>&*GZ*Ha@K zBgeOv{sf<^8Xs<*=x@F2(2`UzDhkxyCu23@?1f-_5Auo+i$PjL)Ww zFku*wLRkvUuz%wDPUh~`o!0X+St2)jBZu31ZeaY3FCKptwH0&n0_I#ma`|V1`|pX{ zOF`FV^tXKf3m%llexLs@gK^ZujZ4`&~n9Zcv;PNIGM(0wHCMjfUZ0?EbEc|Kw#Gcu<&*|FmK_ zzV7_Z6L`x-Qk{WV)P3$-Us$^R$+U9wPHIX2_T|5Gm#+Syy}auBb2qJyX^i27rX6() zsExsmMn3cn{P!!CdE@-+%V&E`V@Gt3u?V;p60(bl84f`wpNWEmL}hRRrFH0R9iX0o zgz6|A`VkM{6RNZlK8!|V$N`^4VwA3U+&kmit`IwR*WtlsT8l63Y&VTZI~HB+9rVj; zV)kr@X(Wj@mN14$q(u3mM1%g5Pkc6j?g`<}A>gLffp#Wdw>})g3O`XFbzC9BRv74G zb3gxOr?QX)Y$w@%3`T2Q)+%N!t~!SFoZ0uKJsonr_%S)~Bb{o>aQ0<{%+bGmJnJ>e zNLphYHDkoSw2Fj15f1(RD^TELEO@DR6_JHo@JL%osJ@c%%qQ!ye4xB(*aH#z zJ!5y}(aY1rUd4*X9_0q3Phr1MEt^6x$?fR3OaujN9hD7$Z1W70aDe*d2Kk&8R#M9v zEvaoSx;qlHHWdMouHFUnNl_U*XTtgmlLyzb1i9#B-Q1cpxsS$dgcb6VY9n9yWp90S zpQ;N=lec5}rDM;eye>B1_3=BiL(6iO7*@EhQo=Xej-!*HkGHuy?XG(|W;mxxD34!1 z=FfL0ggcppX<-|=`lL*U-AxtKAoe5R6 znQq7362>k?RPv%j(N&fF@}6&ARW@;_wy-fHc32pR`C}oo6NzbV$IUPiZ%CNJ(Exsn z1VM{i+L^bW5j{FqFwy4ul{;0UF&2A`Hzj|SDfE?glCZT#Ifum)(22}9B<$8HTm@|k z#TKb@etpZu0$Mp!Tc@4XV1&c;phxMB(xquud&wfHWp)9jMa%&7yE-TFy0C>?&4l=> z2=4NpTb{}n>96gR_Y%Ir!4F@h{i|-bB(FoZ{z-a}f`5IPIaX^NABVPh003{(icUM_ z7@$!a00+2Y-t=1z_XQ7RtA|L@&;ViGT~V%Hr{t7zNn?0MJ*J}`oyZgaB>Zg;I%mYb zzYjks4h+Ax|2>NDpck?IDy`4NggZ8V@T$IVQM$y+K%c6u&;e$FmbQh&o}K7rG_bFD zu_^@fG$t3Ck~t^Q}~UyGOK;4v+BI8`)o7>({A&~W1Iac#P{Isvr! zHm1`q;(zsODz}h>#xPcCji>A`^F@6e&T zG$F*G)FKh)m#k}^eXz`W&1vuvHPvHnz@~dph&+Vx7%I#x_`&5i6;avuWbgGNY|@#J{32%1j^NJ!|3NT6bG68MEQHMMTz<{D<*qsx!0o zXF$gYUchw}bE*m#Q2sJt_)M8!pXycA%asqOyC4hwn)}{AsOf90HT%k3j7fM^p|) z*nE6CWK`#~UOTWjGUPfb*Ksb&ckt@E&!lP$`sd_y*0_0@7e1w0+?JhW%C&;7=%`luldnYO1} z@m0rPYq>gN^CljVaP`~O_IsGwT%JRFv%j40+Xps(;D&m;Iku?1iMo0Bd zepuU#O-Kg8mH*zY+B=;C{grtR$K3ifsIY(>3rMhl0tpDNfb0rrv1n)?Q`6J|Ar{bI z0bLdlUjgM65Lp4u6;NIQ{S{ZL4=AjFE(_?jyk&nN8<~OZ3W%>r%P4{l3B}YJL|H(N z1teP}Xwq^Z!vY#CpvS_QPm_^X1;G{2IsuUu5LS^>It;=rptho8K)KU%-!I@&&h?`I zL$iQ@3J9yLeB1<`6%bqj%@mMnF|)J-Z55Dd0U;L9Yl)7ftEy`s)gyr_3J9@)C<_R& zfJ_UhsDOkD*~lX8DlHELTR_VNG+00d1~gbsIXJ)h?>$Jhgk6pX{T5JYIp^*T3M-)B z0`e?Msz*T91Y}o0dZj zPXW1+9NjCqQ<^)5|w2`&vY1_MMs8j9ay1U%nLIWEPfG z`nVWg@-VsVYr*)mj# zJnnmEl}`9X=^TERns>D=*y{e>%{RT_pP!Y}NqHu&y)%>Q9#lM35YB&C<|3tH1sluZ zIe(gs&@R5~+^3OintjYw`vXT5ELjRmx}z{zP+aX%Y@VwsvLBI2t$zkRdCa-VZ@?mX zy;W|$g7gBSut>V2G~;5tzpO zK5$1!Mu@e1eL~RFy}L4hk1g3r;&l%VjZBmDd|;wCCOw8S!shkoBPLx5D6A95{&| z&hECm)GWMmwH8|2o+1tO8j_T_y7!cexb#Z#xQ`?NC_z>wCX-|7L^>duRixa6zIO^% zzR2I8Om!2VQ6OuyiogwTn`z{V-rn4+yv@=U4<_^B@nlP|mX@LLSItwlmxZST> zZgJ{TRC{S{^SPgXOPbSsQz7IlffPHbOn^NAKU%C#C|o7ie|!v8x|)k4b#Wac*JgE? zk>mE?!Ev>ANro;$|HbC^u%(97?{SwO!!vn8r#na~4+_7ISk}kg=8C4u2#D?TyG@M} zbF#MQscE!B+6yoATsy;frJLXKv2ZZxHaR{p&nQ+HAM%<+%S+b; z!d?dbTIiY&{ml#X{c)h6p_A5bpL!;Wy!q7^%t5*z7IYh6>u2CaxlxO@43AMjtU=2@52#|N%%B_9c9|ls1l~f?F`+xX z#_z_dxKwqN)Eo<2h*jeT@m1!)ZbNaCVK4%fKH zpFp7ove3Gnp4bJk=fxvt-#Q4V*c2uEZQzVU2MvDDi=4?a(HRKM?47Jt8+I}W;`(uf z(}bL)U&i8F&uxlAhJ|bBX*V7Kyb7U)f_|i2cjW0PU>io9BLM;E6@<4Z8>(YjoZJ72 zj9bz|2|NIo)nwg{@EIC*eIlSX)o;BzlDjam-ajh$8cmWZY+ zw<8k|8H-As8|Lsc+G%M2AonkO^ADEh?qc&cN&7D6*!o`W1J*5M?A3)Hah-cWh^m*| z=UgIvj&KmqI_(D}39rzxzU_(RyGimdOXmp<)|tT`@VC9N}9=m}_9(5;3)XTPum+62gpbjx0;q|A;s#&)nN6iRW;i=|J7vtVb ze$j0suYJu)HprC?Awe|guyjxWK%_(9Moc(jClfA&hhU}6l1UqTfF!;jqe4i}uTu3+ zl6}P)rICD4S4a1jVFkY@{jW7UUu}6m9Qk{~qfRC3l);5W)nz!BE&|$s0W@!lJ-r%q z>Bj9c@3jokHp9p-xh2hWJX%%!`u1UERW(R5>!*MZKK+6SUmDD7-~jCRk>cTf>vK#J zlY522gVn8UKL9TAi)vs|O_(Fe>mcZnB zxb8#lvxmsRA*s@E@Vb1P;d&V}Pv!zg2+)z;n?g;^MLB%MAm);(U;g5KD-w72W-jgj9 zmc;jx1gLY7ibuLUF5Pr$x$pr+9ZZDZO-VrP=X! zzpvTFp!OBf0afWgbFR0U2y4K^+GWpt1z~RboBU>o>k|MN0x?8>}K7RNAq3X>4p?U+ie`Y^} zVaApabtuQ}(w?(2HLGw`0sXIeR;pOxv;gr}9Dz0d%hoC63!flGX(Iz!CgexEcDs3UUvR3Z!^ zyc+`vgMz-Ki@;VmsAR{bM|H%}oc1x*PB+LxJW+VCTI{|ctbZpEm0 z?z&^x#rb?Bq2P)Lc)A++KntLaz&)DaY@d9D2|R!W>I*SltC+Yx@kjuWjVf>=;**K6 z6Oc!^h}`2Drf-cmeMz`?kNtv*L3!n(x?>D>7a*nzrCDN408*4OH3G%Tk+#u#`16+d z3a416jMdDgm{0xzUzkbwuOMJNiMm9DIklyEV}R{T7{pi9Ch#n}GGoMHZ)hvPJ(Jbr zm&Wr%$Bq;~%E-uU&v+S`V-SDZq>UZzf9_Id*6ya$7EbZK358pJm7+s3V-j-UUZw1` zQu9P~FW&!2WZ~yl=GM}4ZNE-8DEP0PNk{z%0r>EnEHLH_Gi&4w0@DN@S;u3LU$Z~Y zfweXO_*^OwCd?y#)TrSal7CCkHjDOCD1w)l3gfa{8p#$_uP(0)yqTnFl zX}jsHZANCvnBpM~3w$qt-Z2@~gpaZyZ({TzDOTmBdKHMraNUv8FLPzr9jfBB*wJ%H zH+t6N3?>5(m8kJk0X`wNvViWKV6>%5E8sl3xw1npQ+J^(%D?*i(Q5ce&c<_ym^ozH zDDwb{CGpPB+PW0QW|>%4KY5u2i#U%6p`-bz8=|egSS^B$wiP|~8}?}UbGrSiU%tqR z%|8P-!JbpBKtC4K)x?`y<(|5E?89s*igby&wY>%)g10?ksC7EZjtG3I!OQrDgt0=9 zU%67_KABPYud9mt1infDa;DPPZv-jn$&B9z3!|gV0dXCC6`FvwAHmAAKnFVFp!Ikc3Ce9gS7=!{{ujIgruR48)3md^RfGo7~Ws+`znNQs0_f z|F9K*@f@qerRM98(wy%NL=5m`3;xRBm8$`fUt`Ur_`r^%ety5p2Lp~iypjO9r2PAt zHP9CY8-c++(N}vK1-~0JbO3eY$t&7GFnMq; zlOw`n>4@#F`^3m_A_FMG!;w;8h!yS)v{Ev6cP`@A0R_D|_!R z@N7%k&Ey9+lQ*~e9B+kpBYCyr?*QgAef+QduY`HF zr3W4{89^}S{Qbx`RXhO%?ACF&1Au5N4501t=r6m&)VJWfEn@o8uY>FgWNf78M|ek> zXllrC)urR#7i+y<8^^Z5E1GoAl%C=jR{U+14cy-;56}g0(W|Z$PKagD% z-)T-nO60@+8St$gUE4~Oc`UT#mb=IxfrHmwq7OQl0mL`KW>@fFkg^>g8Np9R7t>C| zHJNKYWR+f1n_lyvUW*u6ieAwR>|II$UCcKX>$SVsN4qp(Q`z&~6$yG9lWmXlYPqnQ z)#T}|pwi|Jpv*ar~rg(?7t+rqndNBi)iA74Z@ zyo>%U*cWVZ;79m@_Syruf=*#XjD32{3wsfpdr!%`m=^hi#~cp&O9X;h2jTpK-8v#@ zu~z@MO8%(JAWW}6v+tqE(zZKj_~l|2aCz@U=fjUfeal+IpXLI!#r9Ht2dh#BJ8FDe zmjof@{ozg}kxoY_ZWrKFi3|)Z&gp1kM#dS-`1n@f#LuH_zatONCTTy2jXw$ z9BS$#Ja&yMvGlWSI!5_b><%Uu8vxAxO-LO+CbeOBxjaf`-Q&FCr{OO_S=z4s!MCd{ zKiyxLc-nHN_qN#Zl+C?go1eP;y|{VLqboU&j4%3rB};u5F)iKLZgi1J?&RHiwo08M zu*9AragGaowIXRNN9**R@rHG2AR#sW`=#n%fy#S^3GYOh+Uks(F=E6($m$C7T{+Jo ziR;2kCz0W%`Dl$1q_fqzH$j2W>xUMqFHdtDRN>e%VsFN2j{y4k*n2FK6l zKHH-5uu^sSv`0d%#B)-sZ|ewdg+2}s@o)C8J(ko0@8-esv*F#@G2gS}=W_>6zvd)*?DeYyy9>0425&OB+Yv@(I zdy!-5{&%{C*?mRZ^?(%o#7-AKZ|i~^?Y>4LCD_X|z|xuf$MI&DebHNURhYW?_{pbF zKRq3i_xHQyuez-`VL%*~Uz~k0&0yG9_iu;3?RbTk_G;r(;P{)0#y6ioy^TzMT-AIcyLAyiITE5s3@a1Bu<6 zfG&&(-t+q7ts8yy_~C;UCx@oBKQX7DtNOoC-2?wx0o%eyCBH$gn>++WX&sJB?Rw)c z_ICc$Tz=l$zjtQK7lZb^cylgzFkt)3GZ)?zoLu;NaMmLCsf)*gBkrBP)^qR1{;h_u z!}am{zwbv6*0LQ&V^Eji?3xVMONnAY(w1qF$qGq&@u%^zh2vncihuf*7Z2;0bvYmE z^0VdYjNxiX{S zZ`)_*hd+4LJX%v}LQ!j*l*m&M9_Y%n%x_dPe?Un|0cL*=F)hm8#yr2bWoy;ee6;ll4AXSu^ZLL0JB%jnaGyP{ z4wl;XeUcphwyCY`{MW4qzbpp_S=&u|c7FJJ^^2z5V5q^ph69z{18o_~QDg6Y+p;@u zZ@p7chK@&d_PBNKF2nb9cK%Y0O86T%VgNi*209IHjeg9WXuPxk?%?^kJH^-G%nF7i zb42`|=P>_Y(Br=kse3=09GvqUe){9!Gr!<(y!E-`C;QtMR)2pIT5nqYHN0X!*JV?# z?7j`EIQ*-HGI?(AZ+C(K(V$*wXW@G7WvQ`T&0*0JQC23X+vxi5h8-)(i@!t-#jf=~ z0=2asyEWn7wR_C9{))B1yK6&l*M>vZ*GAO-KC%1z;O!sRZ6fEzYWv%PqV@IP&({C8 zh5fzUHDJU1o1(HZS@F-~?%!8-gZ!Mi9aAqqUHiAfBrh|Ey@vZJ6{~9%_pM_-0WhKf z;s8iAxnzk?O&7<>+whvEPRq}$F$-1tn~5~eX03ZE3Qx5kp2r@YUdtp$I`Sl9e=jcJ zFVnJ|j*X@$`h4)d;?o%1ch2Xd@6|o_@_i-dp~GcR!nsWy@zYP!x1S0?Wqvy&PVY3fY6YszreI7Ksc(L!j(7Kbnq z8&C5Wh)l&RY=GhtN(JoKaSu6FD5OBW(sWi)9ZfQfyo{G8H4po*I>^Pkb&HZ5DF@2{Pra zXEb6>&b5v2GE*P{!(l3&2i$d=Ndrbk}=#f(U` z@-3O-qTA};=BA>oT0=q?&alt=-T?lqoTcc!-hCU4+Fs8>XoNO(l03%t9{=3 z?$Z8)y7Y3CRamCXN=ZKmOZ2Q`F{M}d-3oh>{avzb45d#*!58lZ9!?#%=+8TaD@@kV z0GEg;|F+fQ*!!eno5~3fo;rI2x><;;#*LpnI3iay5jV8Cq9a93YS^zjb#DmoFtAoz z0=UAQIY6{=z+KYb7E9f{*)DamqT1&-S(-!WC*m|Bd(4?i9JGpgxD=f% ziwQ`yS{I!p)DP9cKHJo7{c-G?de1JfE?OR$BLXd93B7lJ>^EPBc_wRwJ0n3nEG_;N z$y0_1duS>AmXNQ3>9zl3^>f=Jm}JC*F$Gv*fBx1OD(RRf5(px*l}ezfveeRhCx6j%9jpkNaoIT%ln`pxC4y1-V`AE>pWL-b z=hRtAU}HZ*o9d9h@#?1x<}>vTcbsY4shMG}5*mGHlc4OBLegfLXIc_Fk$MdwxZx5t zKw|!ui8fyIOXwbI9gLe^$J&o(bAYRS=~thcNwuAt_DltqD?A1Uqz?5f^?Cfp?X=Pv?1NO=_AMDcxUP@tl=wfN#xt+^tk8!)3UC zJ1Kd|ooCax+8?*YRKweU4>g>@3Nfugs(JFj^vXhA*+%ue&P!N5Y3J#e*EG`HL3OV) zJHqstG4R% zD7A_xp05JS#aj0$7Dngm)e%W(k;&Mb3WJX^;tclatDP9f*BpvZdbFbJWH=?E@K3x> z9&2Df!QYV@6WTCwqlP*dP*6Gi?An$qmnqCcO=z_m(ZORZ>OI=EK){iZS@&x17C%c! z(=0I)yO`9CTBc`mCEA)Y8ZSwV(s}8VA-JItXYs`Rbd~r?z{1&CGM&ZBw4wsB=8jU& z^6yo?ChfjQKTCDb4oEj2C01#DqFH5){!x@VHW;??iqX4m7hl>&Gw}Vv_e~KTPoc36EeAJhfa1rYw&h}HJ99s?9Hbu>h^$)XKcgOV9UB+3WIITuqbs3>e^t|=KaZKjg_euQ5rAj* zx$z@WyvtsV(YX?&7dS;W5JW}bTZou&D?|*g&}^>;c1$<6Eh_&GVWX|nE1>@-b-e*c zdMMO2EU7h5r%f*$Jo-wbfpFAk=baC^SeBTK%S|^;lk@{FRak8VaOdN}n&Uf!BNEnJ z#hqk4Mz=B-quWv`#~P1C%{k3J`>J^^x`7|y#(e}rQo735?5LST(#y(RAhO)U;KmNZMzx4tCz`lZ>Li1G+< zbfTHlF+7EBfW`e|0E!_-37Ulaj>*c(61n0N04_d>O{m0DtL^^u+5sbW|GwD)<~$Wo zmRdh-Lmk(e%){Z?Vq}(%6<5X?G>n8xGhjyru&`7cV4jU^XS=tjjU@}fask&_@bAxE z(g6!;ZxHFpk#X;qTkQB%fA`NTS*8?{LTI7}EQwHk=;zI&l zP*w~=l3EXZ25^r$I9d>j%j-s&pNrz9mN3{_3b6H28JIDPqf>{#gFR9b-GoIsWk$vZ zXVwlLqM9U7vw<}6ECQcxn$McK0X8H9IlC;=@jYA2El7OTw00O1<}b{$Vt=iM!T8W; zgY!>+Z6lFdN)E`TDOjZY16uxo`J|wnZdcB~C8Edts!vVF!}0#ssri6*zSMbQOF%d; z&|67q%psM9bZpMS;Qp$14b>vx&E>TxSa?db``-Qk5RcLXdR)Wh<`7`2KUJ-0Sw2;AkfeT z+$21eKHp|6!7c&se=~4g2k5ML3eR9Q6~_URV62^Z;6$Ngbd6IwD{XhYQ;|KJONY@K zK!mH(M2)hfsv5v*FL!G+1x?7Q z+U7;;5#597`9s{MO<5ga3GJq%xBD$~-aRf$op^H`$+E8FWKRy5^S1za;8hIIYg@iBKN-sEV}%mcJu4iM7iUPOw6`-rj;0 zWXiA*sUt9XPo9<)C%Mxt+nx7!@zHvb!|KqZY_Of%WRYUy{?nU>=)l| zNyR?mfCkOx%@~071mWM^aZvu>NGp-(PCk+&$IE2?X&51lz-a>gZM=teb=Y7C0sN;7 z@&x|7pGyrQAz=Qj@*C~xL@y`nu55GJEp%`;ocHddC(;ANp8>pCDB>h)9f(AkwD#Li z?M&?#a>s<*!@(fBJrS-#EMS0l{h4uvAcI6@jpK(L2byDa?~6wV-sfn8Ome z0K_%rrCRQD%Vc>^#B9GkC)&uJOod7Ii!5cu+*00pFX0)Z9#C-cSfH zbK2&4Z?Cny9P1PNS;^{9R2a@v+(ND$MT2<5;khbSEQgX*D^KvH4Y=^^*+A@2aK0q~ z)#;tFJLtokG6w_uKw}?}%=F+zCHP3LvT+bgpA3*0-0b!)?nqZAR5#c0RC!<*P5CZY z0ZmSVkEEuRH?hSyJnBoLj+OTz51u^4cDM-o*ovipI<bGtM*_~3?-r@Y_tdfAO&m2mAajG4`?1{wuuf-O`O@j9Jm9x$!VgF) zHibYOz~r1&1GeB#}#~65L)H@;P;dRFaUr{w>A5qHpv??(3In3Xf2G9)EAkW=(K}Bj4S} z?u_igBUx`ec!PH)h8#M>a;h<&fKH8h#XhE&e&?QQ5^wK5=cpSJkHlG$c$R6B+RUEU zvnYU)a%D^wF!paH&)Xjvf4ya855P}XAR?67;Sx`Ln|*j9Nv(;l(4O|H*!xu`nWfEu zr}Ki>pFcuOLKytk9J=Mv)SCx}AgV+d9U`La!T<+cV4f&z^ZPOzCghp+5@$D&^v*{fR z?hM*&410wTjhGQ+1rE92SKnuhi{CbF)`h7BV|~EB2O%32=Ez2KXbIO;05RUj3pmX( zv$9NWZ<2V`By-5D!3?|8HrJqT@D$@+cRQe!zc*s^9dJ29m02kwWw2xg92s)Rsrd+j z2%$T9@nFRMLtQRvdI)1HV9OXwY=(E_N4A=$2nFAl_~ShjJD8rxY@pPb6{^P$&GCYz{lL2QtQQv z=59tk1tXblr&NDgj*YdP#)~_ZMLy>fgo4Q5BVcZAR;Iztu#J9mL77q~Zzk>H+1CN4 zNo={LfMQ?l6>YJSuIPrms76QZ&OV9yvzg`SkLNc^l)h{8{9}=W|8SZ3A!}x&dekb< z3_OLng(q@!1h}ganaz1(H!Q|4)2-xUv2ClnuWw^YGPA{VwhsaMTQ41W{`4F6d3C@h zhV9sqjBDZ@;|EM8p4z^7!1FiinsLjTHE5X=XT?`%zQ19+@GA3zjB_gQ#i9)BlMILK zOlTg?pGZHo{;JkXo>WkFav^i>(}=8db-jcv<@3oS=HY)N`2Q?=EMjIAcmYe>vbP=Z z`qPu^z!dyFO+ky^Fz!6_AbT*f*D|NKErq6D#6t<}ZD)HeBS4BK%|68jqX;_0i$A-U z={U7Vx`3_4&VYVw>eJj zn_SYY2I^{f_L2TK8oxO79lp`u&RP9>>ik}yX`s4);0F(TVa0{N=1LyBtLzL&@(>qE zi`UW%)~A3xnc|)U28#~Q4@`V^m~s?1v%_b2d=tmq+n zRUbYH&uUy8ye0vRn)6=Jz?VhfLZ`=4?2z`yhxV}HtR-In@Kd_;1&oMGFaVES3^=m0 z)hK`a2g3q`9Y|4-^C{j9+a3ydp0_Cc*3ekOU7y)2NqKHKCM3;ARKAo}y^kjBCRyjXXQXQg(+6kLPa9M!*8Bk-h=Tl7(zi+2b z+Roxup0q0XbMtVvIk-hvyhP&rJ?AGGo8}FQCPnNkRN}farD5!ec5C2j1#%#f}htTmrIBVuW5b>`}~gX zTNtbT{?dZCk)D+4$-yc7u)6$uAE71Ae^yORo zj$dbtbL9?yZRz?9I0u-V8S6}E23*d~RJ|Jz$KBmN7jO;r%I^@**OPZcb!7(=xF9&g zNea}(4Bu*e)$uU!?7LUDegux5PT-dK@i4zmz0EOwBq?8Mb7RMeg%U|yo!F*~Lq*Kv z?-Gx%!@NId`W)%lkh^g8v%*v*m%jI>$LpDWuT%MNkqT>n9zuT~zWygiF`j3_Q^84? z5&h^T5EViHU27G#clr3G$&$IfZ!Z4hj!gdiNXOaDB?f*t;DI3H;l`Jc6Q7dbFc~xG z*p_QaKTaJF#()4EBP~Jq4`61ou7_BWq&V(rnM_wy>k=Gnb%U32HGF&jx z94NrsYDBcBjp4%fc`gVul3(Y@xs8TM5;WoQ zFd4Mg2xzNWZf%;tFW4B+!Zn#}GWO&vS?@fU#I%fec&uZ5LB4VP;>XOI%Xt?LmVN&? zs_yr*QC0cyy*Gx3FRetaSuM{F7MmUZymsu7xN9EugI z@IRa1D?@}zSk=Eje^wd}bL=X%Zu__P`{%bWU)26cxt6f|nDTP-uVXBp`vu2hwyYAl z1Xn9kT5;($IF+e?OY^kHmS37h$l4b1)hWutjdMX zGrqd~GXcq$6JnMvycz8mwUwi?k_Wx2jbH1OU+QW_23)EQVgA-{XqFa@o3*h4PZ}E% zkJeY;ki4mSr6TUihie9{0rd?7`hRNAU;6HPnf>@4`qSavj^m4$)fcipHq}#~UAguk zYwOk1@#^R5>hC0sf4n(4YH|4n$>hqX%Hv7~hV@HV>h*5@{Vg7TW8(Af#kL~(l%)g| z^QOU_-$u!wZnym1Y7*AB4Q)tn`KE5ObY9th$hcFu^LR|^sl>%Y>wS9l?iv+soGioJ zl@}fyi0YTGHwk|=t`}Ww@MrBt-d)AthaO&em=iZl%uqItRg~#GJOH`bwiayIbz<}A z?z{V2NB126+j_(+wb-T^uFm}P*K*QR)Zv@5xtNc_W5Pp)F5)1>hxYZG(Ilw;O+h4u z7>ct-@k{fhDU&-Cs|92@w2Of3ZwkW2L?XAq*bm-Z!ZaU6BG6{4J7J2(4Gf`6sfy_c zTs;O#MO_l9n&P(63x(qH^d%If{i%0{d$m;It`GHh!)-kpk8_!S7w0lux*R8aW#I(3 zR?*=5xCAm|T?z3CZx?s5!K)wQm3W@`9Kq=-jy!ezN^0isL{sRS3E37)ga}IAD5G*C zgp7hS9)w_Q|0eKy3AE8-wGiXT;9QdFM~$&EH~CMa5mOZ0XF;0BES)GXW0EEXn<13SMAyPo*Y?~et6(c=$tGEFOyGIlLT3^ zSDVrhnV}1{s~ltJ5b>+++&=)c~ia*=9Ot5Q2oW}4g&8QIZVV_CuxY0Gsj@s(RA`2bSa`On2^?l4x?qo)Vx8#> z*S56I4}lAiUd{q>bO_ec#w#Vkec!qb*41md`Ml||Nqv$F%P+DfAF$HIV3`bSK$8u; zIx>J*xJ=lazl*3h#!&+%CE-Oq8b5?O`nEkDXIT^&wVeXD!e{77B5_vp{Tl^D0LI{_ zFX!xcoA5-0R25}?Q&HQp`MNtN=W53F_yL0>uZbpI>YpNxk`UXD*Ee5Qw5LgTlTv zi)ZJz=VER4FGDuZZWJ+p+U!%0ZOeU7dF%EzLB~!;<$65_i>Z!7&CUX6> z9aR9fr08rm(OK^vqXN~(aoME{dlViC zrH98BU>7H(w;T}Su=4%di-!4Xfu%s8w)2^6!v&oKv*-g$6ft#(r(L$QN5|TfV#LbS zotQ*D;8CSND5vf0oP-~15<-T#Q6B5Q=mTV$(^3;ULa2$Ow@1QtV>u6I=^zta;%Oi! z{lZot9M(Bc{WD-2=6;HJ`(3LemasqQp^FtdJIgqIc7C|@V%S-QhvH zrPB3E`xQD)48p?&dsPH_L>9U$L}hsD39C|}u#$U+_uN=T3vG}8CGnXC1IzX>PABqEKj zlK>$sE(*E1jiyRhU;;U%5VAnb7X+#{N{9(@<=s+900*#j$lUL+G!3*s%5hzN_B@9e zBtZFhdy4{|JpvpbrrHTys(D~DI%E58X4{V$J29H1u0U#*CGOp$0t(SQ2&Ev9QR%@- zAmzDi4BQg=D0>3T@rAwbjdtmA5|*sKrK6pz#k?w00r zsPonMr7(9fp}DY|(k_tBVL=cJOoGYUP*hn0Z{VU6NAv3#YilP2Pob&=-GhG2dNYY^ zAP2w|v5}E{xA{Iq5`8U-yGKk50NKU_A#TyZtsIbevd#k9!wv2fB85*Zw}G<@#90a9 za+DCR+YRSa97AbaBWO~RNKLUy;2FgUgn=V`$Qh6+AM%7Y9*X83+D^c&)=GBPY<&+gRV51D^>d1pmu}Z?&fA8GPE1dn+X8_jGZGix| z-^qLb23=(0?GP`0nhhLMh`dO3@6|fA|LDm}l~%MPMg)NNK3=KcCxGS~t>&kc=9ey@ z6zObH*8#}Tnyyf8jqO4K{sE942yuLLzJgF>!jc_B^h7Dgz zfCGtnEO;a`u%swRizChwm;>vqP>|*TD|0+Q5%~_Y%yx>F7fMA^WN1|m!Uzqc$&+o7 z;?i8WJJr!0h7BL0*<5x^S+M8niEV;u*+7ps>p)^$c#A6FO;KJs1+=_$PGm!dUW5i_ zRM`d9bK2ZOOh0c;fsee%^*Xd4U3lt*t!t{H};(JBIbm}T=SAekU9M@5>01ZV| znnxny-hRLeNFX5IAmr=QD&Z_e0h?OR!Al@{Pxw?;x74$R^J3hZwo-`4Ry3b;_L3@2 z6ke31UDpcB4UKTJ(V&d!U7$it!pMcIaDj?9+f5fzuc2&!vw%f?V8~|=RuH`TGLt*w zLR+vODcnF?N1mO&RCQfC2L!i~9)kxeMkA`n4Jc5Iqq`yV;)neQvji$C!oOn< zKb4(xkYeaHd;o88B`^|Mqc6NBhMd_boIy`1 zO7v0;>pQoFE*`?v4eFiWh`hY~VAcAH*aTc%ms`gSc9K*Ps1H$8@WRFbVQZd|j)y+5 zLj8wD1`b`FQ~y{ZhFt2Rz3h7XQWE*|jS*%|fF?q63V?zY$1PkV0tEDfOJWa>y@g+` z&I)sqNZnbYZb;|iQe-{JqL)XJ4D@+XnkLQ%<}T2F{cu3Na&xxomUgZ=l7123bD$I^ zl(!|X*@#wg;d5!y5){LDV7TU1w0FK<4%HkY%FK@t*TJqi_>JHaPrL# zMO`i$px_jRa^`HrvrG2=0tJ5U)QU?zB&%b z*8o!PY`jOf!{A)g%TWcSmSm@am(o7XoovIW*EfZY=oT;Q-3)f~Hf3@~YtFioU1TZ7 zQumCdxY|dq>%6Fq`~4iDE70P+Av|65{;<4HleWA~_Zj|-SJ8SEP}FU!_07P{EF=p^ zN^IUR=Af{)?}X1cC%75lX)lov!v(RO3l7gp3pau+1(k@1U z0$6wrqHfA$enzoo)T@R4Fw>#dOZl2SXl==>1n=ZL#KJ^5|fiOf3AYU$UR{MEm26Nod@5s@k())kr6tOp`0ID&-=^kXrg%)D=&r*=dku;3M`#?^;Yq8aoD@e4z6`!cKf?#vxN94V17z&{E)#m zCejejGJF!M-QKHM8)CGqV*Fd3+=GnPs9w26>av)j3id|Qs*QG5(}HHsf!u#titBIE z)^s^{ggLeE#TgNqW12YEn1RyNq&xGDm1SG5NafyKjQNouewvx{wC2_sB($mgb^YlI zzd|y=)7q^q!m`dmby|V9wSoq<_UO}?;hY+KLssze#l2N6j`-RT^;&eYSlIQfs{Kgz zYMk@V2>YOjFblCaV%#^5BBNIKgRePJy!FAFqQPDp*8$JZKNc3d^4x20x;3`{aX_wK zDO0P%WG{=kU3u_34+Gf@+1qxav)tyTJtHkY*HX(bL6LQ90F*I`=Y3{VbLN?qk1wfS zs&j0pJ97bKQ&zQO zhj_|EWWHt~kxBMqlnhl)E^s z5)CzoAsh9Dja!7Rqk5EyLrqM{1G5*GTr>@S`~Kl!ShG_U4~@uSQe(i_d&NJwMmx#B6Dx2#%OW z*FhuQ7Z(3su$iGio2Y=@tJ|B5k*o=I?itg&)STmyM5t2;#7Q92nJ`H#QNz@?P6|NI1Y@i=!`3Ns2)c?YYOpC!k?V-`c3q_n5Gp`s^y{p|0|C|1Z;hT0 zCN_H9IwBL=((&R@z|G`?|B#ELb#Lw-G?9*QD?S`7$bQtrlrwCPo#@Ro*gx7?dgT98 z`5ci~I2?TE&MDP&{FSu6Zh75}7>B1bLX~{@k9Rl9Hb zP~~m@z~!t~x*#4F5Rz$?Pr|lVf^sR*4LOe{Z;VBXFJK*Fl|*d@6Fv)k8>dF?=kP@pAX-8$wsH zjmM-vtV1kQK*YV=ZV1(Y%G41tER5znX=yBxq@H6HY*oiIab|R@s&qO_0@0zw)N}(u z$<=0CBtA9WR8w&1GUlen2Qm|Jj!`AfKO3_=pi9^?$puu1aEaU62o@S2(9g~>3v~rC zX3~aa+Wlp3gGZ9eHY=MQf2Dew0ryipy=WUg;dhuG2{X5sxM5)Kg|_P}BJc2X_j&HK z`{48Eew04Oa7QKU>rxU7zDxc@AYfMife5$Dt7>r`k&63a*c_Il^2&r>*NdBD1_3v6g= zrB`C}Ygr0g7599nw@jjEkE>dCJDrC^dyR_OpICY3rQ8@3niYcEJzMbKa9`Hgv+Dk7 zwS6!5N$G52CWPngx%%>5S?uuc_vc+`NE|UKy>!2HFU}*YD1uQOmt@M{_oB$bEu1C>6XqmGJKly$`vz?!Pi8 zleYTd@r1z- z*qEQHsuKL=o}b;)owT6h->MOk7oneC*SKe{=ObiBZKa0u({tSD%i1-~*u+Is()iwg zy3S4OznUU99eMUWx`d`BDVez;=RyPehd|}WrCpFL{hkGL#rj$Z;h1UA^oDMprQ(}w zJax?qMUAB9*S`*LayU{2+??+t4;SRIUn#g`wL^28Pla@5tI8YK>i&y5bgI67hO|z= zT5D<-7Uaf& zKPjuj@8_kkGBrB|a0T)s%9{nn#5l*YR0W(>A9HspH#xmLad+JolYraVrr}i;Fsk-q zA##$4l#GV@B^^a#sfJ3tfeD4W<#uUqL~W%M?ovdk>$%d1qDv$<0G2hf4jM7K%M?oh zDhC2YXO%jK{66Gz)3c#9^E&(Q? z;||;3UITWdOv_>yxGqwhotPYFf=rz@b!>d}=0@%ns+K-AalGVQaxI=)!jk>X*ad_q z)bByX1Y*f!8&W7@fs8&aMne9*$56KWKJms2Za3oLc8(1IFcww^>uV zpM*MQxG6OvNIdYR_5$|kQkr-ibCUZO4iJtuq0}P)JdFLSGGdC7nb|(ijAL z!Sz(GEFYQ7XPd-7Mo7Dmq;d!JLav8u$J&TP}uoOX^$lnfn;a{g%FT& zs01KJ@QjHm`LZ$HQh;bTH6JBIc&VEkKFuM4-A0iDw#ScrEm8E{AkY#GxM$Lp z+BXa?C79SRiUVufw6cRZYJ^B+z~xQVlF_3%2i9f=|BJqzdEDm3Fy$Hl-h_zQGs@p~ z*>Kx$Yux*!G{U@{b6J}HNJ12SOBZ5p-KN7gle_7cvwbg*`V9j~ha>bUvSme~64`W6 z?cXF)sfZ(Owfg?NrN%z}R}PQl8&^(z6KDNBl)f$=XX{Kllsr#+rBs>p1KLP#_Au=% zZHaBeR;%Kowi*YTd(YjdDIMRx@kTpn(QODbs?-#fshPN8D-oVMWsmEtxhH29*piD> z9N&b7O0WfGk&ru~`RH?t*dJWQ9@c@wlu`X3LrS&B@%|Gl<1c;9{-;ab`5cZ+(xXmJ zgmuVQY0Xm9->`7glVn zzyH|1?$03^W}+_j>Ln6Y@}T_wzr^Bo{E>Y@C-bjYoS5C`_k$uTQ$L#BZzmxtQ-79Z z>D2)wd$wz|F2pi7v;25$|M#(jp+9TxpJOhRHgnDHrR=(CdGD)4EMidVI<{Xe{A1js zn6T-MiO;{x&4ahPl~VFKAYT2`Xs-1~r&IajbagSyq;Auyd?X-C`rj@!_C;^-kCs!n zL|tmI?7uGc{188;FqK3U7;PoAnk4hnk@?PqqY8B<66f$A0xL+3_m8dUFdyw>9<9B* zj$86L`u5LT%-+Ax_dCnB^JRBV!h%RYU8Mm2j^EOp)f}l`MTfr=oBqaqA$AFHN{x#Q zx7kBqzK-QJ8FkCGL1Ifpm-S#ks%ijNHQAv%0zUvC2J-NuEWmpSC1i<*l9yttK;WLX zC};Q1CzS}q&tAs8sirZPh*H`t{Jc0Ras<6Ys%wkqXSyfap!z|(i1ybjr6PV^(*U-O zjC3NC&Ml$$#mEG~WDH>+0oKs?6+$o>eYYODgN)K>l9a&^1Vr&ghSaYnslQ87FcUl~ z7LRSlT66JXg-v|`xj{@ z@~;f*$S&N6wtIzm#~RywEtKYn7V|q|IR3tKFrlVdB7ehK2oM_RbFmJ~4)A#XUOc?S z+~kcBA$r}k8KKlGvvmfcPmj`fmc3@;tDmZLuu5)EbDH-hWiKyfTMc>a02FDm^;rRl z;pG$0Y}PRk1M>?=h10YjH9P)kdd5&M#5E|Ey;Izks(eOU*)}ydI##*9fYe#QTB#%M zj#W{VR;K7!J~2^w=_MW)yWyKVP$w|@@R&AhU#?k+?aU%=8&s=66F-H@C{E*t=$i91 ztj#CjEWt){T9(-ZL$Y9!>N08&J|4n^!kCxMA)F>r!jKPvy*lijx~J5^tYzKP(xgI> znuUm-B(_*UFd=~Cv7~kB2Kf+baTf7pQd?>g#$bV+bd+?J{xwqr8MuC~w4Pb2_ImNx zj_qEXUOw3*$I(lT)0GP~d|(!^!8D ziT~*iP#b@#+nqI0keb#|47E65CW-9UF27-Nd)lA}K7eGs@QjP{mX^1B{C#*5181RG z0vTkg@@u#bimG$$$vq}=QWiM{Hxh^yBE@7O&}b4p!jcRIPUY#yyq4KECj-ns-S%~t zos>F8b`ldO@}z}GN`@k6e0bI@emg*F;$tU}7-?x(5g#Kxi8h^*U&q5Kazzx?mDeA> zZTt4^+7Bx6Yqh9t@ zby}#;dsKdz$rwPPF;!;Q{ts7o{nljM_7D78vW>bnYLsk*bcdvlF2R8yA?WB3kRb{P zxRH`Fx^aYvlpvshpd$rE1q={T2N>9(qL_TI`+lC|`QiH?Y{!1s=Qz*v{eID~)D(HN zn>D{M(7YmNHwvjXNC7z9io?t1V&4JCC}GQ5E6eFI^zsUdz!hRODL(D7L432d;X00{ z8%m~`n7S$x;kGY&B{C?(gjKX&zNRzVB#Z($>yZZ;?|FJogzC`63$Wy-Lb50YD+=(} z=qb$z$wd>$gkrPzoZaaF(q@$;&o*qq6zI_1#T(pta?$=T=1td_G<`u{I z28ddi!AN|~CGySncD4GzjYkPgSx>=K&-_P9Y(1r>-rQCXT%r!D*i1^f-E0$$SrULWD2uI@gE2`F&Y7%0_5KH6O(L{>ZGRY*e$Gs(dX)88#% zgb@^lCIOI+5G|&%KDbuC7T0WI9Q?Y<)62#_E_Q3%G$j}LJ`s`-w}9=2$u*M{C3Jjb z8Z;_I)$6{KG-z1J_c}wZ``#n_4FsxINuHw$hI&e|SC)1=9ve6nrs${KX`tIuc(@cG z@63PKlo{Ra>QBD?UCTbzm+ntaV%xnpFhjAIv?hMz<7ya-o5cNf9~R74W98mPb!x znUp3^ZB>LbZJ+4V6-ea8Yjl04n{bvaiiz=NV-L~DI~*~x4TTr< zQ`!c|B(5MbO>7nbp6?;^5dkQW@{40VMR9Cj*v$|ol5f+*#0)CdnPi)?Q<19~YYS@f zfCvo+ZEgT>*cp*S6{*{#T_R-JldgiR%SCY^<>e-ktEeHauslU8`@2RBR}fs~H8|u* z7?o`e)zqQGFlqDx4E{Drpn36FO6s}e*N&47-P1 z#DIJ8Rn{P6nWyFJq8VOt0c0;Y6sFk z_V;$7pT+LzihN(Oa2QamACM)~5a`knOJ7iEN>yoxtEvPT?+C)xEWVN=qH;?;!iFoz znJb6(3W@fPqR-8!-)Nk!q2>1|kfRuD`5*lYxBP1g>_{~<>@GJT-JOC0MDpak?v@(O zi)f!UP=72=p7hG>eZmlwO%?m8ey-7{e9UyPQvODz;?{yWb~|zvSH*!nMk=Y%_}ZCh+6t2M zWOoG8Ha6Y1--EJRp*3l2dnz!fg@f)Qq2g({oevp0m2OT40MDhDPW3^%0;W^t)qcdYdXjY5(x5L&fOZEDJH^8Flp`2~{PGVajzvTRJ8+&}Kfkw5igw47Jd zi3q=@APMZEID?DMI%~WBBB@09?;?qV*A2<5C&jlm;2d@sW9*yM=pNt*6BP^i-cSW1 zV3;g64?51w@AS~A3m#`K_-`CK2eb5upYUM5LK(B+@+5%>5|5p~sx8-3i44D*>Rb0p z?XN`2!ACb?J{(^IkJr^V^&5xoKi&Oci?Op(y<06~B>T>+j-E z|EC^JPcP=k@oZT^fR)XBn?pF6>fmp=^yEeDisV0%dtiS0x|Ori(~q?$H3D-(U8)dF zjSEHc;E3Mbe=WhI52VM7)WU>rALSaHII%|`!MJnw;OVL@!#P>yf2l^&%SI;h#^yGa zFlMFTYUde?ApUh@7Z1dR)1d< zReQ85cg?o*VZ*gvO3Euoyv6?Mhx_N;oOYg+$n$O4H@g|VEOGu=VqJa^_!Zl~qV03L z$pl0&-e@<3$9y9ZPU;Z*l&BYS1XpteQ-@}FhlTsz1xUSx*=;y(9+6-F%0Hd`ONl{6 zy`8w2v@Xq>I`eK%i|FvK4-001XXCCvX^*j@N}cWp2&eo+p8MTV@z1aXCp|-FT@j$dJ!q>TC`1IJ_6`MyU7dlErc<-0+5gV&4g7lRXsF7r znCh&84;TL;()YbL`+KxysoMALF_~bU3(x#yp7S)2-tCKlt+D`77(jH>Ql^*#2knS_ zH1xTVgBCaokmXOVkU_T*_5L$bE%4u&;lne(+__b%df!lQ-Hw@Z7AMl_7E0kD00Tw> znn>n^jHpEJm4$0v$(qrSgw1TOe+@QAWzUbZl$dhBUPjHVk~Q|$T#KIA<3RgEN_PuF z5?h@TMLQm5ge}}2PQ2FqbTBIM`(NH4myh%$e!MYp_)yde=X9e+uu=afzwr{)!#DDb zdS2hHF-iQ#XWY9!*YpOyzTl+on}$a+z_7W%3EPrhm#guH7Q78LNoxPzPV?rQOCyhI z82M8R()a2CEPNOHOHEY}Frzm`QUZ+APkj3J``~q_)rbPg5++U*JOcCXj-TSn{YX{R zOKKw1&Y6o`jIh8*XZX=46x>ttcBHdNM-oN8R|KccZLw)c4Nov5$Q|=M9L{iPA*Z0v zta}DXT|tr4B+4@Vb5uH~{Bt#KVB~`IAIx~ zHfVhm;9`>j{419Chzfg#&iwjgnmUug-rk9vY{po_i-HAY^TxN&cS#cS0 zGDQJhx?z4mmam8Gr-*yZP)udY8u*=6jCw2@k29E5$WAR=SM*N1z3s_j;Y7si%MBy~ zF4mpFg|{@EtMULgXAT~?WQYST0Cec)EdUTrayctM3YdS7+zhdT|^A%}EFJY7{=$&XHBKG(?1H6AVH4#>Q*gqC9e%`TOUz zSz(pMk_UDL{|4Un5o3(QE)}LOdNrhnIrufD?TS#oShDNgN(z2g_);K$u>*ZV^l08@ z3+~Z;O{=PPmn#q4O>7*j^<>)N4bmw>1b7w;D1yiPafJNFH&e~6^UPCuKXJLJZh$I; z5ZCj8W%k4~K9ZS4y%O?BZ^e;gk>yT?5YS`tX%&?6VIG*P4Vfa%)JbfW}6X$>$rIC21IWB*%@Ic}v7xkWfQUe~;E) znE-*_kugs8v-}?`rxl}qG%)r!-~5+vBVgF`Dw3IZS_&|EV>A&o6@%@S88_q^!8k-S zQia=RP$i^646ZX(bBVpSE3|u>9-S_)R*yZ9HF}=}=clmQJO|e+5wf^+VIeZ#@vJea zchP4Xex(p*m?*J%*4c`Iqnu176&pM~dw)cO(0R;+k^?=*t-ayDdQdn$*XKin7^DaN z7Y_ObVy{fKo@b_;uHO9hYTB(ernGL}-5$aY( zH&D(8|11fsGO#nW(;sx;ZRZ;Z4-A3bJ&fq8Z|9r%`V2$A#GKI)Zq~nC=|G(?s^X0e zN|l{7JSrPqF5@8l3KJ|OP)ex&5b;J@)yv4|%-f@1-4?$R(0Ax?KI-dl+&6#RjN)*y z?1UkC^R{cK+N&cpnT{cp5|LJ#~LM)_^OtJY;G zo}LSLb}Q#wZgD)SViS4Vt*P$)1v{^IcVnE3N^q~5)z2q5&_`oitX{1uBv%>os8EkO z`0T!M#<;%)$2za+*6fg*^Qe8Yq!p%KK@bbuf7V$fyEr%a;JzH^%e&m$A|l_5o4x1Y7J~G;(i{qOoVwIMDs`o;llNAn;9i@Ib}%N7CM}Pr0r(!&Ty)K8w}Mf8d0hYW0_cxa`b=4>XTZdw2>zoCcHW z*Sp|pNzU_6E#3a1^QR*(afR3C&VHhv$m7dr)yn|5a6R6KYjIpxE2RLL0tjnia&k$z z*q8MarP$3Z$K}ImK1>FG#bT-gHwfJIkSpM`XeF>W)nBA1UO~E!6J=Hnza1;fL5p`G zX1`<~Y!AGRyP=aKtPNW_Gd_Lb+!gbP{r*CXrm?Jnu3(&b7S^s_P#n!Um-uI`fR%79 z_{@k{Qy0p^XEYW)r%s<64F)ikQ#Sv0x*CrP`zz~>qBJ%}co{_zERhF>h-2{+q!=!r ziRbS5;?CH6boD*2 z-n3HS@Z$KV5o1lc3{z6@SjcW>lX7HOn*0*!)Ks_ma-KNU0*g>)PKfH{g}e7GJ(8)v zifv#q#rQ@UgeZ1LGXCzd#_`jS`_A;cG9^E|-O&ywH>@YDQPA^~whdp-`Pi>qK z+cL1jUFGrs{b|4j)*a|(^wMtV!=&dvr|g#7sI-5PeI3 z^yJ+z1x>_zpO9&3gYF_zB{-l_LE+y|dwp27a&qb3wR!C^k;_bLHC5#aqUcD`5JN$Y zJK>mBeon0FsgK6to0p$?jD9U({?_sFyl##wTL;9`00Dj&I580)!c?PUEp5dGLqVIYbYy6HTL|bv;$>8j zHDz2hW$4HdW(Hq9{0K%t$pVIC#a?bs^PY-#nj(0_ixvKeRId;(H8HA;?(+75^#F?k7(qR=KYR?Az4v4Y` z0BaC+VFND4+TkhNz!w^3GfM54I$h{Yrf7T@dL~+28^7no!94&AVaWty>T|~?b5$BJ zag-yI(MMGMa{H$U)%}DkcDXU;XVozD6@#c(r=mX2XP+nLG*0DRnYQ=l1>*uO#zf?Ew2HZ$u69cmE2|h)$NJ<&a{VHwtt;Ianu(uu-MaKlQ@cxZR zW*l(l(vCVhr9yuNfP*ry*>XV=#+Z%hX8TL9(F71Js%6Df#pYdN3rf_h7DCE2;9(vr z$p-uZxD|tfC1fF0Crz}w@{Doc!_t4ufnK&t~N8S{GF=_Y_>dgp;DM_J76 zU3pa)__Yj z*kyZC?j_Lqwoq~cE;Sk^Mnf4PP&g7&EE*9C4c~W*{ik!ZwQcBK8|R&|5t{+*V<9xC z*k3R}k^~o_>Yj~;%cP*3IQoV_HNXTMpaOzuL}fIu%t-q^T*o{PxW3eOQ=+|$UMqv| zT=VXH6Aq4_ZX3V>PnSAg;5wlm)GO}*SuWCuf>NYQZ#i_nuDbB(bjOq1gaK>|9Ox?D ztnlbUwt&e~xXYco{0#aAUZV>sM*~3;{0M+LK;4TF|hbeTZrcT7)VcVVpwTqVLH3^aJle^_{OTNd>b1Wutyu zv_^FU4qZTKG+f%UR-{X;OT_?b+y;nFeM9CKIxN9ncAJ{eZ3q)C+80p!jKSymo&^V!x0{g-Bv|3Eo(u+Psn%sLqw;i_$0zeO=4qWmu6Uj_*1KX?ou zAlCJtu4h@J{&!#Hq+NtbFol(+CaBjMX)HP-G(+H%($t(AxX#<@Fgqf%zo~wZ5bz~D zB)9%14}#QFQ*9=5#Vclm$a0OETwMHE{75v8pw$xMNOES* z;5Jc=5aI=L1Y9s;ewhN<1aqB zLp;i}9ih$_1;2E9 za)osd>h3Al#XQ%a@zAp^*1JBu0C4o25&9+BL~5k8$J)7Fdtc`A8T9QpD5cjNdtl%N z-!pEv=W+70`gfw8@5>J-z-TNGwZeeEiI&7|!qwP_M?LDMe!LV4(kyxmwKR)NHEta< zHfr3nRr~T{v2oi2WAr9mnhGO;JO->7k}t@4q1Ejb8JCuswU_a*S5ybH$3h>MdYYbn zCD6c?tj)@G%fnJ$MeDM!PXt!5VGSX%sNNazts6#SZY!J5OFbrJe+k(9Um5c4%Fi#` zj8tDH{SzpoK9YqC+K2>kQ9KkLNp@km`KI`qB?Y-j*8Ec5{Q)XNHo5=R?DN-sg5S(F zzgZsmc0>=bE%;`C`J3bYZ%&_gz8w(Ua?#v6cwo!@_?Ab(me=L2!}qs*KW`ls{O+gu zJ>bCipyS^|3ciP3{(emJyY=Vq#|3}THGiBq@Z;q1A8`dg5-$Hpy#FKl^ACpLc8cb9 z+JWs1&0B(BBOp<=Hf%fpg#+Vmtaxq#;oO0rTB+MLe6Dzle6@i(kzc5_@D36pKCBJekxMI;=Gj{`fY~ zY6^GM4@a}puneaQ!hNo52h-q9&KGcx-nqAX^+ml}di36-%WvYG!r{jsyn4ePbp}0s z{PA!<{nb5p-f*;f+9NRG$ms3Av>#-d81fu9rl_uIz=fRFuO1(+^P>ER8)k(OXl7u>v^lYu@iL`3X3 zANvL{*e`fVXN2IYvKt{1OSRzD|3>B3Eb}=qGM%fhu&Mpn^fGGn!23Ddn|vq6ZMtzz zR_OCZm|7~V0%g3DcD4I~-b1&<^edPDmGHZGAM4vX#u{?DK*&#X&DNSJ%v5&ccZ-FehN<`um63_b`KWksTlbnj1z9ivuIuN zW8^-{y}9pX-;X0nUmwN2=!q|#^2iTOcv;TsdR)N(=ZTwz!{gl6ABW%=f9)iAs+-(S^9c?Q=T9^3!X9%00 z-)TK$t59yOE07;@)~iqb3R}+9&;zV?x!7fRx*SSaykA@Y{nxRsG10>h-(gBys?J$s z6*4*kKAw)~Un@(D+8Inv6usMB(wTVt#_#XHk6->&R&|UF+w&)STxiF8^nmak9C!2F#SidZBh<67$8^5E77Ah?XS4J!g*ip+eI-6iQ}}XdmYEzn zj=Iihd8Ixwy8klfO8L-^(e5X^4qeRydsMex<~+QOKF|fGRUc4BE9&_dpxeJFKe21E z!JVGX43~%T_uCrf+X~n;aaHn2FJ&J2fpSzm;%(}rZXKN3Ii;&sMH@Hcj9@}bEag6L z@F)^T3Jyp#NpokFfGec{9;uHmQljzN>tGB_Zo{QEG}>Plb2roTXZN|$rjs4~q3``;Rs?fJH3{5V+&=Rq z=1JrlTnv+W5C9)vlp146xF~xfp9t_yajVcPFvYA*q&RDp=v z^hVF3F_zL(T%{d3)x;+=QQ!T}pg0;0e(7SK9GOMH!CV%5$hQt#C~0nkh}Y_kvs)9_ z>*5%r2MbwCjat*bQ74|J=;ih6Tpk~@(fIZ5-o^B9161>N8{yx==BIi)z41+0KG)?V z1caoSJC9syI2iWHqQ_bv6Y12(cwiUUM06_Ed`dZXbpEsoz!!PU=FG9uE&&0R5n8&7 z_9#!-A8j!Wr75ed5f2wX&oL=ccY1!8@5;#^*AHPY?dftolExfs%6s+7A?^JG^pu;# zL_AJ!ZyP=)8oulON6q+&9FhCMfih0d=zd8xv@aHELTP~)({AEcBm;026AVtKT-*r8 z$xT;`%Wbsc+X38Kl8k21#1jUW(!5VK5aSblwcRX!6^Mn11DKDY2)?C7%ArLPUuoER zNv3^%dPxm+^Y~M}d1gppQ-7YGUPEqDbBGpP{2c}mm7oT_I8r%ux@@DwE`^`>a)7kN ziaEkZtuT}=q0(As*XBFKAU;%ayLThk#-_*ODQi;vj+c>U{u}YoeCUB!gRwbu1mJJi zI3$;UN)Ir7nvtqjSvd1g6A0x!7aH+W=KR%rX}0Ri;g0E}qGgkz{PP*;Bm>|8ZM@_B z{HKfK*T?ypuRD`H&Y_pZfcHrbdK9T6F-KoXLc!rfIgudc*1=grMwzm99-l~zohAA? zF=j+i}%q2&*Oc96mPkk6K{VU*XH3noU+3KVaZkE3je6rm#B9x%~ z-itS_z@l{w{*h~?d4iK|XF~YmSC{n4x|H{fymb6?PUEg;?cM%LV~q@vtL``GdHV)w zs&5tK3qn3`NlCtx9%p5`4tE#ve(;ntT7OyXdh;~P@#B_5U{JU=baH9;=by5s;Tc3u z>p6crhcux-#62cF%X7i|UTt+BIOAtplRLq%yj`1QYhE{kbv7XY@Ad@!K3@dHFE>7H zh-=jS-63Md%G?mjrFrW83%KA|lzZoaK7hdhXtV9mtVZpF))SrQD>J!5Kao&o)A>(r4L!8Ci~=+ zG$6v%*vtY#Mj>s~+{zA8MSHFeLcA!XklHvLfMid|F@DmWDWsgL>Fj|#RmdK#KHmgsrVvdEX`~QY3PGn3KMHZ8WCaz7JM}&i z2$7?ZGzuA^VG(qyo0p5bmlSFD{sV3hT?)af5VHFE?Wds|-&v zDy^uCjXzURRH3oQ6f#NU6B&?Z3Q4LER|=t}6*cwr%zbQ~h*IZ3*4V9?y1Mi2Gj~s9=jE|V zAeOXwa;j-;eCpF@2qbO1*j`*-Gx+RzNp}w+q&tBd!w6cfD z(cHW|T{DY|p)D=vF13xlSwB-&*?g(<{bcf3a|A2N9b#_}yYAhdON%&a-NK^%A5A)f zfol+brdZrGGQXTd%{m3D<$>v-X~eVzewa4W8>C#Rx5-r04xcg9N)^DUeXAfZvZ>NA zp7Pu=q=Dp|+LO{-Y$Qx6U&Y#_S?%)VN*$7g-0jYd>45`G}U^1n7U;Oj&W+|-} zXV&$Dp;PFL)Z-_dWBH$KLUVBu8Ih>jJ#K3?#i~c|4GnyKGkfy%J+)IB+ORFWZQN6r9sH%UySQW7jBRa4ZB$+(19 zVO55<8l_N1*1Kd;S)ypB#4f&v8Gt4?(?42U)L1NkD#7rbznZs7cz%1OcTG;Kz>f0! z_TI*hcM{;BM5XbGYh&gskTc+&0$AkU=Gn4xClxhlG1=f`Yq<2-7!2M%WN92GkPKxV* zf@t`S%kTQN0#2&?tlKM#ySH9z(@A>QAr<#w^A^cggsJ|ZVok`R217xZ<1kkqsPph% zaL|GGtxVX=W@>?ivzQVDQ7wbS;2?+t^l^efk#;8l5ph;CKwftz{j4!7)O_D@VdkvW zMG{jev;}~8u$Np-N1VJR4C@Y%DECbi{u~YvFo|$IE_V5`?DeG2J5zEm#Mg*lxane1 z{p}n3Ph0^g6*Nm6!fc(5CE9CQVa}GN^zV-TgT8|gOIDL8~O5_^@Is@lRn>6k|H z_hyg)Ph>bXOm9kpKPb%}OfS1Set{xIV;TZX*hW}kE|n=Zyz$C6T`jOpSWaq{8-14l zMBxw7gsXPDi;`YlZ!&#jfB&45Eh&YXLZF20z(pu*WDiNm(T<%~Z2A&Mq!!>Yu9*ZP zJ17;&RBdIaD#)j#jOaPwA4ap07lat&F?FxL5bx_)t1sS7KWsL3Pd*5h;GVXtx#+#s>Up>I zP!A#1DAccw#^2_7%i&N09FA-4vh-TG{rKwOR!4Mxo6j4Eg~6q*&iK1+M}Cz5nnFr3 zSo!UNijGfiyAm#~RY#a!yW(Y&)813uwBP-~qELNs&?RC|d-y?N?~JXj!fIH@u?sp& zD?4l<)xMyRV0y0igU;{QbeeJ^7I25}@_FbCBs{&TOYHCkf2+UME-1w#?9*a{%dZMglNkwDzh8~6nT{k+PD+ZqckCJ7-cmQEulsU- zmg{lzKgTMVc;BMt-4q!*|3gbs>|=hM&5w-eGs)pch@bXc;&ImGm#KN``SB1(JSs$H zuI(Piv48woa!9IuA~*1PWTEn|u5j@`cKOQ>Z!S4~{5#WS7SrHy>ubiR%(OoiR)_9S zFcw}NVTHADWyA~Hx z{cQXlxqo_9e;>c{zV9`bKXc*&BQZ?$yz#=NsGNq0uyuJ22G)ZB~B3^4sLC2I0m=G2!fk-TkBZ<{>5e?+gowkTNT zpvg3&J@e`So&P<#M?A@?thY+2GwAiN$OXyHjmadb^;4?fpLu1*oI0kq$-RAgO=|MT z$%`NSY<8;Ggm=#Lx@>)X8{m=1eV=(eHsDA&BcMO&?z5Be-MROQZZ5AP&lu+Tnfm#? zsOghQ?wMcV3zxmK{IFYKyE5d4FQ(_u`jvkP7sHGMHhJ&=TC<4TK47o0^6b0E1m(c* zAk`z&sbWcLC5NsrztQly`gQhAU9$7?+j~E5JQZ#GP$wD7{`8}mf>&jn9{x0Zr`Ud4 z5Y738E?y+*57--G=W(!>zEcXGa4aMS@C78xo|~lz$=7E~>IQ9f{J=_i-v0v&WGWvb zaw4vNK^O@med|7V! zU<~BCS_4$nNvO#VR6q3C3$=kh$5u9^fV@OuF+)6xD1vDbQa2RQB&Ha~i^HM;1PxWi zM0su`i9@kZ7X*TYu+UCFMCFy7<=UroWsADhTi1zPz~ieF}YV3MI9)}yHuDi8*@fW z)0cuQnMEl@qwjDCeMG<}J`ymSynE#-kuWhlAcO;G1o@k2U&oa-1({tg4FvM))f*$bKKS(ay?k-e$MS$2*HRKL0 zQ$;5oQJ9Y$$$y@8S`Bu#$biR%X{Wy72puc^wFvJl!jlFVW3Xi|{KH=r6q-khv?NT*e4^rC5a6;9(WQ zG)@%RRumoA(gbMfzegmABWVn#ofW{VI>%E20JUAPeN1d*MXuy*@hKyaGEizlbf+@5^Mp3|` zfikftJYP9Uhbdr;eNL=>Wm$G*yjSh~cOh5LBCF8cv`dviS?QRoX=Xc9TF0hNHCJ=~-#yaRB>RC0t6{|wb{xb8gRl$KmKXNnB5N13v{7GKC}A4f znT47NKzUJtU@cTK35OteJPhxsRR%RS(D^j5V}k)mn+4ECOW}G4SEci%O7~A=(2I#e zf$*m!jELh!UV1mmuXDY%^TW}GKKboCuI$g{Cxo6oyj7JNXI?F)j z&Eg^pc^IUmA{Ht&$8|4n@8++T3mfPZV=#e>_T=kN$Cp>?Ah<%5 z4MZSv6xl!*6GmYR^echF4RFy>DBlS*0my5Bk;v%@ul=Cw&^Td)F;?_->|yR?_{^k$ z+xP)fFu-Rr*c7x-(*Rf)It_@NB?a%$Z-os_3UyET{+aOmU?6Wkb^ykCIe-uAQD$>27Uc&)4Zi&s4Q7d=& z@Un8QvXa}QpYJgAz8sqt<{-_|;ND<`SIGzhKW;g6E51Q72@W`Yk$2Hi5TYw4Tv62R zzDt!=aI?VRqA}^S*m8=AA_*=;1spio$Gu7+MZ1rUlBjG14+RzxZ7NuE@BQ+ zKHL?ek4OyN|NH0uA2P6@b}uOA{yCkyk5s|5Bqv!dEJL>oVb?Ro_wha;jsGll|Etga z*<;g*YIh0U!}b>SOA)ir_A4CP(E+_j6@0%q`0EJerQR3+usd2-G1g)nUwiiqTq)J! z4xxL$qCaTnJ6GrmmW-M}FReBev$VjOTWUrXRPdh(*a1L@9S@x*kEov&RiApaUjw4? z0$tS@j|lh(Uogr^ZBiBtApyR=pdtxKzyLZVAeIC!=zv@BaX6C)ZqB1rw2zk&-mGpf_&M8Y!UM;cr-!TDpOrTVO~prq#})=Va8R@xxzK z5iScw$qN8W&HbU8lfCu4h5BO)cqZenIxkEkz5NM-uJN|vA%5f`CIYPC2ex7~QQewO z(;y(Hg+Ua<7g)qjq`3M2SSke$zs9@>eC*ifrQ$8S$Z3>6!zWDQ8P3{Fic>$16 zduXty8)NXf1>s9T>u+7eh(3i66@GW}zc&EjrW5!}9sj--z@3|eGdPp0W*}N)fM@(U zQA2|ue5W~irM}}9ADN3V=N{>pcS_NLGhg8MfFr_sTmt}tJoCL{eJk2^89t> z-ZTzj=+)fZEA=QaIGQ&SfKihk_n2YZoYBYl_ise*+plf&N&`>cK>5wSR}olw{plr- z{5q=p)5jaDukQ)x?OL^3rXb0mtq=frFSx3)>fx}O+x|AKZWXS@{i#9FxF?Lk-`v#Q z$JlxR{_NT3#|3wKbOR6@m?lV-cS-#489{&P+L-U~NuzH5B`uoE6A0V2gS3#fg3zxS zTBpT;>Boovq#g@AMZx%fxk*nHJKB1I)+9ie1m+PYZAu zTT9xu_L+6bk=H2t7Q$s~zYE6p@(2U>;a9a~Fk zfENEd{AGI_-O4^)gMZV?Wqi{;)*9e$J>>r`bp={K*+d)#gB~uc+y`$yw{fqwj@sFF zIA|MJVw)(BSLU-*-rUHhMj zeeV1zzXxTe{v7#&hB+J`zM*_+!p?vLKjCBgJog-g;p`0%boFYzBA8DT=~&o*^6yWO|STkxI%+tgz%Y`0=vmz`h-%9@V_G_r&b(otym=Op-IE-Wl~BiNv{o&?-++hKU!iM;bHc z-U(htU5aH}0dQasv%{bJ3JvoIr&2it+_h&NqtY$D(PHz3C^J4&D3nJcp+v8}6p7P_ zdkT+#evNBA&yC05xaxP-^6vM}$crDYwq)d61Z4ZVI<%;r60vbyNu4-3q1rVrk;SV* z#EhhnanK|uopR2ITNPQByV4ul$#|kvCxbQ)wUoPh%wI{hPW(-Z07&C$Gi#8`&Mzl~1ZBRK62Uu;+5}oH?m{oIo@7y~US^pyQ_sl;IY9!O~hW==pG0Dy! zMYn7TNI!*eK`~K6*fn!FxJu4%2R6uD(-LJETx5T=KRZ>5n1T}3!7DMC+N)sUc!7`u zY3c+%)%f{j&pQrJ%IMVR!}PFg$$sKoIN})mw0PgY zg!Pj*;=>cxCingxjG({j7zi2g6N;{-a&ncGD&#QdWUz>3aTTZ;e$1L=kJZqk-4&2z z=lG{49PUQKzC<%A=_w37UnM(98xl$xlcFbGNTFuN7-!V1hr#W#{%v17zXR1{BnaE( zd;^=&f_zQ9@c0xLxF1uaB`9+8#E~V6&G75#nS@8VOIy)XSEc5uiBPeD%cS|anEng< zJo-}@L(F|CYyfTzW~m`(;VC|T{BS&01l9$IQSg922`0f9?*m{Pq*(NO^B6c4)KE$n zQXpdZwWci7Jy~ieq%gz@BA`>{0x!5NeYOUnl>!w?*K#;=fL3FZHU-IP@!L#7k9BX& zo)u0yvRgmFM(iFd!Ss6I|D);L|CxN?zkh9JHpiLsv0<2FLQbJ=hB-Eekfb^0d?uuJ zFdEAF)X^LYC1-_Hb4W<#Sn^RJp;9>}rFQT8z3=;9xUL_r>+yQOUe71O+H?e%@t0km z&jU=9sQrRylZ|fP%a3nm2f}KEd=X{D$4~$*kEftaf&Lymips}$DP-$~Cl9UbJjPsx zw?f#`>qEo*nVj`pIA|Fwdwf(J#)gNGKqz3HE`PlspPvZjC6agn7`tra4pq`)ywBNw zBDEq=@$idKqiem-ixLPoUt;!JNVyZN+4N_Iu5gIh42qY>ZjUNz%IgJSd|5xv4`AoK>@xDic#nzoL&%4KH zi}4XrN5Z4-9v)D>y$J@z^dY=M=}3s6-~82d;l*`&N{|c6CymQ@HbV>^;wN7LU_AJx za<7|Qutq4XTpsT2B(Az70cO=E*y$l|_?(4Alv70+F)+|rZP;SB_iG@gga7gt-1+2t zVL#@pv{cvo_jYO{a9l5_|IVH6jP?G`l}DLO0cB(*(^{{pz#wT!<%NQsopWDHZ6`!c zzcR}yrmE=hGK1o03CboV+4m3OOEq9A{7O~&h&x`qTHc3NcDgr9nlD+StPvcV6vvv_ zo%^Qub-=gYh~)k^7ZUIPX?qfDSj|TIWUHHz`{=Ltm{Sh z;LVMOv@^u;E6*!3^~!pRH5=)(Q?)jS@#{6U?hj_Co05*#sPTq-zv1$~1``_-ABFqw z&c1m9O=`}ti13&CZ|0dzQftYhh+yOY-oDD@PSKp~HBav~bRI|E-%BZTy&Gx&Zh5=r zvis+-V{#O4-f1JR`i^a0xj1WhtI2qy>`WT@ zaGB}z1OI)d3cp)wiA=43{)k+0rgcT-=w5MX?&iJO{bAsi*$cX2Qawk0b$Z#XGi^KC z>Ggl)VD`Ot5|7XF*3PuY6EFo3fyiw@q~G-Uv|W zi4+mpkm|lmS&uyXu;sPxX1(0I?;%J3oY{?<|Kc*Yeckr&%M{qJ7h3y2N}l!nr)|mE z>1?>Zdhgl!@0Xl+(nLOtH{SX-p%ERLC1$eyQua~N_`lS?+PO{R3e&~us}6uFUgI1RXr^>xJ?D+K;(U#z|5vQrc*^WYc(3}LgsJ=E`L_P&Dvu2ft@2J<vRe7lSCf@+cBzIKE!EV zw3BTU86jXo8RCZWR6(kMmNf9!tnfg7I-~9xD1R`h#^&uc3Y676 zqq)P%&4&UVhrou`*B6EvRN@OcSd$F1*@bCHnNSAm=w{MP>GCRtfq@PT)i{Px+XrH> z?H)*vbmR|r*V)})9eMa`1I~{Qo{H;?i1_W%^baGe2cSm_*!IIN%G_*5P? zGxe-#I9;F2P(v_W5D40k?F~m}n_>H4+NdP%d1$AP%JuL&~~)9DpIJ z@jUc^UV8F+`V;fUj&0|4amq1(1Xd2ogU!%3p_;FQT=F5gqTD|oe##dJ38Xp}H1sm`(@#7<%Dy6qfEaf;=$z-_K&aiL*WdjqJwAf$;D@ z{Ms$UDDtDTR`W!c_A4(7kCC3|&?8=96Qi66d0tvG-993Qv# z;q>}AdU?7G$FSTmBt0e;4Czqx$i#32%%;vP*VV^RAi3v41=}`nx`zi z%~oKxio?u8z@=}iKr^*7unoAYAkvg%Ao^@EN95F->4D8bYrdqG~f`h0qMk07ng zWHcM3E3z{bB$!PKu$JSm;}c22H{4WO53e$UtPFsIgCp7)+aQ6N4|23Sy|LmhTBa{YW)!Im( z%y1g>5^}4XM%O&TbxAO%BTu<0FgeqSFSP4;S8~dvel>MZ@~FXRw5|+8X=a(uZRZC2 zjC>l`8cbUSkMRQY7Vc}`-hpCXNJP2}pYrTPWZ2ia&&%`LThDouU_R>Js$NTdSxqJ8v_`W(=8Dh zwABwBA@X|(m{fAQ4TT<(_YE&ERT7h7EKS`W;W1`|t&LuPJ<*O@xMW?&LmBqE=gFeSLwHE1`ei+s9;@j> z`3#OV)8@hwDF21d_bh^MU`Mk1`I?C0~=_4Tix`5#HPAOeUxxJElf92fE96GEJiH8ZyufVi&_28?@8!Hb{SF2>e*&C%DD5-cH zm-i&aVS5!?wMnIoOI_HIN|O|OOw6Gt@(t=Wuu!!z5Ibq7i0rBD6c?vsy}M2baJ$si8W2 z@ZN$f4Qt;_1Gjwstg#oG0lP$zggKLVUy}h0Q0Ir9t$!p7k2VCTHF_D8F!Xqv6qvO|WI>S42)h6lizM!6YCw44eift{QAX=5m{|MDPIu!0G|PfoAO zE`UF!Z7(nHwK7Vbiuehs{q`hk_#!rpib4pwfA{TItoBzlA^ld5paOGvCOb zsp>DJ?yBETR>_D-pivVjG!w3DeT!iN0%4uFhh7jXeZu=7ZB+#zDwunD{{*OxAGU4I zCK_OcMPWI-=rUww?@oG!#+Pr{&w>8P8&AInX^qguyXUMf$cRrDkTy27nZzshA6jrD!CsFZNH3L!8u7@VL zqH$JCvlsCeKLpy>;{kx7)C@X7gh|=%5Y*4!cZKnWsM46K9MF%m4019fIk~SBBrpSY zY!m|Nx$+K)jDWxQZpQ59M`(2Zx^#@0iuS9s=XNSQ#U*R4#BK}}OKciVDulTI7EMO#&6SM80oaz7fpfv&f2Fn`g; z_CoA;?|JPe)&9Opp+=2dkCCm7tJ+QQu1!i+AIPu8zTZ_V*t1km1%4^iV_{{szxJbK zn>=o0+2@oZ_fbk|d?7p-1kGsP6EFe6u&~2qiuz6b?}~|78Yyk?Y#LKG?f&|?>mT5C zip-m`%!=+5zc+&A+4j-H`$1*(2T9eZ{=ST4=C-CWu;+{L z8i1F^cjfam^7$*?A-9m!Yj;$_v%fI(&eML?v%Y{*^zUR|yzrU(0y)Qy9AFmSy3@Tv z3Cq|$TVvOsOMPM_z?R z#g#x0$7y$Qr&a07N4(d`+o8i07#Ir>+cX)j7j57&$veu9&-lR2vIH=U>X>H;T5oNS zdG@?C)>eOEY)gGAgBN0g(ZFFxnPFNSZy-SjC#+5!T>2CjsH6xgGs~ut3=b}kUNw&Y zzP4wuI#y*{q#OCW-KEUE!blbFn1MtXr6y>LX9S9Z3fRa65U7AKU{55?}kBAxWod6Z(AyFE822 z9#}4W<9ohfI~$;!x>T%mPA-={2(f|1G6B)0pdm3`=>Zj9fk*2D!gVq!=t8^yXFM$q zBf&dKg5Wg2d_M01J~l_&$mGp9|1sFOwMf`6HGf+h?L$NSN;M=REv2$6|7t`xycT!F z%ik6zI#&pZS9T;(kv??=?)=AMNFb04Nz^@Mg#u!!S6l#xk#0mjmO0~l>OxmOY59h! zr)`$*>}oYM!!-Dc_6;RA8e_u3UZ}MHJq4#D!$MpIoVxNIeg@gFa40W0_V(F0en14w zjKMP8O)3dUKTM!zb*`>E41SUolfkc4*i8}uv*~?Oi0iQ9*{Txcezb~T&K;bvG=g$5 z1zSgz;g>Gg>z8zdwUI=X#W&D>aIGG_exW0RYwoHG>cCU+Jb)^$i4Gz0el2g#=k83n zv?Yvo%_WW`b~XQ`OZ-GAogY!Gmm^c&bxC7Xe=>rkh;jsQ(iw=p>tJL<0F~EF*WCsV z#h{4!zhgb!UmfMM*nWQKm5%`>n9JMOulZByiJWw{dM7%f*%m<(4U=ZuM333)Xi`*f zkhaI|4jRTj1^Z~1HJ6KqlTgh{*S21(6tMb&6Y{-YfIxA*Z5^&jy ziQlcRPolLsLpM!HFaXmpGtr!B)T1OEU)Qg&*?iG*UkQV0>q2O_d!%y><$$x?2BdhB(!9)dKZIdSFK-0 zh}y;bz~nF1J)>CIH#4hDtNIFI;^y74=n$_y-PDf!Cq6AX-r6lfm}*~$P@@{ z=YaBu`8c|*g1ZkGYW01(nCbZ&sKyk+$UEHakHv zYE8Ipm{@OrE5$8pv%R*uB}2>PWHE;XI=DxVmw!|VW|u;cE;UK#pTmOJ#cA#Q z8KB0uz0lh1K1k0DzXJj#!UrR8q{CkGmbLpqT=VIOu-DpfmcuELlHe~kt}f{b5{S30 z$MmG%jH|j*52i=f%bLNdx-bB*Ksm%C;+`*f{B}E9OJU8>Gt}vf*=Et$c96rVu(zjE zU)SEYxEK6C*?B}J*0U2-+tYkJotvHW@ldtVf%#f+-ofzq!yVZ>z*0OGUh+uY#YDw79fa_GK#Pv_SrtEqZ ziF`r+d=@`IL0~U#aM`O3{Q|}Jex%94Km8kYDKFnSSPDw}p!IO(G31|qxez!n6zv6I z^=Lw_+*=<1e1Jj;8-Z^w(+})?06p4HuJfjm-dUaxC zpP~~)w7N1mI_o_H<*N!iadKGzGLMy$%az-aqe3l)a{R9#Vss2|d;_yAW5nXIL_usQEQm9T*Mr6Di-Kmp+6DbbJ$|z=nQT}9{k?Oo?-Hx* zn_|(L`%WwwIyeTSqsDnfCoKd8vylR3MWItHSSoqx-Mm~qi~l}K_zDXCWn9pVb4l0| zE;>twd)!>wn?FPJ8Bnc6w2m#g6p1&^%b%!_{5QLuA&HM`i1tbUc^=6^valn)e2Vt&u7_%BKt-PrxKfHrdZ**m40w1AOW zoJ>(x>YkU=R}kBC7K}SVQK-5uBkm*OtfXgiWgymH16r+T=7-@|MhOR8xZ;0kk-Xd` zS5oh)DjT2>tRy9SO2ksZkbbQ(qe4kjK?A>_eG{P#o>clS*A`hl8GF;r_lgXZGiR*q zuN@^bu2gOI-M{pZN>hj5B>aYm@* z4u#c6Qfod*yt8Wj=t5ckh`(R8bI<>H_kRxjs(hlVYO=QugZ)c1R4<&We)6~4E-py- zceU$m5V3K|Nio1IcM!9@*f{<1wEr#rpFtc3M z_sW2qD97wiQl*vA|AI{$Re6P!U~@6@Kb*7)A6NVdPVHL#NQy;k5+Ezi4^ZI@%I zo9Z;lI+`Meu2x6arC`#H>e4MS44XQJGbY2MF2fg-8C;j?%(^fr+ZQn|B1mQW9>~8; zkh$R^d(Xv|J1x@A$ED%m+8}sxFMqOMl7FU32v&?pSDW`g!&qg8LFJj40$~monvf|W zh&`k^1b?Hf%Dbrz%^Vs4-h+qiS2h0{AQwr5$3tei!>RuONKIvKwSh+fo zN3yc04OmoDp$*?KZ)o`ExoM)zCw_0DUk14rdgUl?f%pEAz zN4sAax6_sy1YsqnKqadl$^JH=9-2yxtZ)K@6=hTH53R@^tOy>gE3~Os)TBe%AVI1` z2$&*C?kxyrL-kyQ1gU}v;*H)ooe1oKAuQ4Lbi+$cU`A8Qi6)Q0i7~;;1hxnQB+16} zc8WHB`2q+Q;@ZDJ#p{`kqPF&56nOD+iC4)d_gTz^}+}VNGBxv5uYR)V2$bCzrv;F;0rM}a@BIUh&&XTb2nH62Qu~!D2_Q@}jokG$ zF&Cn;jbnuYx*2Ojr4g>!d$?b{1-gtUQBXxeHXj2kVuVNoiHlzB`K98$fs5odY}FF zwvM5m?vp~uT+%>3JzR(kHPq|l>g{`PMtx~)tn>KpMqmS&%Q)?*O3P@6h`UR!^BdmZ zf&E_1Aa;7BZd1~Cxz%@#!s4-UE)D-cZK5D;vdaMy7)YS>LH7Z*I?UQc)8vG1nRBGs zA(>1Ck8*ThNlC9P2F%|;<;|z(Y%k&44+f)uY!(tYW@H7iYTZgq8Vp`??uw& z5(WUu!H++C%@Lm^6Bv8G+P@{&LF%0K-*Kx#^ahE*sK(n7e_Pj(29bYXFSU$Fb!M+( zq!|+Kls>s0oGP_Z>{;XQIMLEv*KesG6*^|`3VA32z~~DX*>;c^?wJI+#@N#OZRtAE zabqu+z~jCFjPd}Z_kw$92^i1b-y0GK3G-k;!4Skle#$S1t4=!AeHQN=a?- z45|+;vLz4qLA3`Y4L2s@zW+;dZ^-;2DTbSP0p0z3IHtbF#f`_M1ergx3NA0h zAXEWqw#1UCNzWTR6FAlxo)%2&v3#n`!`7^BcByN|!Qz5@*6~Bld7b)-2MIcXy?FFz zbXn6=?@hOXP3`zNo-Zrv9L{&3-AAQ-Q>?l*&}K_gb<-bA)sZ6z2m4CO zM-NT>H}^iaKv53|TN>9X9-_E2EC*`^1=+Q-1gT2~03u;F%&<$4-Saqd&ci_9Y$nDX z|5I`eL;m3wvrU`_2S_u1h9#&{5{L%}Ebq2~FEm)36Xor}q04cQV!C;FcvI4%=9_Wx zQ7cIjRmKD-IhH9Ahy#`Pic_{}80~>$d^;qbc7Yz8Nydp8wU=& zsSl$<)9J!fp!O+caaS-`sVYOo-)O{~C?XgZ4R~Hmv?Il%$_&p;eS5bY*{hrAb~Mrb zPvVJ#1W7Uu#Ne=vV084K7}J9TOuAr`_L}~N%U!bT z#VODwI?52F(oV-O^&VKQLkHrX^Hzkl8DaSnGz0E8Uu4C^Dd8^=A6kN#s6Q}&atrumOS<&P0(oc}2Mda5bh`6(-rWo!Lz$IS)E>o|s&E)_Lhw@3m%w2hEw>Dmy$H>zf zEh~cNQ!?|@p*j{>Izdon)0<~MD~35v%%3R4rG=_Rx|VvT^!ap!ChQ?L_V5hTJ|K0Y zc<;>huA-V0-=zuN&n4F?pojj#^sk5;ETr_W?h)ND<;K%BV}y9Hy&2L}f?dVEOZGSg zcf21zh1)NcvdVBMHp7qG-KlW1-KO$lumw(QI1Hdo1`u`qBeDb5^;jERHcvhnF-O0u z1G)EKs>Hn6owA~a72Z0&ygE5-%Yk#P9O!B3sk=N!EaB$_@={&UczJ289AOG|YM?`f zb0m1~MdR-8rUNoh=TgoH3Y%CwymM~AERjJuB115L;ifrN^dP`pV0ZE;?-X`8<8Fl+ zpzZ$MG}4aXzK+@J>`G}C`D0r^7(B|`1ETiWnc2H^_j#Gw0j9iqxQmrk$4U2`B|+7q7BdF>+1u}^S~nsw{X zl;_{+2M-(d9!(lpm-0D;pHL_hpN^kN8#^lD72|k(?}&$!fYfN|tnDM*rQ;`V9QS_8 zF@H6=?=xLeaME+^skEK>g=!Xoe3{@!Nwlr3tWTCk$_(5c`bYf5$2}keV>Fy#StiPput39& z(SRYRtun$U4}1NL&CE##5OP%I>=PgPCrPI`&nJa|sb}w}M)sng{I=rVcAy;H*?RO+ z0Qhn7AQsjc^J$P5;Cn>Yi%0M>l=*_-A+hTtvUt7&MDtEO+v*Tn80>|j+7gQ_AciJH zEFe|HXIcWYv%=EKj77L@QlJ(BGCrCqKWs&(mmPul45W}~<<8QIAVhC32Q2^sn`uvX zmxOyZo$k$)I8qvMqK$H9{PyvO9$F5FlRC-VDj8Gg#K9wuombdcB2>eZKlzU_mu8sAJ-~?R;M0-af>sO=ttN_iZ!f&@egz<0$jX_DB8jt0iRyWB!u)ZQFQPwU|)Hu@OC2bTip zHg2ms6;3?R9Co*3Na3@4O*CmIorm+w)8J3rZu9g(7{tqi#_f`}F>^0?A( zhna?uMPaL~2mz2J?2>KKd%@2+rl1hiW0db=6Q#Do7jJ+*tTa=@r{e))7p-yq^i%0m z`CnPO5bDzRN8r=MzKv9ktfgQ!p*y5su9*IRay7R*cfhk_iLEnXwV z&Cw6|7jpEXf^-eyczp7lwNC3xy-OVCH>f$p>DKoFEZjIv#z3=B=zsIn-e~8vpeg%P zl-ol>!*5$}pVPX0e2522%ZyeYpnCek`fD~u9Gc%zQd-dHnt^w_xBdu^ywY;}Yc*X{ zVBH4fha-o2;poBn>>L%m>jv`rC4}SK>H=r3`m`kI=k1H!nKrK~wz-n8h(BxbwlbuA z0cG7O@dhmxh;;bW@_ae0P%dAbN=v^^L6D2m&4ACWf@P~;BjIl?nGvn6?{i+H@rWI% z>CPzpfogmN1tLlcn8_%FMO5&b+eyG6^I|;&@RI-Ar=uJ<@u3(bsrN-NGg8} z`2Nw`T|eIc`O*7qIMm|kQR2&k!kgHfK~VWq=nE_F1-Mf8D(-S~w7!29&I889CJR-9>~9?aL|SFG#xIEh5L}K;$7Dv!tPYSg*^UnwwTRpv`$mfAanjn zVH-O|E`;Biyd-!wUofgU{QxE6-Ts%eM@z2bfFdl7N1W6prRhi)Zzspgdpu?n8?`3k zC>VtLSWJ2ulJ{=ah936LR z_L8`J{tf){P+PrL{Rvn7s`dXa_H*1m-rSeTa;T+-#)t+{b@6Ujejs)ImX=JOlnjB7Zqv9nht{%S^RdV;# zj^?kr-_so|wg6Z3uC_?lZ(~fKQz}oF9FXw{~0l=kQg zAxNYQh3%_ePjyRME+>}x`G60V4WJ?7lxzRdZ>v^4i(_90=g$G!s?eTJ8sHy;5Exid z9qITU7hN@%?<4h)3%_ta!QzWmgm#}^Xgtv%Ao*R*Q+xI=;+#|A`}vn;kL~4jy|cp` zK61XSpw`dBWlNiL>=l=eddEg5K79E8Q}<$imd}!tI4E~BDd^G0x5ku%qa{2=L6m;z z%Vy90@P*&GsV96sg1f)mj`vTC=4dgDRx_(%L9E^+1sLFy_S;NUl z#TvhSU>%gS#kz#VVtLi{NMw169$2!O>dmbtOE1Pu6ziUFJe3_qccSx)Eu z7;CQ@^BlPdVwSu_y6;9 zX~_xR(*GBiOU7BlhYE5Ty3@|&2xQpF|GayXL+)q*(e5jn=pI)Eh0=NOF*mQ_;=!ys zp~uCDv*q(E)`|6^X}-*d=cZb3?>s$wL^!UPN81_AW~ z;$}?Mc5-GtU)R@LdC9MxM3My0o&Oq8W_q{(<(5aqjh{Uk&kSdEfukTz^eH5e4<^-F z!C8XIuU_M16Z6%3ja`elu0P$9hYIqYZhU*ic44a2lRNV74>^?h&B)bzoYL`V`x5;# zox=9L@Z*l>z4ShPVSJ*}D~_6==l)lP3yHr26c$>VI=?jO0)9%SFmAc;4EVJe&$Ikbrf0hk{x{iq5gK(uo9T7s5HxU0W z7BTxLUj~9X(TK@u&Clt9T?!1VjFwH|T zny-b|9wv{}#?Ym6S`eq4I8eQ>=*BNzm%pN&r>-7StZk9iC>&_uzq>ucrxmASS~xJr z&v!&0Z5@X`T;D95^FJHU<8i7dTDb#DRX=^Tpg6VAR<+1YwOD=i#5i>dcl>#toBioy zGU6~volWn*$3F(^cBkxvT$3a?9Yjn~6xF!Fjiz9tNCC zMLVQ#CR*R6f9UJc#x$?BP1NPfxVb$}EjkQx5w(gpdqd)T8)qI)*=o<%H!BM737#~l z-a-+6XjE>QeKL?unKXOy((v=7%+q+GjiMoFk?C78-8@I^lQ=`;Hp`VQ%lJvlEitp< zwj%|TW%1~q4!CK-FPdxV26ig@H zGN8lCxI+UZ<|tZnWY56$$aMP`@nbg*nc$}FIA@AXtlbR`ZxM3D3~}4XuO*t479Ov%WNJ~ccU1#C3;sUoH#!%`d8GWEKc@QyO;V`&v)*&_u5I<#4QiE8*WUaL=K;h z-_d-s<&siza&qTH^l_UN3DS9SpCBRYXYTmtJBPn+>J1;py*lpmZpVK(w{5oLlx+?1 z(9ZyioPf_GrhF1<=8}Of9&LoAzW1rLfk&j8qU0WgdXC`3*q=&D1CZGEebcC=?6bUrW2k zk~Ct81Oi5Uh_t6tz{rCqx3R)Z7M$Q$tvt`i1O&*H;O4JslV^cn0zjt}V1$jjWz>uu ze`Rv{%f1$3mOT&cO@8q#(m&xer>GEVM2-|$q$!y+uboZX+C|AGYc+Uk%U6mUQK+J; z^HC!Hls~%^t3Jl3`~I6OLFr03#813^1GOlbbh;|zkpmTOa=Tkf{psd8J{HojQp`*V zxe3sU9L~R$0`%vFI(zv>QHuN23v$S``kCw&X`q-2yIKhj#)|F(LI6vEYh3OIcwdrb zW*l;Ou;-<`vd+E<{VO;RiK6t)J6QW;A6^3FB`XE6G@lyRXkhWH|YD#BK?ZpuBXs>k^K`|;H$-asKj2dK*(>Dd~aqJTgcJ>_JP^5KV-$l zBnRQXs-j=DoJiT)#MJ6=ea%}l{G~GIA9U87HKVZ#q}5-nHFBh5V;AV1^#)PG!zN1j$#4R7tj?&}*e^E!nK1 zlUjY}dN>u=)Pxe)A5wt#&7!UUHE}v??sauOq2xX|GSwqe#S3K(9G<-lr83%BlF)*u z*|V>7F5}> zID8r`mAZ@)m+db&Ir0EJc+_02I+@*)3x1D6j&jEm3j@4=Wa>!+f5Z8gl>{(s!RsiB zK;s~PD+?GU^Z&+*qQ>{+-tOtJ(?( zaJagb`#6Nxe&=Cxbl6{2*t;>&QtqWi3AAh;`?@Np2*NzKcyB>di^zUm>scIS_i1)ULJZD+x!nb;@p z*iP(UKA6JtiC?q5QlXf?AtB-ZzW9a+4tJ65ndjnTHpw_ zGeXgr(M#Rv^;Pa`zW>8^>Bn>WdQi^#=ozwDCe)Y5A6_OIR_h1dJ zjRh&!FiYT)dH`&yGDpP!1+;$r^#F(nf<-BjV*dPYtDx3B*(>w^b-w185SzQvC*3@- zckA@Nj8Mbn0|21xBF__vgkb;x3+53fg1SnSD+jWW$1v0k5YtRXj5m23d#Gk8Uz7v! zA#xd>w;2DI;c4AR;X*te1#2`H(v`CMq>0v8r}&UYf8jNvv}XdkF!EdqbSo^puwHSrkEtAraH@0;b{0CBIYa*CPZzXXBK1}lo)!5{X zkHccWZ%4|VC684-ILlEyP7QnA2y$$?VDS*oQ{%)#M)jc$)|v-AXF0Je3dvNRH*@jh zF779Y6xYvEUUup);`-H=hckU+xD3%ug2Wt(=B!LwU?6?S>$B%y`>DHVl_K(=foO~k zS)hA-S5^c}q;l(-(l9TOTULSxQFoaSt7k?c^cIlo{bYbsFp?sWpuK=UO~FBf%l&ih zg0BSM%vvV9Uj8JihVYP45f>O0y{J{;LMa~$ftMs*%>~DZ7D{QWF~AV(rJrY5=~2NU z`14(M<8ZKEe!d`htRP<+O>CzE<`^`f2p?BsgL3%+4Qu+c*J|b01^AshZ+`Nf3aV?3 zM(xez;SV?esaAeafy$z_>O1JF8n*zi?9T*IS3@N~Nse!9za9LZeMmJhq)fpIz)!V6 zmCO>aajUoTSHtl)F37ry{Cg{lR97VucnacVJ_Cgz3*GhIH|<$~^${3K*NdMy4u|Fe zC@>$RF}&X6aSd!g;em-@`G{D{n*ONk z9J$vBR{{*#0!_Ad-nS9j)e?@2n<0d5JO(?IG$FAJQw9n zCD^<^dCV}$<0n0%>9LZ8Fm_y|1_iilasY10!4$ZS)fcDab9dq35GYmEyGN~Mu=SPm zxo`KwwcCiVToa@ulw1@%nlQT>)51zErloME>@m?zMU9Glo=B_`UhX7@ua^*3BMb;6 z@WiAm{>jiO*q%ChuwV;}6_H*i|FQ1@MvpE1B`iESYTkchP_JPN%B>N-0`_`C>mLseL9d~P~0pNdbGF=vRaR9B!^_R|-zc!OZ8q8G* zA=o1~@cLPBHHM%Dj~`JS#o+W4RT)|W)jkybdWPP1^BE*40Iyfuwb7fW9O51z_aa1k zclZ$Hg7Qbgd~&C@JtN1TCvyqW`iwK2aXGO+0H0J_Ug)SMbQdNM%$XqZ((@7rVFe!m zb(1mBW(Y8!p^Dbm)6YGGE^uJJMVvruxGZIe$*2O_05cqo;&aCKNds0=59fI)Ksl*G z@+xyQP&59@nUPaO)D;A|4hz@#+)LmW&BzzW0R}{-a`&ojRyo->^MtDPphmgf9M-f* zKMyd3P=&VzfE!_R!{TXQ@!U^&&=oKKTF*kPRpuP@VlL=-(%L-Q??vlGzx zUqovlCUOooqX$xfEg-;5fGoHHkwQc2#bI`9 zC&(_4_ZR{%mCDMbx(>h`qzCx%`E6*{(^2Cx?2xmltf# ze7z)02~(d?e4Xw^+Y6| z>YM5U$U2+w43S0V`mNgke=g2^(sqD>f^m{Jca7NK=QFKkRYVsxuOZknz9q-2DRS` zI%MDm{}+bmO57WYYvk)xP2R1kF43CqBtcU$AnuHSP9v911NMA>CWYy<8(`p zH`JDzVZqsE4|JF}GS;<`??QBTpg}I`=>8z;L<($ScjlB~yW_YsA@k(&o4?|plrGin zSVgdt33j{y@7<^?awb$6dq0_zOr~S@%30i0(I^mQ&hOGpldMq><&IE4dB4?jGXA`H z6LFZL0KS)aTm*919-w(h((Fa(4FGPpka|VR#OqJU#m8kI9mVa8zMUDy*NUT4-2cw?wTM>$Qe3i&T6f$XVLGXrrp^S7eUQu^Qf*F-7LqeZc!TdZ;^TEfw~&C`dWCNFnLHfu;B` z|J$f6+#||~&Mw^m9=ci|ZyepRM`tQC<`^lLLmVUop9VhW+j@|qa-eUb)?(j5iSxO}}^3UV0{_}-f zXH+k;_I|Byirvn-|KY`Zqcwig-^r|FJDtr}+wFKD3d7{hd)VcR1j#+2>{>G}9j8p! z{Awwmz%})%+?*(q-+`3=kO;6MK@gYhu}l(+J{~|JfA>KEyW)$hlFNcpKU?FE<%7m9 zL^u<96lBdJBr}dCC!9~tI~n&>M$qYYvhUIJ@;X$NZff4qOBy;+ZwZ|1QI`Y>O0lU* z*>B{R)ty(=l_mU@?^ekL5u&$-k}<2wx48l5Xa!y|6-|;kcV-va_Bq*7HrfWQI&xGM z6`Ra@Rh9j55D*39S%DkjVcN~AN-|W8Tk6V>G#PYq)>u3rYmARf%0haA==%g&s}zb= z6wI6bu{UQ5M2>1`lyk>8x1GPxcJvG(n#3EP^2NeiH72_Kd_;wg@4Sv9V*y8cV*Pb&*RhtirmCk43^VqcRRE^3=IS zvw4g%(LS0Pz?&}abOm5!nriTheY5Imx9$6CE0}R^f)$vO;X$M@F6pHAk264_Y*LzF zZlu*g{%CEwV@9sXoq|6BDLS$_f*|0)aKflLs1&Bd=A4e)%v&>YhI>29q|(0TJ7ZR@ zm87nU(PGuV#e9p&W=nv|TaW8Yaep3>11g-4@w=FwaEaQ8CUvzs@!xaK1VqPLn^ z?t7!(S*I_iQ&%!_KlUWNJee-F5x3Dp-Lx*)m8&*P52=$56Vk2Lt*Z|G5jxmeeT=Qf zSntHsbKxc-HI|t*)^#+s^{k;_J@S>&suF)iqzhBwg0-!~wY(B{%B|I6P9+y^CQ0dLQ`ty&-nmvO zTE!lIe?T2$t)9{;nJc`l$X4FGS>6;*0c00MJoFw0%_M>(>v+nf!#(Q;DE13-wHsuW$liuH{ zKQ33Vb1I#;xcoJyPEoi(-mPJ4iPX3@SxySMn~-qsDO<^oUgJ($dDgG`OFB)IkZaRc z&6ufXyPr+HdJUg`HB&R2c|)7IUK9%`v=j%|afY6ITi3$fhCHpWdjK*iuo_VsW}$_BWMOez9^g zA;B=Tcy8&So=2gh;7+k?#@!Pctw#D;Rli!F2)Dh_Z6lVpt8U(APi)Y#ZSWfFSe3gg zd+M&{i{@W-own%46N%7FY}eVs&ZP8udRN1eO}nW`9pQIY+*FfN=xx8LZm+2bACc?6 ziCx;E3DT#FV{P;6GP}knyUayeNN%OgmWkJ7Y|GL_ZqEqcJ3ZBzezZqwtEcf|cg2ei zldSfSo89kO=s_awcWpb)B(^q-w1U0$O)q+Ar#rLt8yXYui-z9Ij&ADg%|2V-U0vVO zx>f&EzN;;?qeG#wt2CVPyXO{L{W5gPVQ|gsvq2+YIv8~(tm1@C5h=d+5SLaSS?%n=Wgc*)R&t5wPWn^14)8pUcDR24@Ru;z5hnc;#N90e zyG40!i{jd`0!Ay7HZr2cNa-OgFcLO3bsyJoR$5oQNDwhIZ8t-!obE(Si{;Mv&?sC_ zw`X!%W~`yInm;q^c515z-1SM)n_XG`!LYtVVmN^-+ypFu>yYx zQ_t_)y`6rDYJ8X?Hs_N!N3ERlUVUioGspchgiC3jKYU(rC;L}aFs|^oEUKQAv$Jr8 zV=-50@v8k|LHJ@}&SG)nV(HA{^_|5V97~l-OV##EH^Y~3v8?Edr2z)}JRUc^!p`G^ zMOUz=igBP-)$jBzH7YSxez2p-Y&VG529O%dib-r{^bxT}*=j;}Ueq-%F}%-Jl7S>b zt~fWx(`Hum%F?eT_BoE2*QCa!h~M=lqKkKO(9j9~6&Y9nam`9E+C6c7;0u8KYIEk* z$C-or0Rl7!kG@4_dqS+`iC&)Y#HQ_G+jntxTgzxNT3Ipr2{iIn%(}tg6uDl`Bgl?s zB#Ur%p!Ao1T%W!X#rete^`_G6ltDK190x}1%>}}nb?ewahB2>5Ozb<$UgYKF!&xhA zA92|J^o{UWJeP_w6f_!Si>_ZqgXJP0yGkdPvz6We4E9w#_nRneB7>ble2Ia*#;CpM z2xprH*}pZj_T#z4_c(g++{e$Xi>0rhnqB90c+2zr4gAt_WyQ;-D7JbL9;meQHW&j` zEU`LpH_Wk5?~*WI@hF~_mvfCvtOXqJn;`)b8z%rw>aA_>Vs2Ehdy+YC%|*YiIN*5D z7`u9&71&+TW8Fw(zUQHExL@MDH@B`bzRs9^$)olG@cvMA7&sge>oD7S^~{Gthv-#r zHVl3H#@{zL=GZaw9Ox)k8pyUm-155o=ImvloyqFFLSi2yOn+i*DSuqSzuTTu-gy$S z6X$@HIQn8602pMpelmKL!9Gl85eiuTa^};I+2l!kZhj{A84<>Z=j?bHhvAHAC9^%7 z!;BL-+L>jEw?FhSIU9Vq0#>lAVBz&<))wXvH8I)b-}^ripY}O{MKaK$ikNSH$s5s| zL|!BD4eoMs?HL_T9{LwQWW~iRQI>0`^^u~u1 zxW#;f5#zFPzpYb<=Y9-=1wBBy$tzCtu5WyW>?0sGyQ$mE`ZHhjUl`$FncDw{C!M3? z@D~d%5I}M&2;iZ{A9Nf>6UR<5PJzR83}m?hV>(8#+=R)>Y>I=~akRNTTC>iVJ8{=< z@zJ_%k(&Q(jr-$w_GP;9AJ-Nizb8%UqrvND-Zp33FT?A9<^|b_0p~Up4_61yzi2TK zNa56S{~Gk@%80n0KP&L4oZbMIwc=WK-02NKbLv8U(FC!FC^r7hp=vO&9UvfgCxk|T z#7EX-b>sRFNwPBq@?;n`JOF42iK;k z0q8B7iXI<|&S*x8J+Y~MO4`0kZy##V81L)ULsoR;sp{1l&qT#$X(R2#t*Vp(H#GUo zBQ;c>&;CBDbc4zlWA#4;G}oo6CKAazF4UYkKRWn}xn+UBuyIxPx}%AeW9`+F2K3~Q zHwdOkfJci;V~34LQU9tk40j90ZfxkPLuuJbzZH(>QpYd{y`hO$sA>*#!HIr+``!@v$w!; zBDW>J+amNhspIIU?6w(QTeb%x?j{V&(nyz3)`EyR`Uam%!v|z>NV{=L<*2fRrU;Vh zlHZnsJGa#q_qK!`G8~GDkN0$9TMwK1iY zSr#iBS3tu0)wB09YCZnUnm=#+CmG(RlQpSPeQ5a99A>Q4!9`=Z*zxShuZOYUz26D> z5|wp~(~R~~i3Ossx-|f*jgAG7snGQ<1F>@PO00lQc=)*9HLDUP>(N_g(U+}tBI(Xv zp5l*CBpHt?Hn3S5(7bf#N8qc(AAirUP$FfV3(Ab{WO+?i2k)==>j4G7N+Rz&UB#tm zT>Q}X{8Hk_-t=IWvksWmeBb*%6A9Ouf;W=B^a(PGf?vM=q_ef&b#Up=m-kx2;Q`tY zrV1(?W&SgN`K6H4CCK#HuS5p|@LxX94*-Bde>Ic>3G(vPG-!K^3C# zAU+SW<{%&sQuE%t+k(_Qh|Gfoytb}hacM;*^`q_{XK&rQ1#x+6a_@H_GEZJv<4Rs3 z@whvL;^`QeK$Ko%bLZvDjDXUE2pRdk#`V;2N8G>s8>`} ze7(Hf>4ZCk`9Y2zm{4SRMrGK|~(p4&Jhz>p}&xP$yZh{LmSI364x ztEQ>f+dmAUcy^8_AgFJ2Vm3a31TlFACKeEomy(*Ee2EMJe2{L3mz1xlu7zMeNZ*5q zJjl*VB$HC7zkHFFQ|TLc0AYaEwvN@+HSy;!=o^_p3f_O{zQ!hd4{wOlGcmV?bUO&b zgZw*4#Djo42+Mo)bV*Cc@XnpOlCGX-i?1O8&)mum;^`o_4`THoCJ*B5vdTKxBQ`{X5ZOo4TeVSSrsfp?##i>kD z;#sQxDMtM;HRQg#U5UIc9{iZoDgTTS)5J^)af%ivc57u1R?-%FQfR3yXzo5N>VO%c zYEIkj8xS%3T(33cO=FSY$75O0PQlQ5ai(-&SYLwyPZ#6fFlJof&iTQJNq0kDkHhMT z;ke^j<+@*{;;2s!S!@)vR}usS{K_vP{jTix~NceS$ScYPrSwMp^t%DL{ZGW|#7c5iMQPXD_GJ@eE!ujBSO6x_SHz z#OJVdKe(yxWL#P};3?pz2uK{xmpEkF-dr16xHNz2Jo1mYm2{fwXOoL*0h?jQMzrd= zJQAWI_Elc`UX5$0Rm2N;-K7GcOO=sECRu_?(~39-KhR9hK$6 zo_I4%2$jTiKJ+bAs(FhRTahv*{8sq6*n!`<_y|!p_BB6(;TH4ccC1L+eIRba?ls>h zOZ{Dq2Fj8Y9Uz*Zlocg5pM<@=`^z|5kXA0)&X?Zxe9dle>}EhS1&Lk54v}o6&xn)< zY-fnLq_O85(M+0?c+JV2;PTJCPq--QZeTpF4}M_zoMSuft&1ZZYPofiv99&$LQ|Ia zS>*sjEyHj~F?-oxBT)XNRxTk$K1T{!g*-wN!y1iqd|gVb1F~5SpDJ)?jQb!R(SC_X z^DGXneJfUO7t=Hc3H%4jDAN5*ElIerEqV<3+4vW?nV^^`lOG@-OQ#tNAt)w!RXRiS zLNv~k_|!`TRWd#&fD(CC6tGDc;wzLH6<^%cEl-ro9<=G{+T3Rl$uSZs3lsuL(B8N=H~j^`-&Gp`)~PSjCmh z#IKJF+gYp@!)mjNCf|vp9!&?z-^R~;|G_m_mGDYWBaFAQ#3 z{4g=@nQw_aiXJ|+LM9uUX{0=sEZm*kuf$DzV~>&%8l!|vt;>}HQS?D6Jv9d7a(j(Q zs4OF*j0J0D>sQX!W7 zZo3!1NM37X^R)k?XgNE7o5#(EJMg~aa9#3TwsU?*6;+9k+&fD>n-YPDR`e?k1`W2wun2+@pxu&2 zQaoS^Q2Y0UkE6uVsukJ>$C|0(oy{qkAFOV&M-NMdwWR0r&^kL0k!y`Eg3pIsJJBto zvCrnf=l$}o;8IxNu`LY>;Ya6L4Rg7GIgFQ$CM_R$AIeHTHJ|saeZjurl3Lr-TELji zc%g~RYEb--XP=37XtvV1v%;dkKL}nm;u0sRrC|sY%=@pMPLWq2Ei>wm0u<80Uy!o@{v3WE8ndtmY!(a zk?CBe(|%)yv*TA%4E)lug9n)PLsqQvLOeJc0qMa6_>)@7zq>3>W(=xZGVO3A6JFZ1 zg0ZIk+_o>i+HBnH%(ys`Kuei+m&`4K)5MJtdK^e|`Cl3pToM~8cFv;+F{GqH0a_xd z2~ZLMLME^r8FRUGGdw=sdp^MVy%_^fWtUt*+M)#j0|uFs zR>6|8aE$=WrwZ5N5ndn(opXqpDO_S5Sc0JNSnXW&^QsEbYZBmLCM|RW_am0!mzVh>$(=iA3Rh!x4t3;DyV z7(O7_c&Bhy{6V|fapSBEXdB*lQ5M=X4vf)`D9R-`; zCnC6$0OnZ}Z_s+~5`uy{#srnoDe6||G-bgoI2E-DgEP?Z7GDU$xex{aEC%S3R-)jl z7zo3GGod*Tz{m|$+mKUjPQm6E znVUNfen3P6gfuuzB)|<+ zIvaJ=4WvP1Lq2dMsR(4*0MJ2T9vaABfMJNB86L=_gBS*@6bPROfJ#1kxA)Og&nc<% z@vM9C2nxc9fVf8lJ@yk7$01G*kS2ikc$){(fV(R=Ii5X>Lujj_XULuew=)>f8(<<& ztAYeo$MP;JyaEaL$yq4!daUC=+YNdIA>YwSmzB^tEU?ROtS$$llfo=fpWM(BGFO7E zu3%bn5c4_b5(3}^G`u;R^#cPwpN)WFdhlR41BsXi;COjw)pPr@+P~1iAu`*zpiTfi z8(6u55Id3UO6G9`tt~-_26?*x*x&({0|1a$Jr~GCvgZOlyQsNy(Y~y}LN&=yv^I-I z$wRJY!7Ei=y}<`Tmy4`|S-3;tc(`^@0g6&^N)F_lW3kwURjIOF?t&w8S#0s3B9IGs zBOIEqD53!$-E023;F(46ct+X@_h8igH6*MMZduSyr)Zk^g$72UGOi&iuVLJ|^<5F- z1jPQi=$7vV;zB5bH<=W`$PL3^jR63%E=a`yR5B`#aI_i^c`K2ZFgCbalvx*WwT1=7 zomstK7$H}ru!12HS&ei#LF-bAZzplPg@2ySyD-1~AIGTMGZU z6};C4Ki|2stP8%r5GpSRLgrJ_ha@;NXH5=tkmJ_B=I_a5O|81Y!p(--Wevn%66(oC z%;&zwUB(9=1wi&ZRj^*R{9Q1}$_8L2!R}yC4Ff?mSJx6?I(RHAw4e~=*=O5K=nVH zP5cTRGGr1=m53r=t>e~bJrE=#7V;|g^N>#Lnq*{(R!b>sGxS6*V1>OJ1)+<=>gGV! z=!Wr4LA!}GB>``>3OMKv?`t-E*$u9gVh)iuYfBM;Cy)h#QM7P z3tbRj_s$%~)eH{;(V05YVnkrk0t_I)Nhk(T0!C#NcW1rmZd{;BA&5EtAs?(s% zE?Gzjbpq^BDm-;9s|RLz&K8d{okJ+FwXiy&gAc$s)3NsE&35D-YcRfxBt__J5Q(ZJ zW&wDV;T&k6hH?S@eM<9vdj~ETW`;ST299z+xy7sIjeI{jfL<0vBnhZ8kn8}mahFBz z6gPVkF9FYLUBVQe7UT~TI7MbdRj?cejJf9rH7N)S05i}&sJJ|&{AWm2bXeVBSkq%z zJ84*_Y*_F9u)*@MQQ<#R6g!FJbYGw)Ak4xK>k3+=`Jt=*C=y5Q!wmoCo{rn_BT75C z3*Wa(dBEfJfQ=&kBTo2`Kez5#Z;OUOD-Uj)KS9VK@hiIlcTZNk$2*?fKH^y#=&jIu z`!_glZsvs@4>TA}^%!?8a|u1L8xFVQj!fcVNSm^%1vgoP=j^Op8V-{#V1Xfdue;N!?92fMN%*t*E8Wj?KAN}V|#IUrm_AtX@{bs3 z+rn%2kY-@4&h6Nrosr|6M~=z#V{ir`f}vJ|Gyeo)VS@2|yz!+5HID8zmlP+{!W;_Y z$4bg3)oHWE)7I;Dqp2j*Nok&k-hU>KxMJUAw;Bili|;XIEf;C;HCCSstp#49@axC<2dgANmi#PCyd`AfS;O2OE5J#YV(cD0d2P zx_BcZ@n{ZXB)B+K%$f9L!NU`I$(zDXPDqYY!ZSye!Gk)VjU74ADZJC(~?oE)-iXIT2 zgDLHz4iOM-I+OmQk2AwYKNvi`@bc(4$%(hvg^aKVo7<0Z0>A@rj-3@ye-x^b9q1Fw z{cW5pP>igqB;|^_=dUaXed##@5c00J(|9;?(mz)@Yb|sI_rrb0_Q!?3T)4`zi`K^g zhCgRt!tzaeuEB}KY%E@iV?$+H(?CnxO}>=hpxgfB?Cay?@%!12ZT z8HI(5B8Mu9%PuUwJdgwJz>=z9_zkC$+r=fY=8`)$B;=9Luoj^iXqI7L4)pF@dWJ2k zbSmllSvvTE0Rvx$%n6NOcr+OdYQ8C}wO=k$T(5C!Ub){$~%XP}4Sl!}j=Hf4Um3&>@yPsmWcAm02y%rCiX*>j6Z>%=h ztR~3MkQi@f0PlF#mP~ZS@nidHqxa!K%mbHKYq1W?T$~%563bN2Rg!i5b6mtaXTU>{drE$)weL&oPRU{Q zUbNq(Hr?JfNwbavJ&>T#Znky1x)C@+Z5K2o=lpB0;{b>X9ep*M{D~dzy&W9N!ij%6 zlB7YXgxU*a<0AsRVb8rAP9*GX+%0?jtbgS>=i0)h$3^95%OdWNPjyXZbu%8_f4S#7 zPhy|WKi$_TLSO9ddnvM|2k)Qzv;4I&vV_{dsQ}i8_PyTgpOqa*oDun!IPgXjo=j#B z1KD4aC;4Zgk+bL1N}~m{v+GG?!{s}lmRDXX52KQpC-ycD9s5j<9u%_sEITkD+b|^e z`m^%EXVoKL)DMn*(e(PFP5Pp9@p~DU9~|fUmL9n`-@os4Z1)>- zFOZA$lUC!rd}&oL`3LjMzE0I+(a0C0sE3Rz--V8?-?*`C#hj z)W5#n7NMv-&TZPSyzx6{U?b(o@4!g24wYZmAO5~2x_Tk<_tj6o(;RbxiUjku{@0>S+^}z3w0=S2XD=!>IT-)Flw^IYnnM{mV1aY^Q8uf^2vI9l`dJwBBc%8 z`8HjvY(4dApeWMeuA5Ze%X?4i=hEy?w1*^)Gv0 zGkoX4)kw=DRZNP^5BSyzkcZ>ekrCec-RgtQ_gBj)Hy9Y?`k< zlLe#jX`l`L<*r0$v+aZodj4^QA?9~Xmg3A(eXZV$kEUwo{3rc#YyKE%I1Npp`5f!9 zza_$ZHe)1PhUZOeA8LI;PC1RSUoiVLDn6Xp(p+oBS3fEtXv$+L5?MCaAtMWkeF~7vqc1Z_87pFM~OQ{Z*(~ig2XC2mL3mjcs z18;V?o{oGFKjblRRcn}-_)^QwCta%3&G(AAw!43!f2Vukjnu2c5lUBI-DDxX4yWum zAI=1%O@0 z`7BxBV~jC2m2jBgRU9~*@8uOcm61{;VIu}#K&#`@vZ!J;c$5*y!UCFEBhV5}p~tKA z4+8KgPE+wYiOO=_NAA_6TrP~ngfk6j+> znu3A!;5ezFmUSMab6algLm2vH1#YBh@R~z}Y!Itp!1z!;5hMxs#r0tBiIUlDI2VHd zQUe+)jFwh1cn2_WQ8?lojUO^ zg8t-Pe?5Xd5+;`_6-R{pZbk743Hm3pjKPf79OdI6*ZU+w22cJ9XQ^yC!7g3z0C0nv z`GC@+<3Mi<$%;W0SVjVIstEUdGP@OiSOTq%F!O`6tP|5r)p3yBfTREwrFVJGs>&~{ za8MbQ$G7o-5P=2^fM(LzLAs#Mm_7fVv5vfR54EV7D(G^=d_1a^+U_WE6$h}Afm8*% zh*YH{F`;(?6uP1>7P~MarstH#C$JXA>T!ews2iJ#yxFCsn@Jk$SdL{Q$*~1w>pgU< zG1bi*NW-J$&Iw3Za#rx5@=!-Ga2nL=3*5#LluFd^QNOB+9mBqfW~-ubwy&@ssxa0p zM*zA8m4sNv(4aENwz}8g2+vWeW7> z4>hs6S^SiDr?}qbx@N?CHdxvl8kY2BBSmEjEs&8ohA-GKPOHw=1#ZN10sc{g>QZkU z37NU&fU2)WD}hMe@QDHJ$4P_^=~-&hTOJL(5X*EhAJ92D|ww| zr^nRh@)*7~h3yMG07I1>Wc5L(aLIShrS+QyT4zY5*dTO-6wRPUg-V-yb7?8iHo%F6 zR|(?$FePVNR_6Ay27eWMBj*a6>LFl3n}@}p56O0LRYCFOun@N%$%De@fEWY>EE%!= zJSAsP^=^fFr%JxnU5zGS*l;!=)=sO=K=Jm8yLF4CS3XuzWD}t^EAXj6O^5lqkePoE zzc^6Qs1|Gtt0U%n`QgQm6v+l&)MDBFS#X>DvLVn@Z)POM?-r`%!(@Q>=`9OC0bg0G z$<`N()ISV-_fsXP#3f6``?`Qs0*+wCJ!M=sdd=jv62tF^CgT+ka^TmYVv}8wepSZYY{KM6s#&a-NY3muOwduxiVG`4X+&p{r}_ zcU4^0)kz!ovLEV@BO6+B6oy-`^=z+OPPvOg z5jE+*8MU1-uq|bElb`3ETH()W^HHsLK$z%%Gis&^Nl5;LoJ!r~u|2AkjSu^gZn4zT zC{tvZQ<@sO5#RSu>(a^l>8e=f60k5L+&Z^YlNW$YW}<+z^Bjd}IQH4A39bfwi_-SW zSw{^yU^xnNdYdwV!TjhxU?uj;yE`JemJc(#WK3rA8etNwS6=@ay|(RtwD$@Uqtjy< zoasDW!MnNM;wo3^O*<{J^ypUSP;6h!qkG{l1O|1;%_z2H>iN3X*oE2nOE+qFmfs&^ zy*QU@6jvo!IO~KuLb}Nd_@G~qO_ag!riUwlel>m1Q6nBCnt+fBCh*0)1z-)l66*9+ zjv^}tJ6=%*4K=g6tsq%Mwzt&Z-|N5cK*?GIVL*EYU$s(ypiOO z@ejwrvZy_3905q67^BUg4Orr!Agbr|o2Q)#J$C(`osOjO_4CySiNC`Re~cO9c)1gi zYmTny=2kO2Bd(U(Voqhbk05OOAJbT}MQ*b}IrUH>TEe>>@H$r1p~3~_)MWgb^Z%Dq z$NV>^9u49CT7Tp3$Mk_ey#JR|;~+tkjNBlDwG`tO$Pl0@*TVS6$trksTPz81t%bSZ zD1V{hNOq?6#ex0OW10I#ySxMNA|~5?<`-V_*V6;vk3*HS1avmDO#=N{;~21?a#R*@ z(t#Xz08>L?zfXrLG7)wJpxY>S*AS=xgoBWr(*rGVxaw{SZ3AJ2r+5EGXv&hk@notS z6Pl`|E+9|hDf~njiCdORtsOYvSEQRHAhhu?;}zq~1>;?PWvW#_eSb(031}9XK)hro z2zQaCON9(=@B#&;MoD-2GsX?5-7tA33?Rc!&CzJgJ}PeDv+1DrZVHZ0k=QK~w<1f@ zDIyGn7QQcISI-e??t}!KHO*aI%&F*9B$GmvrI0Li5Y$~VR|5Ie9Lyvkg-S;V7m<1J zWEuMX!O}Y-V8gXt0YZEb0OAYmu+rsDIe# zVQ96t!WgikaS@;vY^vDGAOf@uuCd74f8Z@TdX`VW)fU|pI+nHD=i3Z(oEvps8$Crr zl7k2-R9V=8$Oc*A51=3mKLk=iD@#8YivUewYdqQBn`}f#*$sZ+Xa=oOBVii=ZVs+k zG@MzR%9l?!utUdVC&p7!dHsAV2|Lur?TcI4fs_Q1^~g1O0;W3LK~JOQEDw*8!rt6kq@A!d<;l7 z0mxI5=(GvD)bUbbGuv$m3RRU-QbR9|BbON%PCc1=yEesX1*GEPu#K4vE3$zs1*Ee; zQ*Bg;uo=4fCCnx<*eru+Pi0bMD`1{P`e@SF-E2py6~JpnmoAe1#S4rcrypSFU^y@m z9Elb{)akk3jb!LbFHorfl`GcbE*~I;r=!A&1*UUUkeD50CoxClyl#iEN3(Shu}|$1 z*39H_L_n67q&Yuh=9EdEqcVth%uHZ-Bn%)PKIBZrIZ??p4?JDlib~y|`J79&_M3N# zaRN2~7v@;X#PmNTAf$vg7BM1~irS>kO;C%Rf$q5j79t#`3IIfkwE;r9nT{M!RoOo# zQ8q#^B6BgOf0PL-+uKv^=u)jz`kW(&zr))s^sYXRTgTS?1lochu#`eW)Q-eH;DkeY zc~EFpDN=Z}fUGmnOu@Vu5k>;G4_xe((AGCyvUHxz*gbh`izYeQ)17mS&CDN$ApvGf z@9}SA4oY;#Z%#A3WML2{tYa+U_vGXbSr(v{Y9eI(Q}_!IK=V^7^8^4Q6)O;xLMW)< zlCS0|bssqMl&b3i(3}vd6%Je3^e`#3hbPRDOx0sNj+T8CZ&-9rims<>Q(ZkT~)f-88&F+nCP;;7SAp>7~;_*&N$V zXAtp>hF;8FcgjgNpnJMs&Y^4AAEz=FsI_iizBp5X#~uYI9%U1Yu0OmSq(8a^H;O91 zQa~rll8@=6WW+hc$j)-+?waxQZYvtpeTQt)P50CdcVK@pE8*l??<{}cQfVI`3Z@~v z;ZP^3c{ANu(F~?z_G!77T2Pp>u5T7Mm>i3U>MuhB=9 z=wlDilFcwL#Thp~APq^zjynK^S-~Bf)aK=hRFBK59+NK|NBK{h{#~9kH+zsna-01+ zo#f%^avj}MV>`3%aX|Za`pT{$f=(5?>5<7u5lldw`DVYu=g{`mV_FieS)@v(J2ZuR zrs7yRtIvEWqqmxS{GFV9zHSTbA}kUBxDH$t1QP4%>!JN}WTVt5Dp##)Uyfiu3V4bX zRl?IbY7vVlvTp_Dr4kw}B2gvAk+N2ZXFCh7!f*!wh9^=9bo)%kvh~Fkbh-De1l*dA zz%NjwajafQ3m-nJ-iCx!5j8%EYQpcCwX?#-xyn82jlSm1HVXB~c~_*)n}x63J+;b+ z^8r-7k*?kjakiIZ$jD|-&qg{)(}z#_Sq#lB)5?Sm1pcj4NZ9^Wwo4OSZZz7yy@D!m zXajbjX(h%Vuqt*fjh6}FYN_6>ua2-lS1IJ8GV6~8=uh_aQx!1Dq7M8S3&C?_xU2;_ zh?!;8_f!P+ymVQAs?D(Nb)OP3W8ZG~coB|B5m$nFB%IJug$eAF%@olmD^i6MD8k=- zGVlO5kwW6f!`Qr4+569=2CbjGyuQ1LWJ@6P6H*8p_F`BHoWP{1B6wuU$T=j=W6|^D zx)-NoQ=GrsHUDhD-${C1@XR`0=bhh~cQjRh7gzs^J1KB)S_DY`<>`J%is_>qKclUb{M7Y)@6Mz_zI2?dWU+R_Ti&P zE>4xocIm_QYlTH=0yrxw3ZOznVdG!)4F_&KBSmlJ!>w|`no9yogj6^Y!DS_XnM4lx z&4fviY1=WIO)Oi@0$VN8Tdmq#Z5CVYu3H@eTb<{&y3)3~uWj|*+Pc@d6&=$%i|Ai@ zJ6Jxf-=}}KUmvHfo2?m*Ve%T}ch2D}pckoWd{56hlS?+Z=EMbl?VixyyYCsh_aCw! zZ%aVVe;HLz7AERmH4iYfR7RU5kO1rgjl1ZTYwp#gdJx25+*`sBcXke@BerH(GG^ax zJv^87M&bD*{nHA<`8!cw)F`8k$7JCJCM=i}px{6B?^sRjl&*&NyfUD;4N0$6a^??E z=qAU!>GEG^WXFe;woO#xjDdYP4fo%y-prW){yQvRM1AspJ}SI0NV4TOXjC- zd%V!Y&jyYRSBmp}ig`CVfBN(4MXpVUEV->hnaW(%W85Sc86J)2F92DV(4h3}pkDl; z6Q$a82@bNP=OalRT}Fv6D}`o@rUkWI zKs$;e>%8PjuQ;xcIsqGhjAX)}IwdjF4t}xY%^Ql2=Gp&E2IOzL7?W~}#N5QYD zDfsUl;V-&!UN{}0qgcr-tYpE23shA&S5QH5mWXV+to-Tw30 zko5YirCFbrJThk9;f`bZB^v_1iFTrjt z;t2Xl#M*NSx(b6T*$q>{(KL(JDf0?4^CZ&pSfZLtJUc5IfU)q1qE{-I09ug8qo}#U zB%Mdbxglszd^B75Xw3G;p2Rpq+%iuw__O3>zWhlCGd#g`#7I64z~fCGu<`J%h-xOh zF&}1es-ww**-WVVmrZi+D@rU|$~o;TUYtN7z)y;ZE9R$hV2t6CCT4E7WCZCh`k>|~ zzJf-$X?NWM`^{&_Sk4f4&5*u=5|DRDI1q3DB5sp^m_^ehd!g-wio&WN2=l9Xwm7(-Nr1)*l zy|u|gjmVEsar4Hb+rA?ZCnd_ZxzrW=>EmDh{oTT|=aFV4pX72~KH>Bul#M02bb;)f z4E#;ErEvalCm6w{(Vb`MS`p91y+r3XRxEtch) zxzhc@?el`9EZj;KBo8j1x;VmLblLo;Wbq^iM#76*Yt6?5or)>W7F3ce@mHUBiZ#&b8~wRTIUG6#2||L0N}|Wy=_cLpEyUA}nrZQKg04i?16A`e%e* zrpw(v+ypdL)M9ox5t5?Op*lFpMZQ6>MO41N*pOr0d?0OcOXdk~CdpbFS zNj6{ z72|h=UV}z@gZ6a8mBUHzCkFa-2fs}Ag)A2xzoc1x>6F*sZ7bG;r0+R_(+xLk|tmY<5MBw$Fk47v36KUhgot=B;LO0A8j2J)>X<&g%*J_;nl9cJEpC49+|( z{6O{Zr5_Tr5`*_ETjvj0cnud>xa))E{Kw2(XL*UkZi!0BD*tYOdSoikZnz;M$w6Cs zAHBfDNL^Oqup`KyD|B}z${%eT)w4QRc3mNn_px~d{{B>?>%&md(N3YC6P(4w5tlEeon z%-yzeNVtIHtxA#hdnHCvDvH?y5?XrJrLwx*5ZS5LZQC97+ws|1ySn( z63+<)1{M-!C~Ys17U>0Q7u3SqI{?!ke%7s!IHWqPJ6PSnn zp8^WCN4n^t^6lf;u8PRHnJWr&Eur9rB>qe#!iC4X{QvR4R z;D3Ck8q?pC(5T~zc@Oih62SM*@qMJePO%H2LMRJFT3w;$msok9&H4U89}wiKjW@!h zC{Q)+v~o2(QGsk&V1<>R1DqcaQlBTh1|_aMF&}gutkZ(ybMry53U8cGQ2hd(vpsUi z1y$how+OuXv#kNC5AS5J}ndo5Eav=_Fvt?+-Vb5ijyuRTr8rB*9r)8eb?JwLt2ss!fV+P&1 zvy9!l6g6%CfN=;s-?Xtp*7880oK=2A>U}Gj!9AxSQ-!A-xEKm0NMVQr!cYRp^6Dkm z64N+fVto(cK*8!wJ>E|*($*Jh)0Rhm?I_X;Tl^|(h^PS)GSor)HJRi@YDzMAO<-#G_yGCSJ0?fDaHKKTC%Oju6Mit!W z0h^F%Kf1g*OF^XF+f8-XWrgl~X!V>a`w5@rNKo`6%G-jDRtb;Agq{71=7Z~_I&(&gcnBOs_IvR%VQ8V4{HQWNuFYZ5xE z(7<^P$r-_{Qu?;?1Fg;k(ar=1zNS$|5V}H%b`fl(u3=9yU3~YU(7p<=s$$TBu6TjtZeAMkTR@(dk zqMk&NrJ=|%)La*OdcR@4&~q<86VZ4k5=!we8}$eTWU$e-zx2YO0LbC$n9_Ad>luF` z>Z*u92X@OAksd9XXHqW2v~f_15L#4xkexoDDAM5Mh5wCpOMSzv z0K^&MeESS;SV(*ZkX9fx`Vv2MDNh@o>tx84tah|VA?60N6x`a>g6C z`aGDRnQ9KN_+;cP5~Y}p$_Vn@nyIx3JYZreX`ZrkzAj7TLB_c9iKI$Se3fG%&FB%!QH*RB_u zpeeHBX8<8iV#)!?ls@whbj1%;O_Sajcz3$~#cY$oh4;PY>-2%>ofl?}0mB_~nmcSf z-(C3e^kVe8{~5EG^Rtch>!RT{p!>+=;(9wtwxmbaL`7(Sic=G9HADPJw9#*a&^7 z%0TX{d25wA_Zc$9O|a`>5|O6c?J)=^pw@*CLqERJhQHK?>n@6@{Zx7U=ncDS#X*Co zLm%g%6e$6%s&Z~P@FUfbZB851$>=j}_2%z2AAPT$0yE?Srumq`w`$}OH(iQ(4mJFE z%Yip$Vu(-|B|N3nePGJG)0>_g!KG8WpH+5wd5rn8WYfhtU7|JhgKCGWBsn;8p zK=XSfFV2X(CR{qh9GDXtKW>eOQvO`s{g+7p-SgQk^K3WoGuz9F{?8n~{yy=6@jIyr zL!kNorr)2dXDn!QyMMfC0v>QsQd>`vlG-BE zCbamt)K>QQKB*s=C8uM_$S)R&)++r==Z(e z$M@-qRaxQs{b%XMr$PRXsP(qL!vOC)Qsyz~y6l@gT|7TzE{(KdR1ZeckEP=_&_BzY ze{gz%5Oc_yfPyMV(NN^ZY0d1@p9nZ1m6LXWpZ2=!3)NTX+orE*O2>2RT>o+a@iE=& z=d>*NC_%EvqLowU`ZqT`SBANC&Abh$G6Lc_1BXm65I=Q0!JSETC-$iQy;%5(JwMrR z_Dp=T1`4emNh1een9vqKAXHY@1NrA^CL5oAv)%N{N3!yxkGw%Oc_$7 zwo!NXx^vbC!gr=aP2M91poUo02+1e+29Hz^u3S6z0y>L>Uy-#Yr?PVxE z3Bw6JKd>e2M-=J3l&Odo)up5=VI>0UbmbV6eThET(M$jvJW@EBv0Z0WQ}=zNUDBub ztDod8W$+Nxp?yVG7hsCQ0vcya44h`XXlT>CR`F7%PUm;P_iTRJRoRw-8yrkV3R=vA zT<4;DIa?+gOr~fu!xT25ZNPO7?!QET;YZ)9^VV;1)Zc-Ca28?&RD5t(qOx10{td|@ zHA?=gzHesUw!vDLLEd&a`;R><>B0lv?hGA%ROT8DzQ$1*jQ>Z`QUpjDxxm!6*ljx^ zlGXuGjGou8@J_E zT5sMKA);jeS~ZNbHL*K7Zgd+Q>8L!$(jAKt?pLmO%?_qMI0Qc>U64F6a8k-CdDZcd zkRopifc+wk2kD;R@7=0W>8PP*Ij70@1%q>U>z9O>bZy*pfLpYKrH5vTUrq4v{G z9j!whXPr9P7l%5pId$C}>bmFD{b`ij!_MqE*|lgFWrw&*C*cSR;EiuJ2W@O>SCM9fVGT2tj) z(~RE)>Tlmnep`FF{(^t2aNFBh(HUCi_O8tBw;aAvM`wdc{JtUHb$bSCZ@oeEQNZ>J z?4Vp;5xe1rMu4Tbd*mt|C}}sq(n}kSvbx);gGTkYjZQwi! zl{Al~}3m7a z@R8xmi`x#oHQ5X(=Gyk>x-)y;WShC>qyYR+OZr?|y*aJf9KV}OrKE2LfMrbV1tf>< zbO=dd90NE4A_R^@qB!L&Gl;AzaXGb|aMVolA;wJs9C-**yIlwoV-mKDZ<1TR=vGfj|mvCAVJxV85AH(Rn{+ml1gKM%1&fxiM)V= zhd}6Uha7Sl(r!HIPaQ=|;KF1PPR=0MH#N_|aIbHfb((ztR$I!4WJ;ZvFd^R}oSA35 zH|bs@?KJd^aZcOqMMeQ>+n{sygQm?76CPbXd0;>L^UIL}l}%TZEq8u=h7qi^N$cR@ z3UIGN8%i6LeOCZ^LJ=O|1t#>N3`-rLcx5k;7}IxKzsVcV#}3IF%%nPXHy%c1pA|}{ zf^PtQY&or>B~u=%#9sylxcm%q%(>2*qwBp63ng1RoSN#=KRKxFsz2NIKBcN`m{4Ro z!yYG9_y&4?eUTmLeCS>8BKEXA{On6Jo_gfXRf zQ_OKb0@7Pz)iU;u*6MinX@%&-ArP;SKSM9Nr=Wm# zz8DV2SE1;+^#D$s>n7?K0b1FVSOs2HT?|hil_|pTn;juA)sFI*5n#DFNfzS7p-P)N z`y|<%Na@H!>Z;z}_cTQmEd^ zS#x9@c{=yd<&Uq?qY5wc$BRb;^k>3&zZuj5CpQKQA=yplwkkw3+PQ`us0I!b#T>`V zV>~HGEkGU%ZIr)69ocX{ucO>%4o@x5EQ%@aS6%mf1%r4C6PK#X+zqSbkWfmowtfqS ztI{hFp-iI_ZN>8#uI+_ zf4yUQFY4Q*f9 zOEH@c{)B{ubQiOfB0N8Sb&oo<`m442P^fkOl_jBt89c5m{NJOi|261w@vj0P-waM7 ze;na?AIHB?9v_AzkT)Rz-bKivw85Esxvj*gHcB{Esq!uR$Ij}uiHr9CDU}@L9Tva` zGOqts^Dj8~?Wrs&(N%|i8!T{KWic}AL^`*n3kAms3yFjFD(Wf09&q`6c1sskoKo|) z`Ub)Znn(s;6Mgb7v;O<4d|lr^tuz?7p!UID$*#q+@bqzivDolt@vib*vNP*t;nF#K z=uC+ReL-pcd!4cQ?08JXw*^u~oD1-NSBZ`Z>4v}RCSUb)6~4Ocs7~|8UYirjk2Ez0 zs8M%#1exPvJLO*!-VWYo{7yTpprD6)SwQohNv+5>t(GRJ`6`dSFJ?V^ZG5lw>c+C^ z;H!B=N$mNMGRZoa?US8UsP@mYfTvFzz)=+Smv=gy!n9YIMwwykdT9g5#00{23tj4o&n}E|V~ovmn2vf=VC3B+8~++;AtLAKv%Pf{uNM(gUXO;$W=;0pNT!gy z?;E6BpWf`dz`Xb?aylUNTzC0^X|m3Sktw2GY)5mWrS;SB#tWfGKlQ%~_ELLxxw7Wc zl`ZD)KK+jR>vi$c!-1Zzw!@CbF}Qf{oTG|#=9vv&IKVjfC=(PhbU-AQ zf-kli-hTP~m0MZ~6pVu^5t_{$XIEb2Eq0Bsfy|L}Wu3e?-7BgFNy=YOT6@IhXK#1h zS2kXGM7>J#nJ{3091_?EC*$eJ7?JVK2OeeQx?}ibOJwR|z0#&Fd6Ox3zl2zs)%d+S z_MlW6fFT8N?>K_A-31DQA8X7*KWZV{N3q&5QRAm>kkQbKdEvP=2 z$^>4z1(oL?t@S}y5*Shvoa6u36j0?r1A6cQI!^?O{-($ArTIYk_XH(+u;2#v+>e3t zA3uahoxnHQdAD9{EZ7(K_|V%vj^k7?zHH36qOuBo>Wp<6zW zgCBzstsuGShA=~2IZhYJDvk2lQO~Cha<;LOsMhxXM8zK{7KBQo;wAD){L#O!2-lPW zeSgquPL;5>e)qPnL~M_z%wtYpaJ;+MKYtV3L#%&C6$Z0QEA+3LUxqiFA8oyI;<{HeeNB7_l%v@qmTMGY=KwU5qlx4yArXhu z3)j|_+ptlwyB=+_f=3h>0&q>l-pX>u+f*Hvl2WjTYZ^YRJIF*4;ZvFvY3 zBOphH+_ymA6CHH$N1MvcdZ+v=G5=bttsr03?fgS*OCTk+1sDV(7 z%P#O@>W|?g_$4vMbABU*37E?OV-`PBY3QL9>FW%%8;)BCK3otQFqjZD6xIx4j+p<| zeXr{~z5Yp@rwEl52(YVV_&^*XyaH9d44GySB1h2|nh_WQX8Em(6^F1sg?w(8z#ii~ zUn9%^2eK8ydVek416ipi2_PYPDlkEy-1$X6frWjK)WF3k;D{dqKxJ>5;_ELaRfVto zaYidl0GX$;IR(R-KE6C1tUXU{Ce&=Dh8X-a4I=2NT20X&%sF8LB|Es zpa`&An2y#n6v}-!HdD~DLOcv0NO1^TQZ?9eUyR%C{dSp@@31iRwj$o?c4LWXeSbJV`Xm_pLCFVIs%GNHIrkjHBojgH3|S#)##e zAcQh2quRh9k$5aatp5y;^&c5kTwt~Fr1Ql9c?|C`1+GT}*kM7Tuc;wOm|%}}O{m70 zJq`TjUrD%YWtJvFWS!F(fPT8l`t<&8U`wCzSt}E%qh_QSY#&FHBT)06Cuhk6^47#E zj>#2y)4X(BX~|jg2KKg4ISQ}yCk@iHVzk@Pc+aS`X@g?&h}1K2q}_-NQK)>Ii4~OL znL&2nzUZ$ol7mk4Xuf*r%!QmAH%i;WF^U1#$>dOzJS!)utmOb^L$i|BXTy6VQV zagWb%-_h^BYt=o?#$#`WM^?Yb!Br1#m8}`n#YkOXt=bsJMp)=euzq2VbT6Du*K*T8>wqgTPG z|Kx(-2+{jy4BLC8$@}c8alR0Ztiqep&1CgiWDctyd;39#-^1&sORL%XAwe~({uUvj zYr&>}S2qCPjg{xEjNv=)@&YqVD)e+saFw3qmY3A0a-?x5PBosaj$MK>j zmA2lu4Px7dL&S0~1OS~C1P$5x_~F)W-j*v$Q8#S$muaC_c$~l0GUJjiDLs%A>t^>ixCieIQ`4(?nKJe(ZXs47|CJ^4V@Tny4rbNYNVL>Ld2fVwko-IfDaA z8bS*kP*jcf-#;CbMaTu=L%u%?Cn(6!s(I##Pm1p#n;jA@y^) zk>HPNgeMDNp+8_<0+eKtLF4Q*tKC9=#L(pec3jABKxQd_cl^)YC(dkr;g;FGu$j2P zz%}lh4)bTRKBz7rm*Nd(0I#g;_Nta&S=TyUoU?Bt9vI{|<@tt-}xc@kk4|Y9E=T>;K*SMGpRioN>E&jJWXmN#geIG2wA3QDVD z*S}|V61_WwNJA+gybfPkhtC+91_YQnJbO(-wi<&2x0^wLS!^;`ApJ2nXiXo*g@ZBv zC9{UBwS+bMg8dHVdjv3fJW&yTWIqw|RRE{q)d8`Z8Wfdsk9*lJFqg+eL!}xy$P5Cp zZmw8uF+`0B>Eh#$<9F3RtlEC51|qIO6OqYG@c4+!>8_Q9T)Ziiu#VDYZ!N`3PB-X7 zj&%i&#KdESoX5t|myV$q!Ww>Ui&rC5I=VW^@4uL}ONWogunrG6GEb?MAcS>PMFQiP z$qOC`=hSwp5qi`BJV6E3C{qa#)<{nQI3Q93Y92EJ2$>(D0mF90yJ`S7rXshoqV|Wr z>~V^-2mmO$o+4d#2~RHysvk!r>XugpylvPYb1GqYRl=!)_~mFFjC9j zFl*Iahc||^az$+wk?pS^m%LLmUleWYj3oYEuz+Wi*V)2L3hs z1nt_0WkUpZaEgt3BS-64@Mm=(w8=J_WS8`~7pDQF$J%F;h!4Osn?25?L96EhB{~bi zQTAi1qnFfybWZuZxSCgvCd-TZWseOx6zM78++j6B!iJ^|U)!r6Uobgv;o?H|&EwR+ zziCzMtoi^ALgFgE*+qV9XUYo~Rp&P8PHw1nm5ENEpzj0$|)Kul&v>(XJb4R$QWueCQus z4-rl4Rzd`R;F%GfoL%Qs3H=T+TZg+g3};iH4K)M$%@XEaOLW=wXfZ8WO zk2SPa?9cfiUS35U-1@uS;L41}#`~6^rgHO!a=PWm4nQa@wmDupgAwH>kKL3%9bc~ zKqT3Qx?PFY0%mUBcYN`Rs(sY*)Ix~70aklH>*2%rCxdA*iN!6+V9dP6zxiv!vKS6- zhzk7Z8*SAvaK8$8pL)69_Ef2scjZZZdc6#ZtW$lY;$^QpJ@^mom^F@B++a=SkTE>8KXb!|{7vjZP=nYgmk zEj{?Z&r0kK*iHMHc(gKrlK23@MHBUHp%jk{W%f6<8SNP4n z4(#s{wYLf-{j>viN~TT^gT6ev)0g2>{ln)Y@#KOrZ?wwy>BsA|SNwoqy-TKYlNqA?k+j}Ti$VBV$GT6>Mz{AMJ$HYy%74t{bj@j-iVXXF*h34gXb z>T>pf7`tWqVRiRF!8D2jXln?&mLNP`kbEc-xdcNC$2KKm;3Nvjs8u%xax8~#DHSOh zv+0Uzo)ivjlWBO)@rWfE4S8N@v7~X#;Y>HjgTXr({6 zKj8375v3?%w0V3qwmqb|n)=$OLShUa3)_)3}7 ziTu_IH+kKnG}p4@e$b`{ZiL8P>WWSmTXC8|N2Q_^rDPP=t0+PRIbkzL7oIGl=p`%o#{f-`6Xbi`P^?PiT>CY-=Do}cRHWwGf*F>h=im#2{_p5A!knKzlRkCC1 zGUTBcI81pHs@aDD4HLFbIl_@WmBXsBsmWdshJB-}_;DUXcnMp_yv(R`wJe5knk z?|5hB<;buz72C8Avy=O7o8MWkfhflMZIE4$pcexAAUw&}Z?HpI_Y&%XyS%O~9sprp z++2!pGDHD{+K?51HY`=WK?y_QrU$1=bBLAhXikx=Abe^_7a=wu_C_&Lh^24+yiet-jHw~B)fuf}UA*p$C zls%0)I(cP??l^g4=x_SssrA@LdzKoH_-DV1qMGb-RSsD3RLQB6ra-BR_Cbb-ziDF! zU)3Bizlpq~2MhzF#9NfcN*PKVhCJ|@@-H-t@vNprRrne8L2nA-fZ78nAUzw#C&jId=Rmd;Q5XGx6=P^J zkZU|zocuHLRNxyi0W3-^hF54mOXR?L;(#NY#Z44VhGYN^K>0jEeG#r~b+CR}~!A4Io6W%&Q-{oR5B-a;G5GHsC z0$J6pFf7#5Xs4n6LhHD7TsXp$qaS&_MbDFk+URhqaqLYMt(j$ga#|-4KGwXcc^(Ee zWkjoLJG4;Zx$W zZd7}!KHMS?JyTws(HvdG#Z4{x=vQW(G2PYfv+cMWe!M}J+}-ZCyZCVRwoG{+|2Z6y4BCU(OzF7e6#MmTB{)v??7#takH1mU;j5 z-qhiaJ{Q4C-n06C?st6a*`N1cheSu56eWe4R#m_JS3fj&?~q;}^WAc+!OpN-MRvy6 zXVp9GrJt7hD%P^QpH;sJ>!{gV6UK83bZ`Imv@lXJ{c3ev+PU1PPcb#@K>=);9(kEk zy6?js+bP1^q4Q+Ix5d)kI`bH)2j3PSw%w@P2zCedC^aK0a`l4UWe7bVyO4%OQ%TNBBy)gLYj>SRl<$wwKp9e4PRU-xEzx-XcU(|QQl#{pf zTKEEHs0ZGgzp?AZ`}9xOz4&JivZbBH*n)7OVOdY2W7nmTzT~UAJ?9kMx<+MQ4PHML z^dHc;#4nGG%dyGJgT{&)6*q?!uQD^ zD@VuhGMUWz&euSv-6Zv2TSlPsBJobdn8A@BMynI?zMWbLZrApRO|?^^(DXCxT+L*K%@r5QwZ5FJh)Oh8aeAC&Zr60gj3r@4 zJzl;0{ZEbWmS00h`*Lc`d9M$Pm9MEk?pxhgGtjxkTS4{FzwW;MtjYPolt(qZQv;`- zZjIR}opo=#Y|oXOosq>a^*Wqk-k31 z9xlJ?aJ~Jh?l#vyvt|2!_N;Fz%V6a@p7A&`P~&`RwasT^uiwpuzCHi++BP5j5OucK z5A70bab@^JoWT&PsVgh}f%6Xhu!kO~ReRk~^96+5f_Oa2l88a4;h1C1-L8@wPGQik72 zF}a0?EWrM8vGgbdoR-6{^y{3QJsBO=mdgBr^rFH`{6I;*T9piN4QGJMJV~}3hI9E+ zdgL#1`xe6fI*5^&S%_NV;;$YV|D+T6+chKZd-pcapQNw9b91i!Sbq8VW7F2msjh2m z{MCD_lhrX7;AWMgrMUfs-=ImZc_=6u}F zy(3Z4kpXWCI-(rWz8#`8CGSiIPy%H_8+@KAUCRMZyirsi=K?ESYaA?w47)IemV}Zw zh@sZyh!zmzj+4|a55NMrN~!GZ!rC0aHyUO*&DHx-#W01d6>JeT{&GG_3CM_%BkYAd!>}bundq3Fmmnda--__Fkr(8Ceno|eTIo1*9BXo4j`%d8|HF1 zd77vs7S;~zRC54aC}=$fbbl|})j?i2kq0m#EIfAMtxTMl$Hq2uCA6(_6yQXL^)aAP z9C%#sx)DHz6_%sP4B6X&Lgk>cn?wEu2k`q(myJ;1f7E)78dhTYjbBMrE8VcU2p3Qm zW66bmDJoqn+^1Lwr6Swy!GtyNC>hWM;EYrR&a=3susDvw#xcP=WF)p1T`+}?XL>*@ z4zW3fhp)^POIT|Kg-1dgxNpX-)Wgx593Gy zsTdeTqTJ=ds5}I&aA++V0+{s4^N$jxHm{fvjDYj<(E|fVGD46qge8B&L9EdcbU-OQ zAlqvkh7CZwkinfGS9XU7&avVW+wdrg3+Q=*U&brGg;x+Njs!#~nLS=V0uv(ztWs!u zRgEgL(~~y=n6l4sQ&vo@dy)In(1ie?$AFmkVto>elmr!na~0Qqx@g0!h^|&1G})jP zsiVAFg0+?2w*2$#^1GT;qw4Ogu+o-7Z=js$P_)JCFwAiWxz1#d15kqpy~Qv|KfndZ zf*aLF8p&Vw(A17dDmw2_8l*VGkUBwBD7r6S^2(vu?jQ^Yxl;#D8iGR+N8t_9!&wM` zQ!0x?-X?<*t`B$k-3j*{U`8sUnQ4xftgujkuNTNgt=EgZ>U)d?rw}L9Ri)@$=uI@B z$~@5@aadoKWz7=AXGs|%r5Ft4q9KTO0bwicTF>!__!~$FdZx8SDm|B=9^L2|Jhl`_^gqwK`~8gPM~d z;CNV1oPf@if=$uRgcV(EuaeGcqT^26jx|8j&O{U+4jak?B&^=@G^!09%97w-mHjCQ z3Pp=Xr@OE2AbW#e5mi^(PVc;3XP*Qn7K0U+8k{k>jlYiK645TlKwcymPi_W)DzJ&4>7NTGVyrDVMMVD^@f4n<2cEH)LED#XT8F#Bzg1Avre zD*7ZDY)4H&YxD;UeuhP5ofw#T=J~$UOTX67+ z2RPo*W$o35pmvRAgM~v)?5bm>uoao-Yo+#(&OYzX3+g?$)SDtGvXm+88Ai{aW9_iC z9z+BD(opA>-|dpMe6d58ISU!jlr~R2v&Fb};8ut7>yCkWL=6LTK@3Zw=$sHEaZKrW zGV--0D5r5QEVAtYh=g(afL`>@a)gC+ZBQcv`^1Q82!QHj9$KS8_kuQUeS=l?Mz|8XeopbpbPtWQ6DYNo9Zzo;R!oXNhp}msY z_jsZa4FeX3`-nb$`WojkJ1<_c&vb^t1IZiqf4G?Q^AOu)F!%7qtlF!!l4a>X1vO6+ zkY^35Fo#n10*Do@&J#*)8^Q{=qiS@Ou*VcB?*>RmEk>U zpL1h>PFMTzf7ge@s8>SSA=lvCE6*yfMT*w11kGQGfn3G1M31>$D%_e~1;VU4=Fy30NI!z7wSb2BFFb1baN>)?P5~ZGF ztCRz(*9)}E0WA<}OGZ^2f*lReE}S|-40JJIZA_bwM%QiFzF_jaGI$-E7Ws~JdY#I)lraU|{ zYKX1Kpn{nM@W8YR+Y)rajzTL`4^OKeA&A1GL_oRPGF)Dopx*rS@@o^L$YJ$vOAW-i zTPP~q1=^r7OwGfZYRY2QDPRfs#00dbAl^Y?{Q@*R?HcUMjiO3lXevRij{r<*f5z#2 z8v&Jh1a&L?6|BxzmPbQ5-~eLurcgUxL3CDt0RfCJ@G_=(&3w4wz5+d*3M&yx{pp{W z{5x^@mG({S1lICS!^q?d?A_4%JEK@OfT*18pBREdL`9V-9gd{V1Yb=b`}lWqei)o~ zo_v@y32(R^-!$0~bo1Rj8p@iumhADv68v>e=kL4@(5JsTL6mupmy;(b1loNWzN7V( zK#;$Mo%d`_yQO^+Kl6u(AdrmspdF9oBqF&i9CnSlEjKaJ%>bok013~VEdhG(W?cNR zeBxSp*dtA}k*!FX%((QBeGY|BL9&!evYu7)<48>Z%{bgBf@L zD}Km42yT%9LY{-Z&u4dQJ&Hg2u&!|yigWeb2>!wX8>gnGduI;F0I6n=l6_|r%z(u1 zsXdx%GLv9@x;`7mdXy;xq|vAuG-Cx_Fk57BsBe}Z0~W;G3D^pjL5)nVfMy%PHygk< zv$@=_MhJp&ULx39Y1}!p8Q@eJ|GH0kK8&V5064J!6W5*n@j?E8-0E<&kXQp8Q=xf+=~n@R^}{0fpwV* zh%BH*w)h@sH@gu;-0iy93HI;0^{@K{;RPVA&?*N5aOXj#J(g9~9?mNGjUuySj|JZ$*F*NQ?Z1fvB?aMS*o1HnY2cFw( zK0hC54F<=)dC~oL>o;2f&$h!aE+VGiCXt?UNWkvukXIN9^?#V`Clw?hL3#ed%n>8X@)E-UTNI;?A1o`dGItA zXvlGScfav(`iJJDACS}s3aP%^A^(Hb){g*9MiEdh{N||@SOrDi@{`rNAy&fF2HsRm z-hqPCs)}=Lx5-&f${j?-H@i(Zqut;_+48j3`fBdvS92Xv;YP6d<0n}3D#~&;{`t2} zyO#n8myvvm{Sijyjl%n*){K&FQ^T`LM@V!irqoc%{=8tD}{+!?T2YTsu%aK3~ z_t$Zq(a&Wo$dNw>`hT5V|J88XaGQ*kguZy#PcqT|12q0QvJI^D)8C5)wkf(d-}~Ll z-ZT!Ka!=Ip*c0rrzslpvOAof9XRgiqPbAmV$c&hI1k9EL2NLlRMz5gKNWmM-j5#C7 zh3*C@Z4Dx^TM3y~D7Gptw#Y4pPd4FWel5 zWY5{TJ_xy>>pb5v|m z6=7o`N>$_d-`lhubLF6}Aao)Us@ePZ=vY$GGXJ8Aq?}Kq8f6!v|2HUDbO-Z$q?q78 z7gKPWSd~h{nDnpEu+|S!U1hDGb-IG2u14#67i?OKYKg-qy7HFLj4y7gu~ljA>O1?- z=_%~a!R6~J1C7=8y30bILGQN5l?$ouqjUAwz0c@Rtm~nW<=m^Sl zL6Giib;stLug(47J$`miGrsvbysD}-6ClReo4&BTVhT+z42szMZtpx(D)U~7b1?k& zT1@3IotuJd1 zB&{EUys7Pa2urC=yaeCDu4@4J3_hgL3nfFO9T%kX4Tr~VI~qz^%R~i41Od(Zia{?j z*7fv*y{yvLT+u5;@6K|Hade=o_KOu|)6oXmus&Kfn5(6N=2(&;n7Ce&mJOYNd&>e% zVge4UNN#S+7pir8d7in~g1S$ltF3;Tihzs+^#e+GrUtN;>QbA0vI$(RCm_ki*F!!& z#`EN|r2*ZBr~wm%KuC9`5j)4qrhm$2!zc(NN$F6tg7`Q5r|Hc_0N{CYSfLV zP6f!=)a)oN%xT11JeF6!JCjc;r)WzD@#IM;cJ~0qAV#a+Fnm_Nt9xNgUo_oE`Luw;tLPXQ}Z!?_mywEZmOr^RX7@X z_kNAtvwUj~;08Fr3OS2V%a7u_Tk$Y8n$5UnyXWS3sG$6D|6BE}`I3-SSB-~t1u`Ec z4Ew}btu3bGj)PzBNhoyck5L?oR3xJ=DweH!Hxubp9A17TKcg9$h6JJ`L5HYUYEQ^g z8`R(3*YvkKA=|x#+FW>gr*4J%OI?=3JIi}}onH}ylo~>cc3cnZYC5$NSLu8WGi`Sq zJU#CF!A1HjHbt=a_;%Yi_^ET!7MUy+FBlN?5iJ+JQeIvdWddYEO7}E3A?|TJsDW$< zCM&Z6@l|z9A2S1uOC|wPs`<|DZR0V~aq99*2$hnC(i1LreMh^y*2y7#n4~#~EI#}u z`GPLZYiRoHkGM|D;yU_#GUrzVysMvs3!Hi@H^r zohH&g>rcp3$9F;7gO9d4>VU9uid_Ixy1Cy{B#rjv@vkBvKuevCc_K-p9xgOCJkbZ{ z*EX6s-n6EBmYnE=sjWRcOFoI&nhM}W`V-x@JH4jCPc)4wgwSSU{(hMFE&r<+X|=Kb zI{5N_{?+Q;)=fT5q6>Sw((2!4-TT7?GQv*xgv?XVjm%#?esS!b?L5jsVuA8 zTmZkCC}$iRt6}gAX(+(WD?pib=2r_HZ8StXpFPkX9W1Qcx_-FAW3^FTFvTJpbv-z| ztUSI=4{0U1jM=W6E8U)nu#Y@eTpa_ym;L7a>32>~cBKBgVKsE7fe!J$5IMvmt?)Jv!c^CN(Yvc~N^um>mXo z?>5ZQ0&HA)t8pDTfwfu?1RHUG>GamQN|2#%tVf)L#J}W^^*YAbBXwWqbZwer2h-R0lbX#tFwZDDHtFIa{z^PNUmT)FdzZ|urrAG zn?IT3B6)ZPL&}CVLxx)*01`q6P~ZZ90st7qq8Xg0c3Oq)<31hfwq%+$mLqGgOKn%nW3J3r@0fJ;s delta 353087 zcmYiNi91w(;J=SQ=ghv~j8t|*k~Kq;C7MBYHCjZ8A<0@qMbV6XXJl6x`x3HM(l+)r zjZ(JMC@o4gTD84==l%YCKELaCT{C~cxz07uIp@CbN7d5$_K6J~6>|yzKwI<$8<12e zZlj#?^5<{T@+uqURix!rH_C6?D5oN=ut`Srkynarr;3jqQ*w1p33JSI;GE0;F@>M=PSYRT zo=4=EqO@}E3l*hId-3w+w9#9S`4=Sazc_hXCBmd!3I^T<)1Ac9?2`Pk_%Wh0_UXj2^!Z z*g|*Ag5*WDG>U3T+{*LX7%t6I?D9!4Csn{nwtXtHE6KKw6_Q8wL9f9Iw6}^brA6)E z99x^pvf@>2=}4|c+E=mDwtz~>JL<6hKFjnsw9554%z@+AL$Rl{t>m4kHg1!x)Br~d z#WP`pDpY0$8`TX#c0(4jUpUE*RVo{YhpbJ$WOH&YPyi_ZLZOlWbCU>w2oT5(P?8P9 zQFNcC*49L~%E-dza%We~z>wn+Pd%0?t!3iTh;Ze6cFx4FUzeJ$g(jvv{PEMo+=}6G zENSXm04uit{ri&JceM^>{ zyYSQurA-7vF$be!YdY z5#5Il&=kH*L|W=^sq3tT`MMa^n2OecrxTx^8DTHai^l2x74?Wq=VB644}17rDXTWx=U}|s&gq=*$!jc*b>LBon)YT5-QKtFs{00xo;v-2 z|72--RVAOx z%pO=?4l2CNJ>YuuI5#0-vPsu+S9HZkpVGMfhup)?MY9Tu6O%K~U&>R_rS6XjHgL4o zp_yf7=kIi5T;oq@nVW8N*nO@@5ZuI}?mVDIrMq(?_XifAxn1OWzBQ@5((UN6|KFkW zf6ktqY@9ypj%~~9kpk+mkt=rXH4iQug}r|^+`gqh9~DhdudZTIXX2{Lc84fp_=Wj=RP27F;=Cv31 z*+`<=@VSgcrB1hR1n0G#`tbb0?Hzs3?!^(6#N~`uUJd1(Fl@ea>+9RtBFnNpce~!- zdfFcN!o$TRhx19AwZq?=*P0T62`Z29;j!fy@^ovP?R-8XdUM1LI!C|T#dQiR@pN0O3aq5O@emv<_ki7Pqo$vyVnH&vT(Q#CEZo<{oM zs!NMm@9Fsh;{i;Rrhkxc*Wyb%MWj0(=$yB;aFEV#Jk7|jr|6TcJR#-~Ilz7RmGl)# zOuQN$P{&nZ)Jl`)l8R~teVjzg+|nq&Z`qP>@6dD|D^tJq_9sPzZqZ_K+DYCPwF9w= z*_0Ja)y_WClegXu%<;QE-n;w>bL+3ykOb?A;559WLEeg}vPkh!9a6~&I&JY)QRd6g zW~Id*v4IHhSd~ADTH!v&7!c4$hM(rEA^#Th6Cx?GKoC26HSiTn0{%r#3)}XCe`S-k!`5PHDFNMvi&mDs zmQ|(_?ay1sDV)Nll#7`6 zrV;CssYfikj>AEBlAQ??{mO}6b=22;qp`OTJitr+rLo9D$a7z+7t-{( z2xM=JOP#kb7|MF29+UQ8q@4}sSMOLvI6eNGH~BwPWz25uu3z8rDhKbp#H~9$VBo*@m_6% zrK-2`04@IgkNwbYtB1-g5{jnF`(YDbSCIwaBQj$9wwbea@|}Ea)ybEVJ=7QTu-Ti7 ze1{!8)llnhI@)S&g2q}(S~ylHn(BXy6fwoB0$NZNEM_-4?Ef{p(9~_Kp56F$YVZ;4 zLR_X}3r@cfA#qXAtA5=8xI|4*yj*u@CDyNTtY|T$QriUCNtUbCQN52Izht+7>7_jp zBVQ>qU9!4sGW?k5*<5^zp9QBJcM|RP@S4~fkM!c6$l09D8)FYt>p!UnxL9d!NF2hk;i{+DRav|9@U2Hr zn$vpXWyR?!dt6DCaJQCgKjA?K@%@04$M6kqq-)1yzz2Gz^DS-n#@Nq3 zQbXf!70Nn^pO}5x^+Vk^8D;4EGR1aH2&(dEuL94>jm}-cJ&{1=;i?-kAK%dDyvIqJ@oh6hLyTJlvj^*o|WaideL|L~H7yv6mZeul7?jThmWC=G?K7 zSKHHesbFkT&GgqWBeN~H*73FGkzXUO<8Apj$6jx}@N1MQ-d;H9SRf{YFle9E-vzP! zjz6Fh-<^jlDj(E}1%ku;A)p5h++b1SCjOVZx4l z9D#|DUr5D;rpiqKypVivNU96Bt`{fWJp}hh$X~Ke(VajRP+3@CA;F)6!iJ_xA=1_% zQuP7w;~*dg>QHx@t}+r5Af}|#4nzlYBqf8yl`N2v8@rA-<@m4_Kqf`LuMhJwZ0|-V~(-2a83>JYs2~fIxuqy;+ ziNmSoen|jMjjV%FDeyrWp+E>+gcx#pCN>6w)?g&YD_gogTVCc+RtQ2u2+u#tfw{esy{KoBDK@le=qpf;Rj%2lHq=k9jP-dL0^=MTFUdb!Bq4;q%Rm z^Hml&utv6Z(WR))OPjjUEZGnOt{inBB=?Mr+flpRuq9ZW2gm?VDEiyk`1Dy4T3ziCt z@x>+n(t#92GZ5>BNi9q`kRo10!#?Mwhwdh|(y+rcu>lqyJPMHrhlwrJ6gmgbXTvWU zq)iBj)RN*;lm`ilcdlvV@A8Lr@Z{MD_#qR?(J0FGFUlw?!coADRgxZqxQCYf)vfGj zQJK3&ZtPOgWtn1Jd9LG9ZXFId8|NLw10oH=vw9@fpe2O4V%=y0Ah`>XfKLWhJX?np!T~p!c)0Lg#mdURMsptMvSx4{Mf7 zH6*oaNUj$kRW-pO0jma=U2S<7v70~^r$M0`v z&lZ2j5vRlGq88#i9{P5O1U3|VuLVPAV_s76D;46B6c*8xDHcvm0Rm!92y7}8YokhT z48e$nHXNO;l+CHYwnE|@cqxU00pyC=x-8lHMEm-$#<){FfajsBglNET{w#a#YXBV4 zRSozJ1tax88xhs(rSR?rXW>bJXvldInZVZ7f*9280Wh}&nW>V{jD{XqjR-LQx zPwBQzN7}Rl$(8HLgxhUf1TE*LTP0dMU@`&XY5*=$K~OS`>xj|>*O+iv$aO$#-H_HQ zK}V^=&FhY|VnSPG=B}}rS~q--T=F7fp0S#8!WJoT3`VMAz;EYFcGUKHh%b)kO{ZZu+7HTk%IlCa`fvFcviNRw9te> zG`|esJbRZh#<>xA8%`jC5Yw`qw;>(?!R)3xL~xIIXPVUjdj#GLPrGgq*uJ;EeP zxT;6sqkU7+gjOiJUK8RXWiMpQuib_<8bA;mwilfv^h!qnDZqC(q}(M;pib}+<$eVH zKzNRQ50i~Dx(#pOBFbP~r5uN-eE-{M(hp**P_C0ezxU?q{m)lBsrAmCv`?_tQj+wQ=%0Win4_gPx6`JG;xw)8DK5Twr z9_IFA=%jH1=x0b^lqGIc$+F8VxNfeUNbY|5rxlO5jYFhH)d6$HZK`&!!C23Zon;OH z;9CF)A*^4sA4*IgN{xb5(|N{!dnYd6$9CVZTfL81E+z^AZUMEAS@Wh4mZG9?

    Mm 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

    q}XX|urf?4*izU_kuDwn05q%1&md4y9 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 delta 21 dcmX>%f$`h~#tB&*GUBp=cNtIY+*owS9ROTw2*&^b diff --git a/artifacts/verification/w6/capture-manifest.json b/artifacts/verification/w6/capture-manifest.json index fa77496a..c4207eaa 100644 --- a/artifacts/verification/w6/capture-manifest.json +++ b/artifacts/verification/w6/capture-manifest.json @@ -1,11 +1,11 @@ { "schemaVersion": 3, - "generatedAt": "2026-08-28T23:29:51.179Z", + "generatedAt": "2026-08-29T04:15:41.760Z", "command": "pnpm capture:visual", "binary": "clean npm install from generated tarball", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12", + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5", "stateFixture": "deterministic", "liveDemoCommand": "pnpm capture:demo:live", "terminal": "node-pty/xterm-256color", @@ -255,14 +255,14 @@ }, { "path": "40x12-plain.txt", - "sha256": "b77cd1eff3077ae58000fc67787c8d4abb08874c84ff44d716ddb049712fab4a", + "sha256": "4a408d79d677e0257ceae5d563ba23923ca2ef6d5390b7c88da8cb3f3ce9a8e5", "kind": "plain-frame", "columns": 40, "rows": 12 }, { "path": "40x12.png", - "sha256": "a9a6333b546bb2931a6a6f5595a3b227975ad3c15a10944fbff8c4c0acb31d58", + "sha256": "f0defe0b44629b70ae5124a6c15b290428cad46222229adc26f7badf366e8a02", "kind": "png", "columns": 40, "rows": 12 @@ -276,63 +276,63 @@ }, { "path": "80x24-plain.txt", - "sha256": "b77cd1eff3077ae58000fc67787c8d4abb08874c84ff44d716ddb049712fab4a", + "sha256": "4a408d79d677e0257ceae5d563ba23923ca2ef6d5390b7c88da8cb3f3ce9a8e5", "kind": "plain-frame", "columns": 80, "rows": 24 }, { "path": "80x24.png", - "sha256": "b95fc55039fc496948afbf953389643035fe75ef44f7b880d6abcb66141f6d98", + "sha256": "109d7deadb8dc8359ba2bdcbc3a236a329a98fa14f5d3efb12fc671080ac95ae", "kind": "png", "columns": 80, "rows": 24 }, { "path": "120x40.txt", - "sha256": "0ffabf6605072faa15d74273b31238c0fb3f0ef066e006ad12d965ce3de0148b", + "sha256": "58c75392e4b48a12a9e91f419da5d1d4454ea0419c6cb2dae6a245ec1713cb17", "kind": "terminal-frame", "columns": 120, "rows": 40 }, { "path": "120x40-plain.txt", - "sha256": "b77cd1eff3077ae58000fc67787c8d4abb08874c84ff44d716ddb049712fab4a", + "sha256": "4a408d79d677e0257ceae5d563ba23923ca2ef6d5390b7c88da8cb3f3ce9a8e5", "kind": "plain-frame", "columns": 120, "rows": 40 }, { "path": "120x40.png", - "sha256": "dc8db518f3a59f6ce5d6007cade4cd5d403e5867ee65468d02398a59896fec75", + "sha256": "b93c51aa70403415e390fd7bca0166723c4677a355ad2dfa8e53d479f1cdf2ac", "kind": "png", "columns": 120, "rows": 40 }, { "path": "200x60.txt", - "sha256": "e99f698da3daca690a7c95bdcf58f96087e822f1b620638c577bc25f33fd897f", + "sha256": "d60a1a7b676877e1c00a2c22fedeecc8b1ea7b3dd06040802af722ab28cd3166", "kind": "terminal-frame", "columns": 200, "rows": 60 }, { "path": "200x60-plain.txt", - "sha256": "b77cd1eff3077ae58000fc67787c8d4abb08874c84ff44d716ddb049712fab4a", + "sha256": "4a408d79d677e0257ceae5d563ba23923ca2ef6d5390b7c88da8cb3f3ce9a8e5", "kind": "plain-frame", "columns": 200, "rows": 60 }, { "path": "200x60.png", - "sha256": "1314f53748d98d1af6101d09296bba5c8a34d968766050cfa4956a5779c4206b", + "sha256": "130c5b37999fa5408cd0394f8e90ad3150a4b4b800989045bbb909112900927f", "kind": "png", "columns": 200, "rows": 60 }, { "path": "states/command-palette-40.json", - "sha256": "74aaf313a7c81fa8fe9705d87cf4968f31297d46494210edeef90990c5c5367e", + "sha256": "c931245580790227ce25cbae9f9f031f0f2995a6b1a046cb07cec26f5b73e950", "kind": "semantic-state", "state": "command-palette-40", "columns": 40, @@ -348,7 +348,7 @@ }, { "path": "raw/command-palette-40.cast", - "sha256": "d46eb3f7cae924329c329ea8c2c303407077fc3946d6edd1e7008a4a80611ee8", + "sha256": "0e27ce7949513f7be3024a1c7880b5e412332b2cf8e1e8ec3a16ea4c9f0af68d", "kind": "asciicast", "state": "command-palette-40", "columns": 40, @@ -364,7 +364,7 @@ }, { "path": "states/command-palette-40.png", - "sha256": "781f6ef13dc7f1bc97fd34fe11835e10d25e8ec885fff6ee1b6ddd0bd121e195", + "sha256": "af9b1d50a2e63e5388fadd551e9153e46da0315bfb5089a16192bfe7c26159d7", "kind": "png", "state": "command-palette-40", "columns": 40, @@ -372,7 +372,7 @@ }, { "path": "states/command-palette-80.json", - "sha256": "eb9b58bff12779fa8f01154df307a325133f7c64d0f3e25d0c3c37d92b6c0019", + "sha256": "6f82ea623647cdd3f41d2d1a078a542a93018797b6ba6d48f1dd6d5b45b63f4b", "kind": "semantic-state", "state": "command-palette-80", "columns": 80, @@ -388,7 +388,7 @@ }, { "path": "raw/command-palette-80.cast", - "sha256": "3701e292dff0ed5b5b52c5db81f93c528661541faa25c213ab24efcc88ca0321", + "sha256": "132375fe9d96f177061272127aea045ccc5f21ef1b2db7fee18c94b213792996", "kind": "asciicast", "state": "command-palette-80", "columns": 80, @@ -404,7 +404,7 @@ }, { "path": "states/command-palette-80.png", - "sha256": "15b55341450ccec9fbe9bc96688d78ca8bea9b7b1ccd38bc738201675a4c4c4c", + "sha256": "bc2e193045b7df308f33a8e835ee1dfe841df88e7d1aca468edc13b5cacd5483", "kind": "png", "state": "command-palette-80", "columns": 80, @@ -412,7 +412,7 @@ }, { "path": "states/command-palette-120.json", - "sha256": "b85a8d086d7c938ddf37df8011106ae1548d36bf5dae2b0fa5a7877e32a5cf3f", + "sha256": "d29b2077ba49d4d48bb15c075601f8d569078ebdd9338b95fd9a23b67d455d3f", "kind": "semantic-state", "state": "command-palette-120", "columns": 120, @@ -428,7 +428,7 @@ }, { "path": "raw/command-palette-120.cast", - "sha256": "2619cd205f2ca9d7a5253a69d14d159341673f80666aedad84d253ac85b1eaf0", + "sha256": "74759f83a3eeb472819050bdbd002cfa3d887e88d3372a931d2e6a99eb278fe8", "kind": "asciicast", "state": "command-palette-120", "columns": 120, @@ -436,7 +436,7 @@ }, { "path": "states/command-palette-120.ansi", - "sha256": "75cee28627e9a3c92fdac9590538c73fba4929a209a729033f30f9e2590631ab", + "sha256": "66eb92ca74e749e6c99623810b3af1e04d100fe083d0b62135d83192a3df00c3", "kind": "ansi", "state": "command-palette-120", "columns": 120, @@ -444,7 +444,7 @@ }, { "path": "states/command-palette-120.png", - "sha256": "f33dce783e181c26df0ccc35f0c1749484dee239b55541d15e196fc6d07956fd", + "sha256": "e211be4aebe05b35c1b1b7d776573725054888aa37ba113509158b9581e531e8", "kind": "png", "state": "command-palette-120", "columns": 120, @@ -452,7 +452,7 @@ }, { "path": "states/empty.json", - "sha256": "9027ca5da201c8370d54341cd22011510a9b2613e03113e3a0678a423bde33c8", + "sha256": "5552eff6d496787d8bd570e59c9bc15b059be0cdb6c6cfbcb946d745ad8dfa93", "kind": "semantic-state", "state": "empty", "columns": 80, @@ -468,7 +468,7 @@ }, { "path": "raw/empty.cast", - "sha256": "abdfa60b1687494abfc0a4e1673c994c87bbab229e6d0a9cc120963aa3a64dfc", + "sha256": "82ff92dbccbecbba1d24e8eb254deb699655a0535a0177983abae0f09c457b4a", "kind": "asciicast", "state": "empty", "columns": 80, @@ -484,7 +484,7 @@ }, { "path": "states/empty.png", - "sha256": "b6e5fdb575d0f3a0961d2697e18ad56c71c339fb2821a7736380627ab4a7eed0", + "sha256": "f59ff223741c977636192c2671fe73ba51e991df890038b376183af41f0fc431", "kind": "png", "state": "empty", "columns": 80, @@ -492,7 +492,7 @@ }, { "path": "states/active-streaming.json", - "sha256": "c7d3c23c690d929974b7f4b737eafab568f7a077a578d3e192751c125dc9587c", + "sha256": "6994a6400b3b53e2ada53c18ae9c3a1fcf17b111882cf694abef534069d68e40", "kind": "semantic-state", "state": "active-streaming", "columns": 80, @@ -500,7 +500,7 @@ }, { "path": "states/active-streaming.txt", - "sha256": "c5a1ae59ec6a9b8cb93388531374f7421d4c6593a8830b07ae6bd6b6d3d551b9", + "sha256": "b4c005263e3ff166d9974a0855be23a96b9076a611432ca6909e07f4caa2bdaf", "kind": "plain-frame", "state": "active-streaming", "columns": 80, @@ -508,7 +508,7 @@ }, { "path": "raw/active-streaming.cast", - "sha256": "855dbc3ef728db4c4311f2652e4ccd7a5c2ddc85e2606cc6b9bd8137f9478976", + "sha256": "08e4ccb01e9df9becb1453a0d206f89ad62b82b24422bab4506ce903c7a55bb4", "kind": "asciicast", "state": "active-streaming", "columns": 80, @@ -516,7 +516,7 @@ }, { "path": "states/active-streaming.ansi", - "sha256": "0d20f3327cb98244661040071abc211cbe975decc17ce7e4c0f772902781e651", + "sha256": "8f257fe6cc7f6acb7a2ca7ded88fe993da932eb85fbbb67a52e299418b2d7424", "kind": "ansi", "state": "active-streaming", "columns": 80, @@ -524,7 +524,7 @@ }, { "path": "states/active-streaming.png", - "sha256": "946f92b1782c05b4239244536afb548116b400896fccb2358fb91cb9d2ec6be1", + "sha256": "a8c3804c91ce36260c513d302b7951a2e6b9d45498425d7279362bf3bf1f0e30", "kind": "png", "state": "active-streaming", "columns": 80, @@ -532,7 +532,7 @@ }, { "path": "states/multi-run.json", - "sha256": "2eafbcc920f9b0b343f3a066f090941c595a4d1d874a2f1b6ed6947f281e63d9", + "sha256": "389a119d431fa99c999debaca6902d9ba8853f14d0fb8ae3a3bbc7fc83425c87", "kind": "semantic-state", "state": "multi-run", "columns": 80, @@ -540,7 +540,7 @@ }, { "path": "states/multi-run.txt", - "sha256": "78b50658bf4b064e854a6fa8cf443321da099d27b30b914e9df6e2a01936ad79", + "sha256": "36b0587c50d807d83fc2cecaa1f31f90809019448d88a4e6033a347e99ff6be5", "kind": "plain-frame", "state": "multi-run", "columns": 80, @@ -548,7 +548,7 @@ }, { "path": "raw/multi-run.cast", - "sha256": "45b294328c16dc26950e99e595eefb6788e69b752ee34a6994b8ad3a111ee8c9", + "sha256": "b09dbb5921144c855540d7f52b2fe3114faa70b63f680bcb2fc69b259309928c", "kind": "asciicast", "state": "multi-run", "columns": 80, @@ -556,7 +556,7 @@ }, { "path": "states/multi-run.ansi", - "sha256": "a2e243b22455e488111fd8ea27730a62d5626dd8d68891b8a331144561155900", + "sha256": "316af6b1f9395d0b12c9d447b056030b0268a2b1618a044b9e40d7eff728572f", "kind": "ansi", "state": "multi-run", "columns": 80, @@ -564,7 +564,7 @@ }, { "path": "states/multi-run.png", - "sha256": "8456020385ddc89fe6cac8e8c3740966c5752da37563c46ceffe14baf0aa1d1c", + "sha256": "5112493315e91cc1ae7c207ab071241c4e2a745ed4a2f8c8e5fddb6057a30874", "kind": "png", "state": "multi-run", "columns": 80, @@ -572,7 +572,7 @@ }, { "path": "states/supervision.json", - "sha256": "26470488abf22875058b9a2e83c0842dcdc19b6d2034d87cfd0290ee74b3fa04", + "sha256": "ba20d90a9a545ae7fc9be2792b6e2c01fa621f0ff3b94a05426ac91c6539a64a", "kind": "semantic-state", "state": "supervision", "columns": 80, @@ -580,7 +580,7 @@ }, { "path": "states/supervision.txt", - "sha256": "8d462e403a5aef200facc54b8a9c26429a529f6f6a5bdfcfb954e9d92b2a0d6b", + "sha256": "6b737edd232bfd5dfe8392bce4a0cd44eeb2a2c6209c93f53b6dff9946af688a", "kind": "plain-frame", "state": "supervision", "columns": 80, @@ -588,7 +588,7 @@ }, { "path": "raw/supervision.cast", - "sha256": "ca05aafdabf06f919b6b968063782ffd9ae636d39eb35d52781539733e7dd965", + "sha256": "4c3dd3f300bd9a09e42ef8a06a9cfeb10422f2acf1fc103bab75abc07db46abf", "kind": "asciicast", "state": "supervision", "columns": 80, @@ -596,7 +596,7 @@ }, { "path": "states/supervision.ansi", - "sha256": "548e4473763a65553063de6a4f7a32ab391bd0e26b2131edbd6c0ab1c19d3b98", + "sha256": "809554e977de5c9bc59371b2e3faa0c234c37f67de330e8a9e9529d4cdfea8a0", "kind": "ansi", "state": "supervision", "columns": 80, @@ -604,7 +604,7 @@ }, { "path": "states/supervision.png", - "sha256": "2eeb692f792e6e166372d015476ce72ffcf752b8ae2f9a3f843bce5a7c55d1da", + "sha256": "5e018f976b5b98db2771fc6ff167e03c76e8af475ac013fe5dfd1dc0972ef925", "kind": "png", "state": "supervision", "columns": 80, @@ -612,7 +612,7 @@ }, { "path": "states/interaction.json", - "sha256": "931ba1c06c592c2bd310cf0b3bb4c1bcadb90a258d6ba15d7c526c74b2dda830", + "sha256": "b98eba9a44b008a2710eddf5f04fe401df2eac2ebc955b5e4f4d9947125cf307", "kind": "semantic-state", "state": "interaction", "columns": 80, @@ -628,7 +628,7 @@ }, { "path": "raw/interaction.cast", - "sha256": "5603eeb1483637b9118649bebb112b5c8c95b6efad17082e97184459c1843ac5", + "sha256": "27f6e38aa69c9c3e4a5f6c7cfee425736b7ca7e975a43658dd4d670a33225909", "kind": "asciicast", "state": "interaction", "columns": 80, @@ -644,7 +644,7 @@ }, { "path": "states/interaction.png", - "sha256": "c3668983917935012910682899aa369c8beab39f617ce55241657f00e14fac76", + "sha256": "9de3fd54c19b539a54bd54e469daaef9faf79f674f2e1464f1984d633d988dc1", "kind": "png", "state": "interaction", "columns": 80, @@ -652,7 +652,7 @@ }, { "path": "states/automation.json", - "sha256": "7fe1e4c67b1b6adaf9938230200c4e5d8df71b841bfaec89aaef2899ff90d1e5", + "sha256": "3fcc9dd33fbde1e0c6cde943d6bd035f113fc77bb9c6e2919cdd4486adf59316", "kind": "semantic-state", "state": "automation", "columns": 80, @@ -668,7 +668,7 @@ }, { "path": "raw/automation.cast", - "sha256": "2b19eabd898dfdc4f8ae5c2cccbbdd2d9bf16dfcfbce983c9eb78e2ea5c39b09", + "sha256": "81fbf730d013b1897e2861bda775d16a871757dc30b4ba4a34154792a39acad2", "kind": "asciicast", "state": "automation", "columns": 80, @@ -676,7 +676,7 @@ }, { "path": "states/automation.ansi", - "sha256": "eb00e926c0e22e2e5d1b045852f314151d51d7da8dd15de4339ee0b298e7cd2a", + "sha256": "28f6ac8cafe4c8a441c27795560e9a8b0e5cc1622a9618ed37615782094a14ca", "kind": "ansi", "state": "automation", "columns": 80, @@ -684,7 +684,7 @@ }, { "path": "states/automation.png", - "sha256": "17cee0b7693be58826e5b6eb99367916c0081be596f87ef4333b63571b8e0f35", + "sha256": "a2d7518afdbf91a6bb9d6c3ea45d69b62eb03074f656365dc575e3c90e0c73ef", "kind": "png", "state": "automation", "columns": 80, @@ -692,7 +692,7 @@ }, { "path": "states/fork-preview.json", - "sha256": "0c7d1ec104896054ca18195f2098ab4f3d224fc3ff48a4edd7a70a20daca62ab", + "sha256": "2e9f018ed6309dd26193d2520dcce24fc98db2bb640c1a8e37c4418e5849c621", "kind": "semantic-state", "state": "fork-preview", "columns": 80, @@ -708,7 +708,7 @@ }, { "path": "raw/fork-preview.cast", - "sha256": "a5795fdb8764e7212ffe646bc47b28630492edb492355d49c4040de831f1709d", + "sha256": "c79b690dfe799d8a11a092ebe5771dfd3a5164b4c75a26ab1e60e3e761a23ab1", "kind": "asciicast", "state": "fork-preview", "columns": 80, @@ -724,7 +724,7 @@ }, { "path": "states/fork-preview.png", - "sha256": "2abd7df30fc85b0b65b185e76b41b0a98d375a1dc5dad6ad7c8a48b8870fc56c", + "sha256": "5566645e2160109702a3dd99a6b87e1d1e52626d873bd910a58e80b84484706e", "kind": "png", "state": "fork-preview", "columns": 80, @@ -732,7 +732,7 @@ }, { "path": "states/graph-or-analysis.json", - "sha256": "0da309a3a1bbbd8e4c7b5fb926d853f2d83105d09f62d21eb7c5ee6e5d675248", + "sha256": "5a8328b124869a5f736f0df3377126de3cbeb1b50c178ca8db5146060076a041", "kind": "semantic-state", "state": "graph-or-analysis", "columns": 80, @@ -748,7 +748,7 @@ }, { "path": "raw/graph-or-analysis.cast", - "sha256": "09e5b399ba163d63980aeed768ef106d0aa77b18a5d0310386fdd0e2b595b077", + "sha256": "167c50080039c4ac4a1abcc9e10691ada2ad0da2727c6e7c0c9724292ce1109b", "kind": "asciicast", "state": "graph-or-analysis", "columns": 80, @@ -764,7 +764,7 @@ }, { "path": "states/graph-or-analysis.png", - "sha256": "770586bd2620e2b05fd9577088e0cb9d84820ba5537619186931d694ab0625d8", + "sha256": "31c9771894c54c2127d34b5b8c5f24205a1328e67eb9100a0c8764057c58215e", "kind": "png", "state": "graph-or-analysis", "columns": 80, @@ -772,7 +772,7 @@ }, { "path": "states/analysis.json", - "sha256": "143e4a3374c2dc415fe1198bf25d240468577bbf93f712277a3aba3a3d3909ab", + "sha256": "eb06c3134fa4b047cacab3f00d4a8f0fe4d92022b7841b6ba3b9261f4c920c18", "kind": "semantic-state", "state": "analysis", "columns": 80, @@ -788,7 +788,7 @@ }, { "path": "raw/analysis.cast", - "sha256": "d5da5b9f2d37edf1393841a140e88a8f6dc15ed5d8d87a61bd4ef1c1636f2362", + "sha256": "42553d99329d5b545cc2ce8a3cd721b405e2eec195287bee61480d6aa374cf67", "kind": "asciicast", "state": "analysis", "columns": 80, @@ -796,7 +796,7 @@ }, { "path": "states/analysis.ansi", - "sha256": "af70e39675929e6c9346f7f4a9eee39f40275473fef2f2f549279087bf75bc04", + "sha256": "7a3706d836f53afff168f087c7c6ccfbe608ebff0905e774e99bd043367b0abe", "kind": "ansi", "state": "analysis", "columns": 80, @@ -804,7 +804,7 @@ }, { "path": "states/analysis.png", - "sha256": "bbc4ec409568fa6c1497dfe04700f2dcee5b8329c0ace8f4da7acf8ec45e3c7b", + "sha256": "9cb1baf72e2e0aa380387283d26d30ed7445c97cf8f3f773c4725342ffeae473", "kind": "png", "state": "analysis", "columns": 80, @@ -812,7 +812,7 @@ }, { "path": "states/comparison.json", - "sha256": "1108cd085108e5625befdf0b707c210a23158c5c6b039dae0279831336a51f30", + "sha256": "1812a9bf50f8cc7fa0251169e66cf98968ee5669b1cf11f9e0ad761fc574bbdf", "kind": "semantic-state", "state": "comparison", "columns": 80, @@ -828,7 +828,7 @@ }, { "path": "raw/comparison.cast", - "sha256": "7eb421e8d5bdec735b1bb9b007866ea15d5fa181b7437a0e0ab7fa8a2f2cb927", + "sha256": "efa25fed95f1ccc738620fb4b7c72242ba876102a96b80620ce74f8b9db81c37", "kind": "asciicast", "state": "comparison", "columns": 80, @@ -844,7 +844,7 @@ }, { "path": "states/comparison.png", - "sha256": "f985a8e7017cdc2dd4f71de4b15f3a54744bece0985f1404d0f9b919eaac0972", + "sha256": "0a5e2c7868ec079626d38ed1f35213ed569a5bb77353c31ea4c41ca1355ba74c", "kind": "png", "state": "comparison", "columns": 80, @@ -852,7 +852,7 @@ }, { "path": "states/profile.json", - "sha256": "0d1c038fe79b3498e27dc5493320eef3db1ef352fc2ed890198496577815edd9", + "sha256": "450329156a3bf6974eccb1d63b8728e8b8a6be922f13471fa2c1c2ceffd2c397", "kind": "semantic-state", "state": "profile", "columns": 80, @@ -868,7 +868,7 @@ }, { "path": "raw/profile.cast", - "sha256": "8631af34144079e9c309abc67f157dcb2af6531868c12b44c6cbb9ac4da381a4", + "sha256": "147b475a51e944b234f225ede086ba30bc278876adac56efb51a8ca17127276b", "kind": "asciicast", "state": "profile", "columns": 80, @@ -884,7 +884,7 @@ }, { "path": "states/profile.png", - "sha256": "707f8c5f9ff195bf7bf30c98a272013d346bf638a09cfafd0a25dc30e2555400", + "sha256": "bee0080c70a7db6b589177f356b2ca1e43ac64f48e899aede5822121c1314ff5", "kind": "png", "state": "profile", "columns": 80, @@ -892,7 +892,7 @@ }, { "path": "states/narrow.json", - "sha256": "06bb846dfc06de0b626d680a0e5bf0b61c66bf8cd92541e6d515e59d03160b34", + "sha256": "9e4d493f2b8399a6165d77cc873a4b8f16ec8c18d8e46d7054b814f6bdc29405", "kind": "semantic-state", "state": "narrow", "columns": 40, @@ -908,7 +908,7 @@ }, { "path": "raw/narrow.cast", - "sha256": "c71777b74719daa9a4d8497a6b7f05d10f54347ab8a28f8595ae40b892b2b58d", + "sha256": "1c807d1300be086b72be1aae13700ec24149b3139938906c9a99e41d78738e5c", "kind": "asciicast", "state": "narrow", "columns": 40, @@ -924,7 +924,7 @@ }, { "path": "states/narrow.png", - "sha256": "1ae6ed0085e2433c1b656ec53d610261ae46034ef41f3a922d237e2273e0cf7e", + "sha256": "e8c2031db79117850afde87b419ce706a77e00fcd0f04159ce33ccaef9524c38", "kind": "png", "state": "narrow", "columns": 40, @@ -932,7 +932,7 @@ }, { "path": "states/failure-or-reconnect.json", - "sha256": "4bd262cf6da0cf7f5ee4702a33cb97def6235c1313943d383fff0c4f966bfd9a", + "sha256": "16e74fe1580f45593a951792127c26f01b99f6932cb903192e73fa76e16d9fc3", "kind": "semantic-state", "state": "failure-or-reconnect", "columns": 80, @@ -948,7 +948,7 @@ }, { "path": "raw/failure-or-reconnect.cast", - "sha256": "726e7634e5186fd77bd92c2747ea208d4146a2a06ba5094e813cd4c4b9173a82", + "sha256": "333185bc917c06fd0eeb4641de8cdd38796b8f47b345a25921dd1883d70a0fb3", "kind": "asciicast", "state": "failure-or-reconnect", "columns": 80, @@ -964,7 +964,7 @@ }, { "path": "states/failure-or-reconnect.png", - "sha256": "184b6dd526b7f715c14c118e558a456d410d22014488dd738a92869c3113d5dc", + "sha256": "5a29c53f12d06ca98baeca91a0efaa4d7f77c0ebf120d519aa6bba63041a5bc9", "kind": "png", "state": "failure-or-reconnect", "columns": 80, @@ -979,7 +979,7 @@ }, { "path": "80x24-automation.gif", - "sha256": "6ef28e9987406f8c8b8451b0a845ccc5e2547b774062a1de9a2690fae14f82be", + "sha256": "c22eb4314e2e6f934fca802436aca8bf33eff438430f237ac7a0462afaa4cb7e", "kind": "automation-flow", "state": "automation", "columns": 80, @@ -987,7 +987,7 @@ }, { "path": "80x24-multirun.gif", - "sha256": "f75315c00870bf509f2b0282dcb6a4c9dd4ba845d1f28598aaa8e86026206a10", + "sha256": "406205581dfaa11778887ff67415f18d98062911b49edb89317502562f6fd1e4", "kind": "multi-run-flow", "state": "multi-run", "columns": 80, @@ -995,14 +995,14 @@ }, { "path": "raw/transcript-keyboard.cast", - "sha256": "a5da6f1866a3dabfd925279505aa05039ff1353c728ae1695ae476bb31dacf8b", + "sha256": "7fdb7bb3181ca9502e6992855498eddf4711270d92115542f410bfc30f4b0345", "kind": "keyboard-asciicast", "columns": 80, "rows": 24 }, { "path": "80x24-transcript-keyboard.gif", - "sha256": "3b0ffd1d8a7e2ab21ed3d0e8defaeea14015ea9ba3e56a45258213fd198f5169", + "sha256": "233bf06ba121ff9e4da517fe27e0dc20dc451421f2755ca05c3a65813436d287", "kind": "keyboard-flow", "columns": 80, "rows": 24 diff --git a/artifacts/verification/w6/package-proof.json b/artifacts/verification/w6/package-proof.json index aa550dac..3a3e147c 100644 --- a/artifacts/verification/w6/package-proof.json +++ b/artifacts/verification/w6/package-proof.json @@ -1,10 +1,10 @@ { - "tarball": "tangle-network-braid-0.1.1.tgz", - "sha256": "9bbd7b5b9f78b3d202dbb09d4375970edfd4965ffc5ad94b04bd7fa6ce01c4c7", - "version": "0.1.1", - "gitCommit": "8cce4c6e8aade3b1fc51f558d65a823ac12a5e1a", - "treeSha256": "43230a9eb82fc93f603a6f3d3996829b3610c265", - "sourceDigest": "94b73eeb273cbfc5fba6b88b56e6090b812a10c92f459adfef8da18385802dfd", + "tarball": "tangle-network-braid-0.3.0.tgz", + "sha256": "445dc7cdcf2700e1f13d9393309e24ef074ee956c03f21f385793b15de63f6d7", + "version": "0.3.0", + "gitCommit": "da27d22d647d862fdbd0425d27657fd5ffd47cda", + "treeSha256": "7385a695c5c5e2f11751a19eaa332fe0e4dce729", + "sourceDigest": "b04f7c9e97b49bee808acfb3ac87661937bf5d9a224c64fe970af7fc9022b1f7", "isolatedBuild": true, "sourceCheckout": "isolated-copy-of-worktree", "packageFileManifest": { @@ -17,38 +17,38 @@ }, { "path": "package/README.md", - "size": 13851, - "sha256": "283c26ab5eea55db87f1e6a753a7541e67c0e41519af5fa5c3b83b15b6abd3b7" + "size": 17531, + "sha256": "b8efadc6585180a2389a49d21d880bc0f17c66654fddf3a01ad29020f41c985f" }, { "path": "package/THIRD_PARTY_LICENSES.json", - "size": 4377, - "sha256": "326c8d65a2b272a992a7d4d7b500f4617b5c3d54d59dc389f779813bc20f7e19" + "size": 4614, + "sha256": "54b44a9c890c6162061234159af4286b4655cb91a4c4c9c6f1152c3664c5673e" }, { "path": "package/THIRD_PARTY_NOTICES.md", - "size": 4530, - "sha256": "eb843989e3fbecd81a4faa5228e828440891cf35eb1ac75d724a3b75a7f8aa58" + "size": 5481, + "sha256": "b22ea17d1a9f967e462e4a1b0ba7b93dc53f8e23920ea41f00f3bf81080b47b4" }, { "path": "package/dist/adapters/agent-interface/harness-runtime.d.ts", - "size": 1077, - "sha256": "65206fc50b45849b98c1f8913c9c79bd0fb466b7db8c9b37b3e2f813c929c97e" + "size": 1168, + "sha256": "0b2a3e09a4de1456c8b7160e8b5732d1e63f953dc3454bbee8282bf64286e6c6" }, { "path": "package/dist/adapters/agent-interface/harness-runtime.d.ts.map", - "size": 403, - "sha256": "34e2ec6b73e98ddb8c8844fe27f3e83dfdd6eb53bcedb1d1864ac0946e8cc1f6" + "size": 461, + "sha256": "40856006b04705d81817b357168653e9ede84f900be0487db8aaefc3cf605e40" }, { "path": "package/dist/adapters/agent-interface/harness-runtime.js", - "size": 567, - "sha256": "bb36615cc8aaa76b19c44ef63b57619db6efbde8016b1d7dd7aa61eaf59078c8" + "size": 702, + "sha256": "66ece33845b85ad3ca3d7bc699c23ee1f983002519475e413f5f1738ee74d7d1" }, { "path": "package/dist/adapters/agent-interface/harness-runtime.js.map", - "size": 589, - "sha256": "2f0a1f5c00d1b5d2b08a52dae87d9f1ef67616a02579cd7fe23862be561fa43a" + "size": 700, + "sha256": "70f944c6ce1232f6f2692ff4e1728f23f8c4d938f13b862eaff928f09ee9a8e2" }, { "path": "package/dist/adapters/agent-interface/interaction-runtime.d.ts", @@ -152,43 +152,43 @@ }, { "path": "package/dist/adapters/analysis/eval-analyst.d.ts", - "size": 2214, - "sha256": "f2d104c63aec10d2b9c17f0051a09315a4f647d3d11666c8ac61da5f8bc39151" + "size": 2404, + "sha256": "6d5442527a98fb799021b3855293a4d4d2d4b1e19448aea942cff143fee6fb60" }, { "path": "package/dist/adapters/analysis/eval-analyst.d.ts.map", - "size": 1832, - "sha256": "3ba42627a404e09a96b1e9eeb921faf41de8a10064ef7cf9020bb5919e7cef8e" + "size": 1989, + "sha256": "9eda24e77c4353fcdb1d5c3de81fad4447ad48dbfc03e7936046273306ba487c" }, { "path": "package/dist/adapters/analysis/eval-analyst.js", - "size": 5656, - "sha256": "882caaf5f3bef4a6e2d1ac64511d7e9189297a1708db475c28044804ab32f7fa" + "size": 6429, + "sha256": "b53d2d8d26ad18d6bc087cc0ef11c9baad25e31bd90e96fac7cd1985c92570e3" }, { "path": "package/dist/adapters/analysis/eval-analyst.js.map", - "size": 4992, - "sha256": "4a463468214cfea58b1eade62d9e27b3d9b419ff83a23852f20298b6f23cf2b4" + "size": 5823, + "sha256": "0f925050b65e688411cb1277bf9b8469cec07d88240cdfcf30afe36549f677fe" }, { "path": "package/dist/adapters/analysis/managed-analysis-runtime.d.ts", - "size": 897, - "sha256": "c1439b0218494692e09003bacaf7e753b47951183f99a465d14f258f1f3aa870" + "size": 974, + "sha256": "090a70873d3799e636b904749797ef292b4f10ea39d783eb6ee2a851dd806ab7" }, { "path": "package/dist/adapters/analysis/managed-analysis-runtime.d.ts.map", - "size": 776, - "sha256": "b9cbaf6ef311abf0b8d80b482cdf352db3a4758fe1c787e9ac0641047e94ab24" + "size": 811, + "sha256": "894dc00b0492f93cbcbcb4a3eab620c7083c738f731c5ecb6c8b7819d9f187ca" }, { "path": "package/dist/adapters/analysis/managed-analysis-runtime.js", - "size": 2352, - "sha256": "ca083a3f19a4027437fa7e91d9cb27c81ba4e5175840ad9ae6ac3d6441561914" + "size": 2491, + "sha256": "305e34e5396ed72189147d64bc92333fda22ba11a61bf69fb85908a7df1f6a4d" }, { "path": "package/dist/adapters/analysis/managed-analysis-runtime.js.map", - "size": 1803, - "sha256": "cf8695d4ad8419515c600cbe0ed536f26928ba0e2ed188f1fe0ebb060ee8b925" + "size": 1895, + "sha256": "d11cfcc693180c160f2e7fb04223955471f08acb0162b03cbfaa8fb2a227328a" }, { "path": "package/dist/adapters/analysis/model-execution-scope.d.ts", @@ -212,23 +212,23 @@ }, { "path": "package/dist/adapters/analysis/production-analysis-analyst.d.ts", - "size": 1330, - "sha256": "e0cbf84f1d3c5542e8868fe1b20b702f60f6b4275919fa7538c724500a3fbe1e" + "size": 1354, + "sha256": "6d0d3881748a756e4a269b0c26e4c53c71f13d3c2b4a45fe26d9e679f508fcd3" }, { "path": "package/dist/adapters/analysis/production-analysis-analyst.d.ts.map", - "size": 984, - "sha256": "e1a3e58a46edbbddb495422c186df83734847e6339007e983cef99577ef816ce" + "size": 996, + "sha256": "36a19bc22347be2e136d19c48530b1b8764957288786154c1d7dc8eb9b26a46b" }, { "path": "package/dist/adapters/analysis/production-analysis-analyst.js", - "size": 3462, - "sha256": "903060184d2448de17d6bd42f063102f93093175a7d0fdc8b9369ef5328a4d6f" + "size": 4228, + "sha256": "702e958c23ae5f1a6767a5ad000e52fea1f32aad786d687658ac69cc8e2e4bd6" }, { "path": "package/dist/adapters/analysis/production-analysis-analyst.js.map", - "size": 2984, - "sha256": "245f8822595763435256dbc7d6b2d43b8984c0a4ca91d431c1e7bf0f5e20475b" + "size": 3492, + "sha256": "e99fce059735ac49845540e01c0c15856a5766f77e0a96db2a1cfb36ef8b1ffd" }, { "path": "package/dist/adapters/analysis/python-runner.d.ts", @@ -242,93 +242,93 @@ }, { "path": "package/dist/adapters/analysis/python-runner.js", - "size": 9108, - "sha256": "a0666c019074941f9acf48808c6500574e23e35021c17efa6ff793da60948513" + "size": 9101, + "sha256": "d4cfae24020e851ba83b63ac67eba879b10273fb7230a60bb959db720709278a" }, { "path": "package/dist/adapters/analysis/python-runner.js.map", - "size": 7915, - "sha256": "7b7bf6d816a45f8bc90b128e6d6386a8e8e7aa82d1f847a2e5770f9a4f953235" + "size": 7910, + "sha256": "1605957595609cf2c2245ead57e20797f7e3e9ea5a4a800ac42821c9315ff6ba" }, { "path": "package/dist/adapters/analysis/question-analyst.d.ts", "size": 1148, - "sha256": "f3960c6001cef030b7c04b58b0bb1b05ecf598963bd0c88fddd782fa83a3a19f" + "sha256": "0adc6e6b7f75d46d058baa814505f0563ff513080260925cd64f2f8c8aa6884e" }, { "path": "package/dist/adapters/analysis/question-analyst.d.ts.map", - "size": 481, - "sha256": "48897262ec53f0d1af60bddce189ad66b569f8e68f221d56f2ead0cadb4a973b" + "size": 480, + "sha256": "0a7932d6330bcbc1b604f883cc354bc3334fa7b84f02045bdf6af6f0ab98c951" }, { "path": "package/dist/adapters/analysis/question-analyst.js", - "size": 4083, - "sha256": "e38ca07b1b152d64789b6741f762b79a5afd07b9cea1b42502579aced5f8a617" + "size": 3657, + "sha256": "d7c6a53cb6713f5f2a546e12fa25193cf03740242902fb8537947d36b0509a42" }, { "path": "package/dist/adapters/analysis/question-analyst.js.map", - "size": 2039, - "sha256": "c2b15889aa1580681ec683c51cc1148f392f8b1fd434f26027b199b0dfa7ca09" + "size": 1974, + "sha256": "a7b1cabc60a887b58dddfd484811e7e5d0d6be10a286cfbaa07e6e35b92a1d7d" }, { "path": "package/dist/adapters/analysis/runtime-model-owner.d.ts", - "size": 1921, - "sha256": "299fdbdaa588d86839813329567c38fbba31952de452652f0e2894a67738c077" + "size": 2254, + "sha256": "0c4bd69e5fc9ebb3ddca9679e6b48fcad0be652c2b9ff403d406ef4b1c714ebd" }, { "path": "package/dist/adapters/analysis/runtime-model-owner.d.ts.map", - "size": 1562, - "sha256": "7f9332fc49421e118c6256548efa47b3fcc817a1b7d36e5cc500306c0ced8366" + "size": 1818, + "sha256": "d775149e51600007a282ddc4a2824a84c864a87b285ca5b1ac629aef05fa8113" }, { "path": "package/dist/adapters/analysis/runtime-model-owner.js", - "size": 27038, - "sha256": "6e13f505c024a1462e95347f7acaf65b6ad9c29349dfcd7520f7298a8a55fd77" + "size": 28687, + "sha256": "c45801907e59f42dd8e1ba78e2c7e7a4e0c3bf28f9d4159216308b986a148e82" }, { "path": "package/dist/adapters/analysis/runtime-model-owner.js.map", - "size": 24898, - "sha256": "950e22bdc5838ff9c411796c3a4132e3abe5bd92531a4fa7ecb9b2fa4677d765" + "size": 25970, + "sha256": "3c86654b33540f282a156232f9a9ccc776ae1046ab7fc054af189000731594ca" }, { "path": "package/dist/adapters/analysis/runtime-retained-model-call.d.ts", - "size": 1122, - "sha256": "c7a750523df00f22eda9de75aedafc85322fb92aedf5d6a809f6596262a79955" + "size": 1261, + "sha256": "d2ea9c8a3152bc0fabcbcbc8960462413ebc67f7daaa9e3feb91856cb8aa26f9" }, { "path": "package/dist/adapters/analysis/runtime-retained-model-call.d.ts.map", - "size": 971, - "sha256": "cacf46c8de5f1506b7d7951ef547f9fdacd9b5ce51eae584f67eca1586571014" + "size": 1059, + "sha256": "44f2898679b08a8dbde6225ab5c3993320eea28ab95f98f9c648bf154acdc11f" }, { "path": "package/dist/adapters/analysis/runtime-retained-model-call.js", - "size": 3574, - "sha256": "6e8a395ea4f7024d00bc6588d9bf1458fd776171918534be5ad622be3306352c" + "size": 3614, + "sha256": "f64eb783650077825ecbb7c331a867bda0d3fa5388fecb2bca55372e90951305" }, { "path": "package/dist/adapters/analysis/runtime-retained-model-call.js.map", - "size": 3343, - "sha256": "98d85ea86e7bcb26da03568eaea8f8ea32d7006f60c41bcd1cf52af5a0b0369d" + "size": 3374, + "sha256": "23ef34a5bfb5ca452f39ee8e6785aa92eb9ed841e660f479d2ccbbad371abce8" }, { "path": "package/dist/adapters/analysis/trace-analysis-adapter.d.ts", - "size": 3941, - "sha256": "77190da966f2a6e28a511d19c8b6c9c79467ff5da9b2a28549e8b09a6cce1fa9" + "size": 4175, + "sha256": "d2e197f78b242ababd4537aa6918034a56add14fabc8952abb17ba233eb2c7e7" }, { "path": "package/dist/adapters/analysis/trace-analysis-adapter.d.ts.map", - "size": 2788, - "sha256": "3bcb2d02337a235048c7c29062156e12431a375e6617a82210585730af0bc287" + "size": 2988, + "sha256": "064ce99c267e3ab35dd39b3df63baef2b64d2ec41316c482b8bdec268177d08b" }, { "path": "package/dist/adapters/analysis/trace-analysis-adapter.js", - "size": 12054, - "sha256": "6b8361494a47f105213ba2a3a02599abc01011c84bc1becfd58977f58a1b3251" + "size": 13295, + "sha256": "dcbf03c8bd043475d553c2ff7da1dcf22e752b63edebc87684d6923f2c621b51" }, { "path": "package/dist/adapters/analysis/trace-analysis-adapter.js.map", - "size": 9073, - "sha256": "5b0928ea0b10e724c18af6f03d3c3d345ca577942fdab792955993dd7213facf" + "size": 10238, + "sha256": "7e30212fa197e81f72328fd57ddff9c78c00b49c4ea58cc9f894e68f165c23c7" }, { "path": "package/dist/adapters/analysis/trace-event-projection.d.ts", @@ -338,17 +338,17 @@ { "path": "package/dist/adapters/analysis/trace-event-projection.d.ts.map", "size": 541, - "sha256": "a4667adef083ecae2de26aa4da2756d79d0e2f04b14bd91f7f5953879f525b6a" + "sha256": "656bfa34a25c9dae54f14adf6110748333a29b1c1cb2d9b22d487e6dcf6be62c" }, { "path": "package/dist/adapters/analysis/trace-event-projection.js", - "size": 8998, - "sha256": "869cf48146c81faced4c73cd0aa52d3eef2aea69c2918c10677abf4cf16f4e0f" + "size": 9289, + "sha256": "f3950419a533ef86c484c9ae9bf914d42b49a930bd78c7998e66c8421b96fc32" }, { "path": "package/dist/adapters/analysis/trace-event-projection.js.map", - "size": 8107, - "sha256": "0859c6e488ab4c6272b78ed765b80d44a0ff17d05be8f54afdbe12dd270a082c" + "size": 8297, + "sha256": "3a48f8cecb50cc28586e7a824a783c49cf730493b88c7f8734ed34fbcd58acf9" }, { "path": "package/dist/adapters/analysis/trace-store.d.ts", @@ -370,6 +370,26 @@ "size": 8303, "sha256": "1e6dd6245dccb1c95c4842e628d078dbd4504675501b1aa6fda7d606af127d40" }, + { + "path": "package/dist/adapters/connections/aws-nitro-root-g1.d.ts", + "size": 1353, + "sha256": "1e738a55d19a25d38b65a893156765106329735b0268a4bf42180701c0e4db04" + }, + { + "path": "package/dist/adapters/connections/aws-nitro-root-g1.d.ts.map", + "size": 252, + "sha256": "1e571654b5a84b038d69894de80984a707a69ea9dd600380358f5b78dc56f1a8" + }, + { + "path": "package/dist/adapters/connections/aws-nitro-root-g1.js", + "size": 1322, + "sha256": "9281e200d1796fc66b0e28e56281f18c91ba2413520a92de362a499685ec532f" + }, + { + "path": "package/dist/adapters/connections/aws-nitro-root-g1.js.map", + "size": 282, + "sha256": "ea8cd4d6ef9e0e8141c57b2e3ca47e9f835bb49e77ec69f4f94981550e2cdbb9" + }, { "path": "package/dist/adapters/connections/cli-bridge-health.d.ts", "size": 471, @@ -392,23 +412,23 @@ }, { "path": "package/dist/adapters/connections/cli-bridge-model-route.d.ts", - "size": 1608, - "sha256": "d9276194dd6970601c24ed641674410bc65ed783174b5d1dbf0c6eb793693034" + "size": 1600, + "sha256": "4cc30b0a20802514dce0adbc9e52d76e6f894e124dda89a2e493a2015c999f64" }, { "path": "package/dist/adapters/connections/cli-bridge-model-route.d.ts.map", "size": 1098, - "sha256": "43dfe704afc5ad50be4c25d94843594eb249a18c5cc7f31fc750ebfed2fbf86c" + "sha256": "7c8287f819a0ed819f97dbc9a5a42c5af4229e122a67eaae78eb0e8dfb22592b" }, { "path": "package/dist/adapters/connections/cli-bridge-model-route.js", - "size": 2484, - "sha256": "d2fab728f110d1936914dd1d1dfd5e1fb1343e2b25d843928bdf50ac355318c5" + "size": 2740, + "sha256": "b3780e45ab2f2807820bf25fbe94eb5c212d12e2c479d70c8a27d7f827939386" }, { "path": "package/dist/adapters/connections/cli-bridge-model-route.js.map", - "size": 2192, - "sha256": "2496fd78acc05fd7008eac3762355e60c83a627293a113fb6c18d3b5f43e264c" + "size": 2435, + "sha256": "5259d78e62b2f94e41923168be77b1c293e5b3911e7a6a4250f4482589e7cbbe" }, { "path": "package/dist/adapters/connections/cli-bridge-model-validation.d.ts", @@ -418,17 +438,37 @@ { "path": "package/dist/adapters/connections/cli-bridge-model-validation.d.ts.map", "size": 605, - "sha256": "cd58ae6b34ba23dfd4600f1a7f6f5d59bd63c6736a37efa759514ee6571e8253" + "sha256": "a79d3c526d51d85f80c5ba521fbd80db40cc75af2b9fee348a3f839e611d1333" }, { "path": "package/dist/adapters/connections/cli-bridge-model-validation.js", - "size": 1649, - "sha256": "43eadd6c69bfed3a93966ee8be79a46c1081a94117c46d8b208caf7bb11a1328" + "size": 1726, + "sha256": "fed2de96800afd695daac060d6adbacf4bf426d88966a46a5780cf0b55d59063" }, { "path": "package/dist/adapters/connections/cli-bridge-model-validation.js.map", - "size": 1250, - "sha256": "75c2589d2fdd4389d63e4dce4a6a21346a21edef1928acd37f3648fa8f101576" + "size": 1258, + "sha256": "06000f1b611d870e604b356f89e026e312430255f5c058d1880b31ffd85251bd" + }, + { + "path": "package/dist/adapters/connections/nitro-confidential-attestation.d.ts", + "size": 2375, + "sha256": "16cad34f5fdda0c0ac5ccf2805d223aaa40eee2a7bfbcad5a441f1e00dfd9ead" + }, + { + "path": "package/dist/adapters/connections/nitro-confidential-attestation.d.ts.map", + "size": 1193, + "sha256": "08e8f478867e1409736120e3b55a915094817e4d8cc7378aa68d970e472aeeb5" + }, + { + "path": "package/dist/adapters/connections/nitro-confidential-attestation.js", + "size": 11531, + "sha256": "0e526300b99928df3701d0a367c40e10d1fcef2fc3217868b2329506f8fae145" + }, + { + "path": "package/dist/adapters/connections/nitro-confidential-attestation.js.map", + "size": 9152, + "sha256": "ae42cbf719a97daf048a37f5aa02f108afa271afefe370f889b7f5a9177a9e0a" }, { "path": "package/dist/adapters/connections/production-connection-credentials.d.ts", @@ -492,33 +532,33 @@ }, { "path": "package/dist/adapters/connections/production-connection-providers.d.ts", - "size": 637, - "sha256": "22e351f7ded3dee52a4000fc91398665b0b75cf3f858d22b5e7f79d1c54ca4a4" + "size": 1806, + "sha256": "3fc04d83649207f075c0f4024e7ae566ebe20087213117983b751a87537df921" }, { "path": "package/dist/adapters/connections/production-connection-providers.d.ts.map", - "size": 573, - "sha256": "6e8fd2dfde7837aecd3830bd70d38dd08736b78b3b525c77149ff6ad85788161" + "size": 1093, + "sha256": "2603b17a57f829da49ebb9206db07cfd1326ed97b71733b961f1654ffaea4ef2" }, { "path": "package/dist/adapters/connections/production-connection-providers.js", - "size": 4845, - "sha256": "0adf71312ba01338f89f74549609ee9205673692b193f510eb6de4e2c123d642" + "size": 8771, + "sha256": "8bcd0d89587cdc3f211e9e04b31e6507da10fb84dbc39d60b163fe2c689891c1" }, { "path": "package/dist/adapters/connections/production-connection-providers.js.map", - "size": 4118, - "sha256": "2e22d2dddc33918342c4c5170b5dd60e82455164e86fc88770b245bfe32f201f" + "size": 6821, + "sha256": "70a99c292ee69f91d72ee6d0c67fe30300e46f5c4b21d3bc802bc22d289e7a72" }, { "path": "package/dist/adapters/connections/production-connection-types.d.ts", - "size": 3959, - "sha256": "6a68889e53f84100c965cee60c5e24f37ec1a39984e06ebea54482814753d7d0" + "size": 5373, + "sha256": "c2b4697351c326841707d34d988ebb0a69cd8ab5f5f7d9d42e9f07a7149ab0be" }, { "path": "package/dist/adapters/connections/production-connection-types.d.ts.map", - "size": 3241, - "sha256": "4f20e2a9b8db02cedf53ced7c18319bb58bcb1e1cd014016330cd3496afbe152" + "size": 3942, + "sha256": "e867889d650360523e1ca746dff7bf38972c9e607cffd18fc285f53f5de1c04f" }, { "path": "package/dist/adapters/connections/production-connection-types.js", @@ -527,28 +567,48 @@ }, { "path": "package/dist/adapters/connections/production-connection-types.js.map", - "size": 216, - "sha256": "af5ac94850ad47323d4f78b03fd6c87a665e260708dfbc6d570005b89e7020bd" + "size": 217, + "sha256": "077ebb007cc66dac5c35556d01d675990b17a3c13f73980c571d002bbec70d93" }, { "path": "package/dist/adapters/connections/production-connections.d.ts", - "size": 1112, - "sha256": "41fb637c36e754ab5b2647762284e50dac02393b1fdb69551bcbf466636029aa" + "size": 1667, + "sha256": "cead4a5504645beabaded4402a3ffdaa9bcc900835436e42823fe988522d0ca2" }, { "path": "package/dist/adapters/connections/production-connections.d.ts.map", - "size": 750, - "sha256": "c27361fbdcbd4db28acf8a185650cf4d0b51ed14ed4d2f6b1d17850d3c9e6b22" + "size": 975, + "sha256": "83410e89628d8c4acf218aa86def85f73cf8a970669ef776556f1d6635da2cb4" }, { "path": "package/dist/adapters/connections/production-connections.js", - "size": 1047, - "sha256": "59526ef8c79d9064d99565a50c83defc0a2396d96362de779df97e14c7f55d3e" + "size": 1300, + "sha256": "08630f721ec77ebd1c0da255a3042acd42402bca211016eac4eaadbf1d27367f" }, { "path": "package/dist/adapters/connections/production-connections.js.map", - "size": 872, - "sha256": "20576bf6a3346b4efc35e95b812f52e27a3b215942349ada41d1a8c843d6b2d1" + "size": 971, + "sha256": "ba7e49be8c4dd7e8da6b276f82d2c411dda04f9c484ad50d5a1de80913613ac5" + }, + { + "path": "package/dist/adapters/connections/tangle-retained-control-lookup.d.ts", + "size": 521, + "sha256": "a4ae242c27927721d67a1401935979814e1d5d6c2a649977dd55134dffc9e4d6" + }, + { + "path": "package/dist/adapters/connections/tangle-retained-control-lookup.d.ts.map", + "size": 415, + "sha256": "578734ef27c2b80079d7c23960312f5295366c7183de0de1ec64df0f58906b66" + }, + { + "path": "package/dist/adapters/connections/tangle-retained-control-lookup.js", + "size": 4675, + "sha256": "0b5ac7040ed6408f036e94aab504103b06ecdf7be05f028003990414ebfbceac" + }, + { + "path": "package/dist/adapters/connections/tangle-retained-control-lookup.js.map", + "size": 4188, + "sha256": "eea7bf2a3eecffa63152d690e2400402732b4ae4ab5981fb854691e97a35d2fa" }, { "path": "package/dist/adapters/credentials/headless-key.d.ts", @@ -712,23 +772,23 @@ }, { "path": "package/dist/adapters/runtime/agent-runtime-execution.d.ts", - "size": 1404, - "sha256": "a5e8e57dd2ae2867356a33cfcbfb1ca6f9c1a36f6f258addfab7c5edff55a947" + "size": 1835, + "sha256": "7343d698757211580d6728f468015a31742477f3f5a6c0c050d823f6517921f1" }, { "path": "package/dist/adapters/runtime/agent-runtime-execution.d.ts.map", - "size": 1198, - "sha256": "6aaf179e085df8c39e2de8dcf4a7fc3a444a1badf718943f182e33dee85c6e45" + "size": 1442, + "sha256": "0921273732306f23d59a232e3d2e173404bd9d504ed1e67e04d288dc057e659f" }, { "path": "package/dist/adapters/runtime/agent-runtime-execution.js", - "size": 12178, - "sha256": "5a264648ea3bb1297678242fd312b1661b226701d3aa7a560fb3483eceb1750c" + "size": 14104, + "sha256": "01197a001f5ebdc66e89ca78510fb60fdaa494f7590cfd38875149d56d34a5b3" }, { "path": "package/dist/adapters/runtime/agent-runtime-execution.js.map", - "size": 10394, - "sha256": "10312964675206f2a940a038d65b2dac5b4abe1b1722ea4c20163b5bfa0abf25" + "size": 11338, + "sha256": "ea339656bb2d8de03a631f1044c055ad5989b789bdfa7173bce69e7220744689" }, { "path": "package/dist/adapters/runtime/agent-runtime-version.d.ts", @@ -752,43 +812,43 @@ }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-execution.d.ts", - "size": 955, - "sha256": "40b3737254af5d0e212279083079942ac0d84b1f848402d34728735608971b67" + "size": 1063, + "sha256": "140f63295a3b41eb0b6102a7c3ae330195881e0d90975a462f99d2ab4195d7b5" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-execution.d.ts.map", - "size": 760, - "sha256": "880e01de26c18837c306d0f284bf550b448b773e19fe5fe670ee6a5beb97c509" + "size": 827, + "sha256": "5304b2ae1247286622049a8a24f3f6f704c21047d133dd256ee735c87a24d526" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-execution.js", - "size": 878, - "sha256": "744fc62ae467a73cad60cb342ca5cd8cd98082d999a5037510c1f3318fb100b6" + "size": 1134, + "sha256": "41251eefeb0130ffacfc05dec0023ed3f9368cc0c79ee6e8f10596693e249d2d" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-execution.js.map", - "size": 832, - "sha256": "664bb4c366b1a9330771718f94deef0ff371d99fc016f76b30813abbd3cf450d" + "size": 1109, + "sha256": "4ad7fcd819c4a4c7dcaf16e25b420a0fa02e3a0d720806bee2452ecafb4c746b" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-run.d.ts", - "size": 1578, - "sha256": "8fdbc3e344352e37b4c3106e4660372be28c877736a180b2a3007697cda59d73" + "size": 1611, + "sha256": "2924d90b91cb6554c95290ce93626f3d75e6c8567eedad11d4690b8317fca10f" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-run.d.ts.map", - "size": 1189, - "sha256": "9dfae3e8697d0c07efec8bc535e33a394bfc9bf93f3dfe72e00d10de11005a2a" + "size": 1218, + "sha256": "fbddd0fa4be36d12af5492f29d6b45738938fcd1b9fbe64629b1a74738e0d4b8" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-run.js", - "size": 6065, - "sha256": "39fac099974d3502d9c0eccd708d1451ccaba6c21fe89f2e8548c27a43328458" + "size": 7726, + "sha256": "f621170aa957a8ec93ee6eb3f6fc4696c3182504e2d224b5aa3e5a13477945d0" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-run.js.map", - "size": 5455, - "sha256": "3961a21eba78f18fa19fbd6f2d256cf40579cbec49b253606e33dab0a41d678f" + "size": 6487, + "sha256": "a1ec9057cdb661b98b7c2e235dfcd1dc3521761150aa69275aaeaa777c7b493d" }, { "path": "package/dist/adapters/runtime/execution-observation-source.d.ts", @@ -810,15 +870,75 @@ "size": 977, "sha256": "9224b63f10ae875ad03724048015495b04527a79b322df9768eb1f9acb5eb4f4" }, + { + "path": "package/dist/adapters/runtime/lazy-execution.d.ts", + "size": 2680, + "sha256": "e9213b9b6757b00e79fc8bb8796df0b53e0896d95b662731496529056f7e5269" + }, + { + "path": "package/dist/adapters/runtime/lazy-execution.d.ts.map", + "size": 2226, + "sha256": "1f42cbfd8c5858286a4e52cf64f4c8938d7745b0a513ad2a00ff62937123d7b5" + }, + { + "path": "package/dist/adapters/runtime/lazy-execution.js", + "size": 3371, + "sha256": "8d341baf278aefbe70b96f4c82dc3b1a81533d1690d4814240c8a5255297aec6" + }, + { + "path": "package/dist/adapters/runtime/lazy-execution.js.map", + "size": 2955, + "sha256": "b22064a58d520b7518b909b11c14c15a68e2d6c31eccb48d8516431b5b48c2d6" + }, + { + "path": "package/dist/adapters/runtime/mode-routing-execution.d.ts", + "size": 3651, + "sha256": "10e78fbf79f93ffcb2dbb29b8ace7b2682601fc19a59ce143703c7db6f496d48" + }, + { + "path": "package/dist/adapters/runtime/mode-routing-execution.d.ts.map", + "size": 2384, + "sha256": "63697b33ade0f5f32535fc9d732388339206ae2c1ca6c15ccc978e7ce143c652" + }, + { + "path": "package/dist/adapters/runtime/mode-routing-execution.js", + "size": 7707, + "sha256": "e7ef5a80a16f292f40b4b944ed87d11340e5fd4311ff42b4b3af79a5bdc31680" + }, + { + "path": "package/dist/adapters/runtime/mode-routing-execution.js.map", + "size": 6844, + "sha256": "e17a2644851cb19325dbb91f2f491cbacc7dfef4eed8289a293bf31ab2f45a73" + }, + { + "path": "package/dist/adapters/runtime/native-interactive-run-broker.d.ts", + "size": 1115, + "sha256": "b194cba1228666a00e9ada3778010d4da5340bd0cfc553f018e33f30cbddd4a0" + }, + { + "path": "package/dist/adapters/runtime/native-interactive-run-broker.d.ts.map", + "size": 901, + "sha256": "9a6e58a15f77fafb08d252015e0aa30cd73718ce0428aee1c69088cb172382af" + }, + { + "path": "package/dist/adapters/runtime/native-interactive-run-broker.js", + "size": 3447, + "sha256": "a28d5549c5a6c20c61d22ef2a169dbe7994f8b561e7a89949501b4ef7edf050f" + }, + { + "path": "package/dist/adapters/runtime/native-interactive-run-broker.js.map", + "size": 3574, + "sha256": "bf19c9abef9e70c4c63c2cc8798fa879712a938fd5225940e8116f792bc24be5" + }, { "path": "package/dist/adapters/runtime/prepared-execution.d.ts", - "size": 1800, - "sha256": "5ad813ceefe0aa549856549ee0d1913cd314601f67c7a4cf05cd600e78323719" + "size": 1838, + "sha256": "77dfc0c0150a04c8c20f003a2187925cdd0511ed05150d213d052d3adaa0a622" }, { "path": "package/dist/adapters/runtime/prepared-execution.d.ts.map", - "size": 1201, - "sha256": "c8400b3f50e63e26c1ad74e70aa73a1c03695182986d9ed9bd0738a3da1689b4" + "size": 1242, + "sha256": "a7b8c8deb7c5da4096eb320c05af5e3c05a3d3181786a57f381f7aafb0b69ac6" }, { "path": "package/dist/adapters/runtime/prepared-execution.js", @@ -828,67 +948,67 @@ { "path": "package/dist/adapters/runtime/prepared-execution.js.map", "size": 238, - "sha256": "c5ed26533ab58c92bb1f49a7469023267a842c27f3f0907b1410c3f8f38aee40" + "sha256": "016aef3f3acfbc36561cac3c3df9c83cfdd6a2b9690e41dcdbfbe1110348748d" }, { "path": "package/dist/adapters/runtime/production-backend-common.d.ts", - "size": 1879, - "sha256": "837776aa995c62c3cc86dc0578dd64767879496cd069172b02a49ba6580e61d7" + "size": 2040, + "sha256": "a45363d09dd5511105c66c1f909bd89c3ad2f4df14c99074439919e6bee76567" }, { "path": "package/dist/adapters/runtime/production-backend-common.d.ts.map", - "size": 1557, - "sha256": "0024857ced2b7c4e51c7656b303a53d7ba3dc1eab79f39cb5602debeb301228a" + "size": 1645, + "sha256": "f60ff9a028c5d72dcbf54ec8fc3423e13a2cde95bc89022e2ab503cec91eca18" }, { "path": "package/dist/adapters/runtime/production-backend-common.js", - "size": 3130, - "sha256": "50604a012228a5cd3fbb408b29e780522697c825a018f61be3ead7f562043d6f" + "size": 3814, + "sha256": "2d771a78d4034f9543d3157d55914db4516b4d951ba186e86dd32d6c650e6fa9" }, { "path": "package/dist/adapters/runtime/production-backend-common.js.map", - "size": 2671, - "sha256": "b7b3170c7e6bb3df365b05d7386efade7d4bd5d747805b409855bafb7a11c15a" + "size": 3377, + "sha256": "3a62a997798e63103f01d25ad99ac112feb8bb2c43a958f01308f53b129aa16d" }, { "path": "package/dist/adapters/runtime/production-backend-resolver.d.ts", - "size": 1225, - "sha256": "a4e64ebe477e98884b1cd7c24cc54e95eb985e85efe439652a7e0452543c7b52" + "size": 1580, + "sha256": "ca6cfeb22aca78b5c7dc3785c67905bbac65a47ad93fb3606b62dc4dbff40c3c" }, { "path": "package/dist/adapters/runtime/production-backend-resolver.d.ts.map", - "size": 809, - "sha256": "6a83f4a3fa25b70b71929882c7015f75946ecc7fcf93c25df07cf2111e7357e2" + "size": 972, + "sha256": "60aa3970b112646fcdb7687012da8944b5875ee2399eced99f27b74e089812dc" }, { "path": "package/dist/adapters/runtime/production-backend-resolver.js", - "size": 2194, - "sha256": "4f76944413eaa1857670e7b2af89a0c3098129c9e5ae77e5bc756bad1414d5ae" + "size": 2869, + "sha256": "a7a0320f40467bad9550998a990e4f6dd0df57b2ab10f455b8a05027de8e82bd" }, { "path": "package/dist/adapters/runtime/production-backend-resolver.js.map", - "size": 1918, - "sha256": "787b7f76db27cb3480fb11a0c3d4a3163819ed9e0a03a813a6a8f96ea35653ec" + "size": 2450, + "sha256": "aab8452f94caf71f65d58f2a8bcc36c351652522affe288005faaa5da694b396" }, { "path": "package/dist/adapters/runtime/production-cli-bridge-backend.d.ts", - "size": 1520, - "sha256": "d66413d46c603cf9db9acf2de37c1a3d7f62eb30e1c39c08aab7c22e2e286de7" + "size": 1557, + "sha256": "2361c757743c1b717a20ca7f1d595bc85f437f5b8a0234af13eddda47d1dc528" }, { "path": "package/dist/adapters/runtime/production-cli-bridge-backend.d.ts.map", - "size": 1353, - "sha256": "ed3b66747ca31dc0c0a7523e7adafe781d2b204d4e027169d4366d8343fd3c82" + "size": 1372, + "sha256": "08cae03ebcfa071104c374053ab94a1921fff041e4c4abf44b1b565e80bb1271" }, { "path": "package/dist/adapters/runtime/production-cli-bridge-backend.js", - "size": 4965, - "sha256": "2432dce768135950165f21404f555ed1bd9875e1d1f30b3931f366460c4970a1" + "size": 6986, + "sha256": "0d523c8a7d325e32ccc86feaa048e3ac6e354011c9e059e67a651a6dad5f6d9c" }, { "path": "package/dist/adapters/runtime/production-cli-bridge-backend.js.map", - "size": 3581, - "sha256": "812770051d69d250c412352f16a9f8df39291cd416491831fe84616d6c7eee1b" + "size": 5663, + "sha256": "4d2eb5c0936e963c8984f915b1ff0bb23cf6eedc1679c481037c82c41dff2bf3" }, { "path": "package/dist/adapters/runtime/production-tangle-inference-backend.d.ts", @@ -912,33 +1032,33 @@ }, { "path": "package/dist/adapters/runtime/production-tangle-sandbox-backend.d.ts", - "size": 593, - "sha256": "b7d4a9e7242ca6487892946459d2c3952e071afd927b0d1d95e262d79608347e" + "size": 1989, + "sha256": "d81a480dfa227367a3da620d69c5eef9683a7d868fbe48cb261b205b5c4455a0" }, { "path": "package/dist/adapters/runtime/production-tangle-sandbox-backend.d.ts.map", - "size": 544, - "sha256": "02ff474d9a1b343a6da1abe6ea7f3290ba7cbac4832f932c14e7e5601355d00a" + "size": 1600, + "sha256": "b38bc36f8a62c8a5936c405cdeeb469920e7686b06995406d442f8054fedb9cc" }, { "path": "package/dist/adapters/runtime/production-tangle-sandbox-backend.js", - "size": 5492, - "sha256": "5b4e4363be70dd5b1bb9187333b077fad4e851cf49c4857c97cd58ed10c19efe" + "size": 11088, + "sha256": "c7377eb4bbea60e755cd8c7dde67b457db7de165bb1395a38784717d2afde38b" }, { "path": "package/dist/adapters/runtime/production-tangle-sandbox-backend.js.map", - "size": 4361, - "sha256": "9974209934eb6630997f30a962490347436b2cdf922fa0ab61f4c17835168b67" + "size": 8311, + "sha256": "e15da4d680b7ede373540efa6396270a23cf3b2f65b59ccd5161e0dd2b0e2691" }, { "path": "package/dist/adapters/runtime/retained-execution-contract.d.ts", - "size": 2460, - "sha256": "b51c721ec24f6c86bba450ff5b9131881e56ea1eaf107c8b1694b41b65947939" + "size": 3303, + "sha256": "6cd453271adf1af9dad21950b518ab9f909f07b3be890bc77a62d1eede214c44" }, { "path": "package/dist/adapters/runtime/retained-execution-contract.d.ts.map", - "size": 2173, - "sha256": "9eede1676787269a6e3de00cf8282f610ea5ae33785dd70a33d42fc4cec53660" + "size": 2687, + "sha256": "1d42352b1586629954dd215316d25d1bc362f6526ccb0c7ffd30fc2e633e78b5" }, { "path": "package/dist/adapters/runtime/retained-execution-contract.js", @@ -952,43 +1072,43 @@ }, { "path": "package/dist/adapters/runtime/retained-execution-projection.d.ts", - "size": 1162, - "sha256": "09ed7b813c38a2756955cbb3f0254eaddf702f5b1fcc5f42795ae740284653e5" + "size": 1257, + "sha256": "f25ceb31e523f1fc9dd5e3b05dfbdbb4659ddbf58d51801dc34297bc81f8fb5c" }, { "path": "package/dist/adapters/runtime/retained-execution-projection.d.ts.map", - "size": 1002, - "sha256": "c0b9345c243e4f46d47c043eaf83961912b9d3676c71c409b0e5fdad8ec7850d" + "size": 1110, + "sha256": "149493df6699d3375b7a26abe34414d6f1f85b02f5d0a6a84ab516f4e6d5029a" }, { "path": "package/dist/adapters/runtime/retained-execution-projection.js", - "size": 3639, - "sha256": "5df00c80762e5bf9f2d6c5bd897f2e843962ed5c86ce3b7d9af84472efb7e62f" + "size": 4186, + "sha256": "64b393c04f8e37a3e960d624d0c009d9c411ecad23335faddbca54f45cbd9302" }, { "path": "package/dist/adapters/runtime/retained-execution-projection.js.map", - "size": 3911, - "sha256": "14f8a867ce06e87fee84a12f8b71f2b3fd3ac85168fd85ebee3695ba5f9f5432" + "size": 4267, + "sha256": "803ed810be0910d3c8c378eb9d56f24a38a28640ac69a6298afe4180bbb429fb" }, { "path": "package/dist/adapters/runtime/retained-execution-state.d.ts", - "size": 2401, - "sha256": "043622e9805bd870961898982f4d487699d1e1a9aa03cccd6a3427738b7a42ef" + "size": 2259, + "sha256": "1220d160706eff9240897d2985f1b48a9b7b6605dd7852d53119abe61f078fe7" }, { "path": "package/dist/adapters/runtime/retained-execution-state.d.ts.map", - "size": 2172, - "sha256": "b2f99ed9d40ef3f1b39931a48e33beaf7aa365c2a259142f68fa23c7c01fb87c" + "size": 2034, + "sha256": "bae7fd50e4179d5c98eb7aedd6c181682c04b0684afe0937f9ea6b8fd41cf6e9" }, { "path": "package/dist/adapters/runtime/retained-execution-state.js", - "size": 7295, - "sha256": "3462d0b76d3aeeeff55648c5dbae8e8f76d5a9f8ab938e1c2def9c01c112d5a0" + "size": 6587, + "sha256": "07127ff573ad652c267a3ba3ed06c1c478e56b0df384faa22ed7644ce64c4284" }, { "path": "package/dist/adapters/runtime/retained-execution-state.js.map", - "size": 7243, - "sha256": "dced53ef9ca59d3dc3784fcfdf37f3773fc180b8c2118d2d78899f7f8596ba2d" + "size": 6464, + "sha256": "c71f62558bb6b527a0067342b4d125777a94c6a76e642670a7f2c556eefd5d35" }, { "path": "package/dist/adapters/runtime/retained-execution-stream.d.ts", @@ -998,37 +1118,57 @@ { "path": "package/dist/adapters/runtime/retained-execution-stream.d.ts.map", "size": 741, - "sha256": "f134ca88b2c7c8d6ad5503fe36c05c8118f87e95fdef50044d3c9770be8572b0" + "sha256": "2f2bf3cb8ee66bd44d33196c95f6736e3bdd8ad89621c8b16af55d0a6d23c13d" }, { "path": "package/dist/adapters/runtime/retained-execution-stream.js", - "size": 1994, - "sha256": "9cb42c96b9090606894ac83b69eeb479ec8c1058499526db8b1155346edf59be" + "size": 1873, + "sha256": "85fca4bddce11d21b2243475ca7600c119fbd2f59b519388311f1e6f6e07ecbc" }, { "path": "package/dist/adapters/runtime/retained-execution-stream.js.map", - "size": 2027, - "sha256": "6754486918f9a3580280a2324ccf70c86c46fb9bdf14479eafed51e42eb20b55" + "size": 1910, + "sha256": "35be39778e41a3286fd1c3d4fe21336af1a53de0574393be2abe205767c211c0" }, { "path": "package/dist/adapters/runtime/retained-execution.d.ts", - "size": 1947, - "sha256": "93fa949ae8883fa332b86f4b41e2c6a8b2a38825d46d92caa2b98468d1d9c105" + "size": 3130, + "sha256": "dbaff138260f4c9a488ea32c662722c532b6088674679ad02795913339e52859" }, { "path": "package/dist/adapters/runtime/retained-execution.d.ts.map", - "size": 1696, - "sha256": "816f6f9bd33619c3048fc6164a0281f39241d2569e78161e0ba10c643ddfd799" + "size": 2137, + "sha256": "f59303336c1251284ce3133a8df99413cc326868814036101f9dfc638fc24225" }, { "path": "package/dist/adapters/runtime/retained-execution.js", - "size": 13100, - "sha256": "e0aa0856c3fa88c838d7388e08bd1baf5988a037b78d57175bcccc2ec3eb0344" + "size": 25704, + "sha256": "f29507dc4e3f81ec580464c3dffbf5af18854ddf3bd3030c859860127b0b6f85" }, { "path": "package/dist/adapters/runtime/retained-execution.js.map", - "size": 12597, - "sha256": "b96a06ce39c55146c1de2bb73eb6aa5bf6c19002df107d0939ed4511656ebe53" + "size": 22790, + "sha256": "8eee1d3646b5aef3d212585ac65ffec5125fa0c3d1d38f6f6c0e95d1ef8b851b" + }, + { + "path": "package/dist/adapters/runtime/retained-native-continuation.d.ts", + "size": 920, + "sha256": "1910997dc7b58204ec836add609e49d99d8ebaea2812a3d770ea0ed925e2c750" + }, + { + "path": "package/dist/adapters/runtime/retained-native-continuation.d.ts.map", + "size": 736, + "sha256": "d6e1abb8d8f68e9cf63cb0ab88ef848da82b44b50735cd038c9e7593280d7463" + }, + { + "path": "package/dist/adapters/runtime/retained-native-continuation.js", + "size": 3953, + "sha256": "3da302353cbdfb2a0d27d4df5738a8f9aad84b4155aec2666687aed1089cab6f" + }, + { + "path": "package/dist/adapters/runtime/retained-native-continuation.js.map", + "size": 3494, + "sha256": "d06ce0596c91bd230cc8c7c13cd3f068355bdc49425db9ba83d7e95b021be4a3" }, { "path": "package/dist/adapters/runtime/sandbox-account-observation.d.ts", @@ -1098,57 +1238,37 @@ { "path": "package/dist/adapters/runtime/sandbox-observation.d.ts.map", "size": 497, - "sha256": "99188b347b6a5d439f3a2601cfa1dfea6d0b6d1aa3593ca70d746712447e357a" + "sha256": "551f0865e4803208566b09e171e71f9e7753304e3b913f81e1b42927c1f19404" }, { "path": "package/dist/adapters/runtime/sandbox-observation.js", - "size": 5916, - "sha256": "fb33be6f00cf81f99417d55f726e5e42b5b8f23b774ac4a771b5aa3acd258c03" + "size": 6318, + "sha256": "a5a9648311b6a9d1b8b4daa38353bf202c45466ae1784724b98453886fe5d042" }, { "path": "package/dist/adapters/runtime/sandbox-observation.js.map", - "size": 5753, - "sha256": "5dd84952ad0fe15e11371255be3fe386934844a2d5c9d3c38ae69d8f39843267" - }, - { - "path": "package/dist/adapters/runtime/sandbox-result-projection.d.ts", - "size": 647, - "sha256": "f824e355f41d57657e08940f23c011a4ca0c1e00a471343f78811a0e42ac415b" - }, - { - "path": "package/dist/adapters/runtime/sandbox-result-projection.d.ts.map", - "size": 521, - "sha256": "b5c89484b8dc4ddf291a1e5de58dc3bd35ee9046110bf4e382fba82d78b6de02" - }, - { - "path": "package/dist/adapters/runtime/sandbox-result-projection.js", - "size": 8735, - "sha256": "2a605837432b0331608c76b49c30708b8ab8cea2c66260a1fa77df7168d3a106" - }, - { - "path": "package/dist/adapters/runtime/sandbox-result-projection.js.map", - "size": 8907, - "sha256": "dfa0ae766dd6f7b5b316ea312bbd429350f69626d18a1f87a80de145f8520c64" + "size": 6190, + "sha256": "46100a915374ad695a11607d505600c44da6ffadfb80f4155f72cc14adc0cade" }, { "path": "package/dist/adapters/runtime/supervisor-control.d.ts", - "size": 1676, - "sha256": "892123d1f1fd6866af9bd73b4a4bbb6ea5c5d6022f539aace6794fd2a95045e6" + "size": 3552, + "sha256": "0e326fd2dc7ffa17641574164d78a01f1b6248647006c3fc06264d7ecf920669" }, { "path": "package/dist/adapters/runtime/supervisor-control.d.ts.map", - "size": 1501, - "sha256": "a31736ef7959cd5d3eb5a0f068582c6918cfef0fce96b534c3a3435952a3ae62" + "size": 3171, + "sha256": "d03fe35a7b9f5ed194c40a4cacb5cf7726549dcad4e3f208f5460ec99ac3c092" }, { "path": "package/dist/adapters/runtime/supervisor-control.js", - "size": 3539, - "sha256": "05ae7e1f3046f682baf176fc046004db68e80d047b40925f393a8ff90507a67e" + "size": 7003, + "sha256": "721003cdef0e661fec41efdfe26f76a715dd2f0ecfc9a3ca6c876bb4547a1004" }, { "path": "package/dist/adapters/runtime/supervisor-control.js.map", - "size": 2402, - "sha256": "a42b2ddb8c894d532dd488f71aaadd3a665796badfe1d981089885ba3ddf4ff5" + "size": 5709, + "sha256": "46603aa9bcd151ad3100ec13f09df2cc4fe409922dc6fcb1e7fb2ee1709c40dc" }, { "path": "package/dist/adapters/runtime/supervisor-watch.d.ts", @@ -1170,6 +1290,126 @@ "size": 1461, "sha256": "ecae6558572831eafd3cb07c4791c85fd6e05774df6fcdc05d8e9de570dba69e" }, + { + "path": "package/dist/adapters/runtime/tangle-retained-execution.d.ts", + "size": 1439, + "sha256": "6d89bb1cac28426061fc8b113fc2e7b76a62464b0975d88838aca40c8e02e642" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-execution.d.ts.map", + "size": 1026, + "sha256": "42a2f63d71109ec15c96962dddf6d443835729a134fe5732f988ff5ad41a9700" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-execution.js", + "size": 1477, + "sha256": "9d85e9ab5773a821da5164c2bd2cf06f820ceba2af5b2dd336debf902ad2c850" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-execution.js.map", + "size": 1315, + "sha256": "796691af9eef9009f9a54c98b6d247e656c5b6527b72ea58ce4792379ceeba7c" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-contract.d.ts", + "size": 3101, + "sha256": "b53ac7c072a50d730dd04662151ceba8d722651923d0106300031c7a0ab03d57" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-contract.d.ts.map", + "size": 2011, + "sha256": "372b403abf8f03de3bfecb480d6bee621cd57331ae530861e91b62c44131d812" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-contract.js", + "size": 5619, + "sha256": "48593315c351ca0268987835fa06007736fc0da06a496745ccf27963fd0a715f" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-contract.js.map", + "size": 4553, + "sha256": "ecc6769ddd86aef20b43ec537b9d4ebbaeb18551567186beabb724b454835ade" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-execution.d.ts", + "size": 2575, + "sha256": "9d2a093e8fc1f89df595ce60064fd0243675043da179fbbde056fdb0d2ddeaec" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-execution.d.ts.map", + "size": 1963, + "sha256": "a6caba4dffdd23504e6c9fc1fcc61f7abb5de9483d810062c18c6ac20f528d0e" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-execution.js", + "size": 21334, + "sha256": "40f2bfd619e6070490e8d6b2f438a72286692b57d62b0239781d44dc683f527d" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-execution.js.map", + "size": 19836, + "sha256": "a4891d9be8422b1074e0b9f4706a65710f03616fb9c66cadc04058d24222b080" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-projection.d.ts", + "size": 1950, + "sha256": "1bb605ea167e54edd132329ab11122b280265e6f5de4d8b12cb7f0322e7f1001" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-projection.d.ts.map", + "size": 1470, + "sha256": "f799bcfb9f1eae69b08db54e645422385b0105df5758ba5b408e445ee86967cb" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-projection.js", + "size": 4563, + "sha256": "531c2f1a7997a15f87b6020c014fe1830a13fda50b8f7b0c19852754dbe71ae8" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-interactive-projection.js.map", + "size": 4409, + "sha256": "486915a7c61e6d064823a2975af0050033cd1914d1c3c88d9134103a1e6f33b5" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-run.d.ts", + "size": 1210, + "sha256": "c0ba623f652c0e05a89affa1100cefffc2d58ce420997f9863c0bb2e78a4850c" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-run.d.ts.map", + "size": 934, + "sha256": "e1c8d03506c186689ed15fd106b70622111a8fcfb7750f4ceff22f25cda7b443" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-run.js", + "size": 7770, + "sha256": "a46a0bbad041957f9c493c888fa765c88adbc063b8aae56d2fee9a3f4ba4e568" + }, + { + "path": "package/dist/adapters/runtime/tangle-retained-run.js.map", + "size": 6383, + "sha256": "df596840127781540e33563500e1eaa43971aa7784a571313f8ad1e3fb30c423" + }, + { + "path": "package/dist/adapters/runtime/tangle-sandbox-retention.d.ts", + "size": 1073, + "sha256": "8ac25650a56981bde9e670894159989eacb608c4d67d137df4df98cf56740389" + }, + { + "path": "package/dist/adapters/runtime/tangle-sandbox-retention.d.ts.map", + "size": 851, + "sha256": "f4e100973a0839ffc5e82510fde2c1c9a963e5d2c9c927ce5e26d544070823fd" + }, + { + "path": "package/dist/adapters/runtime/tangle-sandbox-retention.js", + "size": 2800, + "sha256": "ec9477f539334c43488d750618630aa95a237c67d19b38041d7c68631fa5c326" + }, + { + "path": "package/dist/adapters/runtime/tangle-sandbox-retention.js.map", + "size": 2754, + "sha256": "d78a3494745f2a290e57dd12024d03c438754df0ecb327784ac6d54464091a2d" + }, { "path": "package/dist/adapters/runtime/unavailable-execution.d.ts", "size": 570, @@ -1218,17 +1458,17 @@ { "path": "package/dist/adapters/storage/memory-effects.d.ts.map", "size": 682, - "sha256": "3e207be7ff2eac9ba9623f6d6376b49e70902eb623caeb30994e51b9b69a1476" + "sha256": "03e09d54f4f295ff75b9dc1d6dc7d2e92e67fadd2dc184da7512b5da95f15f62" }, { "path": "package/dist/adapters/storage/memory-effects.js", "size": 2007, - "sha256": "a1d8da38ab47d48386c27d505e679e4e50e0929e51b580ca39a9fb1a27190987" + "sha256": "cdbda1ace342240a8d9111a0526bc174683451236cb90d82f665b4761e78c25e" }, { "path": "package/dist/adapters/storage/memory-effects.js.map", "size": 2087, - "sha256": "a556f0f64c0dadc374cd4fb83e913f28c0716bc829b8aed3b9dbf197e5cf1ac2" + "sha256": "c0297315ee0453cf8cad2d8c03e574f5c82ab4debe2c3fa77344e8e70e6fc603" }, { "path": "package/dist/adapters/storage/memory-journal.d.ts", @@ -1258,17 +1498,17 @@ { "path": "package/dist/adapters/storage/memory-maintenance.d.ts.map", "size": 640, - "sha256": "fd76653d03bf17eeae5ad0eca04f148e4f0748404b0406a225e9d74ba36b30ec" + "sha256": "61ea7345e99da6315234cd88742f37dca0bde12e189376841bd08141300f7bf1" }, { "path": "package/dist/adapters/storage/memory-maintenance.js", "size": 2377, - "sha256": "67584835802cee05c7f18b6e40aa169dbecee3d989c3d45c068e2023e76e70d1" + "sha256": "e4d731499349563737663e9531e69fa98b012ebaee3d90024bd122ad57767ebe" }, { "path": "package/dist/adapters/storage/memory-maintenance.js.map", "size": 2331, - "sha256": "3b4776ce1d93abe178949fcfc02f71f99af9dd571846c888b4d216fa455ecc9b" + "sha256": "0f78f03bf7f90a5cd6b3c9aa5e962839a7c8315aa9dc66aecb4ea1c5e8585fb6" }, { "path": "package/dist/adapters/storage/memory-operations.d.ts", @@ -1278,17 +1518,17 @@ { "path": "package/dist/adapters/storage/memory-operations.d.ts.map", "size": 1398, - "sha256": "f222cdd561c03d8290747523936f97b19586b8a89bb0450dabcaf82c74d687da" + "sha256": "d2fa6838cdcaccdc3c069c1ecf513d86d5499d0d89d7ae6d76956764a2f2135a" }, { "path": "package/dist/adapters/storage/memory-operations.js", "size": 7343, - "sha256": "ae1181c31f87e7e37879809a30c5b16165d884dcefae0aaca7f0a1936d6a4584" + "sha256": "a6c6a918222b8ce80212ad00b333acdef97339651700cbfd372c2dd915fa290a" }, { "path": "package/dist/adapters/storage/memory-operations.js.map", "size": 6389, - "sha256": "37807caa482d776efe5fe35d24df4f6f2e234200eb69d9f369e433facb4840f8" + "sha256": "329b1d45544d0b2af9a3d8ce34de4b4d59861f14a5135d495786574a3724c5f3" }, { "path": "package/dist/adapters/storage/memory-retention.d.ts", @@ -1298,27 +1538,27 @@ { "path": "package/dist/adapters/storage/memory-retention.d.ts.map", "size": 1094, - "sha256": "7d9441716b7070bfeab9de2c5e2b6203e683a58d2c82bf1facdb775820479efe" + "sha256": "7162661621a57d573edb04fda5b5d183e80ebf3b4ac6411f5c137209df85f88a" }, { "path": "package/dist/adapters/storage/memory-retention.js", "size": 6593, - "sha256": "6c28d58818af8522eb896f91495f623da547637bdea97bea9f26c186eb4019b5" + "sha256": "4243772c0c69cd7a267926a7ad39e980703295ba46850b0da62ccca1fba9da18" }, { "path": "package/dist/adapters/storage/memory-retention.js.map", "size": 6026, - "sha256": "a528a95ea783135950b0a1b69044c5bfad40a0de41a398e509d548f6031a3fd8" + "sha256": "53aff00a4a14d865e9079b6131743f149947b551e5938de69fc190ed069e0e2d" }, { "path": "package/dist/adapters/storage/memory.d.ts", "size": 246, - "sha256": "7824f002fd54f013b7f47eee56a65cff2f8e885b077e1fdb9f7ab71ee5c6de47" + "sha256": "c043b19f57df1f6f661bf54f178830ff2f6e6d65d57fbe4150af540a8f19d93f" }, { "path": "package/dist/adapters/storage/memory.d.ts.map", "size": 264, - "sha256": "4ede2ff42b1d9180fd04ffa5df04b1fa1a8e3f5eb4d0bac94a5f1287c63757d0" + "sha256": "dddacb83e8518c64455cac19d3ae4c667eb39575541184bd683d12fbcea29d13" }, { "path": "package/dist/adapters/storage/memory.js", @@ -1328,7 +1568,7 @@ { "path": "package/dist/adapters/storage/memory.js.map", "size": 209, - "sha256": "d1d7239bfd8eccf57a6680863a508dc3609feeb766f3c725009906993fd86858" + "sha256": "c68114740a4374c27c25ec4f5d7d7586ebfcd996394fde27a45ee9888699f29e" }, { "path": "package/dist/adapters/storage/sqlite-base.d.ts", @@ -1398,17 +1638,17 @@ { "path": "package/dist/adapters/storage/sqlite-crypto.d.ts.map", "size": 500, - "sha256": "1823e4e6cd6fed42e18db30fe789dca4c4a82e395cacccb1eb7b616af1156220" + "sha256": "006299c7091a65a7ee98a2c03d523e753d9732f27c184f72671f98b11804b9f5" }, { "path": "package/dist/adapters/storage/sqlite-crypto.js", - "size": 7718, - "sha256": "411b8198d1b957109a4f67844fc62d66b69d7a9f2c51f83f7f0964b14e7523f9" + "size": 8068, + "sha256": "83ed6ae5d00eb78614d2cdeeb49ac19e97936246443dd22049b47c3e6ca9caef" }, { "path": "package/dist/adapters/storage/sqlite-crypto.js.map", - "size": 7233, - "sha256": "e10c7df7066eaa1b30359b31edefe0cd9aa9de0ee6fac4971e10afd83c4b54ec" + "size": 7501, + "sha256": "995cc2207bcbeabe8e98f8af9e7075be8762aa56979152fe43bbd73a5f2ef193" }, { "path": "package/dist/adapters/storage/sqlite-driver.d.ts", @@ -1438,17 +1678,17 @@ { "path": "package/dist/adapters/storage/sqlite-effects.d.ts.map", "size": 1196, - "sha256": "d4c0bd4162558ef22ff8f4fe9547f053fdc237a777f3311b4395ecae0077174b" + "sha256": "44b023c2fad1a4443dbcabc367ac799c48a5b4d8adaf75eb780d687a2dcc89e1" }, { "path": "package/dist/adapters/storage/sqlite-effects.js", "size": 13637, - "sha256": "37ed976b14867cf53cfa5fd0fae68eeadc0daf8d40e84ab48fa17ceaa07c4f8a" + "sha256": "3fe599fc32743cee0ea8effea72069dc3a12942ee11b5c3cb3ffa72a518bac4d" }, { "path": "package/dist/adapters/storage/sqlite-effects.js.map", "size": 10295, - "sha256": "573e7c29732cd8c3a1c751bb5a90c63655431f2564b65d46348be2032911cf07" + "sha256": "0da80e526ddbd534c2b266e6c71b6ab84fc11459ee94a65fe2ebba8279c7c219" }, { "path": "package/dist/adapters/storage/sqlite-errors.d.ts", @@ -1483,12 +1723,12 @@ { "path": "package/dist/adapters/storage/sqlite-initialization.js", "size": 4656, - "sha256": "6fa84de2605f4351c6a76913379dcae68bb0a1959c2fd15dba335712d2e0670d" + "sha256": "d5d058565ba16aea7fa9c1f45612f3ec45cfe504a7b7fa7bc7d2b09226f9147a" }, { "path": "package/dist/adapters/storage/sqlite-initialization.js.map", "size": 4544, - "sha256": "e75e5fd8ed8052237514a4d312296d1eb3c43caf5438341f46c1e8fd9f384915" + "sha256": "74f2bf15f633ae193a1b9c2718d0acc523fdde59d2f03d62eb97a13e3a6316cd" }, { "path": "package/dist/adapters/storage/sqlite-journal.d.ts", @@ -1537,18 +1777,18 @@ }, { "path": "package/dist/adapters/storage/sqlite-maintenance.d.ts.map", - "size": 644, - "sha256": "6edc1c663db2bdd8a16cd94005ccb640f24154af02122219945fbd0d9f27fd3b" + "size": 645, + "sha256": "e1e77f40c4bd2b8899590fff28ea0d2e59e4755049f2fa6215639cf4a2272a04" }, { "path": "package/dist/adapters/storage/sqlite-maintenance.js", - "size": 9960, - "sha256": "02269bd93ef8030e8b189799dbe71d6b893cb5dae2f01520fb8fce0bf72a3afd" + "size": 9924, + "sha256": "831f164a4ab9a1631e5d05542fc73c957c6326bb391313384861ef337cfb7f0d" }, { "path": "package/dist/adapters/storage/sqlite-maintenance.js.map", - "size": 8343, - "sha256": "77a414f271463d2ce097b519893ab8f297fd581041d6d45e1265661dc408f402" + "size": 8311, + "sha256": "c47ca898cc07b539f40fc2967b27032d0d42e87c1478783dce267930596881f2" }, { "path": "package/dist/adapters/storage/sqlite-operations.d.ts", @@ -1558,17 +1798,17 @@ { "path": "package/dist/adapters/storage/sqlite-operations.d.ts.map", "size": 1142, - "sha256": "030a1e43578dfcc5ab8dc2ec0e7bdc930d8ebf30fc232d10413c8a67a9c8be63" + "sha256": "c8d28d37d8d4b583d4b071b145853201a65a050032582c681b13debdd1389932" }, { "path": "package/dist/adapters/storage/sqlite-operations.js", "size": 8976, - "sha256": "28d9380aacbada0e22acf32c4647cfeb9eb64fbebe67925df899d1ba4ed51c61" + "sha256": "c63294470de0b4531826c2c5881da9bb49d9479391bdd600274dcc7a0eafd6a2" }, { "path": "package/dist/adapters/storage/sqlite-operations.js.map", "size": 6711, - "sha256": "35a721b5443ebe59b36bc5f0b361ceaf84be7dc880ee00c538372b306d10120a" + "sha256": "421bd8e7914d9d62bb7be9f5ba9a4bb26357f886c48d9ddfa0ddb384778d7ae7" }, { "path": "package/dist/adapters/storage/sqlite-paths.d.ts", @@ -1678,17 +1918,17 @@ { "path": "package/dist/adapters/storage/sqlite-rows.d.ts.map", "size": 1756, - "sha256": "148a0794445ce4f1476f14149b9a03ee6a315ac00400bdc3c83e866fb236854d" + "sha256": "68ab262ef0555340f29fb4b4d3cf985e9e97683cd430ab2f480f65f038587ffd" }, { "path": "package/dist/adapters/storage/sqlite-rows.js", "size": 9390, - "sha256": "491cdc0a889946b3448c7bfeb40c876d9fc05d4f721c141bd8c280cc6d364287" + "sha256": "eee0aaa06b11a706b69768588c0d47231bb0a051ca4a71e48386ae43cfc9f3c9" }, { "path": "package/dist/adapters/storage/sqlite-rows.js.map", "size": 9010, - "sha256": "5558c74f1aa902cb030f944822cc38e22267456514e398daf416fbe7b377e935" + "sha256": "8803cf211615e59b8a4ecc577ea404dee109559afe6e1eaa33dd0cca69eee6a8" }, { "path": "package/dist/adapters/storage/sqlite-schema.d.ts", @@ -1898,7 +2138,7 @@ { "path": "package/dist/adapters/storage/sqlite.d.ts.map", "size": 648, - "sha256": "33ee762ba00a8505af237c607ec3f70de3c3042f0cc2e198b4cb1ac48aa0a773" + "sha256": "bf6df7449f18b139ad924b83e3b54c75c773425cdcca21022f7318a17182d771" }, { "path": "package/dist/adapters/storage/sqlite.js", @@ -1957,18 +2197,38 @@ }, { "path": "package/dist/adapters/tui/application-ui-controller.d.ts.map", - "size": 1356, - "sha256": "6a4ee08467cf4c525563440b5762ffabce01ea2109007fd71f7e2ea7f5aa30f2" + "size": 1357, + "sha256": "f10f773ff9781196399caca6cca6fba620fa3d20a47d0702f021d79ce5c9e3a0" }, { "path": "package/dist/adapters/tui/application-ui-controller.js", - "size": 10426, - "sha256": "7072d9aa9ff71cc92248276779ac2895b856d0238c496925723d9da4f59bd8aa" + "size": 12306, + "sha256": "fa7bfd80f19cdd4b9b21165a855c06fe26500fd33c7ddb37c82043e72e095506" }, { "path": "package/dist/adapters/tui/application-ui-controller.js.map", - "size": 9666, - "sha256": "fa58391e6ec288b65b8f932c86045dc87b1412840281b10a3f8760afd8096be7" + "size": 11102, + "sha256": "4dfe3043f2094b2307f8a5a306eefa58f909a80d0c3eebc563c8df6d483092fa" + }, + { + "path": "package/dist/adapters/tui/native-terminal-transport.d.ts", + "size": 291, + "sha256": "9c2ceb65d279a4f22455177cfb3cc0707523ad77b2f1b8a5c2f8d1f9ffd3b826" + }, + { + "path": "package/dist/adapters/tui/native-terminal-transport.d.ts.map", + "size": 287, + "sha256": "262974db57cedfb81e61f3c717edcae8fdbdafc8cad55d1a93f6faf0652a3689" + }, + { + "path": "package/dist/adapters/tui/native-terminal-transport.js", + "size": 9689, + "sha256": "0208e7414a722960d9b2e892aacd5d7db9dae831abdaf6d33975bd1fb771398e" + }, + { + "path": "package/dist/adapters/tui/native-terminal-transport.js.map", + "size": 9350, + "sha256": "086305f8f82b31012e29ca38b6ad8cee89a264d92aedc884b8e8b0a6e92fb1ef" }, { "path": "package/dist/adapters/tui/profile-connection-dispatch.d.ts", @@ -1978,7 +2238,7 @@ { "path": "package/dist/adapters/tui/profile-connection-dispatch.d.ts.map", "size": 1857, - "sha256": "8e161764c887797ead7911b7a1b84f325ef8acda47e9b0a27bd4b897b5d39c93" + "sha256": "57e6064692b25c6b7fda66087e682fbefd2e52d2ae8b0857bcd9457240a12613" }, { "path": "package/dist/adapters/tui/profile-connection-dispatch.js", @@ -1988,7 +2248,7 @@ { "path": "package/dist/adapters/tui/profile-connection-dispatch.js.map", "size": 10664, - "sha256": "68e01ce0d8f0ae0b1bd089f6d9c19b06e3e7000be5a032360ea2218f11cb3033" + "sha256": "334887decc17b0f782e4d22f7677ae4c42e2545daf0248de15f1fbef35aaeb2b" }, { "path": "package/dist/adapters/tui/ui-automation-command.d.ts", @@ -2032,23 +2292,23 @@ }, { "path": "package/dist/adapters/tui/ui-capabilities.d.ts", - "size": 846, - "sha256": "b09e3c9f64d62188d953dd2afa1beaff683552e764143d85f2d2bd2aef3518e4" + "size": 943, + "sha256": "e33c9101aa0eb038b924b76bbe7931466c9176a27676dde2633ba17b3c2475fc" }, { "path": "package/dist/adapters/tui/ui-capabilities.d.ts.map", - "size": 445, - "sha256": "392739a9af3e39d3fb32d09520c348c1fd581a603a3ddb2dfa3bfde0653c5aca" + "size": 451, + "sha256": "21e370292ea6426ebf9f2b76778346c7b44dde5b18bdde7dac6886a45a56535f" }, { "path": "package/dist/adapters/tui/ui-capabilities.js", - "size": 8909, - "sha256": "b5f11054e7888f62301bdaed54510113d198bdd37a819485ab1b88b559e20bd9" + "size": 12129, + "sha256": "8c474ca2bec8dfd7c30bb01da355890dbb5308d855a6a10308d429c82c620b5b" }, { "path": "package/dist/adapters/tui/ui-capabilities.js.map", - "size": 6726, - "sha256": "a356d8d9dc1246bdf8d77fc6284dae8370cd3118cb866e34ccdc8d605362f91d" + "size": 9042, + "sha256": "7e6058230d6f6f2fa86c0388b65c7c7bda3d8d959e1c5c35e425cf2df0fed471" }, { "path": "package/dist/adapters/tui/ui-command-dispatch.d.ts", @@ -2058,17 +2318,17 @@ { "path": "package/dist/adapters/tui/ui-command-dispatch.d.ts.map", "size": 453, - "sha256": "2fb22d94030da6e516ee32fdcedec48a36f71c5422f2f06cb1be4428c962463c" + "sha256": "06da5a36448ade425152b32fc0f0e8178d8c2fd16010f3705da78149f5a99037" }, { "path": "package/dist/adapters/tui/ui-command-dispatch.js", - "size": 5553, - "sha256": "f84ab30c6b0438e80ee57d879a62ada1a4c81e17045bc859ce7410a9773d6642" + "size": 6020, + "sha256": "a704c3a0a6d76f2142b0fbc39874e6993c2e2ac385e8fa49ded3f9cb9a1c31c8" }, { "path": "package/dist/adapters/tui/ui-command-dispatch.js.map", - "size": 5211, - "sha256": "97ddbc0161cad21417fd6c5c27d5fd40005bb2e817e0700ce5a645ab229103c9" + "size": 5657, + "sha256": "083db6dcc0493668160d68edfc5a70733baeb89a08cc2a2172e02ba18be52fd5" }, { "path": "package/dist/adapters/tui/ui-conversation-dispatch.d.ts", @@ -2078,17 +2338,17 @@ { "path": "package/dist/adapters/tui/ui-conversation-dispatch.d.ts.map", "size": 935, - "sha256": "8457ec8172e22fdee293e7a53c289b9b18e90b47d76602c3028fb5d863d35823" + "sha256": "7ae67346c0b61acf02372fed08a6b073a7c707ef52a11d9f594180cd6c5b6dcc" }, { "path": "package/dist/adapters/tui/ui-conversation-dispatch.js", - "size": 14021, - "sha256": "e8484a9812bc1be1b7879eeeba3e9aa01e099580361a464cfa8f493dec811ed1" + "size": 17433, + "sha256": "b76a124d7dc2b4f29ed1159ca47f5b5d9d7e197a6aec55e02098383318881140" }, { "path": "package/dist/adapters/tui/ui-conversation-dispatch.js.map", - "size": 13030, - "sha256": "518a6abb0b0f76787393eda0547be438ea5ab328dfea827159b74ea73a956167" + "size": 16526, + "sha256": "e17294cd493d8819fe2e2bd70687c3c2ef4e0fff54767dffbc17d1fd71b027ab" }, { "path": "package/dist/adapters/tui/ui-core-dispatch.d.ts", @@ -2098,27 +2358,27 @@ { "path": "package/dist/adapters/tui/ui-core-dispatch.d.ts.map", "size": 522, - "sha256": "d13d2913aabc67bfb7e80e23168b646bd395ca4724c5307fa7f6aea0c80c7d4c" + "sha256": "89ec7ea3ead9585abaa16e13f013340be7d8cb82f42f63280cac1f499d2a25e0" }, { "path": "package/dist/adapters/tui/ui-core-dispatch.js", - "size": 11338, - "sha256": "0b4cf54099303f42a4efae87530929becfe09efc9bfe5f8b7fef63c641d2fa8c" + "size": 12232, + "sha256": "4f1b90247ef73078dcb22781085ecdb33f09cb048340c7e4ae8ce9181e728d0e" }, { "path": "package/dist/adapters/tui/ui-core-dispatch.js.map", - "size": 10009, - "sha256": "5008cf48a577625f8123f946f2e40fd9e0a2f22d2d0a605e1198edcc816effe0" + "size": 10962, + "sha256": "87a932a217669a7d207726a79766b730624f46278c6bced42861f89fc39af58e" }, { "path": "package/dist/adapters/tui/ui-dispatch-context.d.ts", - "size": 959, - "sha256": "640671dbc5eb7bd0b3d483c0c51cefe5c26e45905c0c985c92fa33752fb9e962" + "size": 975, + "sha256": "c5e71ce69165d850857c3ddc01d557871ebb00b524450b3af30d9579d2e1432f" }, { "path": "package/dist/adapters/tui/ui-dispatch-context.d.ts.map", - "size": 906, - "sha256": "a5e5d26b9d8c74ffbb8f43a0bb658abfc26301caffbc49d3604639d1d26933fc" + "size": 931, + "sha256": "4eebbafcdafcaba06f1e79b8c5e186abbcc9408e722e4c3b0715c0371c12955d" }, { "path": "package/dist/adapters/tui/ui-dispatch-context.js", @@ -2178,37 +2438,37 @@ { "path": "package/dist/adapters/tui/ui-entity-details.d.ts.map", "size": 367, - "sha256": "68d3ae22168cb4682ec822e58714d1812870b28f885882adf0cfc77ae0a78960" + "sha256": "ac941fa28e5dbe47801aa91caf507a3476135bc3e0599ad647324c306a34512d" }, { "path": "package/dist/adapters/tui/ui-entity-details.js", - "size": 7251, - "sha256": "69151cbc0b7f989d5436284f2a753b4025aa4e09e754c13e976f7d113651bd8e" + "size": 8149, + "sha256": "13d099e4a3acdd543bcdba30ce1c5400f19b123b2ef71925fdfff69742c2ce39" }, { "path": "package/dist/adapters/tui/ui-entity-details.js.map", - "size": 7394, - "sha256": "c3c79e51248a499961add1b925b82768f643127699b50c9c1bd9586e13668394" + "size": 8211, + "sha256": "0cead7a199e4f2d6e9a705cb829b5d6d1090a8c570ba86fc937c9e8c6f7314cf" }, { "path": "package/dist/adapters/tui/ui-fixtures.d.ts", - "size": 1600, - "sha256": "dba147877b7c0989248670c12530cb4f208472d195f0ce3ad8fc2a8bee888588" + "size": 1616, + "sha256": "2f256ca96a9958fac6017c8525b9ae0b66c26f862ad4add948fde877dbca0fb6" }, { "path": "package/dist/adapters/tui/ui-fixtures.d.ts.map", - "size": 594, - "sha256": "7fff3586cdc106bef66c2ddc1fc4d308b371e77885ee9ea78f82d0134c1bad5c" + "size": 605, + "sha256": "f625b08b0151be5b3be841ea780b745ae7b74012ac829bf37c60683c2a3a6a81" }, { "path": "package/dist/adapters/tui/ui-fixtures.js", - "size": 10662, - "sha256": "cce2e53d28f76b474638a1aeabd6b74db8436db6fe34118d4a586c15838ec275" + "size": 10487, + "sha256": "f3b4549a2d9a92ef721405035a02b946fca07db0df7ce148c772c1e55293afee" }, { "path": "package/dist/adapters/tui/ui-fixtures.js.map", - "size": 7714, - "sha256": "c9f0c75d2dae6ff6baa67b315360fd17b4cd1900a59abf1a81737d0a119939ca" + "size": 7652, + "sha256": "64f0ded3779e1a7517019b90d240326e3c902af8f2f853e67f3910561cf05857" }, { "path": "package/dist/adapters/tui/ui-headless-dispatch.d.ts", @@ -2218,37 +2478,37 @@ { "path": "package/dist/adapters/tui/ui-headless-dispatch.d.ts.map", "size": 457, - "sha256": "672df60d8048e51e92f435b490baeb4f1ccefcbd9ddcc801b3ba79b7a8428e4e" + "sha256": "f8a15a79e841a0c8dcb67977a0dac925aca07b83bfd9bb139fb5d69a6a2c3e6c" }, { "path": "package/dist/adapters/tui/ui-headless-dispatch.js", - "size": 9512, - "sha256": "d0ceb080301e6822c59ae442f345f6dcb5023c66f84c349d53b70b7c53d24c72" + "size": 9871, + "sha256": "c166ce18e353599875c2dfc03e100b4c066dc373ddf1a6c07fbb04a03fcc2557" }, { "path": "package/dist/adapters/tui/ui-headless-dispatch.js.map", - "size": 8528, - "sha256": "7d1d5fe21d72e8c51ecd3bdcf6eccaa7b444dcd9e9a17baa053af68af39690ee" + "size": 8758, + "sha256": "6c9974b491ddae53ac31d598de63e86f8c54fae6b5202a1bdc6bada60cdd6561" }, { "path": "package/dist/adapters/tui/ui-intelligence-dispatch.d.ts", - "size": 622, - "sha256": "3ca5fd7a3cbe7eda37e15b11ece0929a32e19c3df4251b1713722b11301f5d94" + "size": 731, + "sha256": "06e0299b09cf38a9c36d3bf823540177b3e6a7e4ff62f09991fcb7a5f3c10c95" }, { "path": "package/dist/adapters/tui/ui-intelligence-dispatch.d.ts.map", - "size": 636, - "sha256": "cfcc60ba650daa6f7e1481932f17693d68e33cca23921dda8ea232457759750d" + "size": 725, + "sha256": "035fecbe74caf19a3a87687a200a745c54582c1e6fbc7dade2f6e3111ef93ec2" }, { "path": "package/dist/adapters/tui/ui-intelligence-dispatch.js", - "size": 16091, - "sha256": "1abf86c2baa70055557711269585007cdf28e42a301abb4e1b0a1ab5489bca26" + "size": 21281, + "sha256": "8d22f53c7521869cb8fe56dfddc0ff21153cfbf4de942530454f7b90c119260a" }, { "path": "package/dist/adapters/tui/ui-intelligence-dispatch.js.map", - "size": 14939, - "sha256": "3775af77c52e93a9f56a14384a6b75e9d465808aeccf170ebf277023086844a0" + "size": 19054, + "sha256": "a21d1671c73f0a27faadb1691fc312ecaae01d2cdc107d2b1031dfe0da579a55" }, { "path": "package/dist/adapters/tui/ui-intelligence-fixtures.d.ts", @@ -2278,7 +2538,7 @@ { "path": "package/dist/adapters/tui/ui-intelligence-result-view.d.ts.map", "size": 493, - "sha256": "3bf9fa7f0384234150be01d957cc61c5a033caa3ed2e1e4965d070fde0d2e590" + "sha256": "306053a105e9e3f8bcf94f3599d6eb9996ba7924810a829c97d2c606dff1c146" }, { "path": "package/dist/adapters/tui/ui-intelligence-result-view.js", @@ -2288,7 +2548,7 @@ { "path": "package/dist/adapters/tui/ui-intelligence-result-view.js.map", "size": 6662, - "sha256": "8a3f8aa79d8c932cfb4ece570da289f463a795319dd8269c8140adc2982d2393" + "sha256": "6e1655f4a7ccf5c4ccbbe0abf601b13f1e69ea693c690941facf9f44130cb9dc" }, { "path": "package/dist/adapters/tui/ui-interaction-receipt.d.ts", @@ -2312,23 +2572,23 @@ }, { "path": "package/dist/adapters/tui/ui-projection.d.ts", - "size": 1530, - "sha256": "61a742883c3de50ab44cc1048333ad028e3d3adffdcdccc3210600227c92e73f" + "size": 1746, + "sha256": "373b1b2e92ad4ba586cbd4274f94ed309c7f290d114ef1df1e7b2d953fa39e0a" }, { "path": "package/dist/adapters/tui/ui-projection.d.ts.map", - "size": 1420, - "sha256": "3dcf8a90f96aee0b2d8781cefac8997864c8c8d8b723c6bce4695d173afa4fd6" + "size": 1539, + "sha256": "0075b21a3109276e4fc27ab71b1ad54dc69e83e7ece719fdfbc00cda2daad136" }, { "path": "package/dist/adapters/tui/ui-projection.js", - "size": 24137, - "sha256": "13221a70667c4f51bf96adf829050390b5a3028849a0cf0de1e2f54c44368116" + "size": 32493, + "sha256": "65a1c05ec4cc83d25b5e28c46296a01e4e4e7555b21572e17b97ae34b17a1170" }, { "path": "package/dist/adapters/tui/ui-projection.js.map", - "size": 25155, - "sha256": "06951a7cca72682a76585a08676ca8d120e32be64bcfe2476cf6cc91a77e6d46" + "size": 33537, + "sha256": "0d1fde115155ca211c44dd490de619a745a18f671b381728cbe813d1b583df82" }, { "path": "package/dist/adapters/tui/ui-semantic-state.d.ts", @@ -2338,17 +2598,17 @@ { "path": "package/dist/adapters/tui/ui-semantic-state.d.ts.map", "size": 359, - "sha256": "a243e63a4ba1bf129a622346e5db9cabde264a0fb8fb10ff24365f482a887fb8" + "sha256": "e4c67207b74a82885c9ae08c1579f999ef025f42b6e410d3a3bf48d167f36eaf" }, { "path": "package/dist/adapters/tui/ui-semantic-state.js", - "size": 3695, - "sha256": "2c7aa1b91d211aff25f251c614b7abfb8af94c85834bc9bc4cb95001dea361e6" + "size": 5329, + "sha256": "fc87e3455accc16d47dfccce510772214feef572994a378f2abdd84eda8febad" }, { "path": "package/dist/adapters/tui/ui-semantic-state.js.map", - "size": 4262, - "sha256": "f7242727e725b5eb430cbeb61b8b86d4f38a3cef312b62aaf291509464be4e8a" + "size": 6210, + "sha256": "339fc15143d3589b5db3ae921e11330c3b3fa85828d36d90fa7ef8d7c2e5d9f4" }, { "path": "package/dist/adapters/tui/ui-subscriber-delivery.d.ts", @@ -2372,23 +2632,23 @@ }, { "path": "package/dist/adapters/tui/ui-view-model.d.ts", - "size": 645, - "sha256": "93d10a1f26c98a7ef5bf935323583830fd2102162d05dc59d7fcadf7e600e639" + "size": 666, + "sha256": "3492353e942ae4fa836fb02c9d419ff07cd75072ea9d573f895997cc5f3c9fd6" }, { "path": "package/dist/adapters/tui/ui-view-model.d.ts.map", - "size": 642, - "sha256": "230bacc31d306f3b7a7ac6f0c36b64f1182685aeb32331fe228959fabdfa0e97" + "size": 658, + "sha256": "76f92fa5707e0f79ecb8caee70ae2fe6c0d3327a5bb4e3900bb771620ba4ada9" }, { "path": "package/dist/adapters/tui/ui-view-model.js", - "size": 7193, - "sha256": "9e8d77695eed148fd3db0c314b4064db1810489d5de399b55d4bb6c6c65a4ef3" + "size": 9153, + "sha256": "9324ce3505f2472123ae0620c4bd97b43b57fe172dc0817b1ecdbcf8c51b45ed" }, { "path": "package/dist/adapters/tui/ui-view-model.js.map", - "size": 6269, - "sha256": "679dba30a532e755766b7a8462508a7a2449065f1d501f418f568aef8d21f6b7" + "size": 8209, + "sha256": "35eab179b7c594f91fff439d52600cfbfd3c4e8f316df9445b7b62cd48bdf498" }, { "path": "package/dist/app/action-host.d.ts", @@ -2592,23 +2852,23 @@ }, { "path": "package/dist/app/analysis-execution-session.d.ts", - "size": 1741, - "sha256": "87640b0e16524d7ea857b24feaa2247ba0f59fc1102b731aafeab5fc1d32e4a1" + "size": 1931, + "sha256": "c68722196aea75fcf74635d6784cd597b3619f1cddaa8567172eac6a684faace" }, { "path": "package/dist/app/analysis-execution-session.d.ts.map", - "size": 1411, - "sha256": "13396215f156d42ff0735378447680f940be31f3a95c440bb1da2156b31ecb6c" + "size": 1563, + "sha256": "e3fe64cce50803e232477837c657cb744ae45fa4574a0ab0174d72a51d5010df" }, { "path": "package/dist/app/analysis-execution-session.js", - "size": 2173, - "sha256": "1009e96f165c74d4b1d9bcd4669f3fd7d42e5b3701904bb6eebe885c0103ca1a" + "size": 2233, + "sha256": "81edfd10e928edd6f025cfd11322af8e957502709bd3d191534011105fd98145" }, { "path": "package/dist/app/analysis-execution-session.js.map", - "size": 2327, - "sha256": "a94e370d363090ceb8067718b35b334815d029129884034e113c8341663f9715" + "size": 2362, + "sha256": "700801c80c1ff5e97ad9a6672b850797b253d6cddeee63afb90ac7d92fcace37" }, { "path": "package/dist/app/analysis-execution-target.d.ts", @@ -2652,23 +2912,23 @@ }, { "path": "package/dist/app/analysis-lifecycle.d.ts", - "size": 1104, - "sha256": "8589d34aa4cfbdc202cf80ca1e9e8e3968cfe9aaf425117bad9ce68b8d698329" + "size": 1504, + "sha256": "3964a3726076f3cb345971a6516664681cab7e3e60d81e98f7ef67ff46b3cb30" }, { "path": "package/dist/app/analysis-lifecycle.d.ts.map", - "size": 1067, - "sha256": "7cbb1f4ec6930490aca893118035d4378ca934138547d479cfbeaa750c83c52c" + "size": 1389, + "sha256": "4424658c69b46751e462ff625ec55123bf1f5dd3d20d4df829fa1918540a6a8c" }, { "path": "package/dist/app/analysis-lifecycle.js", - "size": 4355, - "sha256": "d55386413b9dd0a4b50be207041659b80e2270af69e010d15160adffbdd1479b" + "size": 7550, + "sha256": "12c3bbdd449ac4bb5a62b45117c88e802476bbef24c5a38382e17ba5830b6705" }, { "path": "package/dist/app/analysis-lifecycle.js.map", - "size": 4086, - "sha256": "e2191b398d140d5a8fb0cff3a6555891ed56876443477d3f616d2f1bd7aa72c0" + "size": 7357, + "sha256": "f2e82029b23f23aaa015797d7ae7f379e3a71d527cd854aaff58923d223b8ce5" }, { "path": "package/dist/app/analysis-model-call-records.d.ts", @@ -2790,6 +3050,26 @@ "size": 10456, "sha256": "81cd4c55e1a608b848f634bb1bcf8e5626b71fb27c0351b48ac3b698ba39fbd1" }, + { + "path": "package/dist/app/analysis-retained-admission.d.ts", + "size": 529, + "sha256": "42a2860a09c96b23c68e03e66ab00059273bbd42e2ee328dc20331b4f79b1a55" + }, + { + "path": "package/dist/app/analysis-retained-admission.d.ts.map", + "size": 459, + "sha256": "6f542f83589f13a1d69c244a36e4e4ad3077cc8b505bd5c2a839df4783dd5903" + }, + { + "path": "package/dist/app/analysis-retained-admission.js", + "size": 3025, + "sha256": "bb633320c8d5d0708751170ead8c4c085846d1a5e790ba06d361101a27933323" + }, + { + "path": "package/dist/app/analysis-retained-admission.js.map", + "size": 2682, + "sha256": "2373729573de37fb3cb0b4df0df2e43fcd97fc7374d217108694b21edaa60608" + }, { "path": "package/dist/app/analysis-service.d.ts", "size": 1201, @@ -2798,17 +3078,17 @@ { "path": "package/dist/app/analysis-service.d.ts.map", "size": 1041, - "sha256": "10127fd5c52f8935aaa0a9fdadac8a42c4168e284f7ffcefc0adf087a730de47" + "sha256": "d68bf5e6b9a8a2d50faafb6a966f4c399b97803b29ff51161480507474503b90" }, { "path": "package/dist/app/analysis-service.js", - "size": 8666, - "sha256": "359ac6f5d8bc539e2e94e789a046ca032b5be0f2419dad474bbb2a67638e6681" + "size": 8896, + "sha256": "bf2b118956a019e4347ef22562fa7c98716553f09f2afa9ec7f753d39e38847d" }, { "path": "package/dist/app/analysis-service.js.map", - "size": 7558, - "sha256": "2671605691a955f0ee5c40ed7db6d3d1e1c499335e20598fcacc03fd369ae5a3" + "size": 7782, + "sha256": "d19a88a7a93295573bd65b9c3a0634dc6e7eecec363b774968e9095729bca662" }, { "path": "package/dist/app/analysis-source.d.ts", @@ -2818,7 +3098,7 @@ { "path": "package/dist/app/analysis-source.d.ts.map", "size": 1685, - "sha256": "bd8c057d0ab7d6d49bcea80a15c475ac93eb1accccc675bc270e1829e77b09f9" + "sha256": "9ffd2ef88341899135129e5816e00c4e7b5326b675fa6c90ee8040b1701d716d" }, { "path": "package/dist/app/analysis-source.js", @@ -2828,17 +3108,17 @@ { "path": "package/dist/app/analysis-source.js.map", "size": 12333, - "sha256": "e3ad38f99030b87cfb44d564b915c58f42aa6ad0c66ce3714e14ad303860e494" + "sha256": "28b77933f9dd5f3c225d92d48833eb53372b75983e215085c0e71f6ab8ba6c68" }, { "path": "package/dist/app/analysis-types.d.ts", - "size": 4888, - "sha256": "33bc4f0777ee09bb86c97a5262e182e8a3638e21d609b48025a1a2b9c1d0664c" + "size": 4973, + "sha256": "6aecd48d4d7e2450998acf9f067784cd5c81e75cc6709538eeb652e3764a5ac2" }, { "path": "package/dist/app/analysis-types.d.ts.map", - "size": 4431, - "sha256": "4e82a615dad1fbbc71b78fc029b88c126a2c86dd83bb16e010e47ca73cc4a222" + "size": 4483, + "sha256": "3ab6c1254f8ced89abc565f73b357c39c7d4f12cac8dc6b8dfeacd3ebd2e2479" }, { "path": "package/dist/app/analysis-types.js", @@ -2848,7 +3128,7 @@ { "path": "package/dist/app/analysis-types.js.map", "size": 945, - "sha256": "cbfb0fc550cb48654de46f64ffaf65c66a6473fef74033ce59a0920675886eba" + "sha256": "b1f56ca4cd8f79c4e5c8e4b3348478563ebf86c83c10c9276d427ed11e761df5" }, { "path": "package/dist/app/application-guards.d.ts", @@ -2858,7 +3138,7 @@ { "path": "package/dist/app/application-guards.d.ts.map", "size": 414, - "sha256": "131f5ddc4cff6faac2a0cee2522fb78ef037763664b3d830541f2938f211f637" + "sha256": "7042fbf9d0f25c31d0deb30731d91e6fb658b6d62d2a7a0291054411a6a9f7c5" }, { "path": "package/dist/app/application-guards.js", @@ -2868,47 +3148,47 @@ { "path": "package/dist/app/application-guards.js.map", "size": 655, - "sha256": "fd7ea17e5199865ba3058e2ac703d85955258b2c36eff4f6f7016f98f010f6a2" + "sha256": "490be594239896b0132c4fa2b2237dd9c6e35e7798c5567f3b8541c24f20b598" }, { "path": "package/dist/app/application-interaction-actions.d.ts", - "size": 2166, - "sha256": "7457fadc0b22ef6b29edb73c507dd71ac30285cfcde81bbdc1ce5dfdd6b3b5ae" + "size": 2180, + "sha256": "d7a87bb56136aff00f9b490b5197fbf9be5aa65e67b01cd76278631909347dd3" }, { "path": "package/dist/app/application-interaction-actions.d.ts.map", - "size": 1872, - "sha256": "d462d611966a38fa5d3f1ef9258ddf966e93aaf750e4737ecd49ae2a329154d3" + "size": 1898, + "sha256": "87f9addde127ab68d4158a7da17a801e717ef61d7b21283687e93388b53f84da" }, { "path": "package/dist/app/application-interaction-actions.js", - "size": 3242, - "sha256": "1ef0137eaaa5ae65c52bc0178a9c3bbc8d34c9fed7fba8ee191eab82a7a2735e" + "size": 4257, + "sha256": "7cf4bfb5c00aaa9e94e173b80a002bdb0ed25b156325e6fb3beeb3ba8329617a" }, { "path": "package/dist/app/application-interaction-actions.js.map", - "size": 2963, - "sha256": "35924d626c199a85b310cb2d43d216ef69f7da0069104617ab3d00a0edf7d573" + "size": 3825, + "sha256": "acc6893b6815a9aa185f0f422bd5150474046492ce34408d24db714333125bee" }, { "path": "package/dist/app/application-lifecycle.d.ts", - "size": 1218, - "sha256": "daa31eefd341ac36090a64ea8387f421ba5e24a4644e0b7df5ce8aff6212f411" + "size": 1277, + "sha256": "ce8943007a5612dfab9fd303b627a72aa6807b0fdba74f744d4f6d8efbf84c93" }, { "path": "package/dist/app/application-lifecycle.d.ts.map", - "size": 1181, - "sha256": "4a23961b41d05f5b8fc92554f9579a9a8b8902787b600c6e16d207997ad062f8" + "size": 1247, + "sha256": "d1949ae684ec7936e6b575b75d50836b0f492ed62750d1dc4df8328a87545acd" }, { "path": "package/dist/app/application-lifecycle.js", - "size": 3891, - "sha256": "08034bd53cb368a98449346e94743e70124c99c5af5b2f811cbb0518838e5306" + "size": 4001, + "sha256": "fad044fb4b978e5bba2a952734ed9d95d1248e0d61c63854b198eca6b98cbcea" }, { "path": "package/dist/app/application-lifecycle.js.map", - "size": 4413, - "sha256": "0b467b9aa3df66d2751705bb1391090ac4067f07780910ef67109c526e00fb90" + "size": 4550, + "sha256": "000e6ac307832aa9fd4c25896fb22a2e513aee3b4803071dbfa1e9cb3779dcf7" }, { "path": "package/dist/app/application-options.d.ts", @@ -2938,17 +3218,17 @@ { "path": "package/dist/app/application-port-builder.d.ts.map", "size": 2295, - "sha256": "a7b96be4fa89040a0e7fb2a441a0422e45c59023508d08bc939897db841895eb" + "sha256": "64c5af3298e0f66a5e7f77abd1c28e8ba3ebd47e303787afc81ce171a5544afa" }, { "path": "package/dist/app/application-port-builder.js", - "size": 2762, - "sha256": "e0c41f1916a5590874496533ae5738adb9fa976756ab12d9c8b5a3f5f9e47c73" + "size": 2971, + "sha256": "d8b95fba34239f4894505c23d652478dc5803a350bad30281fb788bb0d88c335" }, { "path": "package/dist/app/application-port-builder.js.map", - "size": 2757, - "sha256": "3169c73a9c7c91bb9c6ac678ae1c049b58b37f6fcd8ddf887eca1d706332a358" + "size": 2876, + "sha256": "5506ec18c5f8d831c25adb84b94b5b82875fc210984dbf64764848681cb2200e" }, { "path": "package/dist/app/application-port-runtime.d.ts", @@ -2972,13 +3252,13 @@ }, { "path": "package/dist/app/application-ports.d.ts", - "size": 5198, - "sha256": "07473bf969fc45196d35601b8c454059008da13be87fb3c14d61704455262a01" + "size": 5560, + "sha256": "8b1541f6f598062c852a88c52c326c85c73a7e6bf3260e2ead31e117a59fc16f" }, { "path": "package/dist/app/application-ports.d.ts.map", - "size": 4518, - "sha256": "29929c71a97717503fc164ef281942937b9044ae5c23093f5f71f21c9c33d67d" + "size": 4730, + "sha256": "de91730c5c02e5aa4be2a44448f6cc83c485695f21b8204f0a018a2adf7acb15" }, { "path": "package/dist/app/application-ports.js", @@ -3013,22 +3293,22 @@ { "path": "package/dist/app/application-support.d.ts", "size": 3270, - "sha256": "1a9a4bf2b40924affdcd242cc9e739587738500e5573a46a2bcf1b986193eb79" + "sha256": "11cfa48bff5e945b0959dcff80273bea081821fc6eb4fe040d7e8051251b5f9b" }, { "path": "package/dist/app/application-support.d.ts.map", "size": 3031, - "sha256": "4b7c97001b39e369a3a7c423f73d27b254699d8bd980938ec91299189098bb99" + "sha256": "1bf80bcbdc9e8111d2f55449ebc113da4b7e6bbbbd6f0b18f86981f2bed6cbfb" }, { "path": "package/dist/app/application-support.js", - "size": 16150, - "sha256": "47cfe05bf12b3ea36310bdd92b6ac803b080102e1a3071a05a2147d905b7110e" + "size": 18919, + "sha256": "020ce131b3dd6fe095ca6785c893011f988eedec5fd69fffb8c22a6e8b821c27" }, { "path": "package/dist/app/application-support.js.map", - "size": 15113, - "sha256": "9aa0fa411c09a8ad5aa84a2e4da78d9fd6b45683f2744e488ad63ee514d534ca" + "size": 17589, + "sha256": "79741a33780dc743055943cacc77e8f4de66208ae0e82a5326b7f532f03bd9e4" }, { "path": "package/dist/app/application-transition.d.ts", @@ -3052,13 +3332,13 @@ }, { "path": "package/dist/app/application-types.d.ts", - "size": 3192, - "sha256": "3db3bbc4c3b09d5b55bb5b0ca081733e50b5846538ea0a4c98f18b7679464e77" + "size": 3945, + "sha256": "9e3b4024eb9868c1a5bdda5c76bbbdcef40014a16b7113449d6ec35b0f24ec0a" }, { "path": "package/dist/app/application-types.d.ts.map", - "size": 3081, - "sha256": "fdb066a4fcaa7fb09cb2a2a969aeac9ff7e020715e344c649d7f0111018b3563" + "size": 3445, + "sha256": "bfafb924864d02ecd1092d58c7478176fce916c7be2c6a184fdf070342ade322" }, { "path": "package/dist/app/application-types.js", @@ -3072,53 +3352,53 @@ }, { "path": "package/dist/app/application.d.ts", - "size": 4025, - "sha256": "c4c3420722dab227acb7a7782383319dd5f37449b379d40579be4886fed77dd9" + "size": 4256, + "sha256": "75f91211dd1e78c98d05a6fe936cbbf32de9793d95cce263badf415d976b6d05" }, { "path": "package/dist/app/application.d.ts.map", - "size": 3614, - "sha256": "4a7120afbe538f28092f2591f4e263e8504f9b9810534e51b4b17ee520750967" + "size": 3853, + "sha256": "9a784c4b1e331e661ac380b637544c4c0e88b4ec1baf1faeb603773fae54e890" }, { "path": "package/dist/app/application.js", - "size": 22387, - "sha256": "fc43ae827a6b8336ef1a2b905c742019bebcb24b6178a5fad39d3274ae7c5866" + "size": 24731, + "sha256": "b29577aa4aa0b43ac75b9aeef61a91a4e66829000bd8a663c329a96d9239c949" }, { "path": "package/dist/app/application.js.map", - "size": 20500, - "sha256": "45844db9eb7dc6fe59b56b64b6952c9a6611867bd13e4e6fed2b6c8f45eaa908" + "size": 22860, + "sha256": "b1d075f071bdc9dad6e8faf1ef1669502e9d4bdce3a0e0148b903c9599ac5bb4" }, { "path": "package/dist/app/automation-actions.d.ts", - "size": 3701, - "sha256": "fb8e07e90f9e731e90623d2c26c5b68b54f9c10e4e9f165891cac8d1d55c6e6b" + "size": 3715, + "sha256": "37739bafa0995265728a5bbce88b40a3e1b10b579540fac3235198a043799c87" }, { "path": "package/dist/app/automation-actions.d.ts.map", - "size": 3414, - "sha256": "36bcff13c50f0e91dd06bf58d801858633c41f9cd898f9e8571e494bcc7b9b3c" + "size": 3439, + "sha256": "6d00829165d51a1d5185b4b86d612b4b12968747c2f3c6fd701e93b19cca315d" }, { "path": "package/dist/app/automation-actions.js", - "size": 6172, - "sha256": "00ef1ac042b981f122e0d2c105dfbc15e190a6ce868b400e5d42adc12bfc3508" + "size": 6446, + "sha256": "fb12733c4c533075cffc463618c4f52e88dc39158f94725175f31fd73cd12ce5" }, { "path": "package/dist/app/automation-actions.js.map", - "size": 5708, - "sha256": "c76519d1488192364365c6742e35c21dfca42573573e51d1a90cb6bd648c96b9" + "size": 5978, + "sha256": "7900f82f7a4c4c292429ddb1023de22d1c2574ba5369b22bf7c710837670399e" }, { "path": "package/dist/app/automation-matching.d.ts", "size": 2141, - "sha256": "01e7437cf4468bb292bd450eece53bb230ed24333ccf811bd3869249b142cc7e" + "sha256": "2dbab5bb48931782e2cfd6f9da8b528298ed2e335913aee171d16a52cc04d014" }, { "path": "package/dist/app/automation-matching.d.ts.map", "size": 1736, - "sha256": "45ac959d35be3928e82590b75cb2b70dc2c2fbc11c90dd8fe7929024e315024f" + "sha256": "128ea4f137a1424041cd9dd2ba461b48c3e73b0a8ace0b5f7728609ac48107fc" }, { "path": "package/dist/app/automation-matching.js", @@ -3270,25 +3550,45 @@ "size": 360, "sha256": "c68d82f12b924ec07d25679231818bc797846839767a5bc67d777635f8b92df6" }, + { + "path": "package/dist/app/composition-options.d.ts", + "size": 1436, + "sha256": "441d755a8d7c4bd6116351a41b2bdbac7102be6dbc42f2c261da494300254ebd" + }, + { + "path": "package/dist/app/composition-options.d.ts.map", + "size": 1234, + "sha256": "c567ed0133db83aa6d94640ed97b2c7e6f00a9f17c2d055f85e63f7683d8e57f" + }, + { + "path": "package/dist/app/composition-options.js", + "size": 58, + "sha256": "51950878d9728bc0e56db6f3703de591803b65aa33ff115aa85ce8f9b6401c9f" + }, + { + "path": "package/dist/app/composition-options.js.map", + "size": 137, + "sha256": "4340a31d588464a5d7b88eecc21fca20410bc281c64d75962dde6847d82f2eaf" + }, { "path": "package/dist/app/composition.d.ts", - "size": 3542, - "sha256": "bd099db31cd067a06d27259d793178ca3107589d726972ac5b49c5e7b2b18a39" + "size": 863, + "sha256": "c827befe2d2f54e293e318cff727712803975f421afd9d253a709e85e7f8181e" }, { "path": "package/dist/app/composition.d.ts.map", - "size": 2752, - "sha256": "a847764f429f116559950dd4fa1850986cfa53d70f024067d80e43bb42ba62f7" + "size": 617, + "sha256": "13caa0616fe1e8946ef1e6d5bcbd0a581fb7e5c71697e7f8d4066993a73656a3" }, { "path": "package/dist/app/composition.js", - "size": 9010, - "sha256": "5dd0ccaf79c8237c4fe476c161640ad829b69c20eeca6b27b1ae0f671c7bb391" + "size": 5103, + "sha256": "8ee852b971ded8311ad13b27f8f92edf9307c7e3b8e59a297a18c3f075f397c4" }, { "path": "package/dist/app/composition.js.map", - "size": 7620, - "sha256": "c9cce0fdddd74d4b5b17874175da67b917e01f950dc0d164aa4eab9e901b820e" + "size": 4207, + "sha256": "fb433f2dca46cebabf916be9318a990237bb44a717b917680b5ac827be16712f" }, { "path": "package/dist/app/configuration-action-transition.d.ts", @@ -3298,7 +3598,7 @@ { "path": "package/dist/app/configuration-action-transition.d.ts.map", "size": 2200, - "sha256": "fc53bbcf5c04682e69712de21a4d1cd086568e367b3458b7d87568c22660e2ec" + "sha256": "f045b83ebebfa1c34b9467687a301ec03d9f0cfc7e0e957d8f5fcdc1c5fc0a62" }, { "path": "package/dist/app/configuration-action-transition.js", @@ -3308,7 +3608,7 @@ { "path": "package/dist/app/configuration-action-transition.js.map", "size": 3379, - "sha256": "a0c94604db964b938a270ad89ac59e1e0e84524b62505df76ad99aacb9ddc08c" + "sha256": "17064463d3c34411cf6e290c657e8a02d0d5894ccfb121d4e1e546c3562e9b05" }, { "path": "package/dist/app/configuration-session.d.ts", @@ -3318,7 +3618,7 @@ { "path": "package/dist/app/configuration-session.d.ts.map", "size": 2618, - "sha256": "8817cacfa87b5e5b0ce8506a89b51a3a145f7852f6d79cfd4d35573ec0862980" + "sha256": "c2d843bd6ca4391ba62561d07f66530f4bcefc269c1d8e888f0668f62956dbb3" }, { "path": "package/dist/app/configuration-session.js", @@ -3328,7 +3628,7 @@ { "path": "package/dist/app/configuration-session.js.map", "size": 8190, - "sha256": "fc024082369f95d41ce2cef8966c56870c5d79bf839e770e81970f307e22028e" + "sha256": "ff065f6ba5a49cb234ccc7e3aae6d15746026bac2a0a6d4c1df61c9cbd26f08f" }, { "path": "package/dist/app/connection-action-support.d.ts", @@ -3438,7 +3738,7 @@ { "path": "package/dist/app/connection-record-factory.d.ts.map", "size": 704, - "sha256": "3afe0669caec6d0603f81e610f0a1f14fa511beff14fd2eaef83d14af2d3ed57" + "sha256": "93086840439985d793de28a9d15cfa56c8730e940ed346006441008bc63f8cb2" }, { "path": "package/dist/app/connection-record-factory.js", @@ -3448,7 +3748,7 @@ { "path": "package/dist/app/connection-record-factory.js.map", "size": 1372, - "sha256": "340618c4a28e89ec1663c085f69331ed7d5287776f2cd6605f7801f3e1f79f49" + "sha256": "44a70ddf22a7ada47ba827fd602bd3626c4ead1fb0d527c87f9073063710939f" }, { "path": "package/dist/app/connections.d.ts", @@ -3458,17 +3758,17 @@ { "path": "package/dist/app/connections.d.ts.map", "size": 1129, - "sha256": "0e48c1cdd1cb3a607c5d6fd70da24fa159424a616c350a2544a9497bf683e2f0" + "sha256": "37430c078ab5093715d69cdea4fe539373f62e71690d106a5362375ddcb2a32f" }, { "path": "package/dist/app/connections.js", - "size": 8176, - "sha256": "76f63695134bcfccd148646ea316d34edaf292bcfb56c4d7d19f1595bba1749c" + "size": 9151, + "sha256": "4e00adb571a18511f7d7de4ac9c084953d24b144fe16839a740db717f453cf97" }, { "path": "package/dist/app/connections.js.map", - "size": 6940, - "sha256": "da1fbff2c7abcedce3bfaeb7c8ea61cc740a8dddb98b742559ac6f9bbd90d102" + "size": 7617, + "sha256": "f1bd1f8c94c315974bd7a71ebefe0afd74ca6ca49c41d33b038bd626e16eb8ae" }, { "path": "package/dist/app/control-effects.d.ts", @@ -3482,73 +3782,93 @@ }, { "path": "package/dist/app/control-effects.js", - "size": 7660, - "sha256": "2686d57c6465392979e21132f5314419b14607655420e4c54066b54ad36db335" + "size": 7931, + "sha256": "0aaa8cba88749b82b2cf1ee4445c5351e4fa12fb09db46bab52a5bef32a9f0fe" }, { "path": "package/dist/app/control-effects.js.map", - "size": 7212, - "sha256": "1e6f5f95447da168b582ed9919d4d2a464b1767b70d6b3f40be9b347bb94c3a2" + "size": 7496, + "sha256": "4bbb744e43b89b990e7224f695e6aa8118a5d933bb1207b3a063d3550d7a71e6" + }, + { + "path": "package/dist/app/conversation-branch-effects.d.ts", + "size": 862, + "sha256": "4220518c1bafff9c8d10bd14c834c9914fa055bd00c1e397c70a1a3262591d45" + }, + { + "path": "package/dist/app/conversation-branch-effects.d.ts.map", + "size": 714, + "sha256": "c337651d665ba2628e784c6e42faed5ef9c9b761f320def8fd345b929a19a06c" + }, + { + "path": "package/dist/app/conversation-branch-effects.js", + "size": 38435, + "sha256": "3fe2fc5ed338092c8e6c514516a8139118d222a9358e806d80763a384ecb59a0" + }, + { + "path": "package/dist/app/conversation-branch-effects.js.map", + "size": 32858, + "sha256": "90f06900bab6b119b0271fe4c547d1ef05b30294d3fcd7f35e2f044cad99da89" }, { "path": "package/dist/app/conversation-branches.d.ts", - "size": 756, - "sha256": "b804859c5e91c7fabcbc2c5b9bf4a4cd7f4d098390f32354a9043769ffb6fea7" + "size": 1003, + "sha256": "44b29013fe74bd213dff607af5ea7b08887f7377850982906994f652fd77a0b1" }, { "path": "package/dist/app/conversation-branches.d.ts.map", - "size": 748, - "sha256": "d4279b4659e7485ca19ec5322a4cf38ddc5970bf7f83515b63fe867649af8fb7" + "size": 881, + "sha256": "fd384f809f03e657bd0f6e1a8de117c61235a4479274d4f735de563769e5975c" }, { "path": "package/dist/app/conversation-branches.js", - "size": 12944, - "sha256": "3124514d43e886ee583c38fa31784721fc15b8310a21882518c9682f9ebd7ab3" + "size": 22025, + "sha256": "027d9c8c21078a0a5c68fea534c34366cfbe8ea78448ae7345ae97183fd6ae60" }, { "path": "package/dist/app/conversation-branches.js.map", - "size": 12279, - "sha256": "d96b6b8dbc83bcdcc0c609bea73e9a5c9287379fdc3dcfa5f1ce5ae36a87ef24" + "size": 20407, + "sha256": "e05fbb5d87dcc177f9cd097bdeed4f86bdc5350b40f07028d529e01fb2d7bf65" }, { "path": "package/dist/app/conversation-composition.d.ts", - "size": 787, - "sha256": "11c4f171587d694cd3fd8e8e8628e7387d45d3577007750749b0cd9f62dcd31f" + "size": 1004, + "sha256": "2e126fda2d102d889a0e74578df76f3230a03b9dcd01960c41452135fb25c2f0" }, { "path": "package/dist/app/conversation-composition.d.ts.map", - "size": 851, - "sha256": "31de14552ef6d1546ca5b0b02afe02203a67f13b4c153a6d92f16fcc8d5645b8" + "size": 1040, + "sha256": "daf280381fada65c0b2a7e012b62839b4c9066797f8d6fae00c575cfdeb527da" }, { "path": "package/dist/app/conversation-composition.js", - "size": 1396, - "sha256": "cb295bcd7276f0ec0e506f5a6192c2a273bd297457ed47bc215a8b7a26318099" + "size": 1545, + "sha256": "7d63826fb75d5ce71716cc437a1fecea3bc2494491a9ecdbe852af810feca87f" }, { "path": "package/dist/app/conversation-composition.js.map", - "size": 1038, - "sha256": "965607fb0d7e567f553deef56263b8682007ce84597c664393167a96e75c1b74" + "size": 1270, + "sha256": "8bbcce036b085f2bd4ad5b38908520a88573ca87beb5ef88618180e402776a15" }, { "path": "package/dist/app/conversation-context.d.ts", - "size": 592, - "sha256": "1f9c6996180c1cabf0eb1bd3fffc2fa33a8729c563fb3be8ae6e8b27e5573f45" + "size": 1380, + "sha256": "50089dc059c93d09128604e87fef6efc2ae124d8bc688fdcca303b549ea46a63" }, { "path": "package/dist/app/conversation-context.d.ts.map", - "size": 538, - "sha256": "100df5333f9bad226fada4d0dac63c2be757bc897770648f8d04bdfa6cbf425c" + "size": 986, + "sha256": "c75d4d97360030d4d6d0a3ba2c76558d73f3f1c465c38d8f1778927a81a85542" }, { "path": "package/dist/app/conversation-context.js", - "size": 9194, - "sha256": "3df88fc0478d3473ef80ab240ed2c9db61cc9153e0b78306b1a8254d4218a274" + "size": 20841, + "sha256": "2aa16eaf3eb2ff2d1cc650072f44105f56632ca039995bf71eb5dfd530249d29" }, { "path": "package/dist/app/conversation-context.js.map", - "size": 9331, - "sha256": "efa63f57fbf57603fc067d604dd7b346680ebc3facf7d6bcbce9ddf390c4313d" + "size": 20256, + "sha256": "f499c7fb2eb2dcb4f299d4dbe186008e83c3e435d193983c9e2183e32e29203e" }, { "path": "package/dist/app/conversation-drafts.d.ts", @@ -3618,17 +3938,17 @@ { "path": "package/dist/app/conversation-import-builder.d.ts.map", "size": 742, - "sha256": "9bf4e14c22f386ff2bf25ca01bc4c16d7aee3cd25a08dc66e38c3bbe78c4c894" + "sha256": "d40322fc6184c560eed49cb1a56aaae2d9202701b01fb369549109f38862e8d0" }, { "path": "package/dist/app/conversation-import-builder.js", - "size": 9301, - "sha256": "6e4676b5530fb8631c0f614e1db47d6750fd873b09842cb92488df8c3ca55165" + "size": 9234, + "sha256": "3911a97a851eba627ba67a18fd7f3d974846ea0f733ef4d3e144d077caa46a0f" }, { "path": "package/dist/app/conversation-import-builder.js.map", - "size": 7721, - "sha256": "cac83763473f0c22d10cf0a7ae3f9bb53ff3a2abe718ef6337649ca871ad5c17" + "size": 7656, + "sha256": "5cc5135b5ddfc554e08e72616a1e473f26c80423137340193c804fe20521668e" }, { "path": "package/dist/app/conversation-import-document.d.ts", @@ -3702,13 +4022,13 @@ }, { "path": "package/dist/app/conversation-import-runs.js", - "size": 15278, - "sha256": "9c10dd846d95bd5a2831ef73d9a6b165ced7d08427041a4ae5569a038a8b08df" + "size": 15359, + "sha256": "9bdaedc3ab463d4ca3c2f8efe45ec437122bc37133b588b0e3760a428bfd3c47" }, { "path": "package/dist/app/conversation-import-runs.js.map", - "size": 14433, - "sha256": "05cce2c933b2be798544080d510cfed7ca46781154553c98109fa8a985f0d6c2" + "size": 14554, + "sha256": "651e388dc22d5557f97c27f85ec2011e65610e179cd05314100d41414cf21acd" }, { "path": "package/dist/app/conversation-import-validation.d.ts", @@ -3778,17 +4098,17 @@ { "path": "package/dist/app/conversation-lifecycle.d.ts.map", "size": 885, - "sha256": "a9628197a5ae2e83e7da5ca594ca9e5d2bbcf3adb152f59c7229de47fe08851a" + "sha256": "4652650a70013b17d76415fa1a7f832d61d5dc50e35af4a8051c202b59517c5e" }, { "path": "package/dist/app/conversation-lifecycle.js", - "size": 14478, - "sha256": "0717ad9083a658176e68fdbf5a489fdd08ca5cff811fa6610823a437b958d3c6" + "size": 14672, + "sha256": "243432cbd3a90c6711c91dabee8f779ba55ff1b6809809a9c707e147f0c88b39" }, { "path": "package/dist/app/conversation-lifecycle.js.map", - "size": 13073, - "sha256": "2ccdca3c75af53221ef15d3d3458daab54d3f2bd944793b934d50ee18a2ccd0b" + "size": 13199, + "sha256": "326ce196fb522df63b70993d9e52b53100763d37d65e460fd8eabe65f30bf9cb" }, { "path": "package/dist/app/conversation-operation-coordinator.d.ts", @@ -3812,53 +4132,53 @@ }, { "path": "package/dist/app/conversation-records.d.ts", - "size": 1457, - "sha256": "75ba551e7fbd28ef8a665dbb9137862dcb360790d6e95f5cad1634edd869c5c5" + "size": 1485, + "sha256": "eff75250b9630e8c19dddc525e09bb67eb5f88b5506fd5fbfd23c19a4999123f" }, { "path": "package/dist/app/conversation-records.d.ts.map", - "size": 1498, - "sha256": "f0590c78a3151e08fed7a2da0c9c12361f5743890f75ebe62e655572cf3ebff6" + "size": 1541, + "sha256": "aaf63af1219ab9e350f6924f62435f88819ff2c8139ab988036667a8711c8fdd" }, { "path": "package/dist/app/conversation-records.js", - "size": 3794, - "sha256": "225ca1d0ecba94b1a7141740a0cdce6b0d73a04ca34bb46e9ef2c5d4f2c25e60" + "size": 4834, + "sha256": "fa11a72354de9f5bf2bd573aed360f50e86ee6e3a82ab79502ceb44d231c6afe" }, { "path": "package/dist/app/conversation-records.js.map", - "size": 4215, - "sha256": "580a7739b483e9ceb1a941fb20732c1eae04497e219a0b4196af3b019a4594c8" + "size": 5188, + "sha256": "17a17c5cf7aeb4fbfe9c2fe8c810d6e5280bc220718bd6f6ca2d7788895b8c91" }, { "path": "package/dist/app/conversation-support.d.ts", - "size": 2371, - "sha256": "02eb98d5536bfe116a073152338d3c7c8f9a6ff131c52fca7f0f495412df9efe" + "size": 2292, + "sha256": "1348d2565796331289a3c1e496f907a1c094479818ba57de544651547abab715" }, { "path": "package/dist/app/conversation-support.d.ts.map", - "size": 2201, - "sha256": "318495f5a95534549776f5d2a0ce0e22fc98eae92606ed59d4f60c4d15872d41" + "size": 2128, + "sha256": "670ed7157e76add54139aa1451ac606594fbd504ba6547c5ae4f41cea14925ca" }, { "path": "package/dist/app/conversation-support.js", - "size": 4199, - "sha256": "7f3d78a6bef9e79efeacc3d365b978ac39f7fbc0cfa856045fc930070a911999" + "size": 4014, + "sha256": "5a61ca4fcaeb68e3c9ec8b4a903b2aa74e4524057f00024f5fcff404ecf73c50" }, { "path": "package/dist/app/conversation-support.js.map", - "size": 4329, - "sha256": "e4dc4c625afa714ce6508c306795cae52aa7aaccf2e4c0f01a782e5d4737089d" + "size": 4158, + "sha256": "45ee762138499d7a1bc6396c45fdb846cc60b64eca8cdea6a5bed202bc7fc622" }, { "path": "package/dist/app/conversation-types.d.ts", - "size": 3279, - "sha256": "dca36445d8f572586c116c63de8e11438847eb93a733a73fe3fe687ccd3b613a" + "size": 5210, + "sha256": "487b36073d5f0e95af679b740138a2c535c40d3e47cd2a4f7522fae72be162be" }, { "path": "package/dist/app/conversation-types.d.ts.map", - "size": 3365, - "sha256": "88f32ca7d631acc6f69f215f3d1bf88a57b02cf017011325a4473676c1d1bb54" + "size": 5032, + "sha256": "c31d802245a75393cb546ccabf2e2b44eb00474b501003ca94b91b07e362cc6a" }, { "path": "package/dist/app/conversation-types.js", @@ -3892,13 +4212,13 @@ }, { "path": "package/dist/app/conversations.d.ts", - "size": 1628, - "sha256": "de8d8d448a6fd9975df48b988ea75da49d42fbf47214ed13c3d77ec0c9536df6" + "size": 1735, + "sha256": "eda2a2180f80aeed41f84f92d9b342c469fd96bf3b6764adb9f84f413ba5e22b" }, { "path": "package/dist/app/conversations.d.ts.map", - "size": 1078, - "sha256": "7ae3d9cb456e97d21a2fe5488a3ef0c4f43c100b17f998b979c22eb6859ef5a6" + "size": 1130, + "sha256": "74e23af92d383da8ef969d8542a50e2590469447dea5bece355608c72610bb19" }, { "path": "package/dist/app/conversations.js", @@ -3910,25 +4230,45 @@ "size": 913, "sha256": "f2a26035fddd5c902ad2c0aa42ece21f6e8b61de0d6c82154fb033b00bff1efd" }, + { + "path": "package/dist/app/default-profiles.d.ts", + "size": 245, + "sha256": "44235eaa4b648e9642f46d56e2d322e8eb42bee4bf37836389049ce10b00ab0d" + }, + { + "path": "package/dist/app/default-profiles.d.ts.map", + "size": 284, + "sha256": "41659325c83a7147a319e7c1eb897ba9f2667df1d0d16ea947b49756e7a0b954" + }, + { + "path": "package/dist/app/default-profiles.js", + "size": 584, + "sha256": "6c8ede70f95d1351c8824607e711ec6a6326945ced9c41ab1e9ec253d5fbd085" + }, + { + "path": "package/dist/app/default-profiles.js.map", + "size": 488, + "sha256": "dfab73857dbf60e041cf1032062e747c55be0e909656873d4dc6b6670e75f636" + }, { "path": "package/dist/app/durable-send.d.ts", "size": 1767, - "sha256": "431a9b1c1440ffa6e609cd1cffa779aba5554e1530b9db093020e46e2a75461e" + "sha256": "733e1ff84ccf13c13d254373851df4556e541c92d51c8cbf0b7d2ac6ce5ddae3" }, { "path": "package/dist/app/durable-send.d.ts.map", - "size": 1697, - "sha256": "ace0a99f1f0550ec8f2a62600a8a6a8055730ab62ade2c1d1d2dc403825e943f" + "size": 1698, + "sha256": "5353c2084df9f348db51b09e4c7edf4e8f5357316a19a532319adb61e4aa9e5a" }, { "path": "package/dist/app/durable-send.js", - "size": 4021, - "sha256": "b708d70c65e4e9bbfe4c4a684aa5d59be5a43f206e29e20ace7c0615877812b0" + "size": 4386, + "sha256": "c3636e0e0d2a485b726eb75f4a33c6bc338acaa73d8342ae8dd9e42eb0088afe" }, { "path": "package/dist/app/durable-send.js.map", - "size": 3776, - "sha256": "b23c1b6cf577fbb22b6fda1846b36e1195e64917adaefb9d4cabcdfdaae17b11" + "size": 4205, + "sha256": "d75b9eef8e41985e0237ab8463f4dc62d5204afe934cf8c520610f2fe439b8a3" }, { "path": "package/dist/app/effect-coordinator.d.ts", @@ -3970,6 +4310,26 @@ "size": 1110, "sha256": "c47e9e0b3d0c634b625c193d54970b544b4fad317afd55aa4a18dbd717f1e155" }, + { + "path": "package/dist/app/effective-run-configuration.d.ts", + "size": 920, + "sha256": "4fa3833dded7f4a00b364dfebfb0d88b8b48bdd3ddd43532156f8166c41b9887" + }, + { + "path": "package/dist/app/effective-run-configuration.d.ts.map", + "size": 745, + "sha256": "57c17a2bb2d1790f87ffa7b04fbf9ef44201e49b6a4874b65ff1095f032cea52" + }, + { + "path": "package/dist/app/effective-run-configuration.js", + "size": 2956, + "sha256": "3a6cdc3f335afab940934873fbe67f307b0900e1a846ecabfbdb2be31a7a6f66" + }, + { + "path": "package/dist/app/effective-run-configuration.js.map", + "size": 3037, + "sha256": "c8c57bd87c6f1baf7f9215647ce9e22ce8047cb7540bf4fee970b17263a002ca" + }, { "path": "package/dist/app/errors.d.ts", "size": 159, @@ -3998,27 +4358,27 @@ { "path": "package/dist/app/fail-closed-journal.d.ts.map", "size": 746, - "sha256": "1800cbf712fc5190ae59bdc7bb73cbf4ef458caa0d5574a63348a4084c03e4e8" + "sha256": "9f02c1f8f25f1a0c34ea2ff267aba0093c4fd14b32aaf5b4723c1832181883b6" }, { "path": "package/dist/app/fail-closed-journal.js", - "size": 1007, - "sha256": "4b9a99ff51be73621af905a8762eec202fdafbc5b45bb5ea7f562eb98d13847e" + "size": 1278, + "sha256": "76fac0557ab4fa66e712a15a0af1e317a8ea31b99fbcac0c289ce1b015ebf5ac" }, { "path": "package/dist/app/fail-closed-journal.js.map", - "size": 807, - "sha256": "938307c743f3980f369963212bd15ae553bd450c12918db700f2672d8d872ec8" + "size": 1078, + "sha256": "ae7ae930cc88fba4a67c63ae4858afdf989622ea525717a5cb9816665d0ae3cd" }, { "path": "package/dist/app/intelligence-actions.d.ts", "size": 1527, - "sha256": "8eb57deea943e3ea777d6410caf41600f5bc0a6e55c611698c56863b30290e77" + "sha256": "e619222b5ab9032346602699ebc90260874e17b5169ba0b09e1644898c536d3d" }, { "path": "package/dist/app/intelligence-actions.d.ts.map", "size": 1002, - "sha256": "0d85baee153f3cf4e32894114d1e1856ceb2482abc46b41162cff81d3124796f" + "sha256": "d144d0a043dac44b14b06bb913088549b5ef453c71340d126752025fd83f2dd6" }, { "path": "package/dist/app/intelligence-actions.js", @@ -4028,7 +4388,7 @@ { "path": "package/dist/app/intelligence-actions.js.map", "size": 1097, - "sha256": "32d2656a6388be0a204586efe124df7cde5dab1cfe5a3a9c471cbfc1dc6afd0d" + "sha256": "f6cb121045f859466b0a0181331736af6f86455bf8695673c7ed64268da9d596" }, { "path": "package/dist/app/interaction-automation-coordinator.d.ts", @@ -4053,42 +4413,42 @@ { "path": "package/dist/app/interaction-controller.d.ts", "size": 1648, - "sha256": "b44b7b750bf8b1a07694f245623cb65859df914e96b5ddc7ffb09ee8bfcd0614" + "sha256": "a71dcc238f654739cfcff4458ea99c053c997e574488fb58639a38b963db96ee" }, { "path": "package/dist/app/interaction-controller.d.ts.map", - "size": 1550, - "sha256": "8e634597f2ef0d877a530373ee3911afe8179042191ab2fd333a876ecb702658" + "size": 1551, + "sha256": "5ad3cbc894cf58b163671ba75bd76d338c43f6f3a8f0dab0b9dde8b83510ded4" }, { "path": "package/dist/app/interaction-controller.js", - "size": 9887, - "sha256": "063656c58597137cc23dc6d13c8ec6dad964a0f646c69917d6ecca7759a42714" + "size": 10246, + "sha256": "dfe94de01bbd3637ca3808d66905781d2eda8a09bac91168c48eca39deba5b43" }, { "path": "package/dist/app/interaction-controller.js.map", - "size": 8768, - "sha256": "732902a742ae6546888855678bea8b52ad8fe1cad698cc332004504f90204bd5" + "size": 8916, + "sha256": "2579edad54af54df7a6fb74861c9f2eb4a5e5d3a59a48df974fb7e00a71e292e" }, { "path": "package/dist/app/interaction-effects.d.ts", - "size": 699, - "sha256": "a71c33db0ed9f16e306f2b2239265fa167c5df52fbfa899b7e9a0578d1ec0bc0" + "size": 791, + "sha256": "b5b069ebe5e8e1bbdb6ddb306accb4e24693ab71bd81f89f6c10a656fa9a31fe" }, { "path": "package/dist/app/interaction-effects.d.ts.map", - "size": 652, - "sha256": "5aba23668c8ba7fc14741e5e9aa3aa9a3987569d04b3c2dc498fc22565a48697" + "size": 709, + "sha256": "06559053bfd35012ae6cc9307bb1760d42d14d6600423790b9d039601dbf9392" }, { "path": "package/dist/app/interaction-effects.js", - "size": 3430, - "sha256": "f6cc7a4c42585795cb5e8d6a561385d799e5064b2914f24e711386c7121726a1" + "size": 3566, + "sha256": "c7a1fb6fc2c1611920e373728c45787046ae606d195bf825106740f471f00d77" }, { "path": "package/dist/app/interaction-effects.js.map", - "size": 3125, - "sha256": "ea028cb80c92fc0578555525b369bb2ce4fed5c75a98ca8787db82da89bf6e1a" + "size": 3266, + "sha256": "be097a9a1c0732d82b1ce11249bf1ea4b50fc12d5bc79820f5bae18906ebc573" }, { "path": "package/dist/app/interaction-request.d.ts", @@ -4158,17 +4518,17 @@ { "path": "package/dist/app/journal.d.ts.map", "size": 1368, - "sha256": "e1e7eaaaa913ed7f39f567ec1b40a66e98258cd3b867f3df25cb451190ed7786" + "sha256": "42d45cc5f66bc6b38f12716a5f30266d3414bc7c47dae264ec71c25ff2ce916e" }, { "path": "package/dist/app/journal.js", - "size": 3324, - "sha256": "fc7a979d7dbb14b65ee3375bfa9215d7d0f91f1c4d9d0c0425690c5131e7f605" + "size": 3519, + "sha256": "313fc9cece344240b542e3bcb605d59c8161ba924be5c56af55ed6d35b5b0066" }, { "path": "package/dist/app/journal.js.map", - "size": 3436, - "sha256": "004251bc751ae546f952f1ff477afe579d04f015921aff71f49f33c8f3178524" + "size": 3641, + "sha256": "879573dab8d5b04cdc02a2df5a0bec967772107c8dc0db66e24e9b790e65bf5e" }, { "path": "package/dist/app/legacy-cancel.d.ts", @@ -4182,13 +4542,13 @@ }, { "path": "package/dist/app/legacy-cancel.js", - "size": 1929, - "sha256": "bc6cdaa3a25fc9ae57458846f56ae525a2e78ed1bf36445a5a7658b40b76f78c" + "size": 1898, + "sha256": "820ccea77e73a4ca1e9b3d53446790d74a2a678960a2aa9254d67fb48b2dd7d6" }, { "path": "package/dist/app/legacy-cancel.js.map", - "size": 1854, - "sha256": "5f4a7be556833b146d1191424e88593822570f038adbbb91a30211914f61294d" + "size": 1824, + "sha256": "dd32c33e280204094cb60fb649e4a7a3536c7f41e10d81777337555259cd5b06" }, { "path": "package/dist/app/operation-fingerprint.d.ts", @@ -4232,33 +4592,33 @@ }, { "path": "package/dist/app/production-composition.d.ts", - "size": 2228, - "sha256": "a1e5fd8a3b032cf3e8f350adcc94f90979518cba49ac756b497c983aed74e2ad" + "size": 2549, + "sha256": "065aeeb2a634ab9bb700625a52b54b09a8c51100025d08968a77d2919a344042" }, { "path": "package/dist/app/production-composition.d.ts.map", - "size": 1392, - "sha256": "efd65f3408f3f767ad24edc193cd048a1c842cd18e32800c8e945e219de98e1e" + "size": 1577, + "sha256": "d94af449f94806efddde537e5c0b062abcc16a617af0212d393199af9a817cb8" }, { "path": "package/dist/app/production-composition.js", - "size": 5582, - "sha256": "67a436ad1fe04c9145b7488cdeed6d3603748a5a24cd4b24bf0e34de98659f34" + "size": 10553, + "sha256": "282eb2f14dee2ed6dd0e2f7d561115e53df805065ec0ed91023acd5ce5e9a375" }, { "path": "package/dist/app/production-composition.js.map", - "size": 4397, - "sha256": "e0b52554bbe95022409c7c6cf3c3ccebec5456e87295f367c6d837c4d742bcae" + "size": 8061, + "sha256": "8f7c360503b306c6b170bf094e5f15b536e96e056b49ac85d0c68b981c3bbd8a" }, { "path": "package/dist/app/profile-action-support.d.ts", - "size": 4406, - "sha256": "31fc560af564b06a6462e0bb1a7ef6d289297d9e5196bb7dd563290628d29e7e" + "size": 4481, + "sha256": "06619ba62688030f03c4dbc3f2dce6d5e7247650b692605e84f86c22b9362595" }, { "path": "package/dist/app/profile-action-support.d.ts.map", - "size": 3349, - "sha256": "9a06a0aae7c92c9f529a5bb74bacb36369c1ab821e3c91b160bbc89b75a1be7c" + "size": 3351, + "sha256": "2b0850bf546c8131a1d1aa84299f9465f42ed09a7783e875e8ae770f042addad" }, { "path": "package/dist/app/profile-action-support.js", @@ -4273,12 +4633,12 @@ { "path": "package/dist/app/profile-actions.d.ts", "size": 2815, - "sha256": "e944560e5c72bacc7d79d22bd6067000354861e48f7a3fced802300b536263d9" + "sha256": "cd806c920d7ac34aaec1ba56e9d1dc7d423d0c344727c2f9c102d83518b00394" }, { "path": "package/dist/app/profile-actions.d.ts.map", "size": 2605, - "sha256": "b841eec6b6c075305643859146adf2fcde8470699dfc43431f773d048b883c89" + "sha256": "b0af63069bb4ff5812e7345ee349908539cc6d8461a57346198844995791b702" }, { "path": "package/dist/app/profile-actions.js", @@ -4288,7 +4648,7 @@ { "path": "package/dist/app/profile-actions.js.map", "size": 11434, - "sha256": "0075b5e108eac09922d0e0ffb12d023c2d30727494becead8f778f490f040763" + "sha256": "551da49273bea03e26a69eebea1f37886c6bbfbf28167c5b279abf77b3487bfb" }, { "path": "package/dist/app/profile-draft.d.ts", @@ -4298,37 +4658,37 @@ { "path": "package/dist/app/profile-draft.d.ts.map", "size": 717, - "sha256": "f697b0034c56613df2b40071c3eac3858c485b6820329218f24fcf9904b04f1f" + "sha256": "7d0795ed7254aa67def38a43d75487709494afbc3a54397feb35b78d472cf3b9" }, { "path": "package/dist/app/profile-draft.js", "size": 3275, - "sha256": "fcf302d43a458d18bf61f358f33da536fdb79995e83c94196261e41dd93e145f" + "sha256": "e158fe5df479416a68f294dbd278bd927102de5430701ed12a448aef23e273c5" }, { "path": "package/dist/app/profile-draft.js.map", "size": 3065, - "sha256": "d6b2b406c0f9e2aa322e1da94b806985182f382ec7b76b0026972fc3ed826128" + "sha256": "c7d9e50735652ada80f12c7756ff0d75cc3c3d017c65496571aee6d4159f756b" }, { "path": "package/dist/app/profile-model-settings.d.ts", - "size": 419, - "sha256": "d1569631d4dae9301dcea5ad1c679f409ba87169a62630ab5a6e7b0a5161a731" + "size": 512, + "sha256": "d8e68b6ccf2414bdf38bfd4a413c072a6534c735b07d1d3edd0754b01b380f43" }, { "path": "package/dist/app/profile-model-settings.d.ts.map", - "size": 387, - "sha256": "a253afec90c457cbbd74599a84fbe5f7a4ef5c8951803a2c905f6d8064aa852f" + "size": 475, + "sha256": "997ed72fdbdfea17a64030268d6b73e0fb01da9fd36c9318a73271b928cfad7a" }, { "path": "package/dist/app/profile-model-settings.js", - "size": 648, - "sha256": "e2291f11aaf8e88a108fdb206b00d6e403c677b3fa9aaaa958473f7069da137b" + "size": 1002, + "sha256": "3e1a05507623867d584f644b90ca2307f26b1e77dccddcaad1d8f3dd9985b8ea" }, { "path": "package/dist/app/profile-model-settings.js.map", - "size": 690, - "sha256": "e747d3d563ac1fc2b25cb6651ab5e67dba12369efae19e0d64317fec7de334bd" + "size": 1049, + "sha256": "dbf799df822bf12f265d8166178697d3fa3619bcbda4f40505f28bc083c6e129" }, { "path": "package/dist/app/profile-persistence.d.ts", @@ -4378,7 +4738,7 @@ { "path": "package/dist/app/profile-selection.d.ts.map", "size": 357, - "sha256": "c1374184c84dbd12f671c2f118d9ed7f6af3221f23d40c56da4642bde2d04818" + "sha256": "5dbbdaca43921a5b622b13f7168d36cbd90bbc320b8227a3a1aad00d51588913" }, { "path": "package/dist/app/profile-selection.js", @@ -4388,7 +4748,7 @@ { "path": "package/dist/app/profile-selection.js.map", "size": 5176, - "sha256": "2dba3bc570c6bc0cc7d9cfe2a69c72e8015316a11d365262117809d55cf73db6" + "sha256": "26db347c14953f9b129c652eeb39675fa2c0959ad308c13f7202c54a45ac6648" }, { "path": "package/dist/app/profile-snapshots.d.ts", @@ -4413,32 +4773,32 @@ { "path": "package/dist/app/profile-sources.d.ts", "size": 1629, - "sha256": "a96f2214ed2261147ea4a2dcf23c5daf9570d44aa6af784a45aeac11b7202250" + "sha256": "ede481f8ae3c36fa4774985fd51665042b8ff6155feecf049328939f18120716" }, { "path": "package/dist/app/profile-sources.d.ts.map", "size": 1142, - "sha256": "18ed9d07e76f57014cf62734a6e6765201e938ac1530e2b921c4e8b08788b6ed" + "sha256": "b38ff49eb6a324c1872816b17990b15d7acfd7f14740136114a741f6f762c23e" }, { "path": "package/dist/app/profile-sources.js", "size": 6121, - "sha256": "6c70c04de831cdbaabbf6a2deaf209499a0c1e3f5d24d1a0dfb8d7c5d801f125" + "sha256": "d0f8ac591ea43458016b028a86f7f8821b09e9b13850fcbf84b76b815241e7ad" }, { "path": "package/dist/app/profile-sources.js.map", "size": 6203, - "sha256": "d61b69e181bb79317ab90db0d8ad8123704d3a7d0679152fc5b80e0b9d0865cc" + "sha256": "2e5e012e39aa2b757b2e335de8e27ab3564446843bd4c4478bb42f42ea5f8d68" }, { "path": "package/dist/app/profile-types.d.ts", - "size": 9628, - "sha256": "cdf7d29d5ca4f4af86740476b332c9557db0afee48879a1dda6523e7a6696e05" + "size": 9645, + "sha256": "76949f65e54e3f2d5a422757527b454f3ddd5562ac6afa5936dc4915fca37721" }, { "path": "package/dist/app/profile-types.d.ts.map", - "size": 8508, - "sha256": "c190c65e1a377546b3e4e55475e46d8f22b6a1402e4c3e559d0d52e6a0eb277b" + "size": 8533, + "sha256": "52023fb8e6fe89303ee0ca45e488801caea2747ac003eb03b1bd97005c92583a" }, { "path": "package/dist/app/profile-types.js", @@ -4472,13 +4832,13 @@ }, { "path": "package/dist/app/profiles.d.ts", - "size": 4115, - "sha256": "46998cfa533bae618cbbdab6d6b5b4066665f89312f649f1e422e3ceec784509" + "size": 4208, + "sha256": "a870985e96f4506ad445f2fdfe7e10058f25d358341dca02600547e776bab61b" }, { "path": "package/dist/app/profiles.d.ts.map", - "size": 3105, - "sha256": "8e1414e0b583d1e4bcf6989c79e487e3851f0ff0adbc3ee594b0a3d00c0b33fc" + "size": 3193, + "sha256": "6d73d7d14d580e4dcb2a02cfef42b6987cfb7698792079ca041ef2d8c0d9f102" }, { "path": "package/dist/app/profiles.js", @@ -4488,7 +4848,7 @@ { "path": "package/dist/app/profiles.js.map", "size": 5498, - "sha256": "3321732458eb8117b28106afc8f15161967be2868bdfa3b1c7f8ef8e5ad63b55" + "sha256": "49f51eb4a954aa6ee7b219e8a2c24e3402b2a04e42f6814b599831c6059790ac" }, { "path": "package/dist/app/provider-snapshot.d.ts", @@ -4512,43 +4872,43 @@ }, { "path": "package/dist/app/provider-values.d.ts", - "size": 972, - "sha256": "99b0641c543382ecedafa0451a651a384aab13ebfac154626f19af27e4501129" + "size": 734, + "sha256": "fc2a5d64791548d0534c70ea8b986e7f2a7c1e30f2604f994806834cdf14e3ef" }, { "path": "package/dist/app/provider-values.d.ts.map", - "size": 520, - "sha256": "108546a575ffdc0d5451c35d487c9b45072f45288a5534f8966eb93386bb8a96" + "size": 319, + "sha256": "2b0bd91f3d59a88a4ce2c265c792ba4528491376446e417f6d37b85c72f01caf" }, { "path": "package/dist/app/provider-values.js", - "size": 1492, - "sha256": "e62072b934feb49a17ea8cf2de39efd47dd072e004b81a99826699d4f652a7fa" + "size": 2305, + "sha256": "2d1c4628bc965ec803338639e7f7a06ee83a963f3e71ddbffe73d9d9c79921b8" }, { "path": "package/dist/app/provider-values.js.map", - "size": 1052, - "sha256": "df4f4f5db5afaf0a07cd9691b2e3980401681be09a5c47970e93a775ba952df0" + "size": 1886, + "sha256": "fb0b5c2356c14a5a4336662dd10c0af8304041bc8ab332e63fb127348a649304" }, { "path": "package/dist/app/run-admission-continuation.d.ts", - "size": 382, - "sha256": "ff8544bc0ea411e8f2e615b48c69dbb9eb29d6de7f8c4b664a4d7ec7dde1f8e8" + "size": 418, + "sha256": "a37b0a698b02a369de22bedf0da53ee855240913a00bbb5b6f8910cb65c645db" }, { "path": "package/dist/app/run-admission-continuation.d.ts.map", - "size": 454, - "sha256": "42120a48654896d95b209e36c502e4dabfa78d6b47b7947844a0f90f9c7a4562" + "size": 497, + "sha256": "7c8eacc78947f2c5376b8d4cc565a70862071045d43e49c637c9af928d67bb1a" }, { "path": "package/dist/app/run-admission-continuation.js", - "size": 1378, - "sha256": "f497537caf6052d8aa76dcaa767055277090e4e3bffc84be2b8337e2b1487db3" + "size": 1604, + "sha256": "89b9b05e232aa05ded01a7de284c2bf9c4c4d22464bdc97dae06e4b023de8788" }, { "path": "package/dist/app/run-admission-continuation.js.map", - "size": 1334, - "sha256": "19943d47120017ddcec53032f4a9a1dd48801a56eebf56d1a4501ec5c62ff7e6" + "size": 1430, + "sha256": "c673737230bd109dbb9287e34be48eb1f0cdefb17cd3022baf3893f638d0ca6f" }, { "path": "package/dist/app/run-admission-dispatch.d.ts", @@ -4558,17 +4918,17 @@ { "path": "package/dist/app/run-admission-dispatch.d.ts.map", "size": 587, - "sha256": "11abbe9910e8cce14d41e39090d59643a51d1e55194f4e5c8d1c95d0a8f00424" + "sha256": "4bf22a9912be747351ba7f757e414e3967a92b9fdc03e63560a005949a850e21" }, { "path": "package/dist/app/run-admission-dispatch.js", - "size": 6933, - "sha256": "359597edaa3fda34f631b87dd8630e4906cd8d4521c748155b3a51e70db79546" + "size": 8977, + "sha256": "14144520ab683dbda9ff32342f0f49737590f92346e941de93eb75275fe822da" }, { "path": "package/dist/app/run-admission-dispatch.js.map", - "size": 6702, - "sha256": "d60e57abe3f01739aac511883da516aa11a470fbf2bc552592f594bc0ba792f5" + "size": 8596, + "sha256": "7dfa8519d2904f38745385653a4ee96b99dcff2829c9da3ab5869ea5fdb7623b" }, { "path": "package/dist/app/run-admission-receipt.d.ts", @@ -4577,18 +4937,18 @@ }, { "path": "package/dist/app/run-admission-receipt.d.ts.map", - "size": 1034, - "sha256": "3075665591e8b25e64de4179883ec2af120b6d6947417b460a04e1231c2b5cb5" + "size": 1035, + "sha256": "8d99b383e6610259ca7a19a13716416821700ffcc93b444f0efcb72c54691196" }, { "path": "package/dist/app/run-admission-receipt.js", - "size": 4959, - "sha256": "73b2783ef4a0980d6f2df1880a6868b95db52d9f1fa9cb263e2c5f9d5758de5c" + "size": 5519, + "sha256": "f70cee71f58bc7b13cd6b34a87ebd579c9da11af8c3e15651dad2d788e303873" }, { "path": "package/dist/app/run-admission-receipt.js.map", - "size": 4931, - "sha256": "2b800a02eec76b08e5ee5e991a1dd734d38def52fd865c12813a52a922c97017" + "size": 5541, + "sha256": "361774af3c647e202379113e80980d2960ead12dcac24345dc8a23d4314653a6" }, { "path": "package/dist/app/run-admission-request.d.ts", @@ -4597,78 +4957,78 @@ }, { "path": "package/dist/app/run-admission-request.d.ts.map", - "size": 550, - "sha256": "39e7d82ccd9af264eb0427c9a27625c996abb5c31865ec148049432de210af46" + "size": 552, + "sha256": "a02dc37610d4dd23584a93f31d983aa2a7f298be69b7d29decb84b437753e4f5" }, { "path": "package/dist/app/run-admission-request.js", - "size": 1556, - "sha256": "02490b1e83e06458e8075e115f759ea4ce362872d437dcfe78fdb4c1178bd58d" + "size": 2536, + "sha256": "efb471789acb4fb836cc75429a92fb33e1dae6a1633dad92c6f9ea3e5b7842ec" }, { "path": "package/dist/app/run-admission-request.js.map", - "size": 1585, - "sha256": "b60b8dc448386d738f0cd0e02ad563d47c5bc232ebaac1f390610f37c82baac4" + "size": 2543, + "sha256": "9891b3359953a61c77d4278701de0f5fed751516a16d36808ff6206b9af0064b" }, { "path": "package/dist/app/run-admission-validation.d.ts", - "size": 1862, - "sha256": "2b39aa8d1ad2b3c998928d6a8d56358872a2a23146d0c951b21df03b30004526" + "size": 1990, + "sha256": "1ef91ca040803e8bda1062abaab69b1f5202131a3fab45e870ed785d2d75df30" }, { "path": "package/dist/app/run-admission-validation.d.ts.map", - "size": 1604, - "sha256": "1c72a0447bf7fd86596addc9baca29dfdbabc024291de93eeaa4b19d95b71538" + "size": 1642, + "sha256": "6a785bb4d1142d9aaa566d4789da2b62fedd275e03715ccef63976bb84bb306a" }, { "path": "package/dist/app/run-admission-validation.js", - "size": 6853, - "sha256": "5a1c767973ac96bf8ae7da8e5247b7e4976b4658e023362f8e84c070f7e8c80a" + "size": 8249, + "sha256": "60a7ac71e828a15c59175c8152c56aaed2017eee13da17e788f8e3c8014dbea8" }, { "path": "package/dist/app/run-admission-validation.js.map", - "size": 5295, - "sha256": "f5eee102b0f8d7fa5c8c2b4029b919e084996860c1ee4b1d0dbc32d11c97f9fe" + "size": 6235, + "sha256": "2fe5e5212718861125f2f7b7cff22baaec0b1598bfeacfd3a9dd0946b23d8fa2" }, { "path": "package/dist/app/run-admission.d.ts", "size": 422, - "sha256": "33cda4cc25cdb44d980a691b8ba69495f9a6a40bc5bb9961cdf7291451216a01" + "sha256": "c4fc48d223c6e3d8eedb75e0994aab753e648997b952b845b280e92ffc54ad51" }, { "path": "package/dist/app/run-admission.d.ts.map", "size": 386, - "sha256": "b211367ea1bb9b6336e7a4e334a602aab7ad305527de11cf9b4571b7d3efa87f" + "sha256": "088e53d2d2b73d6e0636f4822892b64a39a23f5f0f7308ab0c80404bfaf20091" }, { "path": "package/dist/app/run-admission.js", "size": 420, - "sha256": "1a8639976869e2776e829cbf7475902a65cf766f347ac3064be3027735890a9e" + "sha256": "a977d91303d31f6140fa3a516a413d3672453adbc25018831615b1b8b8dbff61" }, { "path": "package/dist/app/run-admission.js.map", "size": 384, - "sha256": "2884c27ca8682cc63c4ecdf7d62d1c88ddb3420bfffa823ba94670d00b5d35e6" + "sha256": "b044cbcc1bf451c9bdd94efaa1e5c20701863fe671d076cd0ac96050b0f96eb4" }, { "path": "package/dist/app/run-continuation.d.ts", - "size": 832, - "sha256": "da1fcbdeb339b8756ac221178603fdcf09c0ba3cb4e134c68ea887c22f932822" + "size": 1075, + "sha256": "14e03651bba1a2780b41b4b218fd23811ace4fae2d068785c24b8b5dbbf71b1d" }, { "path": "package/dist/app/run-continuation.d.ts.map", - "size": 671, - "sha256": "4c7eef809db7e0770748f5f2b5f4ca6498e641d0c286e3d9102a0f2481ccdc0b" + "size": 812, + "sha256": "3e5c22b40c747bc983a098cb18956b42488bb00975b68993d2831fb0bcddc9ed" }, { "path": "package/dist/app/run-continuation.js", - "size": 1800, - "sha256": "6b970251252252a2a9db90ef3a2b5ffa32ded3d84fcebbf4cc7be7c1c8cd931e" + "size": 2532, + "sha256": "19a9766727398d88b3d6f5480d677cf850c4ed69f520f91cfe6e6efe0eee92c5" }, { "path": "package/dist/app/run-continuation.js.map", - "size": 1538, - "sha256": "3d479fe94f606e707184eb3d22d2a6d1cafa161bae57554c4090891eb5ecdb3c" + "size": 2068, + "sha256": "52e7c16b4eeb4ca12d89125674fb290edba09630b3d44d3e83182a88fc0e858d" }, { "path": "package/dist/app/run-controls.d.ts", @@ -4678,57 +5038,57 @@ { "path": "package/dist/app/run-controls.d.ts.map", "size": 1097, - "sha256": "655516d8e7136b219224bb428583655658577ceac834af3c2529ad6ea1c00a65" + "sha256": "ea4ec323e54825546cdab107167170fdafd7caab7c1ec90e41c1dd83d63cf79b" }, { "path": "package/dist/app/run-controls.js", - "size": 19843, - "sha256": "df36451f7b9191850dfdfa0648e4165c8f90d8da573e4f40b1a7e6a8d97039d3" + "size": 20813, + "sha256": "060af5e653bb3c6e188856994bf8db13b3f1f6974fe3a0d0dbbb2997653e7327" }, { "path": "package/dist/app/run-controls.js.map", - "size": 18132, - "sha256": "6a25cdc743535dd284d67a327849037336931219a04f4e7daa2a6ede73c4b3e2" + "size": 19123, + "sha256": "892e01dbc57b377991a2dbd32b897864c290e3cf56b48ff9d979a3c41ea5f783" }, { "path": "package/dist/app/run-event-mapper.d.ts", - "size": 874, - "sha256": "6f1ef804d70196c7e374a52de0f976e1e8f37bbb320bad420bfa1fe2d84a3087" + "size": 989, + "sha256": "fe861f4d8bf52c721bc92ca7f1526a624832ccfbdf6d7c3a7d00e97953fe9c17" }, { "path": "package/dist/app/run-event-mapper.d.ts.map", - "size": 818, - "sha256": "05c9229d4e41ca2f2a54b97b228dce7fd00530437d1d4a996b308ee4e18eb68d" + "size": 897, + "sha256": "fb035c20916bb472ca3facfe0d2c174220579968f65fb61361355cb6298c7732" }, { "path": "package/dist/app/run-event-mapper.js", - "size": 18669, - "sha256": "94a81a7e31334affd8b9670d3f2da7823cacf152710037321154be5d4200ee00" + "size": 19357, + "sha256": "3d6ba556db16119d3abcae83d19e4383ed0cd66ce6aee5712e61c4b4702c4506" }, { "path": "package/dist/app/run-event-mapper.js.map", - "size": 16997, - "sha256": "bf4b775720d4e083907ff0f4857eb32acdbf75ef0884e7c71a8a89c759cc6206" + "size": 17578, + "sha256": "93036b4ad23d9ad86c26159474b845386cdf93de9849e01af754d1f3d7d313c8" }, { "path": "package/dist/app/run-execution-snapshot.d.ts", - "size": 1410, - "sha256": "50cac31766c87a6e4ec7b1c38df51e87e0d128eea48bb4a663f7e80d84f6c7d3" + "size": 1843, + "sha256": "44513c6ea9ebcbb2e6e855f5bbfd2fa7e0a588a0a42eb212b5f6f56316d84a62" }, { "path": "package/dist/app/run-execution-snapshot.d.ts.map", - "size": 1068, - "sha256": "6927220117914198fc98126e6ed1ac6c6eb29f3072b740cb884a0200411029fd" + "size": 1344, + "sha256": "6c20a2dca48feeb97ef780606976afbfdcf35ad1ff0a6a93845a4c901cc28cce" }, { "path": "package/dist/app/run-execution-snapshot.js", - "size": 1986, - "sha256": "f52b56f16224cd6948086bbbf2f82e481de874f35220d81e4ba59f043fb0c240" + "size": 2515, + "sha256": "017d402c3e19257a22a8cd63bbaffbd80b3419eee076cff08a2b73b404c5543c" }, { "path": "package/dist/app/run-execution-snapshot.js.map", - "size": 1985, - "sha256": "7c5a706520f35a10ed7a8dda98b1c9697f9cc0f5ac01abf03b2affd269ff2710" + "size": 2450, + "sha256": "0ff02c11b7469b612b32495cb940cce94b3ccad46924cab18e369dd51bd364a1" }, { "path": "package/dist/app/run-execution.d.ts", @@ -4738,17 +5098,17 @@ { "path": "package/dist/app/run-execution.d.ts.map", "size": 474, - "sha256": "a90c94e8c51a8f20457e4c9367818a0ef0a37890a3bd5cb24bd00ef739c13e32" + "sha256": "0cdc51b070aed1f0ff706411aa621cca9fd985044df6f51484cff8a99fcdcecd" }, { "path": "package/dist/app/run-execution.js", - "size": 9428, - "sha256": "ce0729d1bbaccce2173f8d6984c7edcdf3b5f72da9f09dc03c189480c590b551" + "size": 11640, + "sha256": "77b64c3eef068326f6442ebe3e7e1d3a0d2cc084159ce1d54a0523c570ee998d" }, { "path": "package/dist/app/run-execution.js.map", - "size": 8750, - "sha256": "31fa5ebcd665dd33753c75bfbc69f0f5e784d2d5e9f7dad3fbd9b7f3bbe447c6" + "size": 10660, + "sha256": "8093ce38e60b0731969611cb52ed2aa6f91a29bbea9516ca5079d4ae60a77a26" }, { "path": "package/dist/app/run-ingestion.d.ts", @@ -4758,77 +5118,117 @@ { "path": "package/dist/app/run-ingestion.d.ts.map", "size": 346, - "sha256": "9cc0c39b252faee35b3b8ab12c844e02a1a45d6437f5a7859a9e0f8b6f61e1f2" + "sha256": "8bfff1b2b1ec7bfaf52cbe5d25ff619d3d64d123d05f62d4c688835fa6c0f880" }, { "path": "package/dist/app/run-ingestion.js", - "size": 3651, - "sha256": "9eebd3fd0b93c198e4b55551b287e66673e8ccb068188a3d13cfca62fc990698" + "size": 4418, + "sha256": "48f1cf652ee63255a05f9b9fee4a892ed38031ba36238d3ba455782ebde4a3aa" }, { "path": "package/dist/app/run-ingestion.js.map", - "size": 3852, - "sha256": "e631432bf770885176d9e9aa9bad2d74b959d9f2edc03abd98c21d4e4122908a" + "size": 4626, + "sha256": "e0994f87288f235679c2ac1c4e3a5021590291fc2550b824e10b41a57877b03f" }, { "path": "package/dist/app/run-ledger.d.ts", "size": 2702, - "sha256": "22734d0d49d883013c1badbdbc5bbb17051a1b363793502f8cf7af3f7d130acf" + "sha256": "666c560c25950969d0c8d7ccf991ad37df6d8fbcfb462408442f60512523abe1" }, { "path": "package/dist/app/run-ledger.d.ts.map", - "size": 2663, - "sha256": "a7034bee23b4cebaeb926e8b5093faf443fbdef6bbadfbd7046fcaa067f41252" + "size": 2664, + "sha256": "b94fdb3f415ee57140fb4d78057fb932fd278c14a714e8bc8de3b4122984e9ec" }, { "path": "package/dist/app/run-ledger.js", - "size": 3446, - "sha256": "5aa0f6617d5575d7ce4be7f034237342babe396beb1f91c2d797e5ace2f363e6" + "size": 3362, + "sha256": "340e7d913da71a251bd15f9d706900b06dc9d4189850b85af26ae8948a4d5133" }, { "path": "package/dist/app/run-ledger.js.map", - "size": 3878, - "sha256": "fcb24eb754ff9496bfca0c6204fea9356ebbbba380fc32f1cb341bac7f35407a" + "size": 3764, + "sha256": "b618aaebac720c85874511df950475419cd6eb07deec8fa55fe417a5a01bc74d" + }, + { + "path": "package/dist/app/run-recovery-context.d.ts", + "size": 411, + "sha256": "4fb0d573b391054e4a1b5a724022d326d50a334f9cc735bb4e33472ca752c5bd" + }, + { + "path": "package/dist/app/run-recovery-context.d.ts.map", + "size": 340, + "sha256": "c84819038d86b7814edee551e24a6013ca0bf12058d74c5cd72c4ebccdc5ff39" + }, + { + "path": "package/dist/app/run-recovery-context.js", + "size": 481, + "sha256": "fc3cf56cb9393d5ac74e607f0ef4357e6c9908faf33b766616d010ced7f417e0" + }, + { + "path": "package/dist/app/run-recovery-context.js.map", + "size": 496, + "sha256": "fe4a21ecec3e336d81dc09e238021553284b473b5da53ed54f952bb2e92c1c55" }, { "path": "package/dist/app/run-replay.d.ts", - "size": 374, - "sha256": "92f3d8617dbd1637ab57ae1c11f530791a1c9bae9dbdcb03721c8f6f84cd4363" + "size": 503, + "sha256": "3a33bb346e021a33f23de32bf5a668f79a1578d5972ffe8d2223978a0f9f48e0" }, { "path": "package/dist/app/run-replay.d.ts.map", - "size": 410, - "sha256": "3936b70acc65fac94dd03618db7c284cd033892d4214dce1e2800702439ce1b3" + "size": 490, + "sha256": "e379b0e0aa37fd8814739e6d16c744eb650a8dd8be05c53582094b9d5b9b0f73" }, { "path": "package/dist/app/run-replay.js", - "size": 8085, - "sha256": "1ffe8e1e005859405ae4e48940ec73eacfb2b4f2c830e97a3483dda82e9c8fbb" + "size": 9036, + "sha256": "1e9b9cdbf0a7a90791144b6ce5b5c3d857ee32b01bed9ebd4de676e0c360573c" }, { "path": "package/dist/app/run-replay.js.map", - "size": 7661, - "sha256": "2e9ff073399f7a3a1b03ed17509119f66a3d84aa8be030aac06145d8433f8c29" + "size": 8279, + "sha256": "477cd223e74664c9a25e08a491c08556baeff9435d5771aeae446e7292737c9d" }, { "path": "package/dist/app/run-status.d.ts", - "size": 631, - "sha256": "0d462b290264ca7b914191f3aed22bfb872c02e879e310235ea5e349a84d2b36" + "size": 641, + "sha256": "f3f6967c05763dd5eb4768a13d084a6555decdb74eff7cf06874d7fbb14ecd23" }, { "path": "package/dist/app/run-status.d.ts.map", - "size": 651, - "sha256": "b951c09ccc0ba7db3383d5277dd8bc714a5acd5967ac119d3f87be8bf6b24801" + "size": 663, + "sha256": "d386821ad2fdefcb786fedf6ded3f2b9711d03da58ee07d810c942f5af61134e" }, { "path": "package/dist/app/run-status.js", - "size": 1323, - "sha256": "2685ffe5d2c9a2e375e4de41fe967f612ad48f471ee90ce60c79391067f40c87" + "size": 2114, + "sha256": "6606293308a2d57df53f7047d7937ecb56dd04774fc774daca6eeb28a37949e0" }, { "path": "package/dist/app/run-status.js.map", - "size": 1413, - "sha256": "370a680e74f949a8c51e9715eadaafde3cf32b4039d66f093fe8092fb67e4bb2" + "size": 2253, + "sha256": "dce6f029e890b1accda0ff695a7b6b62553e2f255cf11e1fb56263d2e8a98329" + }, + { + "path": "package/dist/app/run-stream-sanitizer.d.ts", + "size": 1199, + "sha256": "9486310e1b72d60d8a168880dc3b2b572890e887b496268fdfb184433b177cb8" + }, + { + "path": "package/dist/app/run-stream-sanitizer.d.ts.map", + "size": 1058, + "sha256": "36a66d9539a29b279ed4a74306d191a6b792b07aa3ebe1d260e44ba5deae0c7a" + }, + { + "path": "package/dist/app/run-stream-sanitizer.js", + "size": 2688, + "sha256": "34a407789789109f47611554829a1e3dc79158837295412df9461995fbcb9a8b" + }, + { + "path": "package/dist/app/run-stream-sanitizer.js.map", + "size": 2569, + "sha256": "5b8d5c785435e15531593b32721fdffe9860d4c7f902d96bbd040f5f2248a92f" }, { "path": "package/dist/app/runtime-selection.d.ts", @@ -4853,42 +5253,42 @@ { "path": "package/dist/app/shutdown-controller.d.ts", "size": 1139, - "sha256": "5d128a7f8c36e1a88101d8b0c47d1b628620af10c317bf053a9e141ace56fb35" + "sha256": "f4849b8bcb313ae9b31f2bfbc37bb61b43d4cdbb164a63ea733412bc2eeecdcf" }, { "path": "package/dist/app/shutdown-controller.d.ts.map", - "size": 1213, - "sha256": "1501f3fcbf1259926818c5c2974dedd991bfece875c9d8a0cd14e50bde77e700" + "size": 1214, + "sha256": "438970c083f4da671c2ac0e33df27ec7fe11398a229184eefad5cd62dcdfe8ad" }, { "path": "package/dist/app/shutdown-controller.js", - "size": 2178, - "sha256": "801d301106cc4026489a668bf3026ce1b3613e36ec171a3709b25d97ac197cc4" + "size": 2546, + "sha256": "7ba5075c77658e56e14ad6e2712c5d82a304e11065aecb28a17c0d40ce01ad08" }, { "path": "package/dist/app/shutdown-controller.js.map", - "size": 2402, - "sha256": "6eb824a49780edc05cea70b11bbf45ccf297ccfa4c637ef6dfad1e579e97f78e" + "size": 2776, + "sha256": "a2ffe45aaa276a0bece87795fd34d9bf9389990c1c1d67b73ac7eaef3501e5c6" }, { "path": "package/dist/app/storage-journal-support.d.ts", - "size": 1848, - "sha256": "6103930fd5cdfcd8bddd79bef163a2b632748ce0cdab781e2ff195f25840f150" + "size": 1853, + "sha256": "48a47edf560cdc5b52b3ca66806f2b7e4e76f9cdd8bf20ea0cc2e02df37ed305" }, { "path": "package/dist/app/storage-journal-support.d.ts.map", - "size": 1613, - "sha256": "42d49b0cfe7d464ba46261578c1e2864c2687ed646c50d9cb7e2d0bf79320661" + "size": 1618, + "sha256": "f664e3b43904174b5c45c933d9e4eb3990304cca2bbb0fb1b86a4aaed5972e7e" }, { "path": "package/dist/app/storage-journal-support.js", - "size": 8224, - "sha256": "3c3f3f3f70fc56401d285c93037283c61450b95b5c61db695efdac938d92fad9" + "size": 8557, + "sha256": "98c9c89fd4ca1cf8d27ba9b0342d2fc4fcae359f19b3a8c3f2e0af2c6a1a0f5c" }, { "path": "package/dist/app/storage-journal-support.js.map", - "size": 7090, - "sha256": "1528bee9531a940c4356bd129cc71ecf67a87445c2c4b6266b0ddf375660e76b" + "size": 7452, + "sha256": "c50ff90355f01f83b7da26e269055ae3ff4b26bfa7db6d299ef09116257560c5" }, { "path": "package/dist/app/storage-journal.d.ts", @@ -4897,118 +5297,98 @@ }, { "path": "package/dist/app/storage-journal.d.ts.map", - "size": 1820, - "sha256": "351be267cec71275f76212b48db50fde7bc9f93939621ba6452fad308f2b9480" + "size": 1821, + "sha256": "edf3abc5d40009f8964d80b98e466879bfe100dc9faf143063c71f3091e6e6a1" }, { "path": "package/dist/app/storage-journal.js", - "size": 9010, - "sha256": "5aab6563de87937b47c469797c65f043706b3ee90dabc116e7f879b89e429641" + "size": 9538, + "sha256": "0b2c5beabda57889225fa8cfe4132ec39ad88dea42b597007ba9ea5dae8f46f6" }, { "path": "package/dist/app/storage-journal.js.map", - "size": 8507, - "sha256": "426dc3f53f8e2493b17c910f186b4560221470ca3cd1b17a90ef886598afca42" + "size": 9107, + "sha256": "0e6ea110abc9ad9ad6764a5d793b59c0b57069ed786f15b4331b65590ebb4d4c" }, { "path": "package/dist/app/supervisor-projection.d.ts", - "size": 1316, - "sha256": "a4c950d4c3df01772e6a1f00bdddd5048c3b189e50ea9ae912a95dc5c645f519" + "size": 1765, + "sha256": "10c4ba0c1df4fb80a0f1c4d5bde42d5c25195a5f7095931fbc3e4c324cf2c574" }, { "path": "package/dist/app/supervisor-projection.d.ts.map", - "size": 1136, - "sha256": "4f1840948cc7e2a6d743d03c014f1a7ceef7dc8dc8353341c65cc432df0bc473" + "size": 1445, + "sha256": "09edc4ee6eea2a8e16e1685696d9e79d4877ab0edc698bbda582029adf18e9c7" }, { "path": "package/dist/app/supervisor-projection.js", - "size": 15876, - "sha256": "2e28edca83557915d11e956fa9038efb2d34a4c1ec7bd86ad94665e1fd35be7c" + "size": 16599, + "sha256": "2b3e9efaf5c3f65f9151d8852282be766dc982db609f81e097768bd39b9941d8" }, { "path": "package/dist/app/supervisor-projection.js.map", - "size": 16757, - "sha256": "4bdcec5245b44f64bfeb57de02b8897d75ff28e59376b6fa00793f40dd049a81" + "size": 17379, + "sha256": "9e47d19f8236040a3a80882e4111ac26f29935707f0873e58ff4fa59c332f446" }, { "path": "package/dist/app/supervisor-service.d.ts", - "size": 1555, - "sha256": "756c42fd21195d9ae0a4501c11fdfef171defb3a7647a2146b973fc4f8af68ae" + "size": 1981, + "sha256": "eaf9de4921fb890098db335d4c35558095f97881f171479617ac9c51f2c43f3d" }, { "path": "package/dist/app/supervisor-service.d.ts.map", - "size": 1218, - "sha256": "110c1d1abdaa85113ef25d4691a445e4cd4acd05fcd552f20f5e814482ec2208" + "size": 1628, + "sha256": "7317449e29dd0bb74237202adb8509d42a62e8010435999636b5fbb6467626a6" }, { "path": "package/dist/app/supervisor-service.js", - "size": 3113, - "sha256": "e6dcc40dcd1da30af5cd489120006c73bfcc113293720b18211eb0fe5bff3f24" + "size": 3595, + "sha256": "96c34038e82010f709bf0bc586697f7c6cd97c2e9486210aa296ea1b798dd878" }, { "path": "package/dist/app/supervisor-service.js.map", - "size": 3220, - "sha256": "bb95a3f52d3cca54f560404a07064be0cce385e09c58100e3a12aeebba166cbf" + "size": 3658, + "sha256": "afc53aa3d03ce2ce1b26ee8b0f888596dd8370af38df46931bf9ca35e4200c78" }, { "path": "package/dist/app/unavailable-analyst.d.ts", "size": 544, - "sha256": "bd9c9867d5888368bafd5879f9e6bb9fce0737474cffd6540f44ffe01533c1c7" + "sha256": "b817f0882b406ad2932f4e8adddc5c354615a7a6dc6858d05f3065430f91a63d" }, { "path": "package/dist/app/unavailable-analyst.d.ts.map", "size": 504, - "sha256": "ae8b0e81311f67a6c5cc53cda617df959cef67311356c1802a922081d5cc09b8" + "sha256": "fc71d0b1b289bb922c02708b42e6adc6cd8b1248765d0e00020acb2342dd5c51" }, { "path": "package/dist/app/unavailable-analyst.js", "size": 808, - "sha256": "3404c085a29e783e96b98eb2e34298d60b77f10a933f1045d72acefe7c5d43ec" + "sha256": "0e12ab7b1d6faf5243a7cdb1769ac7bee845dfc2a4fdfcaea4e8f94110e7477e" }, { "path": "package/dist/app/unavailable-analyst.js.map", "size": 636, - "sha256": "d78d88610f151750c03b38349c75a5c5f7b28b0b89cec36292c5bdf569c1fe95" - }, - { - "path": "package/dist/app/view-model.d.ts", - "size": 1389, - "sha256": "ab714ff8f10bc936a036c48104758aaf1d1983d3ce9389d154cc4d62a9abc2f8" - }, - { - "path": "package/dist/app/view-model.d.ts.map", - "size": 1481, - "sha256": "a823d3005abed81194c9dc8326452d2d0e38fe92c6e40968e10e449a9c1ef835" - }, - { - "path": "package/dist/app/view-model.js", - "size": 4380, - "sha256": "cb4d418604f26a275b42a5fdc65f4ea00584660dea55e161579d07ebeb7fe6eb" - }, - { - "path": "package/dist/app/view-model.js.map", - "size": 4331, - "sha256": "78deda762e319464d4edb61ff102f036d14c0cd8acfd0a78a39c4e5a2b0edd7d" + "sha256": "3906c60012e7f8cffc50d8bde24c89dfa797cd038c71cbbba109b58d0d6b9a02" }, { "path": "package/dist/bin/args.d.ts", - "size": 2393, - "sha256": "501449940520ab7181819fda52a86fda26d52e0227cd9c8c034f0e1c49092288" + "size": 2409, + "sha256": "64eea658736751f0bbda530e145364ba74244850b759ff4829cf300cdcedfd05" }, { "path": "package/dist/bin/args.d.ts.map", - "size": 1133, - "sha256": "ca8ca023ca413556020970ecfa169f505fa5b18f2df4c92e419da401835fc4c8" + "size": 1143, + "sha256": "6ba55b301291c8277a2dfcc09ec2b3be4721d84c234ab8791fb9a4956d48a00e" }, { "path": "package/dist/bin/args.js", - "size": 6231, - "sha256": "716617ad1650359c766d67f1b53b543726d72ec7f39f45917b537628ec10e336" + "size": 6289, + "sha256": "2ec96f8f30d5928d51ddb64864ca1974f1988db879c043c4a4b2c0348efa4fc4" }, { "path": "package/dist/bin/args.js.map", - "size": 4813, - "sha256": "c9e5f11cea07fff161efd2fe12ef9f8edcefb24f7dcf96cdc992d6a50eee9d60" + "size": 4835, + "sha256": "7646784ba9590531f52b0b4c5a474c4775722f5ae40564669d6dee92af3b9937" }, { "path": "package/dist/bin/braid-runtime.d.ts", @@ -5018,17 +5398,17 @@ { "path": "package/dist/bin/braid-runtime.d.ts.map", "size": 241, - "sha256": "fd4c3c10a937098b65bd2685c27830f339b4d6eb3e4f9e18884342c3f80bd41c" + "sha256": "353359df264165d68f220da81393cb4969e90128914e2d741adea4621a1ac8c7" }, { "path": "package/dist/bin/braid-runtime.js", - "size": 7520, - "sha256": "6716d7065c1cf0f7ec06b9c4dcfc616feba83b8148087f57747f74c229567f5e" + "size": 7039, + "sha256": "14b7c295cc40bbfbdfa4e278f7a74b8631b8683a018153331d38647fb2ac2578" }, { "path": "package/dist/bin/braid-runtime.js.map", - "size": 6042, - "sha256": "57cf28545ba0de003b11ecaf967fe6efe754d8f2c4ac76cd6447033537b743ee" + "size": 5567, + "sha256": "74927735ccbed9f5bcb0ab0193651b0bc3b2816ccf8afe9859479231428642bf" }, { "path": "package/dist/bin/braid.d.ts", @@ -5050,6 +5430,26 @@ "size": 1481, "sha256": "765a6daf4750c762f8e2e521076e24bccccdb81ce463c910c7914c4bdde80dab" }, + { + "path": "package/dist/bin/fixture-application.d.ts", + "size": 352, + "sha256": "116232c2e09763263629e8aa9cddfd6d4947271c81a46aefd1474e7cfabfd090" + }, + { + "path": "package/dist/bin/fixture-application.d.ts.map", + "size": 244, + "sha256": "9461b31cea8ed0b37732f8769a70a25f8764caf5bf13b653219151e21fcf6a24" + }, + { + "path": "package/dist/bin/fixture-application.js", + "size": 1132, + "sha256": "93c4c5d907edeea8dce65fc6940a769d5c6ba84e849d0371e94c44e1725bd16c" + }, + { + "path": "package/dist/bin/fixture-application.js.map", + "size": 1121, + "sha256": "3799f81bfd335b64aaefbe6d1d558cdedf5edd0acbab449190715388544967d5" + }, { "path": "package/dist/bin/interface-runner.d.ts", "size": 1252, @@ -5058,37 +5458,37 @@ { "path": "package/dist/bin/interface-runner.d.ts.map", "size": 977, - "sha256": "edca2dd9f413904747f1ecbaba488bf67a2321015a0f92162aa0cc062a14728d" + "sha256": "06e962852cc913c2db4b3423ed14b8b744f55378dae76bb500ae3344f476db64" }, { "path": "package/dist/bin/interface-runner.js", - "size": 8409, - "sha256": "c0a0bf1d038840f67eec620bfdbc51a439d495142c44472d5a6e01865a56b8b3" + "size": 9171, + "sha256": "8335f0e413e90895bfdc7fd97375188db4b929ca646c7c3e4d702afa225492a8" }, { "path": "package/dist/bin/interface-runner.js.map", - "size": 7295, - "sha256": "9a929eb6b8490a0f815bdbd4753d5050957cdccc100d6fe978b787ae5c9c0ec1" + "size": 7899, + "sha256": "5d4e3512f7356f69fda647e89fe2d81ac755e8586eaee4fc05972dea5443e80c" }, { "path": "package/dist/bin/interface-signal-lifecycle.d.ts", - "size": 996, - "sha256": "f6598ec59e65e5d1dc2e2aa3205dfe3c1a1a951bb3b7f690aaccd493cfab0803" + "size": 1154, + "sha256": "94c66a7565c1421409c29fce8fbc6400f7acdfafcfd24b5482ae235da4085308" }, { "path": "package/dist/bin/interface-signal-lifecycle.d.ts.map", - "size": 931, - "sha256": "b9c31c63cd5aa1f9cde91028fe97be37f3e171deb2c79db77ec5a52f4c5e6dad" + "size": 1035, + "sha256": "03f58025d6180e6d6c53916e11dcbcba3dbf289062d7e10075174b8943a19cb8" }, { "path": "package/dist/bin/interface-signal-lifecycle.js", - "size": 3418, - "sha256": "e4ebf50574bb8ae6c38d92cc88b3eb723d67d3c6315080137dc169d39d2cda52" + "size": 4459, + "sha256": "9bae989a5975c66febdd88df7b12318ab1f2de7f7a621c4642b3dba7a6d64c73" }, { "path": "package/dist/bin/interface-signal-lifecycle.js.map", - "size": 3108, - "sha256": "70e7b0290887729d1697368a23fc893b1b7bc9869116ea1980910a4478d87581" + "size": 3829, + "sha256": "e9cd9bfaf2a01252e2d1b834b457a1cf478cf92a033a66fc14b42667c4ef991a" }, { "path": "package/dist/bin/interface-state-recorder.d.ts", @@ -5098,17 +5498,37 @@ { "path": "package/dist/bin/interface-state-recorder.d.ts.map", "size": 325, - "sha256": "17b236a4d455214ff07a50cde2a7c1ed2a290c03a3f62e4b6833e5d4f862f94f" + "sha256": "70aca532dcbaadc4b0b6218f44ac7b62e5d0b33c38cebaa174d842cee8c69db8" }, { "path": "package/dist/bin/interface-state-recorder.js", - "size": 783, - "sha256": "53ff7be57ad887d378d8939491f9dc53f8d83abf3e83c07dd2ac5606d15524d6" + "size": 939, + "sha256": "7d91b6cb59840382ea4e22d72bedd0349dc0b7ff4f1bdf4ddacbf0865f7358b9" }, { "path": "package/dist/bin/interface-state-recorder.js.map", - "size": 896, - "sha256": "dfb4453df429ea1e527c0f063a86300621fccd415f89ddf7c19d03485cebba16" + "size": 1033, + "sha256": "b550124c7360245470d87fecacb9e0b9c2605cb0f8a5fa74871c2c4f921fffb6" + }, + { + "path": "package/dist/bin/native-interactive-actions.d.ts", + "size": 1257, + "sha256": "fa56163da634ccb134666c2750e38ef7fe15d6e4309d5a7e4c809f2e89f158b3" + }, + { + "path": "package/dist/bin/native-interactive-actions.d.ts.map", + "size": 967, + "sha256": "348a0b63683b01668fb793f1fc8786ce1d76adb65529b5dd1e3e28512e3ccb99" + }, + { + "path": "package/dist/bin/native-interactive-actions.js", + "size": 11567, + "sha256": "0a4080f41e8ed4937d354d34098e2a53018e413d91a715ac98dad6368373661b" + }, + { + "path": "package/dist/bin/native-interactive-actions.js.map", + "size": 10700, + "sha256": "d68c40ff585b58576189d999233a27a61de9f02c3dcd15f55100eee82bace372" }, { "path": "package/dist/bin/plain.d.ts", @@ -5152,23 +5572,23 @@ }, { "path": "package/dist/bin/production-application.d.ts", - "size": 1386, - "sha256": "9a6cba1a9dad33d9620c7e351e0fc7e9afa5eeb1c39603f0a9089ce63c98c618" + "size": 1553, + "sha256": "e62d121be1ca16f02da09c83b04f23d90c163fd86c4b52ae59e1f4771a89d2cc" }, { "path": "package/dist/bin/production-application.d.ts.map", - "size": 1066, - "sha256": "08e532730b02c8f6ca7054d1bcc3c8c83f9269558eabf21cacb0aed041ee9143" + "size": 1161, + "sha256": "ebad14a8cfd865476c85491ec274ffe2826d64b45def23c2787348b44d20c5fe" }, { "path": "package/dist/bin/production-application.js", - "size": 7006, - "sha256": "d2ed329196fbb868472ee16e7559a13ed9e59c1d44cfb546516e48d73e44f2b8" + "size": 7568, + "sha256": "4ace8691733e874c2620a5221e9a67a19396136887a8ee03d8b9f3f8ba01d53c" }, { "path": "package/dist/bin/production-application.js.map", - "size": 5963, - "sha256": "8d8c91e79861066fadc2d3b39627e1282861cc056b601d0b27280d655bc1904b" + "size": 6438, + "sha256": "b7549b81f8a4cf6cc353c4a210389aafcaf4174dc4b1cc68febb462098759790" }, { "path": "package/dist/bin/production-bridge-client.d.ts", @@ -5258,17 +5678,17 @@ { "path": "package/dist/bin/production-connection-actions.d.ts.map", "size": 1289, - "sha256": "b14bc7f59800f787737a8f1ecd818c1fcb6621a3d4684d6c30072c3ec72c37f5" + "sha256": "9f5dd32baa4ee3e35f7b8efdd4aaad0e88ac0cfd8f3c2105a8d044f4960d9f29" }, { "path": "package/dist/bin/production-connection-actions.js", "size": 10267, - "sha256": "bc8ce1041dbc6ed15456d03d7243baff73d10c3af01cddc59b4eaa6d570c590d" + "sha256": "7ab6fa2a0f2b27720a77f03bbb3346862fcff5de856049d8f62a0de38e9edf48" }, { "path": "package/dist/bin/production-connection-actions.js.map", "size": 8744, - "sha256": "e99535e81e09bf131b3efecbd9e1b2324e9eb8a49f6c3902b2d6de56c9ea473b" + "sha256": "a964436b2b7d78a8f36b932ac3fb51aa5be72b3e807620224c0c49ea94a9de0d" }, { "path": "package/dist/bin/production-connection-catalog.d.ts", @@ -5298,17 +5718,17 @@ { "path": "package/dist/bin/production-connection-credential-cleanup.d.ts.map", "size": 1706, - "sha256": "2b6f1c65da6a9ba50dbe0dfaf20e98b08c5e941135da425d666db80e4e898071" + "sha256": "9e35f4ae3ca14f59fe6cc67023f4eaf2a477bd9417c1b8c36a137f235dc0f531" }, { "path": "package/dist/bin/production-connection-credential-cleanup.js", "size": 5814, - "sha256": "f40841315e5b48597b96d7a1023dec3520d15d7b4b668dc85d754c9a22353b1e" + "sha256": "e16bcdf77dbec224d3ef3b2f3222e03244c8c02c9aad806f26ee150b2b8ea341" }, { "path": "package/dist/bin/production-connection-credential-cleanup.js.map", "size": 4842, - "sha256": "04bad0aa693ed5f4cf415e6a1b644e762c9806a33e385f4dadcee725488184cd" + "sha256": "b3076181cda2f3bcaaaca3d044d6b008524f5c94122ddd863652c44addec0fa8" }, { "path": "package/dist/bin/production-connection-credential-removal-record.d.ts", @@ -5338,7 +5758,7 @@ { "path": "package/dist/bin/production-connection-removal.d.ts.map", "size": 1224, - "sha256": "f14052eb148a22d59651ea9078064ab6b74bd486347b0322947546b16030557b" + "sha256": "377b7fa3b1003f2fbd3d748b86ec669c9e053c878f596a770baf7803f643c10c" }, { "path": "package/dist/bin/production-connection-removal.js", @@ -5348,7 +5768,7 @@ { "path": "package/dist/bin/production-connection-removal.js.map", "size": 3235, - "sha256": "b52b04a7ffbacbec608acf74a70c1e8f2bc0a3169d64fdbc5cf4e61b1c514541" + "sha256": "61c880854a554bc70604a6d31d0f01564b52afa83567873c7a54a421ef3c4705" }, { "path": "package/dist/bin/production-connection-replay.d.ts", @@ -5473,22 +5893,22 @@ { "path": "package/dist/bin/production-setup-discovery.d.ts", "size": 913, - "sha256": "cc2fb19ad4b89bca4fe5b4545aa9377a16e4e8788cc3b662fa02c648d3356059" + "sha256": "c1a6d6f85c6951b70be0d8d3e17898631afaa81d567cd5ece21deef37574c83b" }, { "path": "package/dist/bin/production-setup-discovery.d.ts.map", "size": 619, - "sha256": "08e7d66b2af5c4905d2f0878513778c57cd6d7b4550a17c010cc89752d76d62a" + "sha256": "0b8c27df788e5849f7868e7b675b083e24059d8b2d447ebd40cd94d9216783f2" }, { "path": "package/dist/bin/production-setup-discovery.js", "size": 7139, - "sha256": "d51492f34f106786ba1f1b3fb25af128b979fff488c021ad43e37a071bd37a5f" + "sha256": "124f809ab3f9d5fb3a9aabdf0c90edd2d83dc2b38d60a37db4e2705cf735e3a5" }, { "path": "package/dist/bin/production-setup-discovery.js.map", "size": 5725, - "sha256": "9f5b68d841e0b21865fa1a2a3344fcb5d927eedc5f96d21b6571c1911d7ee77a" + "sha256": "f5c9a8d9bdc941f052eefe01b04d1a0ded2625c87fd17bed928efb76ff49da45" }, { "path": "package/dist/bin/production-setup-persistence.d.ts", @@ -5512,13 +5932,13 @@ }, { "path": "package/dist/bin/production-setup-transition.d.ts", - "size": 2580, - "sha256": "9378bc7274e67acd1ca1336d173f7ba89e9d25fab597e7c6a5c45482ad5f6ebc" + "size": 2747, + "sha256": "1b5bcca6f46e70b755c93d252c36a86c220435a0a9a62963d97ecbc6314b3702" }, { "path": "package/dist/bin/production-setup-transition.d.ts.map", - "size": 1800, - "sha256": "3d86f29315bafa2fd90f312ba23b690fc4517862163c064a712c90c6ef833c2d" + "size": 1895, + "sha256": "480ed2ce89b2595617cc6c1d1ea2a716987f6c38b3645d261ec0d20232cd29a4" }, { "path": "package/dist/bin/production-setup-transition.js", @@ -5528,17 +5948,17 @@ { "path": "package/dist/bin/production-setup-transition.js.map", "size": 2985, - "sha256": "aa97e8be2be471ed7ffbefbbb0b1c59983fad82aec635b6e9097da8b9b61a32d" + "sha256": "c5d5312d64415936e633b2c8b75a4d7f7cb17aa1d1f3945cc53aee96fdc8376f" }, { "path": "package/dist/bin/production-setup-types.d.ts", - "size": 2201, - "sha256": "58893bcd2b4ca9c39885f22c1fc6504deab4bbb1203317d8b5cfbb9e3d408736" + "size": 2396, + "sha256": "dc78162c22678e0574933a487345198382b13ebd6ff940c9ed155f117f1befe0" }, { "path": "package/dist/bin/production-setup-types.d.ts.map", - "size": 1649, - "sha256": "4826fcf502eff3f14cc97a92cf14109c12f9436f758f9f4896c4967d3eb68ce1" + "size": 1724, + "sha256": "2c381629e72ce8fd2c7e9a8084b2e7102e203053ea6fdbbdd7ce4a35ccc3e3bb" }, { "path": "package/dist/bin/production-setup-types.js", @@ -5598,17 +6018,17 @@ { "path": "package/dist/bin/production-startup.d.ts.map", "size": 987, - "sha256": "357048a546a644086a0ca55321218281cc39ca2c71b1e69593794ea13be32180" + "sha256": "0af348a993ae1e4a9960f601535b342ad90a5c4865d04ff6566b2355c5862834" }, { "path": "package/dist/bin/production-startup.js", - "size": 14484, - "sha256": "088eda6ce642666f91c18ebfdf9738c15cd4e8db4f05625d5107e1e47cf97c9d" + "size": 14630, + "sha256": "31d1ccc167d83901ab4716b00fd87ba2b6aefef13c8f2be4e4d179f79787275b" }, { "path": "package/dist/bin/production-startup.js.map", - "size": 10744, - "sha256": "e4e760e10335572db3b36712d1c2ed090bb63c6402ba40e665ba4becc6093e48" + "size": 10867, + "sha256": "adf9755532c6b7e0f4bc0c765e9c5897a28d7ca1d7988819dae61017004e0728" }, { "path": "package/dist/bin/runtime-startup-options.d.ts", @@ -5618,17 +6038,17 @@ { "path": "package/dist/bin/runtime-startup-options.d.ts.map", "size": 485, - "sha256": "8ee65c67c4fc75fcb62d832e0ca5c68d8bda61ac527f4d1485f4dbc1bdd3ed2f" + "sha256": "5957e3fcccfcfc3b9670823fbafbe9273b010cc8f61086cad054192b172097cb" }, { "path": "package/dist/bin/runtime-startup-options.js", - "size": 2693, - "sha256": "15ed77f63ab2f244bdb4d15f3fc69a0855b94db312deb2b509a35d2e78799b5f" + "size": 3326, + "sha256": "8d6039b77ca2b033552af157cdc23291e4597cfa2544a7653f91fe6e35f9a8ce" }, { "path": "package/dist/bin/runtime-startup-options.js.map", - "size": 2840, - "sha256": "795e6dcbc9fa7c6e19f3adc9349abea852c4b3dd24bf26ab4434c2fd921d1119" + "size": 3308, + "sha256": "c25d0a9ff55ab8b8a4702b10a2d28f5582d85d6aac4320a3abe9be90054f4112" }, { "path": "package/dist/bin/state-path.d.ts", @@ -5678,37 +6098,57 @@ { "path": "package/dist/domain/bounded-structured.d.ts.map", "size": 1279, - "sha256": "b180692bc0c8c7566ee0f17b663d9b55709b917c2f677d63249ba5c92b6d8abb" + "sha256": "3c88188e57d8eb1d8414e214227cfcd62b69e6b996c526234f4256797b372cd7" }, { "path": "package/dist/domain/bounded-structured.js", - "size": 11599, - "sha256": "dce7322dc3f22fdbd05e2c5069e863e8a5b2d69e336d318d9bfcdb232acca25b" + "size": 12313, + "sha256": "40306fb5055a01b83344a157b0d2dace5f35f397ee307c6a0cd4c9d1ec9475fd" }, { "path": "package/dist/domain/bounded-structured.js.map", - "size": 10890, - "sha256": "a9f3c554c65b34f6e63185c44d35c9ef742f2aa770369cd4630e984da5e53cc3" + "size": 11634, + "sha256": "7a749287f0f98917a9b5c3c7fab09c22e3c900fa32795f23ddddfe8c58b7be9d" + }, + { + "path": "package/dist/domain/canonical-json.d.ts", + "size": 656, + "sha256": "0a6bd001c726a5311d782b02bb66a08766fbdc1c927db93ab274474f86190f9c" + }, + { + "path": "package/dist/domain/canonical-json.d.ts.map", + "size": 203, + "sha256": "95a9d808fc650d8ee488dfe4fc8243f6bdda8f095b319484aff1058647aa49e3" + }, + { + "path": "package/dist/domain/canonical-json.js", + "size": 2356, + "sha256": "a0683776add21ff8c73f0de642d18cb893f0ca5a905c68e64b48d76e261e0a91" + }, + { + "path": "package/dist/domain/canonical-json.js.map", + "size": 2031, + "sha256": "453b3feaa770b7e8063584b25e1eee02c9590f6b01b485387b90eaaf7bba46c6" }, { "path": "package/dist/domain/canonical.d.ts", - "size": 207, - "sha256": "4fbfa95baf0447ff7a67de4d1abfa5cc4a9b00bfea6d0571cbc2839643ea3484" + "size": 271, + "sha256": "78959701630795d033e9c0671a8d2d632c5437e6c2eaf4315b02bd910bbdd981" }, { "path": "package/dist/domain/canonical.d.ts.map", - "size": 275, - "sha256": "fddbc0d4276d95aa4f22bce2164403ddb27967e999d330d2f58a6e721710278f" + "size": 308, + "sha256": "4f7184e6b846fa368e3d948d5785bdbfddeaf407cc38f284c7dcbd8a6784b27d" }, { "path": "package/dist/domain/canonical.js", - "size": 2018, - "sha256": "04035f1b1d282683b5470016496bb97a12de15aa2775a1958e82e52473596be8" + "size": 380, + "sha256": "5ce25f200bed428302c63ef95eab159aef27a51e367e82f8058adecfb31096e8" }, { "path": "package/dist/domain/canonical.js.map", - "size": 2242, - "sha256": "7a27fd75bb00494af3b6b6f9f3fc36b5ef496505d3d5b737d234eaa41b46c35d" + "size": 445, + "sha256": "dda34bf36494e7fb1d0a1fb7764f275c85a99b8f100095fecdc92f40cf46cbae" }, { "path": "package/dist/domain/code-unit-order.d.ts", @@ -5733,22 +6173,22 @@ { "path": "package/dist/domain/connection-removal.d.ts", "size": 576, - "sha256": "06fe84ebf7faefa1381a46206c0819cd6dbb9d0cb9c039b9d46c52ff4e32c347" + "sha256": "d4198bd6a0830b71dbd05db4b56f1510f51b5d204d8fc3c29e7d34b0ae34dd77" }, { "path": "package/dist/domain/connection-removal.d.ts.map", - "size": 592, - "sha256": "5f235be69dde6bab328082907bc3150c73fdb67c0381a6d539b111a9f49feb16" + "size": 593, + "sha256": "4d577467a8dc545615bea06a33fe3d96176f8ef59cd353b7c6f719ad673b6921" }, { "path": "package/dist/domain/connection-removal.js", - "size": 2970, - "sha256": "14386d1896cce9309419226c07788ef82bb9e50a2e10500f5d07c307e2ed7545" + "size": 2987, + "sha256": "28ac7f7ff48efdc00f2fc55218a72a4d82cc6465af2490656b067d508406a674" }, { "path": "package/dist/domain/connection-removal.js.map", - "size": 2362, - "sha256": "ab2b9e49451e7478f2aabafe4a0f8ed2e9b0d1c603f761571c901aca8a4c88ad" + "size": 2363, + "sha256": "ff040b55d14fea3a473eecfad18b7fef8117e5e6cf5e4aee714ea8f33d8c1860" }, { "path": "package/dist/domain/content-budget.d.ts", @@ -5792,33 +6232,33 @@ }, { "path": "package/dist/domain/entities-core.d.ts", - "size": 7822, - "sha256": "f244bc742395e04b62b7cd10ea485c4fd5d4fdc25fb9c216b095137ee3ec6bab" + "size": 8917, + "sha256": "2a73daa6327cf679547f877dac7aa90a78cb5a647bdfa78176e6812a8269029e" }, { "path": "package/dist/domain/entities-core.d.ts.map", - "size": 7299, - "sha256": "7c3a792a8a4e1cc7a6fb27453f1c7f310480cb3763805c3faaad7194ffb8032b" + "size": 7821, + "sha256": "c4b95683525725fbd774f7603d8e238ce4d794944293fa54710019416f8a94bd" }, { "path": "package/dist/domain/entities-core.js", - "size": 52, - "sha256": "448ca0ee188d70ed699187682e2686b5ed246cc36f41124694db9edd604581de" + "size": 331, + "sha256": "68f4f120f6fda3d73a63b6b68fd34294fa6bf0d62dc5a853743c8d6e2b5a6203" }, { "path": "package/dist/domain/entities-core.js.map", - "size": 128, - "sha256": "e737e03a4ed1ead77bc3bc403e095e5c520e1b9dee49d6c4d8a34272d98b8fa2" + "size": 342, + "sha256": "85f67e7a37aab9e8e8fb302e15e28d8b7af70e8d8f4573d51e0830880957099f" }, { "path": "package/dist/domain/entities-graph.d.ts", - "size": 5267, - "sha256": "4a1af0d228c990e103a94f363ee3c6cf77a27764e337a43c1cb936903ae9dd9c" + "size": 5284, + "sha256": "ecc5aa297ce2a0b6c7d99f56d6ce5c8100c206915554f8ed135d72b6061d5fd1" }, { "path": "package/dist/domain/entities-graph.d.ts.map", - "size": 5367, - "sha256": "4dde3764f8655197d49398d1d32ae02345fa9768c980a12e028501e38a54e93e" + "size": 5377, + "sha256": "ba22b5d3107aafe5d8a3663ea697de08e0877ce3f3010ac24aa010190adaa024" }, { "path": "package/dist/domain/entities-graph.js", @@ -5832,13 +6272,13 @@ }, { "path": "package/dist/domain/entities-interactions.d.ts", - "size": 8261, - "sha256": "74f30d939db423c1f705938cca6a7653f5b282ac26c19cec60fd31e6d030b2dc" + "size": 6793, + "sha256": "671b7b276b51644008b1693bcd2bad6212117dfd50bbc32bf6ae7b6723f03b05" }, { "path": "package/dist/domain/entities-interactions.d.ts.map", - "size": 7788, - "sha256": "dd558374ef53ea5722102d781fea49a4b682694b67c87ee0982fc85a05baa87b" + "size": 6568, + "sha256": "ad53949ba78feba93f37f50a29919d177b048d09013d233848df99c02096fc2f" }, { "path": "package/dist/domain/entities-interactions.js", @@ -5852,13 +6292,13 @@ }, { "path": "package/dist/domain/entities-messages.d.ts", - "size": 4795, - "sha256": "3cb76c81f199cd44014d5ce347734b1e5e2841bfe922922e72fa66f799ce19b2" + "size": 4921, + "sha256": "91f55f3d9b1e416129332e0f54cd18f72cc7d29680aea2aed7490816c79a6a3c" }, { "path": "package/dist/domain/entities-messages.d.ts.map", - "size": 4579, - "sha256": "74f07298aadb551d4d4a31c6a4d45abf269d43115e6bd075dbc7f68feee2c692" + "size": 4635, + "sha256": "85038c4a25bd4d7140ec3d30b4e2ac033f5ec1fce7f57c155300e3e50fca8cd7" }, { "path": "package/dist/domain/entities-messages.js", @@ -5873,12 +6313,12 @@ { "path": "package/dist/domain/entities-runtime.d.ts", "size": 7029, - "sha256": "827b6f0e4b7c597e7c1ebd9a5b2251960c0aee36eaf71e11869d169f3325f0eb" + "sha256": "2c39df038847b3773c350b4b8cbbc9bd3285b1614db3f2444502d954d5168aba" }, { "path": "package/dist/domain/entities-runtime.d.ts.map", "size": 6460, - "sha256": "0ec5b87d69dec84e5abef6af0da562fe60e76328d6cbb6f77106c141661621f9" + "sha256": "6209a1cad6d27446a063fa9937401170e506a67971bb2cad41ad79196fdf29ea" }, { "path": "package/dist/domain/entities-runtime.js", @@ -5893,32 +6333,32 @@ { "path": "package/dist/domain/entities.d.ts", "size": 312, - "sha256": "767e72aaf142206aa797d72e555cffd0b393e5986c0a378eaee831166975a420" + "sha256": "70b4b83796da24bcb193d051d4d1dfb9e86af91bd5c0289df38d89852dfc5776" }, { "path": "package/dist/domain/entities.d.ts.map", "size": 279, - "sha256": "b3ec1dc9c20ecf370758e59430b7e3444acb300ea526884144e979a74c6ea43a" + "sha256": "f3dce9500f13a4b2d2c57496031756f2616b3027ce4eb682b5595008010613b5" }, { "path": "package/dist/domain/entities.js", "size": 310, - "sha256": "dde6760dc11d56b9a8ea69710cb4a4a706d551a884b1fd8d5149a3eda9d3d297" + "sha256": "035ee500aa61275326b0edbf8bef773443dbe8b74d36223f8de40f89da85045e" }, { "path": "package/dist/domain/entities.js.map", "size": 277, - "sha256": "e2fbabc53aeddb9f551b3fc41b7a1c6c67cfb262a1e60a05a0720a25b7946fcf" + "sha256": "430d99c015456f40eabeb43d95f88df92b0400ba6625cbd4c5d13dafe7e496f2" }, { "path": "package/dist/domain/events-legacy.d.ts", - "size": 6462, - "sha256": "ff2b970985e3d1206de59de937fc1284c98a1d4140cd93aa19cd290dddede57f" + "size": 6687, + "sha256": "2d8a2fbc64715d7ce3f934b10f1cabb0a10ef94b8e824bfc474e2b2757cdd9c9" }, { "path": "package/dist/domain/events-legacy.d.ts.map", - "size": 6964, - "sha256": "0cfff8fb4f7aa30e37d7c04a763079a6eebb3583bc015d0c717221146358c66f" + "size": 7141, + "sha256": "bc8b55451f5bfce683a44208c3c93c476803c12bea85e5fcb094e471b5358f67" }, { "path": "package/dist/domain/events-legacy.js", @@ -5932,23 +6372,23 @@ }, { "path": "package/dist/domain/events.d.ts", - "size": 11050, - "sha256": "d59980dcbe393a7f6f99fae6138bc6062b0795e78a904b1b83cf2860aac354a8" + "size": 10559, + "sha256": "404e437993bd7b4bfa5875b5dfe0efd4b246d619db129488c16ef92638f5c34a" }, { "path": "package/dist/domain/events.d.ts.map", - "size": 9398, - "sha256": "fd804fd0a9ab0db59b7d0f475dff498d6045a4be76c80b09db5d183279e2f131" + "size": 8921, + "sha256": "215491cbb1e2eb64ee65ece2efc44402cc583f603990ed9d9fec17b1c4a8bbb6" }, { "path": "package/dist/domain/events.js", - "size": 3536, - "sha256": "5f9b70dd19730518bf3bcc946460459640bc31fe784de40a7554fdb670359dd5" + "size": 3626, + "sha256": "5c6a4fd1416c2ccf8422de75c2a5d29c04ee540269d4d8c5a6244440dab1ec0f" }, { "path": "package/dist/domain/events.js.map", - "size": 2604, - "sha256": "b086602c935370c6e0b2eccf32fa9b6ca04294a4f44395da464777b53fd13038" + "size": 2747, + "sha256": "1002b7ce41c9f83f6fdda55dc1a188c2871e723bad732929330f3199471e0b97" }, { "path": "package/dist/domain/execution-observation.d.ts", @@ -6033,12 +6473,12 @@ { "path": "package/dist/domain/ids-values.d.ts", "size": 11912, - "sha256": "85dee314ac328affedd2e8c969fe84ae4e129e4520953f8dff5eed17c59b11e9" + "sha256": "235a19954a005ec7c9635d41c61f7522c4ad5ac32b2545bb4976178219cba4a2" }, { "path": "package/dist/domain/ids-values.d.ts.map", "size": 8909, - "sha256": "a597f5ea7ddd43d818fc500fa32fae941c94b60678c83f68a2ec401435a34882" + "sha256": "473e2750b0522c0bd014caca37aa5ed63f4a10d79162ba88558b21901c02dc24" }, { "path": "package/dist/domain/ids-values.js", @@ -6048,7 +6488,7 @@ { "path": "package/dist/domain/ids-values.js.map", "size": 13631, - "sha256": "464db5fac1352aa7ab138ee340738c01600963e0486f46556123afbeb709babf" + "sha256": "190cacf33e9bca55dab921debfb5ebe361218dbfe2c5148741b639c579aa4493" }, { "path": "package/dist/domain/ids.d.ts", @@ -6058,7 +6498,7 @@ { "path": "package/dist/domain/ids.d.ts.map", "size": 569, - "sha256": "521bc1c3063983987dc0f2480a048c953a2e00f621ea23f4cb6985834289314e" + "sha256": "98c9bb0d6f3fb902a8e4a389ea1158f0069066ca06751cd515186da59beed35d" }, { "path": "package/dist/domain/ids.js", @@ -6068,7 +6508,27 @@ { "path": "package/dist/domain/ids.js.map", "size": 484, - "sha256": "99b69c077d6c4e57f735b317dfb2811da2044b9859f4a30d460755e6d596b976" + "sha256": "7391b6f6bd8a5a5742d616166d083d5436bd9aa91e2a0432f5a9614edba8217e" + }, + { + "path": "package/dist/domain/interaction-timeout.d.ts", + "size": 238, + "sha256": "0d44f6fd9f8af4065e943dd032d1003082945b83e8e7b00a2cc3d262f0d81c08" + }, + { + "path": "package/dist/domain/interaction-timeout.d.ts.map", + "size": 312, + "sha256": "903480e8b841d4a7298c62195d0352853fa53b493784ecc1208370e9e11690ca" + }, + { + "path": "package/dist/domain/interaction-timeout.js", + "size": 528, + "sha256": "3e30627d31773feae6911d22528298590df7e44a6fca08dde65660ca0079e7ae" + }, + { + "path": "package/dist/domain/interaction-timeout.js.map", + "size": 726, + "sha256": "604c989e6b5ea13d0bbb03f5c3ddfb7eaf732501c3a7f8d04b61bd914ac2d6c5" }, { "path": "package/dist/domain/invariants-base.d.ts", @@ -6078,17 +6538,17 @@ { "path": "package/dist/domain/invariants-base.d.ts.map", "size": 1985, - "sha256": "4a37686afa8aec6580a3135ed7c4e1c5419e5b9f2233f4d5da8eeec8329c8b3d" + "sha256": "6a50456579c702a1245e95476e1dbfeec3c0e4f50d3017d3cc9accb588ad4f57" }, { "path": "package/dist/domain/invariants-base.js", - "size": 6187, - "sha256": "e846f527fd17a562e99d30176d2107d32d4fc50e63edfdd422603ae06e7e7890" + "size": 6207, + "sha256": "2321372838a32e14e046b688edb79a6c833a7455b900e87cb0bc288ec75db5fc" }, { "path": "package/dist/domain/invariants-base.js.map", - "size": 5688, - "sha256": "7d62e2ea2a87d9a03ed8c084be51747db72eeed3298987fac53046dfc072b59e" + "size": 5698, + "sha256": "268982872aba50cc629dd88c2023bbaf7e9b7ebd3b0ae3b9175fe8f85757bb32" }, { "path": "package/dist/domain/invariants-conversation.d.ts", @@ -6098,17 +6558,17 @@ { "path": "package/dist/domain/invariants-conversation.d.ts.map", "size": 523, - "sha256": "4bcac1a202d330089a760b39209b10ef69f22c208e2122e624e25f8e5a3eda8f" + "sha256": "fde2de2c015a20da37b1b95a828fb0ffb53195de7a29cb02736d6b15a80a3576" }, { "path": "package/dist/domain/invariants-conversation.js", - "size": 6916, - "sha256": "663e46c15f80bc0e3bad70a5989f2095c1a3fac9d004c383b86d2daba9f1234b" + "size": 8100, + "sha256": "f8deb3a09bac2a3146a1d963bada0d33c55cedd48aefcae9332c0895add8164e" }, { "path": "package/dist/domain/invariants-conversation.js.map", - "size": 5887, - "sha256": "2887ef2e4846f27038c9db0e8fd61a4e60beaf8a981bbcc94878911859619408" + "size": 6906, + "sha256": "de9034012a3679b699549167ba3dcdd891de23053a5ea5421ca790bc3bc66387" }, { "path": "package/dist/domain/invariants-profile.d.ts", @@ -6117,18 +6577,18 @@ }, { "path": "package/dist/domain/invariants-profile.d.ts.map", - "size": 628, - "sha256": "7a884a5e3ec6b6528ab9995a8355a1c1bb5fc1787be0e8da3dd8e35d7e29a089" + "size": 629, + "sha256": "c2021a9923fb2c1307252979eb89badedc8c2bc101b1b492664043c67f562657" }, { "path": "package/dist/domain/invariants-profile.js", - "size": 4522, - "sha256": "0b3123a5dc6b724db1e88a9b5d1f0b4f37aaaf1f9ce5d69891486aa69fa4df7a" + "size": 8332, + "sha256": "dcd2bab1ff408ab14a2530325a392d78c5ba995cd5fc57acaef34110969b8839" }, { "path": "package/dist/domain/invariants-profile.js.map", - "size": 3954, - "sha256": "9d333b41da8d9200fd83854fd137cece23734575a0cf71b97e7a943524374af3" + "size": 6404, + "sha256": "3a46cab9bd49468a26be6f928cbe0928ca9d39245f6635b222e421d0eafcf1c7" }, { "path": "package/dist/domain/invariants-relations.d.ts", @@ -6138,7 +6598,7 @@ { "path": "package/dist/domain/invariants-relations.d.ts.map", "size": 245, - "sha256": "a712705cf972a9fe613e6ea9ab87f9c906e0a267ad97975aabf76c251b6e7dbc" + "sha256": "d22ffc87d1f3fe9974152b24961b4451cc1d9365bcc195d02671367ba7416a60" }, { "path": "package/dist/domain/invariants-relations.js", @@ -6148,27 +6608,47 @@ { "path": "package/dist/domain/invariants-relations.js.map", "size": 5849, - "sha256": "baccbe4514baac0f57ebaa99747016d11cdd08645f0e10e666c3e806d2ccbe29" + "sha256": "2e304dc3fbfff7dd4994b1fa655ae4b1345e254d23e2a4ef85130fcdb94a7c44" + }, + { + "path": "package/dist/domain/invariants-retained-admission.d.ts", + "size": 184, + "sha256": "560a968e0434eeaa5e624b972be2bb33975a7b3ed77c115c682c0afd80f21e11" + }, + { + "path": "package/dist/domain/invariants-retained-admission.d.ts.map", + "size": 264, + "sha256": "24b0a1be99a020e3b8fb9d9145ae2a6df1afe708557913a9021146022174ee4a" + }, + { + "path": "package/dist/domain/invariants-retained-admission.js", + "size": 5651, + "sha256": "a61ed657d980322480803298e8cba2890d570cf58708f6da41a1a8d4375a7d10" + }, + { + "path": "package/dist/domain/invariants-retained-admission.js.map", + "size": 4179, + "sha256": "7095e7515f52143dc637c13a02fce5f34e1e48bc6c2c764058d1f782cb335cf3" }, { "path": "package/dist/domain/invariants-run.d.ts", - "size": 555, - "sha256": "2b90626b9b65cf70203b19f39d80a25854319a513e7541af4eb73ca2cf72159e" + "size": 366, + "sha256": "198f8916584e7ddf7f8660348c9ff4db58959ccc3c42bfdcfe8df0c24b9636d6" }, { "path": "package/dist/domain/invariants-run.d.ts.map", - "size": 500, - "sha256": "8606affef36b7d1dc20dd0f34628687202c577a1f2e123874f81dc3e687be91f" + "size": 371, + "sha256": "afea0600b1efaa4bd3dbb502fa091249b9eb6cc7acd8a2327d051c6c6d4a037a" }, { "path": "package/dist/domain/invariants-run.js", - "size": 17174, - "sha256": "e505efab4ab0de5064cd302e366c0fded9e9cab8abe862b68038ddaf38c5f37e" + "size": 20681, + "sha256": "43946040b904e4fb5fa278c4f13855f9c6a2c9e05d3bdc25cc147f63a4892ecd" }, { "path": "package/dist/domain/invariants-run.js.map", - "size": 14111, - "sha256": "e4d1e8fe0b14f30194d89d391e376ce503747f4677e10e583ec62c883233b0b0" + "size": 17057, + "sha256": "615b2454bb56f1ea14dec4d520f33c5f43b9f5bb3001d8023e6e40aa879a545b" }, { "path": "package/dist/domain/invariants-runtime.d.ts", @@ -6178,57 +6658,77 @@ { "path": "package/dist/domain/invariants-runtime.d.ts.map", "size": 1094, - "sha256": "c20ece49a640729046ad7b788b43a3a809684c470c26746d22b198e6f2197af8" + "sha256": "f342d8d367426efc58f2485f7fc5063ab8edbcb34131d79f63119d9b7c82eec5" }, { "path": "package/dist/domain/invariants-runtime.js", - "size": 19763, - "sha256": "5ab95c63a26f83d393869e28db8494e3492ab2f50d716a13be5cd8c9d6aa2c3b" + "size": 19739, + "sha256": "7296bfdc8577a0c1e0ccdd3a3c8a9eb8540d15b279a6beb97ddddecf86ff7332" }, { "path": "package/dist/domain/invariants-runtime.js.map", - "size": 17015, - "sha256": "7465b7a10a0beb9047ae8ccc508b76092472530af20dc43c96f6a3234924a20e" + "size": 17051, + "sha256": "85081a91aac1b348a9406707886b4153e021318b1a28d448c89009b8c3afc5d6" }, { "path": "package/dist/domain/invariants-state.d.ts", "size": 286, - "sha256": "1948c5661d89a509ff61362287a965872cd64a99847dc81a2a182e68156489d3" + "sha256": "bc8b89b55f6f0742580318d79c099ed1bb9fabcffcc2577b61e6738a595250be" }, { "path": "package/dist/domain/invariants-state.d.ts.map", - "size": 387, - "sha256": "0e4b06e803ec43cdfb798bc4f6e07d6c8402471f75f9aecf837b2bf411c1bcc4" + "size": 388, + "sha256": "d28f96e68680b28219a052b0bd8a5f58b52d0b8c6350e800357d858346590506" }, { "path": "package/dist/domain/invariants-state.js", - "size": 9221, - "sha256": "7759422a1a1a23f3385cf162b0701e2eeff1dfc34a45c77165dfecc0d2405e86" + "size": 10334, + "sha256": "af1347314d4f6d43b55a7f7fd78b6c8da3295179d55883eff99a1248ec042b8e" }, { "path": "package/dist/domain/invariants-state.js.map", - "size": 9423, - "sha256": "4c685171cb531f022f3fbc49dd3f102ed44b9260cd8dd7a5c08721ab5cf6d225" + "size": 10608, + "sha256": "fd77639c019ad6b9795c20df5ec2749c1602cb4ad9acd439f9d1f3557f7dd97d" }, { "path": "package/dist/domain/invariants.d.ts", "size": 282, - "sha256": "c52a51c44f1032e91eef2dc6ae42a367b6f4bb300035ec33eb3342b34e2734af" + "sha256": "1787f33f2631a00c9065c160ae8eaa06d6daa626695dce8b3cff2db240c2778f" }, { "path": "package/dist/domain/invariants.d.ts.map", "size": 260, - "sha256": "76ba2213dcbf6dd9e967c0298b3f80482b81bc07511f20828125ec517345d645" + "sha256": "9ca5f623dfc669886736f951d1e549300b67917af8d01192318fd9e12f831a90" }, { "path": "package/dist/domain/invariants.js", "size": 280, - "sha256": "8ad8491593ef020e15550ed5f052d43102fa4b0ffb155d1269d17203fa782bde" + "sha256": "59459dbdb9a0a499b4f6222617adcb644377cc2ef690499ea7c6e77804d59bd5" }, { "path": "package/dist/domain/invariants.js.map", "size": 258, - "sha256": "6ac24b20c28c1424fd3b41445dca9434ce78b79e6354690ba5f20b534d17a652" + "sha256": "730ce8240690bad9fae376173b7067585bca71d4994677f65fe4c4d36226fa2e" + }, + { + "path": "package/dist/domain/legacy-interaction-snapshot.d.ts", + "size": 329, + "sha256": "14cee4c36f2e499394d3a4b5155a4bf36f0c1ec8d6a325379f4716ea9cd12d6a" + }, + { + "path": "package/dist/domain/legacy-interaction-snapshot.d.ts.map", + "size": 353, + "sha256": "2c67779b813049b42fd0b667552a236ecb6a411cba930224b59637e5e251da50" + }, + { + "path": "package/dist/domain/legacy-interaction-snapshot.js", + "size": 9908, + "sha256": "cec7c8883ea249864397de278c1cf932263a76758f08cacba51a126e3963b0ce" + }, + { + "path": "package/dist/domain/legacy-interaction-snapshot.js.map", + "size": 9130, + "sha256": "102a4fb92d2d300fe6facd27e7daf6c0a29044901db3f7b2fb9114e40f4192ed" }, { "path": "package/dist/domain/materialization-receipt.d.ts", @@ -6252,23 +6752,43 @@ }, { "path": "package/dist/domain/materialized-state-snapshot.d.ts", - "size": 4158, - "sha256": "4a9264bd46c20916add0a1f1c7235ec2478411e9edb5714e47ba8c86aaf33250" + "size": 1441, + "sha256": "a8a92df3c89f3c6691ae2d297cc2fc99225dd433607689a0aed6055e3798ac8f" }, { "path": "package/dist/domain/materialized-state-snapshot.d.ts.map", - "size": 3469, - "sha256": "0407196a5786ce6dd8ea5e1aeadb47bd031834ec9fc6d097e3f27fc993450eeb" + "size": 1089, + "sha256": "680c9cf7721d6dc32e18d04cbb7a5c9d3c4235439aa7a46b829b0e5c431f21e3" }, { "path": "package/dist/domain/materialized-state-snapshot.js", - "size": 4782, - "sha256": "47f301983ce762867722e3609d942dc89c75c0a0bd1a8d58c458f62b0eebe3f9" + "size": 6341, + "sha256": "463a35c8279d868badb2fc645bebc35f41b84ce55ef1e49582ca9b58640c6e42" }, { "path": "package/dist/domain/materialized-state-snapshot.js.map", - "size": 4033, - "sha256": "f7192b2557d064021ac3cd89a433f6fbad1fa817693486a49c2848fb6af8e44c" + "size": 5530, + "sha256": "47382d698a924da53869b1aaac0184c92f43ec13280f985d69a02fd0717517db" + }, + { + "path": "package/dist/domain/materialized-state.d.ts", + "size": 3216, + "sha256": "80c90f91e16486914c86eb948a891410843af28158ce8ef8517c610ffeeab477" + }, + { + "path": "package/dist/domain/materialized-state.d.ts.map", + "size": 2810, + "sha256": "fe758e2aa784d3bb991a82e17d80934fe5c3c247a67d3313e21ec726b65a3381" + }, + { + "path": "package/dist/domain/materialized-state.js", + "size": 57, + "sha256": "d0f53c99b6f930f25e464c25255937e88a0f33c0b04c238139cd5c17869fe423" + }, + { + "path": "package/dist/domain/materialized-state.js.map", + "size": 138, + "sha256": "83b44f38b197f387cba1861f974a5f1136f65c501d13fb21e694a6215b38e598" }, { "path": "package/dist/domain/projection-checksum.d.ts", @@ -6332,23 +6852,23 @@ }, { "path": "package/dist/domain/receipts.d.ts", - "size": 2055, - "sha256": "0a504deeaaa24e48e7d6ef101dc6a2c22082631ab4e968714a2defc39c4cd89c" + "size": 2180, + "sha256": "a8812541d55a4357091cdfa8c63afd24867006a37013b03d5d194f531c71afbe" }, { "path": "package/dist/domain/receipts.d.ts.map", - "size": 1892, - "sha256": "9921cb6fdff9e9454031203aa2093512eb77e4c4e883d895e62561ee666c7191" + "size": 2002, + "sha256": "39a6e5a9187cdf159527b61f69eb9f89f5e8cfba168636a6af197deb344ee755" }, { "path": "package/dist/domain/receipts.js", - "size": 6816, - "sha256": "e655d858e65319acb789fc013fee2d49e35d752c406dab3f3c4ae321b64fc082" + "size": 7056, + "sha256": "4f4816f81b6e433cff8af8f076fb03873059d501c99e615288de09e7d4a2f9c1" }, { "path": "package/dist/domain/receipts.js.map", - "size": 6344, - "sha256": "099baa16d284c7e446315bbe7d1e8719db32805302fa47418addc10f1ed0bdc2" + "size": 6658, + "sha256": "82db57aa139c6bf5c10e630198f38998686c671343a6eafa564ba95901fe7436" }, { "path": "package/dist/domain/redaction.d.ts", @@ -6358,77 +6878,77 @@ { "path": "package/dist/domain/redaction.d.ts.map", "size": 570, - "sha256": "7c2703168deacaac5b3abd01e102e80f59e529b46197a6f9920bc7e1acbd9b84" + "sha256": "5901d4c327e5f4ac38c8245814e01af5c66bfdfdafb1138bbb9d9f41cb65c4a2" }, { "path": "package/dist/domain/redaction.js", - "size": 2801, - "sha256": "805c822f61526c07c530cd9bb1a5d754ef7c815e2fb6db550be8bc60bc73f575" + "size": 2798, + "sha256": "96b290690b1b7040d8a9744c8743b2f59323980341b987e53835a1e3dc468567" }, { "path": "package/dist/domain/redaction.js.map", - "size": 2740, - "sha256": "22deeb0025b1cb9b414e0180ce259232f48252a0924e2667a1c8e4ab6e4adb9c" + "size": 2727, + "sha256": "929fa0b401db784a6f2333033f90353b8e1268d0a6c1682d621f3f0fdd9a3443" }, { "path": "package/dist/domain/reducer-content.d.ts", "size": 569, - "sha256": "92700f34a344f27b1c0b1aa56a41ac6a061d3ba04cc5598e9e626e6bfd106348" + "sha256": "043ea0bd2ac244b31edee775ab3d9da3dd48a9a179a4dbd91a23cee01146cf61" }, { "path": "package/dist/domain/reducer-content.d.ts.map", "size": 567, - "sha256": "67ed19c1695e649dba65547ee8d4b4e303c98e3519777faa3d7e5712a1d41c41" + "sha256": "d622a84de8c6389ad85082c8fe6b8c023c6648127f41ba7ac5beb609e93ef053" }, { "path": "package/dist/domain/reducer-content.js", "size": 11193, - "sha256": "4d90c6c9abc227e6e1b91824c47e737fcdb7be38be869d8bf72418f41818c1ab" + "sha256": "b2c78904cf769c6a4a5ee434cd8170148765d4dd726fb71956d50fb23c1d9e02" }, { "path": "package/dist/domain/reducer-content.js.map", "size": 11190, - "sha256": "29e983dc7274e647a2e7055a76f8ccd3963d8e2f9da65c55dc716b02bb089bbc" + "sha256": "4090d2cf03bcc14648cbb3b52609e26365052b0311f5c582b2b38e8b240f8bbb" }, { "path": "package/dist/domain/reducer-conversation-events.d.ts", "size": 520, - "sha256": "572284b6f2799f52a09ef4776a602b0da20955890113f18c08317461e8f62c64" + "sha256": "f5b3846889c59faa009984cf22dc043cdbeccb7852ccd7f330e289ffaf71e2b8" }, { "path": "package/dist/domain/reducer-conversation-events.d.ts.map", - "size": 514, - "sha256": "7a34a123d2e0b714c75c2ea071e5553b99963364d82ad59a605ec88950263ef9" + "size": 515, + "sha256": "c5288c5029babc8e750b5c59f441294d6166b8862022348bfdd909dfe5b7526f" }, { "path": "package/dist/domain/reducer-conversation-events.js", - "size": 11132, - "sha256": "456d0d6a64856d2053ae8cc26f799cdf0abc5bdd1c12e707ffbc9285a503cd46" + "size": 11837, + "sha256": "83d9bba7ce8fe45b2db7506787fb4a9888831031c6a2284423f681ad199969d0" }, { "path": "package/dist/domain/reducer-conversation-events.js.map", - "size": 12200, - "sha256": "42187f2fbbc3d7e6544f272948c9615ae2f68240905137feb66b5456f0bc596c" + "size": 12787, + "sha256": "e655bcbfaee9c44ebbc38f71a6ccb2d5e7e696a802e64304f60ca11c471d2ccf" }, { "path": "package/dist/domain/reducer-domain-events.d.ts", "size": 329, - "sha256": "78966cdf239ddd2bb67d71cd73233a0181500479a145892f8977d2ffcceb7535" + "sha256": "f6472537e96e9ce97bf98bfbdf7e3be10bc6a1d79625b21bf4448d15f1a337a6" }, { "path": "package/dist/domain/reducer-domain-events.d.ts.map", - "size": 414, - "sha256": "46025c0a01b7f5c0c8ac482e4803a1a339382fd416ac158aa43c6b0a4b5959bd" + "size": 415, + "sha256": "91a65a8254b04c82c6da8e4cb67dd31e0b0818134849aeb1ecc4c526b00bdfd9" }, { "path": "package/dist/domain/reducer-domain-events.js", - "size": 12350, - "sha256": "e5e561d46e4a921919ce942cbc50f0941819eac5718f088cd514cae28dc4db16" + "size": 10588, + "sha256": "05f5d3cd19b9613bb2b6818589d35d3846c239c4c10c7eae45bb323a05513064" }, { "path": "package/dist/domain/reducer-domain-events.js.map", - "size": 11164, - "sha256": "e272f9eb5e4f7bcbb32f8b40430ccc815f874e61ce200647a7d0ccc2a7534513" + "size": 9962, + "sha256": "80730267173abf83cc10da8d6b6aae22b1f4977efbd6991c900810e4975698d0" }, { "path": "package/dist/domain/reducer-execution-observation.d.ts", @@ -6448,87 +6968,87 @@ { "path": "package/dist/domain/reducer-execution-observation.js.map", "size": 6077, - "sha256": "035217fef5820dca11b1da32556f13cc6ab7a300f9fb65f9411f71ad87f17608" + "sha256": "5f07133ec3d6e4555df2082f48cd507e2d6ca54df48235b1ed9303f2c13c6b8a" }, { "path": "package/dist/domain/reducer-helpers.d.ts", - "size": 3564, - "sha256": "0f6582ed745706f80413376971ff5acf344546824fe968e4afcb5a36e2ca8d63" + "size": 3726, + "sha256": "6fff115fe95630c52be65da8efb1dcaf8e081bdb76143ae30c2c992e771f7586" }, { "path": "package/dist/domain/reducer-helpers.d.ts.map", - "size": 3085, - "sha256": "afa0bfb12d78d6c21645eed465ccdb56be6aee9baeadbd0682460b17dd454bb9" + "size": 3257, + "sha256": "f52da922ea63a8c6502d294ff4f751546b2d23802234c298291de0088b51ae88" }, { "path": "package/dist/domain/reducer-helpers.js", - "size": 13200, - "sha256": "89919019374b8ed9bd1245df635884b91bd7edf71700103beb03e5307c906641" + "size": 13316, + "sha256": "2feeaa045d04bc041321288a19022b6b80eedf3d2e26893ff2ade942ade1d81c" }, { "path": "package/dist/domain/reducer-helpers.js.map", - "size": 12534, - "sha256": "e38a9e9ad31092d0e8da1146043f026104c61d6c09e46deb39a06299bb470665" + "size": 12658, + "sha256": "e410a6cc407543afbfaad9bbdff88d61c8d3e1f655f01a555d4d155c39dbf088" }, { "path": "package/dist/domain/reducer-interactions.d.ts", "size": 575, - "sha256": "b6bb00172382beed88bc6293f4273319c95532fa6b5181a5d769ec2176515205" + "sha256": "cf658f6e44890bf2c4c80b78f966fa67a30c224ea7baa2753ca3c52e94bd5181" }, { "path": "package/dist/domain/reducer-interactions.d.ts.map", "size": 548, - "sha256": "0920a80ab41957ac8bea8944cead70980695711922b2f604cb7edebbc3c1980d" + "sha256": "37d8217d111babd3a98f4771482d8ea6089f973807e4908b7ff297b488575f46" }, { "path": "package/dist/domain/reducer-interactions.js", - "size": 9602, - "sha256": "c01a2e703296250dfa80b349313f2400fba25302cc18282ae82240f7817c6153" + "size": 16145, + "sha256": "ea6d5c31f24b7994159e672ec11b9f9530138d0c15876bef6ff37e9802df5378" }, { "path": "package/dist/domain/reducer-interactions.js.map", - "size": 8433, - "sha256": "1bf6c7f45a21b831ae943f3c61dcab5ac4b4ef01ec15ee5bca93b0920a92f66f" + "size": 13963, + "sha256": "f793e13bd3ed24f8182a8772f2f351a157d9c582ca46d05989bb370b17ecedc9" }, { "path": "package/dist/domain/reducer-legacy.d.ts", "size": 465, - "sha256": "a458d884562d378591f986124fe6ca2dec7b94cf7fe212fa0c30be5e6f15bce0" + "sha256": "c9933ce5a51eef09910369dfeb179f6abd5c0eb23ca147643ba24b37dfcf82de" }, { "path": "package/dist/domain/reducer-legacy.d.ts.map", - "size": 468, - "sha256": "871143ba931fe865c4bd7a8f4773c329f51f1b530c44fada6df63e0eba9f42e7" + "size": 470, + "sha256": "1b2b276eb2154511fe9c13319b1587209e48e485dcf66597832822a9d1527814" }, { "path": "package/dist/domain/reducer-legacy.js", - "size": 7633, - "sha256": "730d14c7e70ed9e8c3953318bfaf7bf4c7c8fe995a0a33813cbee847dc5f7949" + "size": 7956, + "sha256": "efe6b9e4e02615d36bc5152a6eb44a41d6815e3dd9f789aed5cf0b48023b38ca" }, { "path": "package/dist/domain/reducer-legacy.js.map", - "size": 6847, - "sha256": "2b6a2db0b9bdab7a23b7b12e42cfe1801e03fd08140557a481441225f8f665b4" + "size": 7201, + "sha256": "3663dfccbf430389808ff92f3739824235cbb2445033a0b26dfa6f9b690dea8b" }, { "path": "package/dist/domain/reducer-lifecycle.d.ts", "size": 592, - "sha256": "5d28fa39664bd027e2a0d34cdd1b129bcf1361d749036d04e2a3932edf478ca0" + "sha256": "ce5c69893ae63c2d0fdbca79da170a422144758b69c34bf22cff83883d8a857d" }, { "path": "package/dist/domain/reducer-lifecycle.d.ts.map", - "size": 578, - "sha256": "c50a76cc4c4cc6b4d01c05d2b9d1ed28105215c7be3258e1a9a7da164b4206ca" + "size": 579, + "sha256": "44d69ce041b44edd22fe002fd2efd7797289b99a78e74d1aa8ec43223551afb1" }, { "path": "package/dist/domain/reducer-lifecycle.js", - "size": 10739, - "sha256": "949745a9febbc8c0818823a1f2799694d44813235f9f9091399a2ea0468ecaea" + "size": 13485, + "sha256": "b0986911a30948b59dd5d85c66b79ab0bac9f27e7966bcd776d8b97a149e7c75" }, { "path": "package/dist/domain/reducer-lifecycle.js.map", - "size": 9856, - "sha256": "de9d4cb9f443f9afadfc0ea4f0d6c988555359e79c60d475b3cb4184611f984d" + "size": 12104, + "sha256": "1b8bad21c0aae619889009216ac4bc7d2e457893a5879725a9c23deb235e5552" }, { "path": "package/dist/domain/reducer-replay.d.ts", @@ -6537,18 +7057,38 @@ }, { "path": "package/dist/domain/reducer-replay.d.ts.map", - "size": 699, - "sha256": "3e8d1ff59bfbde24333a4cc7d1a69a4f3dd8aa53e461c378c98e64980ca0ed20" + "size": 700, + "sha256": "2e72fd003451a1c25af41ae88cecfe09b3da243f15113f4d26bb84d75e3f3859" }, { "path": "package/dist/domain/reducer-replay.js", - "size": 6421, - "sha256": "e7296bb34e6ddfd68b020302181e5b0b083ca189a099f087e4772871ff8c274c" + "size": 6484, + "sha256": "a0ad9afc12fc41712db5b5db38c9ba1314309d67d23630a4df8effb72a8a2e93" }, { "path": "package/dist/domain/reducer-replay.js.map", - "size": 5983, - "sha256": "ad34fce650ad083328f230113fcf3b578bc2bebeab6e0c5c2bc81c80b0f140c4" + "size": 6029, + "sha256": "9acf8037e892ba549b89b6f7178fd9df596e0535a10813606659149f6918eccc" + }, + { + "path": "package/dist/domain/reducer-retained-admission.d.ts", + "size": 382, + "sha256": "af5d49476c511da6677ed045bae8465dd8c254fc395e50214327dc800a97f96d" + }, + { + "path": "package/dist/domain/reducer-retained-admission.d.ts.map", + "size": 443, + "sha256": "3a2b522cb754d1025270672dc52a97b4eda5c2cef861c728e8d136607c31ee5d" + }, + { + "path": "package/dist/domain/reducer-retained-admission.js", + "size": 6517, + "sha256": "5325d3f9903bea1cd9329161e511b85b9df55ecf7602256e9da819d7629f9c03" + }, + { + "path": "package/dist/domain/reducer-retained-admission.js.map", + "size": 5381, + "sha256": "3fc1119986347ac9fedd8ff3e0bc015c37f11b422f4e79c7be3275bb05e2515c" }, { "path": "package/dist/domain/reducer-run-graph.d.ts", @@ -6558,17 +7098,17 @@ { "path": "package/dist/domain/reducer-run-graph.d.ts.map", "size": 508, - "sha256": "99b326efda20c8d67e53d4050439e34db56bed052b702d2e230d0181d781ed07" + "sha256": "8d92345395d23c53e6b1017dbb83789b531e345f8e25383a0e7b70da5ae32607" }, { "path": "package/dist/domain/reducer-run-graph.js", - "size": 2322, - "sha256": "4be8e06be1c39e50911cbacfbba2216e66222a52bb8d7a594cbb3d6a5d0ec3e2" + "size": 2472, + "sha256": "bd0f76133f6f10a3b6544a0763a4964794a8dc443e5f5e2fb300a2185a406eeb" }, { "path": "package/dist/domain/reducer-run-graph.js.map", - "size": 2258, - "sha256": "153ac6daa1fd6ae5286bee094468589f97805f49b9e62f5ee26eb7dab16d78c5" + "size": 2445, + "sha256": "097f7a56c0488b0a4b18a2710a7d0eaf767e6e390f6d3aa7a0c04effc8bb4061" }, { "path": "package/dist/domain/reducer-runtime.d.ts", @@ -6577,48 +7117,48 @@ }, { "path": "package/dist/domain/reducer-runtime.d.ts.map", - "size": 827, - "sha256": "155b22947b0300e7a5c277412359e04c29d80eecafa5b781e4eb8b4adef88eb0" + "size": 828, + "sha256": "c548568b811c406c6022a08d12462995df5af42c7b49c07457ce295674303fe0" }, { "path": "package/dist/domain/reducer-runtime.js", - "size": 5834, - "sha256": "d49bbe9479986dcb9bdd660f332201113a07b565c3a2335c0c44683a55c447d1" + "size": 6578, + "sha256": "3f583149e8d539e4646eca3e17b4124953114ceba0441c3db27d65aef30aef7f" }, { "path": "package/dist/domain/reducer-runtime.js.map", - "size": 5131, - "sha256": "fd718ca2ead9a444c1d2742642f884dcd65037aad24ac129313ecdc1a44d5204" + "size": 5899, + "sha256": "9f511db403a58ef4c38c4d5b54e4c80decd066df96741fb86d38218bdda64048" }, { "path": "package/dist/domain/reducer-support.d.ts", - "size": 2114, - "sha256": "1bf6136e84b4aae8e6e8e553681dcd94487b4efee87b1897f8875d8fc18f25d6" + "size": 2462, + "sha256": "b3750bfba4c9d9d0b07b463073cac4e25e0236726ff6eafdbe2e7112c989dd66" }, { "path": "package/dist/domain/reducer-support.d.ts.map", - "size": 1878, - "sha256": "e828a1ce62c47804149b548439d083f51d81c03ab8159ac0fdddd75f1a930c53" + "size": 2028, + "sha256": "c964dd791fd91807723c2d35763af31a63c4a80158a3dccc7e81a201a91fa958" }, { "path": "package/dist/domain/reducer-support.js", - "size": 5839, - "sha256": "9241d1f19d552ff380a44dff6a9cdfe4b808e3e9c2c4b86f129b8de7e4b70307" + "size": 6734, + "sha256": "a4f5ad9bf191c85ba3c4ef59de36be2dfd9bf3c33eaaa159ccfd1f6059d6f04d" }, { "path": "package/dist/domain/reducer-support.js.map", - "size": 6270, - "sha256": "d153acebb9fd9db0a4d90ff5c16c9835c17198fa4d45bae3188b8968555fb723" + "size": 7006, + "sha256": "1d82c141dd4cedc48436e5f9ec7c0398e5f97623839edc7beffe87cf920d7de6" }, { "path": "package/dist/domain/reducer.d.ts", "size": 287, - "sha256": "ed20db0cff3647b614d7df8fa7119c294fb66281af6180e1764bbe000fd4af47" + "sha256": "9afed73fa1ca96c36a5bf2022ba2f990bf50591830228faf0e623166639787c5" }, { "path": "package/dist/domain/reducer.d.ts.map", "size": 294, - "sha256": "e24e179a6b34493f4c72895c77e018025104bb0d50095b05a488c072e2ec44c9" + "sha256": "3e534a5fd07e69dd4ca334a4c0327017abbf0b0cb87271186f693d8a8c0d13b8" }, { "path": "package/dist/domain/reducer.js", @@ -6628,17 +7168,17 @@ { "path": "package/dist/domain/reducer.js.map", "size": 247, - "sha256": "69c07bcf33a6e93dabf73cc45001d16bf20d347f57258a6ff919125ac7b0ca4a" + "sha256": "b3a688a6f84f0ba4fd1273d57922d6be8715a51c254f03e0a78edec2a0da7f9e" }, { "path": "package/dist/domain/run-contracts.d.ts", - "size": 4646, - "sha256": "a0ca3db91de85b3f30de98d5bfb093f41e837cedf322970d92ef5e1e88a357a7" + "size": 5077, + "sha256": "97ba269b15ba09f179067aaaad87184e849f255cdb79326743465e8db2357c4e" }, { "path": "package/dist/domain/run-contracts.d.ts.map", - "size": 4896, - "sha256": "e61615d90e0b5fd293d19a67ab2fa54c5ddc72704a721fbcf06b5d6124722e59" + "size": 5060, + "sha256": "1e7f49693d3e5fa96bb7e66dbc065a280b406b709574f1cae3233f6ee140ca1f" }, { "path": "package/dist/domain/run-contracts.js", @@ -6650,6 +7190,26 @@ "size": 128, "sha256": "08538ea17304090957d2670a2200bbe1c1bf126bba135bca9650824b16ecc6bb" }, + { + "path": "package/dist/domain/run-interactions.d.ts", + "size": 370, + "sha256": "59e631425595e444041002869a2ddf5a62f0ffd45cdae58a841f845124b71450" + }, + { + "path": "package/dist/domain/run-interactions.d.ts.map", + "size": 323, + "sha256": "79d952bf0381dfc92561e898a3966686f8fbc94c079694ed37d112353bb78475" + }, + { + "path": "package/dist/domain/run-interactions.js", + "size": 664, + "sha256": "7d21923bb25c06e52b0f8dd5a64cde7324469261b971944cf52092a6490a0ee1" + }, + { + "path": "package/dist/domain/run-interactions.js.map", + "size": 798, + "sha256": "126484b0145f7880b86eabd555b559657908554077212af2126f1fba2d97c1ba" + }, { "path": "package/dist/domain/run-usage.d.ts", "size": 524, @@ -6692,13 +7252,13 @@ }, { "path": "package/dist/domain/runtime-events.d.ts", - "size": 1726, - "sha256": "8d5a7aa707feeea9604989955559e02157f50187edf453863d8547413425b56d" + "size": 2060, + "sha256": "3cc67a1908ee99ead95fa961a6987f58b0767e2d8f1f930da3c053b90945ff28" }, { "path": "package/dist/domain/runtime-events.d.ts.map", - "size": 1618, - "sha256": "81b953b54eb5a49752a7272bd603270de99934a401c852e322f5c70b16085583" + "size": 1842, + "sha256": "0220bb82270ff882e9d119848c283ba1e4f70187f1f4d430a771eceba741dad6" }, { "path": "package/dist/domain/runtime-events.js", @@ -6707,18 +7267,18 @@ }, { "path": "package/dist/domain/runtime-events.js.map", - "size": 724, - "sha256": "831d9c3592ca05cc52cdd6690a0a9404570e34fae629bc41116da0a20ff6a8dc" + "size": 723, + "sha256": "5ffc4b4fa9778d62c74534828bb22bcf8f72490889142df0ee888f462633b158" }, { "path": "package/dist/domain/runtime-projection.d.ts", - "size": 3297, - "sha256": "b67fca63ab602f704097611c9dbdf9aec30abb2eda0c8bc143c708afc322642e" + "size": 3778, + "sha256": "ef93a64d4564f747080cf590c7b555420e0115bb3f1f0934f7efd322cca7fbc8" }, { "path": "package/dist/domain/runtime-projection.d.ts.map", - "size": 3345, - "sha256": "d7f4a61322c15560d96fdf635ab69e84a75f7c10f15eee4e185b235f1f7ef85f" + "size": 3585, + "sha256": "68f227cedc2c7fcdf70c5e990600521da8836d4d961110aadc13d995fdb7dc32" }, { "path": "package/dist/domain/runtime-projection.js", @@ -6728,67 +7288,67 @@ { "path": "package/dist/domain/runtime-projection.js.map", "size": 591, - "sha256": "511ae95ce031367d03c8ea81498bab4d4773b2b5160b91388d6791e90b9c5cb0" + "sha256": "b30e32d840ce9393fcd43a44396b8024cf5afb95172a00f9950672c1399b5599" }, { "path": "package/dist/domain/secret-sanitizer.d.ts", - "size": 579, - "sha256": "2fba6a92c67f75fcb1374ba343a888aeea2fd42b63c9ddf7b2a430e4b4042f6b" + "size": 842, + "sha256": "c7699fbb9bdb03a8e58a5cfe2814a977d23f942466affc0d902410f178590c23" }, { "path": "package/dist/domain/secret-sanitizer.d.ts.map", - "size": 543, - "sha256": "4fb8290978a894eb68d8b6aa5edc087f757923f27f7972624f43461834c5bf85" + "size": 681, + "sha256": "9871c412ea8602d6a3991c1387884a56ebc81c2b92da7c1ee0e80f5bdd823299" }, { "path": "package/dist/domain/secret-sanitizer.js", - "size": 11913, - "sha256": "8cc44bb7c9d00ad61fd5879772c134b154366390a309eb62ec5d4c7d5409b831" + "size": 29749, + "sha256": "697f16cca1dfcabdcc35adc7a45fde9915826547cfc1cf7871c411ab0a3dbdb6" }, { "path": "package/dist/domain/secret-sanitizer.js.map", - "size": 11467, - "sha256": "2bf5dcd7b1a5879f7ed7202b7806cd900338eca7f4e0c1c7a89004138f7f0e06" + "size": 26696, + "sha256": "e05ecb9749d885d831362c7866933ce7815365a2cf04337d73832d744351bade" }, { "path": "package/dist/domain/state.d.ts", - "size": 4051, - "sha256": "31c99557fdd14c53415bacbcb62eec1919a966a8c90cf18404119bdad14da42e" + "size": 5317, + "sha256": "7942e19d8ad38b04e1653c5dda5ae95ebd459b5e9f4b810152064552c8b726aa" }, { "path": "package/dist/domain/state.d.ts.map", - "size": 3534, - "sha256": "9265b0bacc3fca2aa6a4e0355bd2be960fdea88798a2e21ad121abad14a785af" + "size": 4183, + "sha256": "83517e5060c951e5d9afcc7c13e4e7eebe8a7ba203f84b2811a02e5d7c7fd4ec" }, { "path": "package/dist/domain/state.js", - "size": 1671, - "sha256": "37f61f2dbdadd13cfb97198b316304d7bf86c580c61a95ed02965356b07b1b4a" + "size": 3712, + "sha256": "c068e9e9022d405a2f0589e7112457c61bc90c94d386a5402bff3e6a9de388db" }, { "path": "package/dist/domain/state.js.map", - "size": 1462, - "sha256": "9a7491d8f8514f618039769131be1a58e38a76485a376653f1fb4ffc794e622a" + "size": 3219, + "sha256": "fb548e879d3711fe838646c4c4de1562fed6649bba455ae50afceb5097c4ea69" }, { "path": "package/dist/domain/terminal-sanitizer.d.ts", - "size": 306, - "sha256": "108e3bc56bbf4b0a10cfeb599f4a43505fa5a9f1dcc9f8335bf8e229ba925f80" + "size": 362, + "sha256": "c22e33b01dd3e03699cb05bf5540dbf18eb79a926b379b8f3d5927172df6b489" }, { "path": "package/dist/domain/terminal-sanitizer.d.ts.map", - "size": 305, - "sha256": "d67672829c1c09ce6141cb992b39baa5d2452c50f5ad2653a7798e10c9774e0e" + "size": 339, + "sha256": "56278881cb5507b2d55a1ddd94d8ad24b65c501fed572887c4e296a52d3cefa6" }, { "path": "package/dist/domain/terminal-sanitizer.js", - "size": 3149, - "sha256": "307df57a8cc1763c70f310c8ec823e254a6e216439625ca84bfce1402769279d" + "size": 4327, + "sha256": "bff3cdc921728debd1f723b76c1ba7e0e91c5d8d9ae5451b4a7c1b83c993ad94" }, { "path": "package/dist/domain/terminal-sanitizer.js.map", - "size": 3032, - "sha256": "4d3d455949043d765c4d8effed5d10e54f19933f9e85119bfa238e2ac6c73e1d" + "size": 4012, + "sha256": "9fe30f5e8be9fbf6b9c08bfe55fb40c9579ff0771a541ede6b4879e50a9f3ec6" }, { "path": "package/dist/domain/text.d.ts", @@ -6823,12 +7383,12 @@ { "path": "package/dist/eval/calibration.js", "size": 11821, - "sha256": "8f0503e32a736e18b96699f2f32af041171cbac8ade7bff3d24d49e58c1a3851" + "sha256": "3667e06bd327be23b29ee77a21ab00f4d9916e9ae0f07c228c209aa96f8ecd34" }, { "path": "package/dist/eval/calibration.js.map", "size": 11431, - "sha256": "638c6420e88f6543098d1901a6a32b161256e9235c5a97be94bc132b91be494b" + "sha256": "6529b0451e53512f52b1a0e95a127757651d86b501d9d0e363625691c0271a3a" }, { "path": "package/dist/eval/campaigns.d.ts", @@ -6858,7 +7418,7 @@ { "path": "package/dist/eval/cases.d.ts.map", "size": 604, - "sha256": "93a022055b2c9ac1ec46c7c2d539e3b1b6afcc38f36fe5589264e4e5c2a3a665" + "sha256": "b37d4fe580243fd40e56b7bc3895f27b32959aa920286f1d0353b78a7f0bf94d" }, { "path": "package/dist/eval/cases.js", @@ -6868,7 +7428,7 @@ { "path": "package/dist/eval/cases.js.map", "size": 5607, - "sha256": "e6795a4a4506a4394b1791fc7417bc0241cea08946ac2c8d9fcb5798439e375b" + "sha256": "350ffe597741eb15ac2b9283d176fd92580279052623c4c3b32a8a8623fff2fa" }, { "path": "package/dist/eval/execution.d.ts", @@ -6878,17 +7438,17 @@ { "path": "package/dist/eval/execution.d.ts.map", "size": 2009, - "sha256": "795eeaae496fc6c6ebf508d01824ef61635ba8262b3b09dce1f82777a875c65b" + "sha256": "7bfdd63faaf8842fddf13807a31ca2f3941fbe025c175f62dc7a41d8257b80c3" }, { "path": "package/dist/eval/execution.js", - "size": 10290, - "sha256": "adfbea2ce637654536b309398381629eb888d373ccf60a54e251909475c0d322" + "size": 10566, + "sha256": "958160809747dcfb19ecd91da351715dea16174d55f8ab08f7c05dd3de2da4ab" }, { "path": "package/dist/eval/execution.js.map", - "size": 8950, - "sha256": "355a2c7cb2b83c87e1feff7ac8af6b09ff21eac813c1b0be6fd3c96c227e6cd8" + "size": 8988, + "sha256": "4991c753f4e56ff5f7783a639a40f3b48164be15cd44b6dc567d2999f23d7830" }, { "path": "package/dist/eval/fixtures.d.ts", @@ -6903,12 +7463,12 @@ { "path": "package/dist/eval/fixtures.js", "size": 28653, - "sha256": "f6fcba6c103d6266a51c21ebba13fb777c0bba904954a1ed1a0dd7a81a0155f9" + "sha256": "058a8a1b1aa58599a3f6b35fb70168d7fe4539e7e9de08526cd178b110891ced" }, { "path": "package/dist/eval/fixtures.js.map", "size": 17842, - "sha256": "85e68cd4f8341621f023428cc45ffc0cc7d379ca6f7c9e0e8c425f1a899058a3" + "sha256": "ff7585864110c1770caef9abb2ba41e699dd703a12e23c8cc4312b0fdf5f9a00" }, { "path": "package/dist/eval/product-path.d.ts", @@ -6918,17 +7478,17 @@ { "path": "package/dist/eval/product-path.d.ts.map", "size": 556, - "sha256": "08cc89ac94f8e9668dd62828223e0ffa904080ada2cc0cbac4076beea8117c0a" + "sha256": "c7790740fef21ffd54a57644c75456dbe1f01ec7b5728f8d03fe5b3671f2737f" }, { "path": "package/dist/eval/product-path.js", - "size": 10722, - "sha256": "3f277a4ce8694743c65b461ed0291551c93bfb53d14cfa9e39bcb636174429a9" + "size": 10653, + "sha256": "2a9adc8a33fe2b8b073b9293f0473fead2d616d627cbf9e9cd373b6a26ac7eb3" }, { "path": "package/dist/eval/product-path.js.map", - "size": 9244, - "sha256": "53988fe377042d27b2cf7c0052b3f232a51373404f053c134223ef90fd82e914" + "size": 9144, + "sha256": "e7ec2454d9f718a791a209f297f34fae33355906a292c6af0e815d3a9b8ceb33" }, { "path": "package/dist/eval/record-builder.d.ts", @@ -7052,23 +7612,23 @@ }, { "path": "package/dist/index.d.ts", - "size": 4997, - "sha256": "57f0a518339ceeb2d1538079b4d84e1c54f042f68d03d15835aa8823351c8cf3" + "size": 6356, + "sha256": "8ac74305806b5b41894030c541c42cab4f6c5248a8fb5f314ce7cc78b08f4f04" }, { "path": "package/dist/index.d.ts.map", - "size": 3361, - "sha256": "68ad28f45fa5cf97d3fffaa5cb3192b2870f4d6d30f7a61e68b56a6175bd1c08" + "size": 3945, + "sha256": "484ac5684a972c33f3ae2ace7b293720d5b4973a9223d3dd6115b3697a1f92c7" }, { "path": "package/dist/index.js", - "size": 2733, - "sha256": "5e72da610070827a4b0777ff077c432f0ebe6d3f45f51d5caeffc730f51f1c1a" + "size": 2906, + "sha256": "f2bcfb01f12326d63ca5254dd7f906f2da135449ccafe0417453e3c1606afd5f" }, { "path": "package/dist/index.js.map", - "size": 1809, - "sha256": "d9d266b5627959e6ad0f052ce0c66d6c8cce7dd7312abda4cd4cad27ad447f87" + "size": 1859, + "sha256": "c4a55275326e5ce62ff7c1de369d8e91a8f17ae91a72c5f2dfb102428f6511ca" }, { "path": "package/dist/installed-package-version.d.ts", @@ -7172,23 +7732,23 @@ }, { "path": "package/dist/ports/execution.d.ts", - "size": 5003, - "sha256": "dba8cc6189e7a955b9ad5b5aa975c3f49904d5a57f83e1d315cbac2b86b9574c" + "size": 8790, + "sha256": "69cad4aec400144ae217974d45097c6a9e9b94c66c7a80943db789ddd63fc2eb" }, { "path": "package/dist/ports/execution.d.ts.map", - "size": 4730, - "sha256": "1ec897402a04c96d5a22f9ab515e06f9cd20fbbbe9dfde11e0cc75c3c444b7e4" + "size": 6422, + "sha256": "d2e0ee3a4ce87f7317cbdfcd80dac5790f02c0942d549b30756837e69324383d" }, { "path": "package/dist/ports/execution.js", - "size": 1701, - "sha256": "85b8c9862521cdaf49014c553c364ccde0e3413088d26e5808c5edb75b3983af" + "size": 2729, + "sha256": "87523e42b8f90a66752e1a9cdce1729dea7d7f45beab98958df2ca144da7a2ef" }, { "path": "package/dist/ports/execution.js.map", - "size": 1610, - "sha256": "dc872eeac8ef326ea7b856c85e8111ed15d821471f4df9948d358cfb52d598c4" + "size": 2153, + "sha256": "53f370f68983431ef440ef06ca5f98f2598e9bdd352be7d5f1b2ebc4881a49d1" }, { "path": "package/dist/ports/ids.d.ts", @@ -7210,6 +7770,46 @@ "size": 467, "sha256": "ddd237597b1228c6640c45c8c4cf3a109cfc303d8f9a8f8a4b1a2e6533d7af29" }, + { + "path": "package/dist/ports/native-interactive-execution.d.ts", + "size": 732, + "sha256": "f19526428cfd70d8a409441d33a26fc0d6d1d4a5fb7518911f204bbeb715870c" + }, + { + "path": "package/dist/ports/native-interactive-execution.d.ts.map", + "size": 727, + "sha256": "35a78efce7bdb85b3a6432db8eb078d5ed94fcc0198eb22eb33324400dd335f2" + }, + { + "path": "package/dist/ports/native-interactive-execution.js", + "size": 67, + "sha256": "c05468ddcd45dcb8e8088458c2cd0562643f89c9f021d04b180e9edd0ba134e7" + }, + { + "path": "package/dist/ports/native-interactive-execution.js.map", + "size": 157, + "sha256": "bcbc9c1c222c07089573bb6fdb72d2b8fce10e7f9401b3b3ecb4edadd95f9ec2" + }, + { + "path": "package/dist/ports/native-terminal-transport.d.ts", + "size": 2613, + "sha256": "553d952b00066b91f5c8b70012587fa101cd66adeb072682009b9e7936baf05a" + }, + { + "path": "package/dist/ports/native-terminal-transport.d.ts.map", + "size": 2291, + "sha256": "3d6f7edfb1c5fa2291713fcdb23325bee48199a020f31e49fcbfc58a906c2832" + }, + { + "path": "package/dist/ports/native-terminal-transport.js", + "size": 64, + "sha256": "20d53b76601129e8e3778449f3eb6e4ec7a8730e7def416b02126e6b022d166e" + }, + { + "path": "package/dist/ports/native-terminal-transport.js.map", + "size": 151, + "sha256": "3e67db35dba88106b001c311ce05851fe26ffd60ec94b7705c762b7a4a7a727d" + }, { "path": "package/dist/ports/storage.d.ts", "size": 8766, @@ -7232,43 +7832,43 @@ }, { "path": "package/dist/startup/durable-runtime.d.ts", - "size": 116, - "sha256": "fbe45f698eca6d9e12c88c34238dd72eaf82d9aee6f6b81b5aa68fa221807f94" + "size": 2232, + "sha256": "13fc0ddf9df2aba805cf267eb3eb312e33f9ab72c9d8e882955be8ed7970484f" }, { "path": "package/dist/startup/durable-runtime.d.ts.map", - "size": 178, - "sha256": "36fddf792b0e47174cf07622eba0c981987f3abbf224e35d72b9d4979d0749c8" + "size": 1631, + "sha256": "a3649b2c5fb0fc638cb244143ecc2201cc3734db9e2d4ab690181269168bdb1a" }, { "path": "package/dist/startup/durable-runtime.js", - "size": 114, - "sha256": "8bc97f1b3ad298bdc79a85b28fd15c74771b48813e51a40cf2f6f994845c1bce" + "size": 6461, + "sha256": "4c0072d587909f8442d265756ae1789257796278abe4bffaa7bdeb17aa2877d0" }, { "path": "package/dist/startup/durable-runtime.js.map", - "size": 176, - "sha256": "07cfcc5d6dc9d09eb257259f18e775143d33c1095e175dce26945b8bead33a20" + "size": 5143, + "sha256": "244d9ec597c315ac2d7658e48efcf6a97702786b477b62e689f23387903ae0eb" }, { "path": "package/dist/startup/preview-runtime.d.ts", - "size": 2260, - "sha256": "422c38e97b7971b7d9fee1f546a8ba3d77f8a4d8aeba9dbe1775d4f884b558e0" + "size": 2369, + "sha256": "ec60508a1d7320dac3692bdf25aa9978ed65b8f47d7f724b12f4a944667fab98" }, { "path": "package/dist/startup/preview-runtime.d.ts.map", - "size": 2312, - "sha256": "5233c02daeb3e194a36d308a398284b3fdcda949b990e1424dbceccc9f555b83" + "size": 2400, + "sha256": "65a3c2f7690cbd2a47af8db4f8fe90f9945f2f504731d45b21f1533ba48a986e" }, { "path": "package/dist/startup/preview-runtime.js", - "size": 6716, - "sha256": "ff6e9adf0994cb2c4606c052768015243cd31c5ca3de89702db5a7030394c75f" + "size": 7091, + "sha256": "4034e6b5db051e4d3d34827194ce55addfc1903c20079074182324d0ebd9e23c" }, { "path": "package/dist/startup/preview-runtime.js.map", - "size": 7039, - "sha256": "d68c488efc6a92aa3811f5d97d8142f8ad7ad418ef533d0f46924957c9a45425" + "size": 7375, + "sha256": "a1ba2a01cb89b657dfda161878108c66ff8c7093a74ebb13b86b6fa46ec6b9f7" }, { "path": "package/dist/startup/terminal-runtime.d.ts", @@ -7358,7 +7958,7 @@ { "path": "package/dist/testing/runtime-contract-fixtures.d.ts.map", "size": 359, - "sha256": "92bb7abb744468b34a7d610d1520202a61836cf5e539c7d355c1461773632690" + "sha256": "0586199b0a941d9950febd17c60b29828eb7311150066b477ad558507717a3a0" }, { "path": "package/dist/testing/runtime-contract-fixtures.js", @@ -7368,7 +7968,47 @@ { "path": "package/dist/testing/runtime-contract-fixtures.js.map", "size": 2574, - "sha256": "95767c52abcfd1da5278c6e60c0b693eeab5804a98576b9ded7d90713223f3b7" + "sha256": "2f562f31b50027fcfff91ed43d69877c1b2fb88d2eda6f3616abebed12bb4fde" + }, + { + "path": "package/dist/testing/supervision-fixture.d.ts", + "size": 1731, + "sha256": "a8e5028c0e6617b0e8b52133dcaa41fe8bfc1e94447b8e109a8d0cbbd44dbed1" + }, + { + "path": "package/dist/testing/supervision-fixture.d.ts.map", + "size": 1673, + "sha256": "7083aea99892a6540336bdc28c3882ddb6a7a6fd8ffef3eba7b925fe1be57b16" + }, + { + "path": "package/dist/testing/supervision-fixture.js", + "size": 4597, + "sha256": "83a102a7219ffbc475f606d4706c1c9449fb37cc1995e42a1d979bc1a409fb00" + }, + { + "path": "package/dist/testing/supervision-fixture.js.map", + "size": 5072, + "sha256": "e1e50575185ccffdc4453c4cd27b860be00eb95cc12a43ade906d2dc1f5fb2b5" + }, + { + "path": "package/dist/testing/supervision-ui-fixture.d.ts", + "size": 306, + "sha256": "0c6bc5697493072d1303bb6b47f77c37ff04b22abe044b7fe7b319b79070557d" + }, + { + "path": "package/dist/testing/supervision-ui-fixture.d.ts.map", + "size": 249, + "sha256": "3e8372ec1d3481516749452c6f604ac544f8e0a181c95f87f7705a9ab5c6822c" + }, + { + "path": "package/dist/testing/supervision-ui-fixture.js", + "size": 3094, + "sha256": "a03bd5f8a639d8fa1af47f198406606cc6b5f7698d84507693c08358a7ee33fc" + }, + { + "path": "package/dist/testing/supervision-ui-fixture.js.map", + "size": 1904, + "sha256": "49cf6e8683789471ebfc6cd635d0cd9cd7df4d6d9af4a04dccc4149a12762cd9" }, { "path": "package/dist/version.d.ts", @@ -7432,13 +8072,13 @@ }, { "path": "package/dist/views/headless/protocol.d.ts", - "size": 5742, - "sha256": "a3b5a68ed22ac6307cfb89a3f068d1d78b6e90d3ca23bf718415c705d7dc95f5" + "size": 5822, + "sha256": "6de2cb3d3ee78912f1b1ef6c775d9d10480a5fb368b7a2f085d073bb6bbd5e86" }, { "path": "package/dist/views/headless/protocol.d.ts.map", "size": 4929, - "sha256": "bc466b5ac3216988ced3df8a2c1cb4612b46f6dcf28e4e90ef5f41ab7c9acd8c" + "sha256": "9b3ba86db3c0b4f15f7f2c5797422b5bda6883abac76a3b8e0005cbce0d43ac3" }, { "path": "package/dist/views/headless/protocol.js", @@ -7448,7 +8088,7 @@ { "path": "package/dist/views/headless/protocol.js.map", "size": 261, - "sha256": "c421156fa137cbc2b206250a1e7fa62fe958a71200975f44bd49cf33d9195364" + "sha256": "23f5daa290dd5d0837c59744a1d0688f41a808b8a731505b623357df1f72e7ab" }, { "path": "package/dist/views/headless/rpc-automation-commands.d.ts", @@ -7518,27 +8158,27 @@ { "path": "package/dist/views/headless/rpc-parser.d.ts.map", "size": 460, - "sha256": "00b789488eca3be72ae758817e74b8d242d4431577053996a171bb6c94852c66" + "sha256": "0eadabf0cc829cb5d1d170a500a30e9e3b1cbcb08e899f7d392603985c689540" }, { "path": "package/dist/views/headless/rpc-parser.js", - "size": 19612, - "sha256": "2fd4b49f12659567bbe332e48ec4232c3215a57771335ad2430e815b859cfd92" + "size": 20561, + "sha256": "ce1079d827d6fb5258cbca3888e60f16629276bf15b8195164e5c644c2f2ba7f" }, { "path": "package/dist/views/headless/rpc-parser.js.map", - "size": 17427, - "sha256": "f02d886edf261975fd084dce2810c092b95d86028b073b69bfa130721975b039" + "size": 18078, + "sha256": "8669e453a5a641e2a64d4a71eff1f1fe6941221be6e9e2ff6b906a760e6ee3d0" }, { "path": "package/dist/views/headless/rpc-types.d.ts", - "size": 480, - "sha256": "9400e446e318d8be286ab95eda947b9591d8318ab40ea8a496ff15a950de1dc0" + "size": 560, + "sha256": "2e97e8bae5c11314b30abe002b7404e1bdaac9160ea607cacc2f8fabf71a7b20" }, { "path": "package/dist/views/headless/rpc-types.d.ts.map", - "size": 562, - "sha256": "0adbad854989c067d045fcb6e66b1cbea9a88ae7915bb011055920afd5158568" + "size": 575, + "sha256": "ab8e87042ab166eeb16a8b7ee28e473068f9a76045161923b8dd89641698816a" }, { "path": "package/dist/views/headless/rpc-types.js", @@ -7558,37 +8198,37 @@ { "path": "package/dist/views/headless/rpc.d.ts.map", "size": 460, - "sha256": "dfee726abde76ad26285660ca443e7159ec36066eec46c353871bd69756ca492" + "sha256": "fa65c8fe62b5ca8ca9fda7c7d974a0ca74fc0af125eec327843ece710d37e0c4" }, { "path": "package/dist/views/headless/rpc.js", - "size": 18391, - "sha256": "a2c9faf66c1f26370d2d1c04e24b48061b7c23f61e5f654a3829da1bf037275f" + "size": 18893, + "sha256": "948a9f2c88164fefbb33d0d4408c44e41167896a2f0b96a575127cf6c06bbece" }, { "path": "package/dist/views/headless/rpc.js.map", - "size": 14529, - "sha256": "ec69f9a89135547cdf00cc4e04c281ce0d906be4ac044219052813a64dca2681" + "size": 14940, + "sha256": "4094e1d97979008c7070bbeba05ba90cd9dd334b2305d1ca74ab50b068209e1d" }, { "path": "package/dist/views/shared/analysis-model-call-presentation.d.ts", - "size": 671, - "sha256": "7e302dd3a9ada11e34efafd7fd0e03030253038b43a939a9c417ef5b5851a24b" + "size": 1030, + "sha256": "9fe3716753cefcf4a0002e81bb6bfcb4242a132f656e8f31c1bf842729178c83" }, { "path": "package/dist/views/shared/analysis-model-call-presentation.d.ts.map", - "size": 575, - "sha256": "56312988f1f09874ab5f5d771b156e414b6d97955267b3616cc1967d4b955795" + "size": 726, + "sha256": "c26bd0720427f505db0514523c38bb22a5fc778262549c199755d6a428cf977b" }, { "path": "package/dist/views/shared/analysis-model-call-presentation.js", - "size": 5049, - "sha256": "d29ee5a0098c5eec5c46cf221f790c1b7c5e97b7b656fe8a284556a2217ac18f" + "size": 7845, + "sha256": "5130aab6b031a79eb01475b0da2570e2e9e4ced931685670945df80afc23e71c" }, { "path": "package/dist/views/shared/analysis-model-call-presentation.js.map", - "size": 6223, - "sha256": "e04fc2ba51d190ce0b23bae2fa141213a767dc3d129d87e0dc38523b12e6f9c7" + "size": 9833, + "sha256": "d4788c687c6626e5da804bdfa4d2e372a0403a665d44d9a301995c5aa4bb925a" }, { "path": "package/dist/views/shared/analysis-presentation.d.ts", @@ -7598,17 +8238,17 @@ { "path": "package/dist/views/shared/analysis-presentation.d.ts.map", "size": 582, - "sha256": "c469aec64e78160fdef11187da0f04e71208033d8a3174666eef264f58dc8612" + "sha256": "8be6e2cf088226dd4ec811232b6fac5d812a408e67b18f1785b3cae4ae3a3422" }, { "path": "package/dist/views/shared/analysis-presentation.js", - "size": 9874, - "sha256": "27099533612d7ed54033258ae713d7f30ecc28590e9d0f37ff0ace393e63e41a" + "size": 11775, + "sha256": "8cc16c6d69311a25274d90ae8fc872792947a3298f4a7f647ea6dda3b8ba5f32" }, { "path": "package/dist/views/shared/analysis-presentation.js.map", - "size": 10000, - "sha256": "b1acbd69bd0e02a8ca7df7afe2acc05f275e8853807773fb4598bf28f01c6900" + "size": 12193, + "sha256": "07eb30d881c3b9679879e01b4f16f065254f4ba6ff679b60170398bd10baa397" }, { "path": "package/dist/views/shared/appearance.d.ts", @@ -7632,63 +8272,63 @@ }, { "path": "package/dist/views/shared/canonical.d.ts", - "size": 393, - "sha256": "4a1f05cebd1045ee24a5c15ae22aae69b39e9c6016ce5ea94d007742922811e6" + "size": 682, + "sha256": "9330f9d35c0896f1866c7b1f998d6ec5713122933f78bb500e031b1585fbab87" }, { "path": "package/dist/views/shared/canonical.d.ts.map", - "size": 249, - "sha256": "01875428feae7f0ebb9d9ec6777bb116450086720f5f3e85b5a24217a4151131" + "size": 246, + "sha256": "def1456e57a59be84c8c3b5cbd0017cc945f12f505a81084183212539047f132" }, { "path": "package/dist/views/shared/canonical.js", - "size": 858, - "sha256": "fecf6cf57698d05f20dfb88d592e06c784c9d1677bcd6ff5d97020a95d461fc9" + "size": 755, + "sha256": "bd56d8dd65172a47211f89a621334fac31469fbb2da08125ed9d90682d67abae" }, { "path": "package/dist/views/shared/canonical.js.map", - "size": 963, - "sha256": "f84fb507770bdd4c73b643dc8797d3916ab22ceb68b9b1c1866fd5d12e3d0676" + "size": 311, + "sha256": "8ff1318ea4db9e50ae0f2f3f4341635955312c6637ee543b247befa3a95b5b74" }, { "path": "package/dist/views/shared/command-registry.d.ts", - "size": 2845, - "sha256": "96b42a814582b1d37c0f4fb6f9eccf582812c415055307ff7520303ec165d7c0" + "size": 2872, + "sha256": "1e0c1810653c8917ab7f48f05e2f14dc054d389000eb06a2a5d582a84bf10d29" }, { "path": "package/dist/views/shared/command-registry.d.ts.map", "size": 2422, - "sha256": "b835b143e56798a81a8271be02ba333cc632fb97529e65290129d4f1b0c1ce29" + "sha256": "25192e7c3b2c5e8fd9bcef2a74e230e02ca378dcfefb7634a02eac88d97ad68c" }, { "path": "package/dist/views/shared/command-registry.js", - "size": 11839, - "sha256": "51b1ea27b4d83789f35836153d67e5f8689c6ee5c9fe8a89ca316269661f70f0" + "size": 12414, + "sha256": "4fb669cb2a34812a7bc13d3cef452c2df2a0d72bb87c111311cd9cd335469bec" }, { "path": "package/dist/views/shared/command-registry.js.map", - "size": 10723, - "sha256": "1c804bfe8ff760669100285b1478c522334e94c8993d08d0be8087cf7054ae08" + "size": 11099, + "sha256": "ce3be8452c8693b9214619223924d30c5ca828ce77f67a89c909f5335e51dc27" }, { "path": "package/dist/views/shared/command-table.d.ts", - "size": 6475, - "sha256": "5fa6e857e65fd3a89ce78daa793b9b3119881be8020ab22e09d5411d56c0598d" + "size": 6822, + "sha256": "e6cc01b2c5b0996ba02262bdaac4cc8f1b633afe8eca982e1a8863c50a35740b" }, { "path": "package/dist/views/shared/command-table.d.ts.map", - "size": 3033, - "sha256": "7cc2c0c6a1b75649b71b00765751c018eaf9fb02a9318228cf9ab74351d3b0ee" + "size": 3154, + "sha256": "2b5387127c1297ddab5af4a5a044506a212e83bd725b4be52bfeed0b845f7ade" }, { "path": "package/dist/views/shared/command-table.js", - "size": 5768, - "sha256": "ba7b9ef2e43fb47451f7290de903a554c9333a1e5240b51ec85bc39867f2a006" + "size": 6055, + "sha256": "311b36f8e0f96e8246d980fd67673bc1872e5689c05017fffc846e62a013a6a6" }, { "path": "package/dist/views/shared/command-table.js.map", - "size": 4146, - "sha256": "5145a8277dd9fa846006ff2b79ff9c79693aae1a687006d5b31da1ec1abff5ed" + "size": 4345, + "sha256": "0cf59fe9bdd13cfbcde1fe7f2023dd82434ab92983ecf861299cca9da03f6b37" }, { "path": "package/dist/views/shared/comparison-presentation.d.ts", @@ -7738,17 +8378,17 @@ { "path": "package/dist/views/shared/duration.d.ts.map", "size": 403, - "sha256": "27ffd4a47abf9570458248876604102567b6500c0ac45503e59f024d3db8ca8b" + "sha256": "2e74b83da56f8b8d1ffa93577056d239ce6967df1ea5263a4c4d8bfa6f32ad39" }, { "path": "package/dist/views/shared/duration.js", - "size": 1316, - "sha256": "c7ce6a2b63723b2be159f0a2cb6c7339828e7b7d6018880f9facbb10ff2adae2" + "size": 1420, + "sha256": "658a96e8107fcec08b37f5acf4f0d2b9e72ce98ca53b7e3e388548fd78258391" }, { "path": "package/dist/views/shared/duration.js.map", - "size": 1704, - "sha256": "291b2ad9a4ec27b0df6302f040f2331c6d5efefe877c4e3f0559204066b9d326" + "size": 1805, + "sha256": "948cd065a1a9a8094621f1969c060dd4240ead7db587467304892e5910cdd895" }, { "path": "package/dist/views/shared/environment-presentation.d.ts", @@ -7772,33 +8412,33 @@ }, { "path": "package/dist/views/shared/headless-commands.d.ts", - "size": 1340, - "sha256": "e772af418f1763a22fb1c607ba5501222b37a2365ca9b61232504469b5d1615c" + "size": 1420, + "sha256": "289081d90ecb6aa21e89c47906995c5f74c0586d58f5f67e785bf95d7312fe0c" }, { "path": "package/dist/views/shared/headless-commands.d.ts.map", - "size": 1037, - "sha256": "6d3ce0a7ed342ce0d29eb7ab796d13ac7fbd95c7a9049e4768930b2e54364fee" + "size": 1086, + "sha256": "ea3fa0e7b6a69a1a7461adf98b63b1edc321c57ff1e4b55089e489d232613edb" }, { "path": "package/dist/views/shared/headless-commands.js", - "size": 3919, - "sha256": "11c80956a75500b533a8818576d0391df063b15c8c807ea67a0322ed133fac22" + "size": 4290, + "sha256": "a32ecdcb519fdc40c57b422d0038f3537cf385d94e0f68568b47f46c1f1e0f06" }, { "path": "package/dist/views/shared/headless-commands.js.map", - "size": 2634, - "sha256": "f258f883ac0d9ab356bb84e2a22fc215e84fb0d622715364e36d817d89ce27e0" + "size": 2819, + "sha256": "f61dc09e351a816ec1a5e8c99f60b2cfcc78c22c768f066025943eeef54c07cc" }, { "path": "package/dist/views/shared/intents.d.ts", - "size": 5200, - "sha256": "b26b9e82d9ac3d03bc8478ea5b8bbce9202b5947597bd63bf523adecdfc868f4" + "size": 5358, + "sha256": "97c44cd6516902075f8c5613b55908fa29498dad9788d8a9d2d8df91f92a26f2" }, { "path": "package/dist/views/shared/intents.d.ts.map", - "size": 5088, - "sha256": "f8c1de8cf11c543104ce4a9e993858094f8e619a70c824f14f5406f9fdb41b9f" + "size": 5292, + "sha256": "30709b0400e7e66a922c67f418597efe2c252231249f3905feeeaa01ebbd64c1" }, { "path": "package/dist/views/shared/intents.js", @@ -7812,13 +8452,13 @@ }, { "path": "package/dist/views/shared/models.d.ts", - "size": 21550, - "sha256": "f0d8a1066ab7f90527dd13f65ce286f0942e93d547698a4208a2f99f22746394" + "size": 24869, + "sha256": "b49af7f9026f18d54a543d0616a80b32329e381e4648708985505074f3522fb4" }, { "path": "package/dist/views/shared/models.d.ts.map", - "size": 22195, - "sha256": "3f9a137c1ef7a3ea44b2dc631311b1b88c5992d4f6a64b2ce1cd0a58afb4d361" + "size": 25527, + "sha256": "64d2a56d0a6fcde304741272aa072add14864b1a6e70ab099fa344e6a268088e" }, { "path": "package/dist/views/shared/models.js", @@ -7828,7 +8468,27 @@ { "path": "package/dist/views/shared/models.js.map", "size": 595, - "sha256": "bacf326846406bde657e44461a6a022678a0c2fcf451fa4cd24ff07a81b82291" + "sha256": "c2edf6b3bec3e61ea8c77e30fecb8d277f9cb1030cb691e0f07e6a931c85a09b" + }, + { + "path": "package/dist/views/shared/native-interactive-actions.d.ts", + "size": 1607, + "sha256": "64e116c85f024c981cd90c60f73ae82486ebf09307216a233c6c92db4a17ceeb" + }, + { + "path": "package/dist/views/shared/native-interactive-actions.d.ts.map", + "size": 1584, + "sha256": "3a8be0847abd818008d9dfdcdb199046f0ac5b459db5a23c0d2a135d7404b21a" + }, + { + "path": "package/dist/views/shared/native-interactive-actions.js", + "size": 65, + "sha256": "72288da755d7ed2411980b71cecf5608aa4d7207ae427ede450d3739cd56fafe" + }, + { + "path": "package/dist/views/shared/native-interactive-actions.js.map", + "size": 163, + "sha256": "b89c888285624046b307c19c0a3c5617a83e2cae0a0e75b2c3920a1d5f0c8c9c" }, { "path": "package/dist/views/shared/plain-accessibility.d.ts", @@ -7898,17 +8558,17 @@ { "path": "package/dist/views/shared/semantic-activity.d.ts.map", "size": 533, - "sha256": "45a6bb369f391086c4259bb84b18dcc772f8bd9bdc921c8da34fed89e42db0ed" + "sha256": "7d8c3f0f61a76e42ec42de35ad9d7050a905daa47d478c50d2f5bd79e5eb3200" }, { "path": "package/dist/views/shared/semantic-activity.js", - "size": 9781, - "sha256": "42d5913fef12df652b79ee8f081cdf5f220f159cb2794bb3e0194e0bd187b56f" + "size": 9399, + "sha256": "3f88b844d7a0e036c43312d62e178ce3160eeea967053a05b6fb983e09eaaec2" }, { "path": "package/dist/views/shared/semantic-activity.js.map", - "size": 11029, - "sha256": "11513b73fd9077f33dbfffba247664bb430cc546e44c65ee1d5a16b0078eccaa" + "size": 10610, + "sha256": "32f3a46610b027c40a3157cd49eb8917ed13eed1d495fea24234b6d2f65fdbbe" }, { "path": "package/dist/views/shared/semantic-details.d.ts", @@ -7918,17 +8578,17 @@ { "path": "package/dist/views/shared/semantic-details.d.ts.map", "size": 565, - "sha256": "f27b908205ed5455f63c5edbd8f383c2694b9c57c3bffe4dbb4c0fd408de7241" + "sha256": "f8279c618d208f4dd4af80569867d125ce5479f90328030e2d64e2cfea6ba8f5" }, { "path": "package/dist/views/shared/semantic-details.js", - "size": 21448, - "sha256": "046221f5ba1e2100070b088e8ace61d83508e88b3b10a592a22eba650975e7ba" + "size": 21601, + "sha256": "2c174af022b0a9f90f9155197f733194f3230d373bdf320896d2b46d533388eb" }, { "path": "package/dist/views/shared/semantic-details.js.map", - "size": 21143, - "sha256": "014b08afbbdbbd4f8f6aeb12090ab2c1637fc1362fddca379febc132b9cfccfb" + "size": 21284, + "sha256": "bcdfb438cf5e5062345c72df293ec9b1d7afc6f9fc1236ec6c7715aef9bc634a" }, { "path": "package/dist/views/shared/semantic-graph-edges.d.ts", @@ -8018,17 +8678,17 @@ { "path": "package/dist/views/shared/semantic-projection.d.ts.map", "size": 580, - "sha256": "7d2166d8501e5552883646014e284942a23845940c57524859bb6c3614515210" + "sha256": "63803a6cda605e4d143071b913af1602a1054dbe3e5c43678bdc15c200ffdf74" }, { "path": "package/dist/views/shared/semantic-projection.js", - "size": 16166, - "sha256": "2096848fe410dce6f9b26ed8f1d9255df08d46b0de8709eae0af2739292a6bae" + "size": 16731, + "sha256": "b26f09b65c7d76539ffc6f321f8afddde45f7c4d058124b31b9fe7b1e21f7568" }, { "path": "package/dist/views/shared/semantic-projection.js.map", - "size": 15923, - "sha256": "2c1d9da15052f21539496795fa11c2c8cff406c7ca522a0ce0719c2b546333df" + "size": 16482, + "sha256": "500aa03bd74c1cbc91be87561988649333841258cb93127d2daf0e5470f0b7cf" }, { "path": "package/dist/views/shared/semantic-query-scope.d.ts", @@ -8072,43 +8732,43 @@ }, { "path": "package/dist/views/shared/usage-projection.d.ts", - "size": 346, - "sha256": "5af5bc62985cae5687b1d5f5500832d8762cb090849a1742dc6559971f44b4ba" + "size": 351, + "sha256": "758afac81204218c22ee75dab9cabedce96ce9077befd21832aa85bd71dc4f53" }, { "path": "package/dist/views/shared/usage-projection.d.ts.map", - "size": 415, - "sha256": "9bd325a4c0191d09c9a9369b37de2c4ea7f7fe852ace1e36eacbb10f52f1963f" + "size": 420, + "sha256": "fffbb271cf0e82e4765ca41eefa738e10b3c6801788a534ed56378d361c4f664" }, { "path": "package/dist/views/shared/usage-projection.js", - "size": 14302, - "sha256": "4a3b1bdcc8d4edfe23f7364663167ef48d6083265cde2dc905b6544803f44b4b" + "size": 14740, + "sha256": "080370dd81778d2255b19e619bc6fbddc71f8c27f910c2ee6b98272fdfe8f225" }, { "path": "package/dist/views/shared/usage-projection.js.map", - "size": 16026, - "sha256": "d4ab210f38887170434674d153f7f0feec44b884c521f1928d9a90288f5cac53" + "size": 16327, + "sha256": "5008c6d580f5e21b7fdfa07d0abc52d8f42691596b40e4b67b61314166e5ab44" }, { "path": "package/dist/views/tui/activity-browser.d.ts", - "size": 1050, - "sha256": "dbe333f55c6b23ca5c13e61c53eb24aa4d79e6cfd1b8ca497929b6030b749aea" + "size": 1409, + "sha256": "2089437e3af97526130f4b7dae53f41b4c6866810ba4877b4dfb006bb9ce122a" }, { "path": "package/dist/views/tui/activity-browser.d.ts.map", - "size": 1073, - "sha256": "68a8bf96aed9305cf545bace4008a320f74b96f63b4b05c6610aa5f68ad77e4f" + "size": 1411, + "sha256": "616fbb7df0a692a4a5bb79f1f250d2f5671e9e172b705215f83bef7a09f3b007" }, { "path": "package/dist/views/tui/activity-browser.js", - "size": 9220, - "sha256": "b189226e485bc6734f73724bd7d13a27a24ccd1c51b0286f3339aae01cf7622e" + "size": 10961, + "sha256": "e09d2bb08af3d74c0edf9914f4679b7408a7ae4db59717487944f90b47dedcaf" }, { "path": "package/dist/views/tui/activity-browser.js.map", - "size": 10509, - "sha256": "1e698ef83201edf318ccb90751058889786fa75b7ec4a95ea6fca3da8db18678" + "size": 12191, + "sha256": "475a6cc69ea6ccf59361c017290f99670ad7c66ff177744b7e33832edcfa8c1f" }, { "path": "package/dist/views/tui/activity-document.d.ts", @@ -8132,23 +8792,23 @@ }, { "path": "package/dist/views/tui/activity.d.ts", - "size": 342, - "sha256": "9fbbdadfd740e0c7df73feeb8d9ac5d5a916c10b958681f4c7d0f507e2df5e6a" + "size": 410, + "sha256": "26a25646883ece7dcb98fd77f6401cde20ad9f1680d6effc58108d3ca19c310d" }, { "path": "package/dist/views/tui/activity.d.ts.map", - "size": 373, - "sha256": "41dcd3fd8b67e9442825c47a0e9d7fca00ccd163ae557a15b9912a81885cbdf0" + "size": 426, + "sha256": "2584f292b1a84ea381d551e2ee6d5a047a345484db96aed2c2329c55319b659e" }, { "path": "package/dist/views/tui/activity.js", - "size": 1815, - "sha256": "def2e40d6c0bdfd2c51fb74039e9d351372b80072213f20daa956ca9ad13cac0" + "size": 1730, + "sha256": "02dde6bfe527673048c820ab91b9bf8261646b4c2ae3b7fd79bd545ae0dd366f" }, { "path": "package/dist/views/tui/activity.js.map", - "size": 2174, - "sha256": "3d738471d101855e6402e695b42d709d97108bb85b2746ace39556b2a4c93e80" + "size": 2045, + "sha256": "e427236d173415db90f50a940a2051bf52bdbe29bc5b44e8df4238500ad58da5" }, { "path": "package/dist/views/tui/analysis.d.ts", @@ -8222,13 +8882,13 @@ }, { "path": "package/dist/views/tui/automation-rule-panel.js", - "size": 8222, - "sha256": "55ae01ee0420788b9ea9ff81ef10c124290df8529933bb13f3bbc1dd85e12471" + "size": 8238, + "sha256": "2a14d544af4767298078c174fe1d920cd8524b6e1009b8cb5bb3a11f3ded819c" }, { "path": "package/dist/views/tui/automation-rule-panel.js.map", "size": 7367, - "sha256": "a692cd776f44a9b711dc59e289dee160d2440c4ac31cdea9bec4f0147d8e31e7" + "sha256": "233d33820cc7c3a683700605a8002ad4d7176b7cf478031a8cd59bc4bb868902" }, { "path": "package/dist/views/tui/automation-rule-presentation.d.ts", @@ -8278,17 +8938,17 @@ { "path": "package/dist/views/tui/command-palette.d.ts.map", "size": 494, - "sha256": "c73ecbdfede1ec266848c9795698c6c36f03394ccc3efb8c2beaec81a74093c8" + "sha256": "b4c0affd682d133397a08b68984ed06b612556e55f503022e05a398ae512f79f" }, { "path": "package/dist/views/tui/command-palette.js", - "size": 562, - "sha256": "e92e7b0870c01ebd9f9d9eae07e24911d315fba1b445773d7ad3bbf2b39cd612" + "size": 605, + "sha256": "6e28ee347abd830398bd0506190b30aaca75c43c710cc9cfd90f5b4606f15db4" }, { "path": "package/dist/views/tui/command-palette.js.map", - "size": 604, - "sha256": "d3c4d16049f1aabe29abaf8b56b0517ac2e68e8f8be14ce219a9c772cc7f1a56" + "size": 627, + "sha256": "25465d7cee902572804c303836e67a9863728ada75ed66a9772752b9cb74ef90" }, { "path": "package/dist/views/tui/comparison.d.ts", @@ -8318,17 +8978,17 @@ { "path": "package/dist/views/tui/composer-view.d.ts.map", "size": 1273, - "sha256": "44be45a1e247ba253a000fa35864099f2967886dc43a6e36f90b8aaac880c948" + "sha256": "fab3301df92b618982bac9a77600a0cfa437e76d718d926374a578260c99991f" }, { "path": "package/dist/views/tui/composer-view.js", - "size": 6265, - "sha256": "8a2fa6a4fc73841166f04623fb6d37222f718bbb57cdf94686336e0d651ee640" + "size": 6889, + "sha256": "2c7a487f639a16fba0190255f83846f542e1dbbafc4adb7404856f534d908166" }, { "path": "package/dist/views/tui/composer-view.js.map", - "size": 7111, - "sha256": "399b90b823a37679a28901efb3a6b9e69547b47cfb83416dd8185dbc119f03e6" + "size": 7653, + "sha256": "991801861dcde3b93a62487c391695a86c4705252c6cdc4bce21b6fe67da02f2" }, { "path": "package/dist/views/tui/configuration-credential.d.ts", @@ -8338,7 +8998,7 @@ { "path": "package/dist/views/tui/configuration-credential.d.ts.map", "size": 1503, - "sha256": "1ca2d868189bc88d4431ae31e02017b1ac3c6cbca75355b6540c37f97603c2a5" + "sha256": "90dc51a3d8d01d1f7733c95c7018e87a0ae139bd10f04fe10cfb524ae0baa623" }, { "path": "package/dist/views/tui/configuration-credential.js", @@ -8348,7 +9008,7 @@ { "path": "package/dist/views/tui/configuration-credential.js.map", "size": 2589, - "sha256": "f4b17c6e37c85ba94efc73ff6ef93b3fadd2a97038ff6df6622f20ea6d2fec0f" + "sha256": "a4d0a226d5f6ed817c00e18961da6a6946088281456f2427aba5aed0a4bfb63c" }, { "path": "package/dist/views/tui/configuration-presenters.d.ts", @@ -8357,18 +9017,18 @@ }, { "path": "package/dist/views/tui/configuration-presenters.d.ts.map", - "size": 1759, - "sha256": "3d564301c38088dbf128b8baee8a300fd2221033e05311e942e9aba14df1ddaf" + "size": 1758, + "sha256": "3e0b76d207db1cf465169a966b36b4d8c9328b66c989a43a5935608db4e21895" }, { "path": "package/dist/views/tui/configuration-presenters.js", - "size": 9042, - "sha256": "119365031e8ad750067d38f5030549d9ca2aa433b2f76dafcc04d2ea9fc7d89e" + "size": 9813, + "sha256": "4db25d23699972503c52ced8b793da60d980a757964d6628e10aa9117848074e" }, { "path": "package/dist/views/tui/configuration-presenters.js.map", - "size": 9153, - "sha256": "bf78a7af4bb4e7b2406848b486a2467f2f38817440b2db7117dfac9a268d00cb" + "size": 10003, + "sha256": "e8c98039126958db1a2becc48475371299a030cf880b4f1bc365aef653021c2a" }, { "path": "package/dist/views/tui/configuration-responsive-text.d.ts", @@ -8398,17 +9058,17 @@ { "path": "package/dist/views/tui/configuration-review.d.ts.map", "size": 863, - "sha256": "b986f43db47830694f2406d4cadbfea5903741ec05c787d6069c64752e8b0911" + "sha256": "0f7ee71e2fd5f1ece7fb5fdae7a4f42b35deda2b7efdfaeea9eeedb3c9cab326" }, { "path": "package/dist/views/tui/configuration-review.js", - "size": 1924, - "sha256": "a3b51ff7fb2be721d19197868feaa0380edf86cc589242f893a7f457b0a2e0f5" + "size": 2098, + "sha256": "a32d1c422694ac98b787ffc287c55308270e8893c064abdad017ac6c4d8d4d6b" }, { "path": "package/dist/views/tui/configuration-review.js.map", - "size": 2204, - "sha256": "5c8905769118addbeea3f9027ff6544189853440296fd9438119d3c127cc4d6c" + "size": 2378, + "sha256": "74faaec2c16a053240882f706664065e6fcd3ec483519755b6909bd97e30c6ee" }, { "path": "package/dist/views/tui/configuration-wizard-presentation.d.ts", @@ -8418,17 +9078,17 @@ { "path": "package/dist/views/tui/configuration-wizard-presentation.d.ts.map", "size": 1429, - "sha256": "0ab2114de47e46fa1ac9cfde615dd8bfd50d6017480713138059388c32858cdf" + "sha256": "4c15de82b84e721e7336dc87deecb5f5cc4abe5799a089399f102d5a6b15a02f" }, { "path": "package/dist/views/tui/configuration-wizard-presentation.js", - "size": 8418, - "sha256": "9e9d64886da8392357de572d5731f4ce2c57938d6592ea31be4bb64f1b79d597" + "size": 8515, + "sha256": "e6c7087e13dc185149911a32137516dabe3bb39b8b36d29a3e0ecbbcbe35d771" }, { "path": "package/dist/views/tui/configuration-wizard-presentation.js.map", - "size": 7143, - "sha256": "8a1bbb5d4d28d6012f8331d98813bc8820399403bce5fc56e17f7428211b3b38" + "size": 7149, + "sha256": "af545b4f18899e10f0a8d7b80e765271e8257cd3db1662f6f1f38138fedc5213" }, { "path": "package/dist/views/tui/configuration-wizard.d.ts", @@ -8438,17 +9098,17 @@ { "path": "package/dist/views/tui/configuration-wizard.d.ts.map", "size": 1373, - "sha256": "d2061c0f62b3c86d4c3c82c831ec9ecb49f36abf81e09f62fe997394ad14f2a7" + "sha256": "1b783d45f2b3ea412499fad4122b9cff67c658ac8d9835d2a1e764c269ce146f" }, { "path": "package/dist/views/tui/configuration-wizard.js", - "size": 10052, - "sha256": "84e2c551ce75bc2e4a863e0378b76af0d43ab5685a5300e42a69d3476c3154d9" + "size": 10064, + "sha256": "6fb3e9d36e8459be256c8ad40722c6f09a29a9afa060e36bdadec0feffb0358c" }, { "path": "package/dist/views/tui/configuration-wizard.js.map", "size": 9556, - "sha256": "4228fe6f32193305241c70214adb515fb4326135be5d845988dc6c1fd95c5527" + "sha256": "0e916d0974fc24f7a0011901f767818568afbdeec81b7d8a723f6323fde44797" }, { "path": "package/dist/views/tui/connection-metadata-editor-actions.d.ts", @@ -8462,13 +9122,13 @@ }, { "path": "package/dist/views/tui/connection-metadata-editor-actions.js", - "size": 1446, - "sha256": "991ab6d3370cb2fc5380c41ff38c1bdb490916af0210a48045c459f741299f8c" + "size": 1450, + "sha256": "4fe7b263fd6a75cf6c1cc6e825e881187dcfd0ee9d961d0e568307c43d8c9a60" }, { "path": "package/dist/views/tui/connection-metadata-editor-actions.js.map", "size": 1552, - "sha256": "5f924339c5a842c9d2ed5c5d6db7fd6f91b9a04d49309b591829a2e2a4ae6fe6" + "sha256": "e807f7a7cd00985b4eb63778485d0a6916f97f029ba413d49c470f5e96838e48" }, { "path": "package/dist/views/tui/connection-metadata-editor-inputs.d.ts", @@ -8542,13 +9202,13 @@ }, { "path": "package/dist/views/tui/connection-metadata-editor-rendering.js", - "size": 3765, - "sha256": "e682bd54bd4844961d2c040847e59893e942b55241acb0bfe920a42364475790" + "size": 3777, + "sha256": "ef55116e26ee21a64119ea5d8006961a34e0ef1410de19e3f2383d8bfc50e5b4" }, { "path": "package/dist/views/tui/connection-metadata-editor-rendering.js.map", "size": 4223, - "sha256": "f6bc628dfdecf6cdb7269fdb32b60ec718dd6c44c4b19e0297744ee355fd922a" + "sha256": "60dc51369bfa445388ca49c749c15bb8b1e47ddc5e99044e78819369dd02c002" }, { "path": "package/dist/views/tui/connection-metadata-editor.d.ts", @@ -8558,17 +9218,17 @@ { "path": "package/dist/views/tui/connection-metadata-editor.d.ts.map", "size": 877, - "sha256": "d145c38fc695a1397c1fad7c874b2b669d673fda142a33c6b7259062bca0cfd9" + "sha256": "98b72d064d1ade5174379ade7e7d7ee9a37733a1d290a6a6d260a7f0552908f8" }, { "path": "package/dist/views/tui/connection-metadata-editor.js", - "size": 9316, - "sha256": "d8fdad936df8cbacec745f2a06bec160d0807be20bce7bc2199c6e6723c7fa87" + "size": 9557, + "sha256": "e8695f6e67096412e01c8c70a33d0c4dad34cce72c5925de7d9f092ae53be9ff" }, { "path": "package/dist/views/tui/connection-metadata-editor.js.map", - "size": 9055, - "sha256": "7c18450b861b5c6e4d67751e98040dbb520827c6223b34a26d466b6b77ef4c19" + "size": 9270, + "sha256": "7aea9881360db2fc29805317dde90dce35ea5bce52c1186e4e9c7248a350022a" }, { "path": "package/dist/views/tui/connection-overlay-workflow.d.ts", @@ -8578,17 +9238,17 @@ { "path": "package/dist/views/tui/connection-overlay-workflow.d.ts.map", "size": 971, - "sha256": "06597d833d0aafe793bfa5ea69da099b8f5cd415a8dcebba7ed87fd07beb1980" + "sha256": "0c0a104279b8e68cb0040545ff6bbb3fb5f1e082f51471a0951e7ed6133a2c0d" }, { "path": "package/dist/views/tui/connection-overlay-workflow.js", "size": 4852, - "sha256": "33b6dd2b6307b3e5f2ed56845e798bf79596223c497cef24ba48abbabe4f5fd1" + "sha256": "0fd71b955bc9085e4196d5794fcfb6bf74a2b999965b1897ac80c7a7610e1f5a" }, { "path": "package/dist/views/tui/connection-overlay-workflow.js.map", - "size": 4421, - "sha256": "dd3710aff90e74518d871d7cf3584ac93608050a5799ee323c7b84acf33c7692" + "size": 4420, + "sha256": "77bbba6250509e966ab3b98c0d6a606030c24502d95dfb28caa587c02235362a" }, { "path": "package/dist/views/tui/connection-setup-actions.d.ts", @@ -8642,13 +9302,13 @@ }, { "path": "package/dist/views/tui/connection-setup.js", - "size": 8738, - "sha256": "2df3cfa43bfab744c9e5b79cebbe93de1da39f0136a7f7fe04b12336914c0774" + "size": 8746, + "sha256": "37b548cc33a5f8f634a41ab8f9f35d3d33418303fbe9c30e821b35301a5b661e" }, { "path": "package/dist/views/tui/connection-setup.js.map", "size": 8183, - "sha256": "4dac6cda9ab94bb30bbe277d5cf74484948f99087452e2de118e579bd68a09f1" + "sha256": "e037b7854b7bb5f7e14f17ea8b30568b37fe0748c47aed5876445f1d082e76f1" }, { "path": "package/dist/views/tui/conversation-dialogs.d.ts", @@ -8657,18 +9317,18 @@ }, { "path": "package/dist/views/tui/conversation-dialogs.d.ts.map", - "size": 1236, - "sha256": "35061e80bd9dd6ca259c998485c614f745c5a22525dfe9975be7143f3a396c5d" + "size": 1237, + "sha256": "b655708ce7f0eeec4ed0a2513bff58cbfdb0485d9e25c547e93c4a5ec962d649" }, { "path": "package/dist/views/tui/conversation-dialogs.js", - "size": 3992, - "sha256": "4d018f8eac10c9846dede0bdf5639521db3722a38595f8e8d49c2222575ba6ac" + "size": 4060, + "sha256": "4dc16c3198fbc86621d0872322eee974d8d80c3c5cdec2d42fe04e5add3d4083" }, { "path": "package/dist/views/tui/conversation-dialogs.js.map", - "size": 4742, - "sha256": "cf4d452c5e8b04e6bd9cb27797c75076741e1dbab2ace0aabc916a3c6a5d7473" + "size": 4780, + "sha256": "847a669c9725b945e547f6836ec81a76c19cab9e402e41bfb303a3a7471bcb5c" }, { "path": "package/dist/views/tui/conversation-overlay-actions.d.ts", @@ -8678,37 +9338,37 @@ { "path": "package/dist/views/tui/conversation-overlay-actions.d.ts.map", "size": 1128, - "sha256": "517d5c977799c41025e4eae3836ede23524a08634cc73bfc5ea7d123fdcf8721" + "sha256": "aada6bafd5b66028fd9f0881b03ff907845ecdfd3c215d0ed02bc8bc63809b1e" }, { "path": "package/dist/views/tui/conversation-overlay-actions.js", - "size": 8820, - "sha256": "79db619ad23ebc7b022abd40950cd70cb4a83fd73ed58a6a560b78b18d3e3663" + "size": 9242, + "sha256": "cd650e772f3b32b3dd530a046fb32fb0ba35764b6d752aeb425f5893ecf7a284" }, { "path": "package/dist/views/tui/conversation-overlay-actions.js.map", - "size": 7951, - "sha256": "14019fe30a21a90fb947a56da50ec5ac3d6501384b252fb47bcc48cb629bad78" + "size": 8340, + "sha256": "7d70b2d9c93eaf824ddaa0f888afc61e127b042c2bde866eae51a5b9aa874f8d" }, { "path": "package/dist/views/tui/conversation-overlay-helpers.d.ts", - "size": 1175, - "sha256": "6d00073bafd4f228ad5b4be8bbf5fb75c358530e9825b2ff261f16dd0ea0a082" + "size": 1064, + "sha256": "c31e99bf09d9c9d9c00ce5f4017a502210ae949cbd7f1acafb11a7ddc041b1de" }, { "path": "package/dist/views/tui/conversation-overlay-helpers.d.ts.map", - "size": 1157, - "sha256": "43b82d265db230672843f63e1546c976373472bf98f0cd595ab2cc66e4a883f0" + "size": 1057, + "sha256": "824f31ed3fbaa58b533276fcbcf3c839c3f34aeda9019c28dba9f97aee537c5f" }, { "path": "package/dist/views/tui/conversation-overlay-helpers.js", - "size": 2830, - "sha256": "29857daa00b5db5cc918f48a1d460529bbaa842443eab001c8c7712e1fd78576" + "size": 2698, + "sha256": "87fa1dbf56e17fe82174515179f4832de798024969e880f579c8ab86d7f8c696" }, { "path": "package/dist/views/tui/conversation-overlay-helpers.js.map", - "size": 3295, - "sha256": "fd1e8750845da3558e6d288fc5ce492d41f10a1282bd98704c26c290a9e7e8bc" + "size": 3121, + "sha256": "69dac1d34b01ede28450aed3b324460671e204dcbb32f042e6e0a88b682b30d0" }, { "path": "package/dist/views/tui/conversation-overlays.d.ts", @@ -8717,18 +9377,18 @@ }, { "path": "package/dist/views/tui/conversation-overlays.d.ts.map", - "size": 739, - "sha256": "eeee7beb224dcc6aba7d16c28668bc15a5cfc61b1d805dc51b644e2f5a19121b" + "size": 738, + "sha256": "da6dee6dcd14efab59ebd06a3b7cfaab45e7e852bf90c9107b4e384701c634ba" }, { "path": "package/dist/views/tui/conversation-overlays.js", - "size": 2675, - "sha256": "2478b07a25a2c979892361cdab1e9b1543ab618314f69bfd8726270f5a7ce78b" + "size": 2680, + "sha256": "686598944d9c356ab84be470f1b7c2098fc20bac337d746fdc227b73f362ade5" }, { "path": "package/dist/views/tui/conversation-overlays.js.map", "size": 2664, - "sha256": "27807ed14f67618498ad2f277bd9795ff8848f32aceb28eb5f9b6c36df83b5a1" + "sha256": "b61e636384449dd088dfea11a5f9fa5f41cf849330c6797026a69e24dc424e52" }, { "path": "package/dist/views/tui/details.d.ts", @@ -8770,45 +9430,65 @@ "size": 1318, "sha256": "278545c5af568d6445e40f0e0f0ff1917c7996572aa36ffbe391f283a92b27ea" }, + { + "path": "package/dist/views/tui/entity-browser-layout.d.ts", + "size": 451, + "sha256": "abf84188010c23f9d63fb3f89f9f3887e9195d06b6b5cf2e7865021bfac6cae3" + }, + { + "path": "package/dist/views/tui/entity-browser-layout.d.ts.map", + "size": 550, + "sha256": "207d64029b01f75accd8edf08be608de7501e52a771aee82c59551aae11a69d4" + }, + { + "path": "package/dist/views/tui/entity-browser-layout.js", + "size": 3499, + "sha256": "5337aa3c0adc64ae972c4ba6985e79400c16e38fc712faa6f1b14f409330b5aa" + }, + { + "path": "package/dist/views/tui/entity-browser-layout.js.map", + "size": 3468, + "sha256": "2361a6a7203b6c709e192d3cdf56f014333b8185ea595f6609ca980bb2807a3a" + }, { "path": "package/dist/views/tui/entity-browser.d.ts", - "size": 1594, - "sha256": "0de22cd20ef5cff75bdb3f8aea35f6b67f3e52bcd094455be815ae990949bd75" + "size": 1705, + "sha256": "cd6d1a02d96bf34898316ab42e2a29f58b83ad2f14a118ff91e08f8cf1d779b6" }, { "path": "package/dist/views/tui/entity-browser.d.ts.map", - "size": 1668, - "sha256": "080e2836a79c908858a375ff710868dd2956113a032d1ac9108b8bdff3393e5d" + "size": 1802, + "sha256": "c0a056c1e868fdd8aafd509e91182f6da816ea425135b790ace6e61f6066bfcf" }, { "path": "package/dist/views/tui/entity-browser.js", - "size": 15873, - "sha256": "92e1d49f9e07dcda1dba3745a68f0407487f3dd5afbcd615b6c45a863b66fc9f" + "size": 15474, + "sha256": "b552180419eb484de16b18a67bedf227df7a2a22c2f8ddb7aafd295148d5f5de" }, { "path": "package/dist/views/tui/entity-browser.js.map", - "size": 17577, - "sha256": "d2b75730b1f54509071b3d6d3fc3ab159919dffc7628296b9405906d6858856e" + "size": 17172, + "sha256": "96ce4bc0e53ab8921c8b2727dd84fe48ecf7fcbc4c3c7d99e84f55eb9186e23b" }, { "path": "package/dist/views/tui/execution-target.d.ts", - "size": 745, - "sha256": "df1c1619be3e076857e34c47bd90115cf62b7a1e1e687ebafe8b7c9b8aca0dd1" + "size": 1080, + "sha256": "cd7c67c77cbb7e5cbf918f1df449e8d9d0bc79a5d31efa08b62fc5f593b366a9" }, { "path": "package/dist/views/tui/execution-target.d.ts.map", - "size": 767, - "sha256": "1f5d5a120f860be2dd459fb93fadf55f59acb4813784565764520c278207d1ba" + "size": 1020, + "sha256": "f432796e5c54c57f945dbc2c774bee4a0ba942436e971ebbdcbe36f5309f71a1" }, { "path": "package/dist/views/tui/execution-target.js", - "size": 1788, - "sha256": "f5fbc3485ada80e0098e091dd3e814e33dd2b4cab14cceeea6740d17c7c876d4" + "size": 4851, + "sha256": "d43474953cb7233eb1613587661ece64d60c2a9cf15d50a873260d029ccce883" }, { "path": "package/dist/views/tui/execution-target.js.map", - "size": 2197, - "sha256": "129aa40e3f5f173647f58e0852d59d88737464ebde52b4025d4af380d0e901b4" + "size": 5505, + "sha256": "93d576875e3574bf3ccaeb0c65e0573b6be06dda1c83088d0d2ad681341b4696" }, { "path": "package/dist/views/tui/focused-surface.d.ts", @@ -8852,23 +9532,23 @@ }, { "path": "package/dist/views/tui/graph.d.ts", - "size": 729, - "sha256": "c0df83e4a4e5206bed8c38d47b1e0e4c88174e01de0b5256bb5487abb66ca5ee" + "size": 969, + "sha256": "481ed1c008f533a6075953076cc902592b6df2c4ef60abc4cadb20352f47afe9" }, { "path": "package/dist/views/tui/graph.d.ts.map", - "size": 751, - "sha256": "b2b61a896af5456bfeb16fe904f8446665953b7bf182156182e665550a1b5138" + "size": 987, + "sha256": "612a0e220c55dde01dc424665a6262b097b1b4abbb051559ebecf4f68aa3f66a" }, { "path": "package/dist/views/tui/graph.js", - "size": 3968, - "sha256": "ad252d58f4d1ed9429b090ebf96f401a8537e4e2fa766904f5fd077f1aa69d1d" + "size": 8720, + "sha256": "c8d20cff89ed4a9e738b677b83df3b8038f04ef8700ccad70dab851f69a0293e" }, { "path": "package/dist/views/tui/graph.js.map", - "size": 4426, - "sha256": "f949fb77669edab4ee2a66e24f09e888319292184b92087988d83f28935765e1" + "size": 9550, + "sha256": "f73f2bf43fbad4d6e7a59fc42be7b4010c3858307d1358ea2799c20ab510ee16" }, { "path": "package/dist/views/tui/help.d.ts", @@ -8882,13 +9562,13 @@ }, { "path": "package/dist/views/tui/help.js", - "size": 2078, - "sha256": "f96ad89a57a33a5d751a0a8b07d891382afa9d39b783ffe07e76876cc060108e" + "size": 2079, + "sha256": "247c3e5498d672d7472c8206ca965fc44c7098b560b0a1afc14bd859655bda32" }, { "path": "package/dist/views/tui/help.js.map", "size": 2355, - "sha256": "2c87e8d7e35150993cf1d2c6a3dbdd9d1e35fcac329e9c11ea1ab59332aed6d7" + "sha256": "e69f96e0266306065800a0ab532c3201cbbb00ff2fbf1d720f24984916be00cf" }, { "path": "package/dist/views/tui/interaction-automation-response.d.ts", @@ -8952,43 +9632,43 @@ }, { "path": "package/dist/views/tui/interaction-presentation.d.ts", - "size": 1670, - "sha256": "32cc62b97836f7f94de8f5481e2b9597d1dec81ab28ab8aa90ed580e7e34671c" + "size": 1773, + "sha256": "3336a5a3de274a60a4d13007781ebf8c0a14f8f2248ccbd2b3fe116fdab9513b" }, { "path": "package/dist/views/tui/interaction-presentation.d.ts.map", - "size": 1379, - "sha256": "e762fe68783020751784c859265dd3cbca533d9555cc46995bcbea07ead65172" + "size": 1444, + "sha256": "7683989739668c9f461e26af948e6a2024a07334822b5d061efede78eab491ae" }, { "path": "package/dist/views/tui/interaction-presentation.js", - "size": 7074, - "sha256": "3ed65c58c1712101054781d0d121127828ceca8d9c36b7d9cb42a525e7f9846f" + "size": 7009, + "sha256": "64f150a5d37d46e2bd3f69a2ede7af7be3c9e18d60131a40c496784bb47c3507" }, { "path": "package/dist/views/tui/interaction-presentation.js.map", - "size": 7634, - "sha256": "3b60b31b49e17d7ddf4fa69d2500bf5986167f3637e784636b4b9c988be7d6bf" + "size": 7439, + "sha256": "996fa53f1f6c4ec7c91175d46b7fe39cbebce9de4a6e29ff02d28244bfe2b1b9" }, { "path": "package/dist/views/tui/interaction.d.ts", - "size": 718, - "sha256": "e69e77845e96ce0f6383e898b272e626a83e899413f24bd307266484b2956d88" + "size": 774, + "sha256": "ed094a65ca2b2185447efb4adf6cde4c739a7e885fb6488bcf77beecf5273255" }, { "path": "package/dist/views/tui/interaction.d.ts.map", - "size": 732, - "sha256": "72d6b9df3b492dd80cee8a7027c015d3bf391f9c0b3976d74d2cc62ab207542f" + "size": 778, + "sha256": "01c5a2348389a1d22a4f0cb82290c0d81873a9e27ad48071be041394273cfea3" }, { "path": "package/dist/views/tui/interaction.js", - "size": 8608, - "sha256": "ba7a382f305c35aec066058694a330ab5980812aa88ef7500f03528c05746b3a" + "size": 8510, + "sha256": "2ebe3ead7073252c8c339d391e04b65dafe1ba3315449650a35ac75582b175f8" }, { "path": "package/dist/views/tui/interaction.js.map", - "size": 8150, - "sha256": "5e68d1dc106b0b64ba3c56aca1b43a019b2f0d63d12cfdbd41f6fd4e56310a23" + "size": 8079, + "sha256": "120452fc914ab997e4f6f5734e88f4a203fff204dbfdb2c5250221f8a5fa5179" }, { "path": "package/dist/views/tui/keyboard.d.ts", @@ -9002,13 +9682,13 @@ }, { "path": "package/dist/views/tui/keyboard.js", - "size": 7341, - "sha256": "ce63745e2eb0560d893d835c55f6cd3944345e0d2882088b787b42efbb4fc6d3" + "size": 7349, + "sha256": "e7dd253c52d275849d9a12c99756c078f3cfe1132be06d1c4bb03768f12efee9" }, { "path": "package/dist/views/tui/keyboard.js.map", - "size": 7896, - "sha256": "8ef94a69feb8e4c2e49e88556b6e40e86fd3ff309eb1c2ca83cba834b8338055" + "size": 7906, + "sha256": "24400ba8b38cd6f27275302d7b2dc6bc2c956316d8d6f56574a7103c094a3f40" }, { "path": "package/dist/views/tui/layout.d.ts", @@ -9030,25 +9710,45 @@ "size": 1637, "sha256": "94d5f44f8d7b1da3b909cf49fd1d06c73cdffb805061dd8af195757ddf109b66" }, + { + "path": "package/dist/views/tui/measurement-display.d.ts", + "size": 241, + "sha256": "65683bfd4ced9d983cd77b4585be4d8ca05ebbdbe53e83b41a4dd07089379384" + }, + { + "path": "package/dist/views/tui/measurement-display.d.ts.map", + "size": 235, + "sha256": "8a6f06f6841c4f627be28210f12992b9678b06c0f08d3250112b4b95966cc16b" + }, + { + "path": "package/dist/views/tui/measurement-display.js", + "size": 546, + "sha256": "264d7ea9b173062a928da764e8f4abddef966298452e24b532c495b7668bdfd8" + }, + { + "path": "package/dist/views/tui/measurement-display.js.map", + "size": 578, + "sha256": "8bb6871e8c8e3ba1a4b41484839250ef3b351331a02214c12944c54b558482a6" + }, { "path": "package/dist/views/tui/modal-coordinator.d.ts", - "size": 777, - "sha256": "0f0b40e62ab977b73ead88a8966cc8b5f37f61777cb3cd4412070f1c3b466e58" + "size": 854, + "sha256": "757513d788dde8ba5a424bcbbeae59fb6dcd4a456ddd62c584a0bf6c01fae247" }, { "path": "package/dist/views/tui/modal-coordinator.d.ts.map", - "size": 773, - "sha256": "8937ed152e266dc83bf86ab1dbd6dff3ef8f9c912c1d46e3a6eb7e956b82b6c2" + "size": 830, + "sha256": "76d8a125b9eaf3959fa7d8f307160efd111928b904c095c7cbc6940941a02a25" }, { "path": "package/dist/views/tui/modal-coordinator.js", - "size": 2474, - "sha256": "62b3e915192cc08b93c073a4866c39bbc83f5a85551e0245cc0fd02df1338f69" + "size": 3035, + "sha256": "764535594b7ecd358ace173b342503552963265a877bc8a2a13e98ebf4332af2" }, { "path": "package/dist/views/tui/modal-coordinator.js.map", - "size": 2761, - "sha256": "d54773d1676a7dae0d3c453bc33d3fea94ed9f4708cedb758a3d5dd7f2cd4583" + "size": 3221, + "sha256": "0b494bd095e152021173c0658584f1e50a6bd5049c60a30ca65c7593a838be74" }, { "path": "package/dist/views/tui/profile-compatibility.d.ts", @@ -9097,38 +9797,38 @@ }, { "path": "package/dist/views/tui/profile-editor-rendering.d.ts.map", - "size": 389, - "sha256": "8fb85d9c909010158bdbec15e84d950389e7a5cf67562d558cf7d5494f6e1854" + "size": 388, + "sha256": "ec4b5e5288bbf0adee63baee8fb02a7e94bdc3773d1f35111e430c52868bc55d" }, { "path": "package/dist/views/tui/profile-editor-rendering.js", - "size": 1341, - "sha256": "a40cbb7f97439698e323a79bca4a54e6b41153b5637764060ad81158754332c0" + "size": 1280, + "sha256": "3872a4f71b471dab157df6b1f98353316fe9652900786b7b340c470be8edf1d9" }, { "path": "package/dist/views/tui/profile-editor-rendering.js.map", - "size": 1739, - "sha256": "db0a0f98c7fc2f65764ed19ef7962fbf295cf5b6c660318a5c33f08b17cba2e7" + "size": 1624, + "sha256": "5000736ff16fd206ec224a7d942eb8bc8f1a87d31e7be5405a811986a2732ed8" }, { "path": "package/dist/views/tui/profile-editor.d.ts", - "size": 789, - "sha256": "650deb8bf9f5924f119d6c57677bd61674c6803cf793e1c8d4bd777a7542c672" + "size": 860, + "sha256": "0d2fdba7aa3b0d5c1669e3be9aaba44657790f1a86fbc03efd593305a820d993" }, { "path": "package/dist/views/tui/profile-editor.d.ts.map", - "size": 805, - "sha256": "a2041acc65f1679f46d59311ab1f00eec8b9d8175d03e72d7ee3efeb9fd15c2a" + "size": 902, + "sha256": "26b6fa78f8a88cbf036642c28b27f51b8614e5822dd4b639c1d77b0daa50c039" }, { "path": "package/dist/views/tui/profile-editor.js", - "size": 10225, - "sha256": "17569e4184f7da87722b2b15111bde9151a05069d17dc84ef80397b096381d26" + "size": 10025, + "sha256": "9fe1d3ee2705345f9cef57c82620bd492a08dfdd311447f61c0431db90386c28" }, { "path": "package/dist/views/tui/profile-editor.js.map", - "size": 9379, - "sha256": "d3933d251e869f790ee5a62d44043e731a9b8255ad43a9dc39858a2ba045da6a" + "size": 9157, + "sha256": "e027e5b2097d89f2077a60eedab135127b642435b26f198c80ae718d26dbe95f" }, { "path": "package/dist/views/tui/safe-markdown.d.ts", @@ -9158,7 +9858,7 @@ { "path": "package/dist/views/tui/secret-input.d.ts.map", "size": 964, - "sha256": "2f5a4792ad284dbeb418c3e37dbef12abd5fb417763e8a8ddb7984871a66deb3" + "sha256": "47938b48c526301a44990a90717c0e3fde459c2d692b119254ec29de8affd849" }, { "path": "package/dist/views/tui/secret-input.js", @@ -9168,87 +9868,107 @@ { "path": "package/dist/views/tui/secret-input.js.map", "size": 14407, - "sha256": "5bc9530d2d46b2a8708c07c24f2175cbc6eac9048becfd9bec967d8e8d1f72f1" + "sha256": "084640daa6095346025f900d82b7fe4e340c3debeef83622fd812afd87186a63" }, { "path": "package/dist/views/tui/selector.d.ts", - "size": 1295, - "sha256": "eeb9103e600333c95488f0ded66c6e1d70bc97ec1332d9580adff8125ada7067" + "size": 1696, + "sha256": "ac379badf4df58bc0d26214af01302f29e30185f725a13b634c20e4d8f34194b" }, { "path": "package/dist/views/tui/selector.d.ts.map", - "size": 1410, - "sha256": "6ea1fcccd25f116cf763b9255ba5d2520cc0a1d4e3133c0373e9d873208ce8ba" + "size": 1470, + "sha256": "13b2c6d59ae143b6ff22b3b8762280a81f2555203590d395f74f6452b3d28788" }, { "path": "package/dist/views/tui/selector.js", - "size": 6727, - "sha256": "1be97125de7a586c7f18d7e57ffddf15ef27a8066314bf89810c6acf449b967c" + "size": 9413, + "sha256": "6d27fc5f3698f30285fc8fa4a1f8576768d691dc4924c22b382677abbfae5cd1" }, { "path": "package/dist/views/tui/selector.js.map", - "size": 7704, - "sha256": "85e8f52cda69c3fec75ee5cb456bc656d7ef91527fa9ff77b5012ab174a4de70" + "size": 9734, + "sha256": "a1ebd19196b6b7d0c50e9145a006802e58ade17fa89883cfad11baaa4ccbcca2" + }, + { + "path": "package/dist/views/tui/supervisor-actions.d.ts", + "size": 744, + "sha256": "1465409d81e1942691df095b370b5a1aefdd5bc0902003b9a060310e9cc57d13" + }, + { + "path": "package/dist/views/tui/supervisor-actions.d.ts.map", + "size": 752, + "sha256": "722915858d86c3a32f514fb11e9314a269a8d8f8713e77afdd09e33f4f67ae69" + }, + { + "path": "package/dist/views/tui/supervisor-actions.js", + "size": 2032, + "sha256": "93deb2941b549924fccb3eef4fdd4a6e11bfa7520623d68e83259c91711193cd" + }, + { + "path": "package/dist/views/tui/supervisor-actions.js.map", + "size": 2354, + "sha256": "737a2ac5ca35aed9b4305caaf6c9afd046ba90ed61ed4e3e703a311bc704d08c" }, { "path": "package/dist/views/tui/terminal-app.d.ts", - "size": 1283, - "sha256": "646eb476ad7b597ca3289350f17bd033124b39a8c14018021ac96d569898d8d8" + "size": 1654, + "sha256": "2c232d9f895a39dc12f73b3ce984f49cf6784badc92994ad17f713f1d10eafb3" }, { "path": "package/dist/views/tui/terminal-app.d.ts.map", - "size": 1253, - "sha256": "93f8a7b562e6b7cf66baecb241d9ed51ae6055125a48f63398d8f1fddb044c57" + "size": 1424, + "sha256": "ec1feb4ad66974431747944711b57b9fb9df104728203b4eaf416ce3d17fe06e" }, { "path": "package/dist/views/tui/terminal-app.js", - "size": 9382, - "sha256": "2f2948e7c35e1574c09fd8d36be3c3469ac03d73d2442f1ad5a93d5b6327f107" + "size": 11320, + "sha256": "bfe4b1cb58e57043c1925933e0146e236ebf4bd495de8bc69558959d561be175" }, { "path": "package/dist/views/tui/terminal-app.js.map", - "size": 9226, - "sha256": "65e356ba75a123467aa9384e70382e694bc337e611bec2f70735c296ba26f334" + "size": 10841, + "sha256": "1fb0602d7dc6746beafd40e9e0c511ee8e62b0f7722d1394deff23b5757f3b17" }, { "path": "package/dist/views/tui/terminal-chrome.d.ts", "size": 869, - "sha256": "28449a80a9326a85678b24a6d0f80d159b40d85a99bbf4a03ed79e3c587744da" + "sha256": "3d11851e2c65c1e854cca5b8a758bf7e92b7b2d05c69dc0de94a3b2dd6212219" }, { "path": "package/dist/views/tui/terminal-chrome.d.ts.map", - "size": 842, - "sha256": "8a9bce7e603dfc8f868738ed9420b01c972b05684a889f9366416313dc28c09e" + "size": 844, + "sha256": "25771fb8a197a97087bb376895854d49a0d33fa6e6fef20c93a69606e4183592" }, { "path": "package/dist/views/tui/terminal-chrome.js", - "size": 6757, - "sha256": "b09523bc0681c1500757728f449631d85bb08bf03814a8084da62f582243e2c6" + "size": 13374, + "sha256": "cc4f38cd201872db0e3c99973f6c966e2d62a9f290b6378c6c785c6b68b84094" }, { "path": "package/dist/views/tui/terminal-chrome.js.map", - "size": 6514, - "sha256": "5484f11fb007f2e0399e5c257558c45f5e256d886e3f4573137d03db89edf9d9" + "size": 14140, + "sha256": "19eb8fabbf10527bdee95b39e5d1995b0762c159b996ad150109fae778c9d78c" }, { "path": "package/dist/views/tui/terminal-command-controller.d.ts", - "size": 1263, - "sha256": "d75dd7e91d9ef95348c055a8dc39f5d2b03d422175ba03fedb222d137a25cacf" + "size": 1415, + "sha256": "d3c5f436eb2147e79c0811d7632387711a0e7a88ec3e8b97baf0374adc1e238f" }, { "path": "package/dist/views/tui/terminal-command-controller.d.ts.map", - "size": 1119, - "sha256": "8e5a644592e1d3c20e6c1eb33875fcead161a5108bcf061519b8cdaa4376c3ac" + "size": 1214, + "sha256": "3bb714441ad0a7d42f6bfaf44cf36f3886277043c48bb9d5d11b43e946f8301a" }, { "path": "package/dist/views/tui/terminal-command-controller.js", - "size": 8982, - "sha256": "0e4133269e59b912e299687b292a79bacb3244029d81ac73ef8ca69f001fc899" + "size": 11126, + "sha256": "9a0d4ec91ba6950641d40dd2c176b445acb9b48c710075190ab90423647fcd33" }, { "path": "package/dist/views/tui/terminal-command-controller.js.map", - "size": 9028, - "sha256": "b6c788d576dccd76afe1a8f614a7480b0d00820484b992ab77348826678be99f" + "size": 11178, + "sha256": "bb345701f1a5d6f84263f9a53f7f2b6b27458be2750101ff5e5fab7a5cfff7a3" }, { "path": "package/dist/views/tui/terminal-compatibility.d.ts", @@ -9292,143 +10012,143 @@ }, { "path": "package/dist/views/tui/terminal-identity.d.ts", - "size": 1337, - "sha256": "22ced0c49b5656bfeddaafc099df67520375998fd243871d33929a3852a00b52" + "size": 1701, + "sha256": "bea0255a7c62898ed3ec8f44fd4552753d2b9005700a38c68517d6bdff0f0e5b" }, { "path": "package/dist/views/tui/terminal-identity.d.ts.map", - "size": 1349, - "sha256": "f4d6016a1319c1eca4449cc91251d47ca6fcbe25a2fef3c47679a48b4b5ff0ad" + "size": 1680, + "sha256": "e6f7dd720428e03885ca86970e6c5b8b040e66690063ef411f31ed52f125838c" }, { "path": "package/dist/views/tui/terminal-identity.js", - "size": 4507, - "sha256": "c87fa96acc5f9d5c77ae209ab87fbccfd29918449fda84166a72222a0d273454" + "size": 7989, + "sha256": "72bfaf308097163359dfeb169c0618859cd5722b728b7e2cb6b3b580dc3f76c4" }, { "path": "package/dist/views/tui/terminal-identity.js.map", - "size": 5016, - "sha256": "2c37382ea0953d317f84ab84397dd903092db3e29a5df291aa35e2f87175d77b" + "size": 8057, + "sha256": "be5a2165a7a9205acef6e1723e6dad4462196af7050c7e376eb9e9404c700292" }, { "path": "package/dist/views/tui/terminal-input-controller.d.ts", - "size": 1774, - "sha256": "eba017acbd5844fe8e711ed074a9deb857445c371f65d6dc356ecac983db62d2" + "size": 1486, + "sha256": "661229b8d934f06f344ddd8a6f5837a3996fbd9ba74e3f5d750918da52b461b6" }, { "path": "package/dist/views/tui/terminal-input-controller.d.ts.map", - "size": 1590, - "sha256": "15333bb9fae8b5ac56a5e476145a6ea6edf90d8c6d72ee94f6a7196c1de64b4d" + "size": 1349, + "sha256": "f35a5989ec3d46fa712c319856ffa9278e7b197597954c736d052b41f11702c7" }, { "path": "package/dist/views/tui/terminal-input-controller.js", - "size": 7149, - "sha256": "a75a730f3e1b973f610b9378134461eec11914c8b7e92eb1e1f2ae3330497ace" + "size": 8030, + "sha256": "22fbaf9f2bcd85e3a13aed53e85438963962027e58de7fa5ba1c366e8f7b3406" }, { "path": "package/dist/views/tui/terminal-input-controller.js.map", - "size": 7312, - "sha256": "48abefa24d94ffb8e33fd158485ca0c7d9dfb896a89b42af1251189e056cfbba" + "size": 8137, + "sha256": "43c8b0a63abe6667e90fba126ad54db2d8311632957591192bef5dd81b97fec0" }, { "path": "package/dist/views/tui/terminal-interaction-controller.d.ts", - "size": 1196, - "sha256": "05bfab1a4317f4e4d57b11977a1b7e8cc858ba57bd4e3099217cc6d67444696c" + "size": 1257, + "sha256": "d00709fbfe4508a7e57df7424e053333ef8f8d11208e930493aedf84303e8f25" }, { "path": "package/dist/views/tui/terminal-interaction-controller.d.ts.map", - "size": 1069, - "sha256": "042135baffde487393ad61c640403264a8fc73bc590d2a10347c719df4d6bf55" + "size": 1137, + "sha256": "9fa5b7e33dd453aa21954a1d8029bc1a0e128fc6dbffad22c4b17a5a21d54d7b" }, { "path": "package/dist/views/tui/terminal-interaction-controller.js", - "size": 3471, - "sha256": "89e75c04d26644a5d776dde73ffe736998e4d0a59ff24d5c1ba9b0cd74343058" + "size": 4857, + "sha256": "0b2346721ac778aaf112a808539002463907ec0b0659dbefbcfd027d1d5e31b2" }, { "path": "package/dist/views/tui/terminal-interaction-controller.js.map", - "size": 3250, - "sha256": "e9f7f5d568d6b9c0502bc9ef47467e8a277c2f870e63a52b0a006c5b9e79d0d9" + "size": 4563, + "sha256": "2b6ca23f3a63af09b650c930dac7657e88c1c2e769925ca2f2ca3b79e545bbc6" }, { "path": "package/dist/views/tui/terminal-overlays.d.ts", - "size": 2567, - "sha256": "0b9053065642f773b34c3d0d244206c3854b6c75dd6e3b54ab596144b3a720f8" + "size": 2781, + "sha256": "6be4ec66507d04721391add4ffdc8771667f597349b548bfd0b895d7ee46a0c7" }, { "path": "package/dist/views/tui/terminal-overlays.d.ts.map", - "size": 2343, - "sha256": "a23e750c0049b2229ee6552902f70b198800011cae4e498a3aca1208ffbe56ee" + "size": 2508, + "sha256": "041e3a6e548d233c053760ad9088c97996c90946f44cafbc4929737d3469836e" }, { "path": "package/dist/views/tui/terminal-overlays.js", - "size": 11599, - "sha256": "c0ebb81d2aa5c96dfa258cc47e53b32950e2a06922a1de90fff885bb061d46b0" + "size": 14203, + "sha256": "8f6ffc2f3d76e87eb7883afca653999997c46486624a922bec802cd104dba0d1" }, { "path": "package/dist/views/tui/terminal-overlays.js.map", - "size": 10446, - "sha256": "240688d7afaa39fbb565068c981d4a8e0743520b1657b12018daeb47e0b05916" + "size": 12512, + "sha256": "141f6395a438b8bf44db06d3f6ffb7211daac4713896a1c71a5cd83e28a63377" }, { "path": "package/dist/views/tui/terminal-shell.d.ts", - "size": 1016, - "sha256": "f448e99165410b8f5ccd28fc0ee2368e4b0900c9e9aec69ffab0b96506ee635e" + "size": 968, + "sha256": "559abb3f9eaef79bcd4129118aa66457a08f4df604a812989dc5a8a1db45b8cd" }, { "path": "package/dist/views/tui/terminal-shell.d.ts.map", - "size": 1073, - "sha256": "01c8c49f7b913206a0404773b3a7768f7e10ff0e370411ba8f3c1881e272b0a0" + "size": 1025, + "sha256": "10d3875b9c83d9b05ffd23e2a6010ab7e4f69ef2be140771672ec073629a72cc" }, { "path": "package/dist/views/tui/terminal-shell.js", - "size": 6043, - "sha256": "07e887228026b9af3ff1d17fa3e9df22b0e0f30b59178e79579fa3d67e367996" + "size": 4900, + "sha256": "97f87c84cad711f7c4b7f04e81fc50cc8ab1bac6c32ffa4a0e3bd3e3febaf66c" }, { "path": "package/dist/views/tui/terminal-shell.js.map", - "size": 6444, - "sha256": "0dbc6de43a96699935957f9a6504d83763b433b07ebf493cf9304705ae8b5d11" + "size": 5210, + "sha256": "4cb41f2216817c743fac429efc10f43b5c9cf91fddbde72cc40453ddaaeeb1e7" }, { "path": "package/dist/views/tui/terminal-surface-overlays.d.ts", - "size": 1301, - "sha256": "2bf27877e14fe9e690d2a16c59ae7ffab5905f3144a5ae6c22dd41773261eec2" + "size": 1546, + "sha256": "11e21238ceb310909229cce0d021b75a72b4abada528eaf740251dc3bc12ea2b" }, { "path": "package/dist/views/tui/terminal-surface-overlays.d.ts.map", - "size": 1298, - "sha256": "c69f98bd473b3bb0aa2c3c928713419891e90416ffc2e3d13a2c8a36a52123f3" + "size": 1500, + "sha256": "d9f77b9711e0001cf4af0c4d27c6c2b8b2e72b0ca0dfd6d8a75524dedc04d039" }, { "path": "package/dist/views/tui/terminal-surface-overlays.js", - "size": 11421, - "sha256": "84d089d0e870cdfaf39a3810acedaa9cd519540fff1733fd7069aea92ee6f168" + "size": 22098, + "sha256": "a86afa61e44c0b2640380b522661fdd3becd99c49df2ff8116292bc54e2828e7" }, { "path": "package/dist/views/tui/terminal-surface-overlays.js.map", - "size": 10149, - "sha256": "f48421cd2f82294c98214fad2fe1aa35ea15a4f5dd126c6c06457124ca10d0ad" + "size": 19205, + "sha256": "01d59c8b209afb4957ba30face52ff786ea9d4027aef13c4b1b620f89539cda8" }, { "path": "package/dist/views/tui/terminal-usage.d.ts", - "size": 239, - "sha256": "4748d7b0c205ab7c17197b96b1fb430a1518c8876552967af80dcc2f06cdeb5e" + "size": 401, + "sha256": "7dc31e593ed1964a66c445de8d7744b5a8145c65db555e66e1e86d48acfce7f3" }, { "path": "package/dist/views/tui/terminal-usage.d.ts.map", - "size": 257, - "sha256": "53815711294ef5083bfcae05656ad6d7eac681795e25d4b796b0d455e25ce6d2" + "size": 330, + "sha256": "3c05658a451d24a4da1de163256595f321ea9bafa1048bf92102b79f555a7209" }, { "path": "package/dist/views/tui/terminal-usage.js", - "size": 2640, - "sha256": "21ad03a1f3168fe482a932aaf94b24735c6716520ce2a5491a0988f2894e0f5b" + "size": 3433, + "sha256": "d75277203238c6564772c81a6d1374655aa5865739ab5759bd2a4c769db0a024" }, { "path": "package/dist/views/tui/terminal-usage.js.map", - "size": 3042, - "sha256": "8195d5323ede16fbaa049b5f1b4857b5ec0766f341ce6809994de134a6d2d509" + "size": 3835, + "sha256": "f83201e485d4620fb4d4068028636982e9ab1eb8f4c2c822212bb9f0459318e6" }, { "path": "package/dist/views/tui/theme.d.ts", @@ -9457,28 +10177,28 @@ }, { "path": "package/dist/views/tui/transcript.d.ts.map", - "size": 789, - "sha256": "7136604006c007ff224961c82ff89ca82fe6b405115fe05e5161cfe8ea699ada" + "size": 790, + "sha256": "4f1e6d09faae829323ff372b844863e1f3e296f02469771a4f45524562ad8d95" }, { "path": "package/dist/views/tui/transcript.js", - "size": 13459, - "sha256": "1c3f19194a2056ef51333efe12f556551fb6e56cde78c47eb56968500c65338b" + "size": 13803, + "sha256": "5d6bb2b43d1b5426563f74b7ae8b17de2a4e2337b55c5d041266c709e2bf7031" }, { "path": "package/dist/views/tui/transcript.js.map", - "size": 15010, - "sha256": "f609c12af31425d1dc8b911bfd8751a32ce39ab47f1e7744713ad9b09257c5fb" + "size": 15517, + "sha256": "224d4ec2b0a4540abdb16688bf93b726e273f1aed094c205aa0b856e144c867a" }, { "path": "package/package.json", - "size": 5673, - "sha256": "70fd8ae1e0a9cb9b77230dfc2b23164a7818936b3169eedfded195b5e5fe9935" + "size": 6069, + "sha256": "b093ec5e7aef60709683e622eab7d50af769c402cbafecc9dd75b1d2b725831f" } ], - "digest": "e95f73298dd6bb3e59e4c238995985212ed879ae5daa34f6bec19d9cf89736ae" + "digest": "d842b2dc20253877c91b19487542984c8c262a1b9bc82ddf744852cffefc49f7" }, - "rpcRecords": 34, + "rpcRecords": 37, "referenceSizes": [ { "columns": 40, diff --git a/artifacts/verification/w6/raw/transcript-keyboard.cast b/artifacts/verification/w6/raw/transcript-keyboard.cast index 65d7ff62..e4a4c22f 100644 --- a/artifacts/verification/w6/raw/transcript-keyboard.cast +++ b/artifacts/verification/w6/raw/transcript-keyboard.cast @@ -1,63 +1,72 @@ -{"version":2,"width":80,"height":24,"timestamp":1787959790,"duration":1.825351,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} -[0.320897,"o","\u001b[?2004h"] -[0.320988,"o","\u001b[>7u\u001b[?u\u001b[c\u001b[?1049h\u001b[2J\u001b[H"] -[0.321008,"o","\u001b[?25l"] -[0.332226,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.332275,"o","\u001b[3A\u001b[2G\u001b[?25l"] -[0.351184,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] -[0.354647,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.354667,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.36202,"i","keyboard-flow-01"] -[0.362075,"i","\r"] -[0.366564,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-01\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.36764,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.405762,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.462212,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.54403,"i","keyboard-flow-02"] -[0.544117,"i","\r"] -[0.549183,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.551249,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.56813,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.623498,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.705244,"i","keyboard-flow-03"] -[0.705317,"i","\r"] -[0.709034,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.711199,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.727868,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.787604,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.866472,"i","keyboard-flow-04"] -[0.866546,"i","\r"] -[0.869661,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.872198,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.888421,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.952827,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.046881,"i","keyboard-flow-05"] -[1.04694,"i","\r"] -[1.051673,"o","\u001b[15G\u001b[?25l"] -[1.068093,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.130418,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.20737,"i","keyboard-flow-06"] -[1.207449,"i","\r"] -[1.210871,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.213368,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.230251,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.292664,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.368684,"i","keyboard-flow-07"] -[1.368771,"i","\r"] -[1.371163,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-07\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.373713,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.393254,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.455546,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.549502,"i","keyboard-flow-08"] -[1.549615,"i","\r"] -[1.552955,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.556006,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.574564,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia not connected\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.640419,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.731376,"i","\u001b[5~"] -[1.731459,"i","\u001b[1;3H"] -[1.734862,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.811805,"i","\u001b[6~"] -[1.811879,"i","\u001b[1;3F"] -[1.815351,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.825351,"o","\u001b[0m"] +{"version":2,"width":80,"height":24,"timestamp":1787976941,"duration":1.803897,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} +[0.336361,"o","\u001b[?2004h"] +[0.33647,"o","\u001b[>7u\u001b[?u\u001b[c\u001b[?1049h"] +[0.336484,"o","\u001b[2J\u001b[H"] +[0.336494,"o","\u001b[?25l"] +[0.345574,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.34561,"o","\u001b[3A\u001b[2G\u001b[?25l"] +[0.361923,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] +[0.364416,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.364425,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.381826,"i","keyboard-flow-01"] +[0.381903,"i","\r"] +[0.386823,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-01\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.396383,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.420324,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.485552,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.562383,"i","keyboard-flow-02"] +[0.562478,"i","\r"] +[0.566174,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.567498,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.567518,"o","\u001b[15G\u001b[?25l"] +[0.583392,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.583419,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[0.634631,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.723599,"i","keyboard-flow-03"] +[0.723671,"i","\r"] +[0.725579,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.727043,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.727053,"o","\u001b[15G\u001b[?25l"] +[0.742938,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.797576,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.797616,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.884302,"i","keyboard-flow-04"] +[0.884388,"i","\r"] +[0.888006,"o","\u001b[15G\u001b[?25l"] +[0.903903,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.957937,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.04468,"i","keyboard-flow-05"] +[1.044755,"i","\r"] +[1.046508,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-05\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.048203,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.064658,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.12084,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.206673,"i","keyboard-flow-06"] +[1.206746,"i","\r"] +[1.208552,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.210413,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.210423,"o","\u001b[15G\u001b[?25l"] +[1.226899,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.285617,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.368618,"i","keyboard-flow-07"] +[1.368719,"i","\r"] +[1.372884,"o","\u001b[15G"] +[1.372933,"o","\u001b[?25l"] +[1.392959,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.456956,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.548916,"i","keyboard-flow-08"] +[1.549012,"i","\r"] +[1.551159,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.553914,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.55393,"o","\u001b[15G\u001b[?25l"] +[1.57056,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.570586,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[1.633073,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.71075,"i","\u001b[5~"] +[1.710848,"i","\u001b[1;3H"] +[1.713959,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.790684,"i","\u001b[6~"] +[1.790767,"i","\u001b[1;3F"] +[1.793863,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.793897,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[1.803897,"o","\u001b[0m"] diff --git a/artifacts/verification/w6/states/active-streaming.json b/artifacts/verification/w6/states/active-streaming.json index d4c97c65..bd9e7ad1 100644 --- a/artifacts/verification/w6/states/active-streaming.json +++ b/artifacts/verification/w6/states/active-streaming.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 5, - "frame": " › W6 active streaming\n\n working…\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n────────────────────────────────────────────────────────────────────────────────\n› queue #1\n\n\n─────────────────── type / for commands · Alt+Enter · paste ────────────────────\nprofile Braid starter · pi · via not connected Ctrl+C cancel\n", + "frame": " › W6 active streaming\n\n working…\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n────────────────────────────────────────────────────────────────────────────────\n› queue #1\n\n\n─────────────────── type / for commands · Alt+Enter · paste ────────────────────\nprofile Braid starter · pi · via local Ctrl+C cancel\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -320,7 +320,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-28T23:29:28.917Z", + "occurredAt": "2026-08-29T04:15:19.660Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -697,10 +697,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-21a5cfb954eabf6c97d3d061", + "id": "effect-op-terminal-000002-45de610136272ea261191af6", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "21a5cfb954eabf6c97d3d06170a1bae5789f7c6759f3f7d8e6a16440358b6805", + "requestDigest": "45de610136272ea261191af643c9dd3b12914e873e83e8b680df5b1fe3e76aea", "kind": "send", "status": "pending", "attempt": 1, @@ -719,13 +719,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-28T23:29:28.917Z", + "occurredAt": "2026-08-29T04:15:19.660Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-233466b8-b149-46a5-a7d6-eb418bf44422", + "id": "turn-d8490564-4935-4979-ba99-140f6bdcf903", "intent": "W6 active streaming", "metadata": { "identity": { @@ -735,11 +735,11 @@ } }, "session": { - "id": "982719fe-28b6-4b2f-acf8-910c6927fbae", + "id": "3a6fd1ce-c86b-465e-88ad-c030ddbec98d", "backend": "executor", "status": "active", - "createdAt": "2026-08-28T23:29:28.917Z", - "updatedAt": "2026-08-28T23:29:28.917Z", + "createdAt": "2026-08-29T04:15:19.660Z", + "updatedAt": "2026-08-29T04:15:19.660Z", "metadata": "[unavailable]" }, "backend": "router", @@ -761,16 +761,16 @@ }, "execution": { "kind": "request", - "id": "turn-233466b8-b149-46a5-a7d6-eb418bf44422" + "id": "turn-d8490564-4935-4979-ba99-140f6bdcf903" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-233466b8-b149-46a5-a7d6-eb418bf44422:attempt:7600ea2e-d7fe-48fd-9436-bd05cc341094", - "materializationReceiptDigest": "sha256:3c34ecf4d56c81b3581a736aedc85c682a865fc5867031bd20cf99bf925a4742", - "bindingDigest": "sha256:71f5702ace44c44d5db0970b3a6b7603d9194b65c5f7893a6fc9f3fc5678551d", + "attemptId": "turn-d8490564-4935-4979-ba99-140f6bdcf903:attempt:74db3162-d771-425f-870f-e3ff90ccde34", + "materializationReceiptDigest": "sha256:195e92e6febf86c70504edfb0327cf82a9a9be8bb902113992f254a48deaa9c0", + "bindingDigest": "sha256:c2c0fcc9d684c3d83693ed84679af33065bbdda1bd8fa5f81327f9329b89a784", "descriptor": { "kind": "router-request", "transport": "http", @@ -782,10 +782,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-28T23:29:28.915Z" + "startedAt": "2026-08-29T04:15:19.657Z" } }, - "timestamp": "2026-08-28T23:29:28.917Z" + "timestamp": "2026-08-29T04:15:19.660Z" } } } diff --git a/artifacts/verification/w6/states/active-streaming.png b/artifacts/verification/w6/states/active-streaming.png index 95d02a004ca135215d5900cf1bbc046ab073dc83..70a692d754d995e1c633d3906c6735aa6df78af4 100644 GIT binary patch literal 15091 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 SG6}o_sjKKbD^q^?;r{@^{)^oJ literal 15309 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 diff --git a/artifacts/verification/w6/states/active-streaming.txt b/artifacts/verification/w6/states/active-streaming.txt index 8c2397d7..f848296c 100644 --- a/artifacts/verification/w6/states/active-streaming.txt +++ b/artifacts/verification/w6/states/active-streaming.txt @@ -21,4 +21,4 @@ ─────────────────── type / for commands · Alt+Enter · paste ──────────────────── -profile Braid starter · pi · via not connected Ctrl+C cancel +profile Braid starter · pi · via local Ctrl+C cancel diff --git a/artifacts/verification/w6/states/analysis.json b/artifacts/verification/w6/states/analysis.json index 1e6ac416..07a9d0ca 100644 --- a/artifacts/verification/w6/states/analysis.json +++ b/artifacts/verification/w6/states/analysis.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/analysis.png b/artifacts/verification/w6/states/analysis.png index c5412a6d6b34b95c0d9a80b5e3aae6827fa61aad..2a95f0afe38c700fedde90ff85e138b4ac579540 100644 GIT binary patch delta 21 dcmbPwf_dr*<_TFGvMl@xLEjI_Y%E&*7yw$Q2;%?% delta 21 dcmbPwf_dr*<_TFGGUBqDUzrQkHx?~^3;hhY9#UabW&)27T{_@7687crmO$QkO delta 19 acmeD3>hhY9#UUduD{hjM+q1D~h6(^bHwJ(J diff --git a/artifacts/verification/w6/states/command-palette-80.json b/artifacts/verification/w6/states/command-palette-80.json index 8b3623be..0f1df50e 100644 --- a/artifacts/verification/w6/states/command-palette-80.json +++ b/artifacts/verification/w6/states/command-palette-80.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/command-palette-80.png b/artifacts/verification/w6/states/command-palette-80.png index f5f9cf4159d8a4898befdec8052530524998e3aa..aaedb28c639839a60f8da2a671df34eeb81edc4f 100644 GIT binary patch delta 21 dcmX>znd!`ArU_XbvMl`kKh^%bZY+xG1OQue2yFlW delta 21 dcmX>znd!`ArU_XbGUBq5mv1?AZ!C)H1OQ#W2&@1A diff --git a/artifacts/verification/w6/states/comparison.json b/artifacts/verification/w6/states/comparison.json index 6c4e4996..24ab1c54 100644 --- a/artifacts/verification/w6/states/comparison.json +++ b/artifacts/verification/w6/states/comparison.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/comparison.png b/artifacts/verification/w6/states/comparison.png index 0340989affd2ab683d06f279b9861450428abaf9..0893ada1b42752b0ab311eaa43ba42bdffd32c4c 100644 GIT binary patch delta 21 dcmeDC#oYIcc|sP4EDOKVo}Y^iHWtnK0{~<739bMD delta 21 ccmeDC#oYIcc|sP4jJT|}G_N4{#-cfY09Ez}lK=n! diff --git a/artifacts/verification/w6/states/empty.json b/artifacts/verification/w6/states/empty.json index cdd87606..2839d614 100644 --- a/artifacts/verification/w6/states/empty.json +++ b/artifacts/verification/w6/states/empty.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/empty.png b/artifacts/verification/w6/states/empty.png index bd6d11fe513d7eadec25f9172feed2f9c951fea0..30198012785176a92ef6f63efad12ea4f85fa2e6 100644 GIT binary patch delta 21 ccmbQHJ56^(Av1?83%~GN^~GG9E16}50Z5Yu761SM delta 21 dcmbQHJ56^(Av1@JxU9_L4O>_?S2D{A0{~2428jRw diff --git a/artifacts/verification/w6/states/failure-or-reconnect.json b/artifacts/verification/w6/states/failure-or-reconnect.json index 7caf9e41..48a0e486 100644 --- a/artifacts/verification/w6/states/failure-or-reconnect.json +++ b/artifacts/verification/w6/states/failure-or-reconnect.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, @@ -336,7 +336,7 @@ "title": "event backend_start", "status": "failed", "detail": "sequence 1", - "occurredAt": "2026-08-28T23:29:47.355Z", + "occurredAt": "2026-08-29T04:15:38.014Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -348,7 +348,7 @@ "title": "error", "status": "failed", "detail": "RUNTIME_BACKEND_ERROR", - "occurredAt": "2026-08-28T23:29:47.361Z", + "occurredAt": "2026-08-29T04:15:38.019Z", "sourceEventId": "run-000001:runtime:2", "runId": "run-000001", "entityType": "run", @@ -725,10 +725,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-2af333447995b080ba597cd3", + "id": "effect-op-terminal-000002-fba170922d6cd2f9b6496912", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "2af333447995b080ba597cd3e8554c498d83dd433017a3bc6a7917e9ad7a705f", + "requestDigest": "fba170922d6cd2f9b6496912e7ad24d1c69c1b92ac671f88f8d2487e01e721d8", "kind": "send", "status": "pending", "attempt": 1, @@ -747,13 +747,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-28T23:29:47.355Z", + "occurredAt": "2026-08-29T04:15:38.014Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-c2a1629b-efaf-449e-a76e-098919894407", + "id": "turn-6a468be9-cb03-47de-b96b-41b1151e2889", "intent": "W6 failure state", "metadata": { "identity": { @@ -763,11 +763,11 @@ } }, "session": { - "id": "9295b0e0-bf2d-46fa-8a6a-f33255abff95", + "id": "55a133d5-b560-4442-a1c2-6b9946fe482a", "backend": "executor", "status": "active", - "createdAt": "2026-08-28T23:29:47.355Z", - "updatedAt": "2026-08-28T23:29:47.355Z", + "createdAt": "2026-08-29T04:15:38.014Z", + "updatedAt": "2026-08-29T04:15:38.014Z", "metadata": "[unavailable]" }, "backend": "router", @@ -789,16 +789,16 @@ }, "execution": { "kind": "request", - "id": "turn-c2a1629b-efaf-449e-a76e-098919894407" + "id": "turn-6a468be9-cb03-47de-b96b-41b1151e2889" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-c2a1629b-efaf-449e-a76e-098919894407:attempt:564e9b25-1802-4f52-b8ef-49a13c359798", - "materializationReceiptDigest": "sha256:30fc6237bb9437013c6934721b3c510eaa645d9e66ef72337311588774d00aed", - "bindingDigest": "sha256:54f44b56afcc77f5cd8ea6370bec3f0dff165f7c48edd7b2bc5b79a5993c3473", + "attemptId": "turn-6a468be9-cb03-47de-b96b-41b1151e2889:attempt:772a55da-87d6-4d00-bd33-d6ea72398ec4", + "materializationReceiptDigest": "sha256:be162e6f7e446df440f167a30d05cdfce67d6f4b476ccb912e48265a474404e3", + "bindingDigest": "sha256:68e0b31252f2fc9e6a9103f34f9486c9ceecae1b411386be5e3fecbcf47dfe72", "descriptor": { "kind": "router-request", "transport": "http", @@ -810,10 +810,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-28T23:29:47.352Z" + "startedAt": "2026-08-29T04:15:38.012Z" } }, - "timestamp": "2026-08-28T23:29:47.355Z" + "timestamp": "2026-08-29T04:15:38.014Z" } } }, @@ -826,7 +826,7 @@ "source": { "eventId": "run-000001:runtime:2", "providerSequence": 2, - "occurredAt": "2026-08-28T23:29:47.361Z", + "occurredAt": "2026-08-29T04:15:38.019Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "error": { @@ -845,7 +845,7 @@ "source": { "eventId": "run-000001:runtime:3", "providerSequence": 3, - "occurredAt": "2026-08-28T23:29:47.365Z", + "occurredAt": "2026-08-29T04:15:38.022Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "status": "failed", @@ -869,10 +869,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-2af333447995b080ba597cd3", + "id": "effect-op-terminal-000002-fba170922d6cd2f9b6496912", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "2af333447995b080ba597cd3e8554c498d83dd433017a3bc6a7917e9ad7a705f", + "requestDigest": "fba170922d6cd2f9b6496912e7ad24d1c69c1b92ac671f88f8d2487e01e721d8", "kind": "send", "status": "failed", "attempt": 1, diff --git a/artifacts/verification/w6/states/failure-or-reconnect.png b/artifacts/verification/w6/states/failure-or-reconnect.png index 34b2199e4130c0c9d79cfdf97cfdc200269cb9d2..8242e9ec36dac70d461033c73b4ba8ff55ffb1ab 100644 GIT binary patch delta 21 dcmaDfiSf}S#tB&*vMl^+yQidUZY=uX0RUY!2z>wm delta 21 dcmaDfiSf}S#tB&*GUBrOG6`3OHWq#G003H)2r2*o diff --git a/artifacts/verification/w6/states/fork-preview.json b/artifacts/verification/w6/states/fork-preview.json index 23971b28..2e01734f 100644 --- a/artifacts/verification/w6/states/fork-preview.json +++ b/artifacts/verification/w6/states/fork-preview.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/fork-preview.png b/artifacts/verification/w6/states/fork-preview.png index eca6ed880b9078c02a2a835830829b96967e1ce2..9ea6d59cbb9d05636db1a2cfc8df587a352cacf2 100644 GIT binary patch delta 21 ccmbQ{JI!~45i^G@3%@Ma{65~zR?IQV07RVyv;Y7A delta 21 ccmbQ{JI!~45i^I3xU5?0p4@Glt(aq!0Zozy-2eap diff --git a/artifacts/verification/w6/states/graph-or-analysis.json b/artifacts/verification/w6/states/graph-or-analysis.json index 6de0c13c..9958b9de 100644 --- a/artifacts/verification/w6/states/graph-or-analysis.json +++ b/artifacts/verification/w6/states/graph-or-analysis.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/graph-or-analysis.png b/artifacts/verification/w6/states/graph-or-analysis.png index 8ddfa57639e9ec93498b40b164cdb1a1fc44afdd..d057555ad332a6f88da14aa75236629e65e4f54d 100644 GIT binary patch delta 21 dcmZ3uka6Kc#tB&*vMl`aPbR)s+*qU^0039}2mb&7 delta 21 dcmZ3uka6Kc#tB&*GUBotO)L%@Hx}s!002>F2O0nX diff --git a/artifacts/verification/w6/states/interaction.json b/artifacts/verification/w6/states/interaction.json index dbfb3bd3..0ebb3e57 100644 --- a/artifacts/verification/w6/states/interaction.json +++ b/artifacts/verification/w6/states/interaction.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/interaction.png b/artifacts/verification/w6/states/interaction.png index f005a67e7b3e5621cb760a9ab7f93f86ee5cef7a..ec742a89bf7e682ecb8e32e8dba6fcaea971636b 100644 GIT binary patch delta 21 dcmbR8ka5aG#tB&*vMl^kQ+`XY+gPMj003P`2u1(^ delta 21 dcmbR8ka5aG#tB&*GUBqzqSt0xZY)wN003H=2h;!n diff --git a/artifacts/verification/w6/states/multi-run.json b/artifacts/verification/w6/states/multi-run.json index e4a965b6..a35641e5 100644 --- a/artifacts/verification/w6/states/multi-run.json +++ b/artifacts/verification/w6/states/multi-run.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, @@ -29,18 +29,18 @@ } }, "capturePhase": "atomic-signal-frame", - "captureRevision": 12, - "frame": " › parallel run B\n\n working…\n\n\n\n\n\n\n\n\n\n\n\n\n\n────────────────────────────────────────────────────────────────────────────────\n› queue #1\n\n\n─────────────────── type / for commands · Alt+Enter · paste ────────────────────\nprofile Braid starter · pi · via not connected Ctrl+C cancel\nfocus branch-1 · running · pi/fixture/deterministic actions switch/cancel\nwork branch-623aa83c34…af629727 · running actions switch/cancel\n", + "captureRevision": 13, + "frame": " › parallel run B\n\n working…\n\n\n\n\n\n\n\n\n\n\n\n\n\n────────────────────────────────────────────────────────────────────────────────\n› queue #1\n\n\n─────────────────── type / for commands · Alt+Enter · paste ────────────────────\nprofile Braid starter · pi · via local Ctrl+C cancel\nfocus Parallel run A · running · pi/fixture/deterministic actions switch/cancel\nwork Parallel run B · running · pi/fixture/deterministic actions switch/cancel\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", "state": { "schemaVersion": 2, - "revision": 12, - "sequence": 12, + "revision": 13, + "sequence": 13, "workspace": "/home/drew/code/.worktrees/braid-10-complete", - "conversationId": "conversation-623aa83c342b79cfdbe81474af629727", - "branchId": "branch-623aa83c342b79cfdbe81474af629727", + "conversationId": "conversation-9a119371c39642360c09b1815ce5e788", + "branchId": "branch-9a119371c39642360c09b1815ce5e788", "conversations": [ { "id": "conv-1", @@ -50,9 +50,16 @@ "updatedAt": "2026-08-01T00:00:00.000Z" }, { - "id": "conversation-623aa83c342b79cfdbe81474af629727", + "id": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d", + "title": "Parallel run A", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", + "archived": false, + "updatedAt": "2026-08-01T00:00:00.000Z" + }, + { + "id": "conversation-9a119371c39642360c09b1815ce5e788", "title": "Parallel run B", - "branchId": "branch-623aa83c342b79cfdbe81474af629727", + "branchId": "branch-9a119371c39642360c09b1815ce5e788", "archived": false, "updatedAt": "2026-08-01T00:00:00.000Z" } @@ -103,7 +110,7 @@ { "id": "run-000001", "turnId": "turn-000002", - "operationId": "op-terminal-000002", + "operationId": "op-terminal-000003", "status": "streaming", "startedAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z", @@ -122,7 +129,7 @@ { "id": "run-000005", "turnId": "turn-000006", - "operationId": "op-terminal-000006", + "operationId": "op-terminal-000007", "status": "streaming", "startedAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z", @@ -189,19 +196,19 @@ "activeRuns": [ { "runId": "run-000001", - "conversationId": "conv-1", - "branchId": "branch-1" + "conversationId": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d" }, { "runId": "run-000005", - "conversationId": "conversation-623aa83c342b79cfdbe81474af629727", - "branchId": "branch-623aa83c342b79cfdbe81474af629727" + "conversationId": "conversation-9a119371c39642360c09b1815ce5e788", + "branchId": "branch-9a119371c39642360c09b1815ce5e788" } ], "lastError": null }, "view": { - "revision": 12, + "revision": 13, "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", @@ -210,7 +217,7 @@ "effort": "none", "runOverrides": {}, "connection": "deterministic fixture", - "conversationId": "conversation-623aa83c342b79cfdbe81474af629727", + "conversationId": "conversation-9a119371c39642360c09b1815ce5e788", "conversationTitle": "Parallel run B", "conversations": [ { @@ -222,15 +229,23 @@ "updatedAt": "2026-08-01T00:00:00.000Z" }, { - "id": "conversation-623aa83c342b79cfdbe81474af629727", + "id": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d", + "title": "Parallel run A", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", + "archived": false, + "active": false, + "updatedAt": "2026-08-01T00:00:00.000Z" + }, + { + "id": "conversation-9a119371c39642360c09b1815ce5e788", "title": "Parallel run B", - "branchId": "branch-623aa83c342b79cfdbe81474af629727", + "branchId": "branch-9a119371c39642360c09b1815ce5e788", "archived": false, "active": true, "updatedAt": "2026-08-01T00:00:00.000Z" } ], - "branch": "branch-623aa83c342b79cfdbe81474af629727", + "branch": "branch-9a119371c39642360c09b1815ce5e788", "status": "running", "statusText": "Opened Parallel run B", "queueCount": 0, @@ -264,9 +279,9 @@ { "id": "run-000001", "turnId": "turn-000002", - "conversationId": "conv-1", - "branchId": "branch-1", - "operationId": "op-terminal-000002", + "conversationId": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", + "operationId": "op-terminal-000003", "status": "running", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", @@ -286,9 +301,9 @@ { "id": "run-000005", "turnId": "turn-000006", - "conversationId": "conversation-623aa83c342b79cfdbe81474af629727", - "branchId": "branch-623aa83c342b79cfdbe81474af629727", - "operationId": "op-terminal-000006", + "conversationId": "conversation-9a119371c39642360c09b1815ce5e788", + "branchId": "branch-9a119371c39642360c09b1815ce5e788", + "operationId": "op-terminal-000007", "status": "running", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", @@ -355,8 +370,9 @@ { "id": "run-000001", "runId": "run-000001", - "conversationId": "conv-1", - "branchId": "branch-1", + "conversationId": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", + "label": "Parallel run A", "state": "running", "runner": "pi", "model": "fixture/deterministic", @@ -372,8 +388,9 @@ { "id": "run-000005", "runId": "run-000005", - "conversationId": "conversation-623aa83c342b79cfdbe81474af629727", - "branchId": "branch-623aa83c342b79cfdbe81474af629727", + "conversationId": "conversation-9a119371c39642360c09b1815ce5e788", + "branchId": "branch-9a119371c39642360c09b1815ce5e788", + "label": "Parallel run B", "state": "running", "runner": "pi", "model": "fixture/deterministic", @@ -439,7 +456,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-28T23:29:30.634Z", + "occurredAt": "2026-08-29T04:15:21.460Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -451,7 +468,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-28T23:29:30.769Z", + "occurredAt": "2026-08-29T04:15:21.592Z", "sourceEventId": "run-000005:runtime:1", "runId": "run-000005", "entityType": "run", @@ -469,7 +486,7 @@ "startedAt": "2026-08-01T00:00:00.000Z" }, { - "id": "conversation-623aa83c342b79cfdbe81474af629727", + "id": "conversation-9a119371c39642360c09b1815ce5e788", "type": "conversation", "title": "Parallel run B", "status": "complete", @@ -477,6 +494,15 @@ "edgeLabel": "attached", "startedAt": "2026-08-01T00:00:00.000Z" }, + { + "id": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d", + "type": "conversation", + "title": "Parallel run A", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-01T00:00:00.000Z" + }, { "id": "branch-1", "type": "branch", @@ -490,14 +516,26 @@ "startedAt": "2026-08-01T00:00:00.000Z" }, { - "id": "branch-623aa83c342b79cfdbe81474af629727", + "id": "branch-9a119371c39642360c09b1815ce5e788", "type": "branch", "title": "Main", "status": "complete", "depth": 1, "edgeLabel": "attached", "parentIds": [ - "conversation:conversation-623aa83c342b79cfdbe81474af629727" + "conversation:conversation-9a119371c39642360c09b1815ce5e788" + ], + "startedAt": "2026-08-01T00:00:00.000Z" + }, + { + "id": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conversation-eca55dcb13e97865b3c0d3e7fdacfc9d" ], "startedAt": "2026-08-01T00:00:00.000Z" }, @@ -509,7 +547,7 @@ "depth": 2, "edgeLabel": "continued", "parentIds": [ - "branch:branch-1" + "branch:branch-eca55dcb13e97865b3c0d3e7fdacfc9d" ], "startedAt": "2026-08-01T00:00:00.000Z" }, @@ -521,7 +559,7 @@ "depth": 2, "edgeLabel": "continued", "parentIds": [ - "branch:branch-623aa83c342b79cfdbe81474af629727" + "branch:branch-9a119371c39642360c09b1815ce5e788" ], "startedAt": "2026-08-01T00:00:00.000Z" }, @@ -770,24 +808,133 @@ { "sequence": 2, "revision": 2, + "kind": "conversation.created", + "payload": { + "value": { + "kind": "conversation.created", + "conversation": { + "id": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d", + "workspaceId": "workspace-348f516c21ce5b4b7b7591b59b1ceb82", + "title": "Parallel run A", + "activeBranchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", + "createdAt": "2026-08-01T00:00:00.000Z", + "updatedAt": "2026-08-01T00:00:00.000Z", + "archived": false, + "retention": {} + }, + "branch": { + "id": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", + "conversationId": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d", + "overrides": {}, + "draftId": "draft-eca55dcb13e97865b3c0d3e7fdacfc9d", + "queueId": "queue-eca55dcb13e97865b3c0d3e7fdacfc9d", + "status": "active", + "createdAt": "2026-08-01T00:00:00.000Z", + "updatedAt": "2026-08-01T00:00:00.000Z" + }, + "draft": { + "id": "draft-eca55dcb13e97865b3c0d3e7fdacfc9d", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", + "text": "", + "updatedAt": "2026-08-01T00:00:00.000Z" + }, + "queue": { + "id": "queue-eca55dcb13e97865b3c0d3e7fdacfc9d", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", + "entryIds": [], + "createdAt": "2026-08-01T00:00:00.000Z", + "updatedAt": "2026-08-01T00:00:00.000Z" + }, + "graphNodes": [ + { + "id": "node-2cf9eb0e5b621d770007b4d94b1da232", + "reference": { + "kind": "workspace", + "id": "workspace-348f516c21ce5b4b7b7591b59b1ceb82" + }, + "createdAt": "2026-08-01T00:00:00.000Z", + "updatedAt": "2026-08-01T00:00:00.000Z" + }, + { + "id": "node-1aa9a629a2e07f36710f18b02fc5e06a", + "reference": { + "kind": "conversation", + "id": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d" + }, + "title": "Parallel run A", + "createdAt": "2026-08-01T00:00:00.000Z", + "updatedAt": "2026-08-01T00:00:00.000Z" + }, + { + "id": "node-ec2900c174c34db40d84754174be2451", + "reference": { + "kind": "branch", + "id": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d" + }, + "title": "Main", + "createdAt": "2026-08-01T00:00:00.000Z", + "updatedAt": "2026-08-01T00:00:00.000Z" + } + ], + "graphEdges": [ + { + "id": "edge-8ffc3e06b43fb2a38399b40ee3fc7ce7", + "kind": "attached", + "source": "node-2cf9eb0e5b621d770007b4d94b1da232", + "destination": "node-1aa9a629a2e07f36710f18b02fc5e06a", + "provenance": { + "operationId": "op-terminal-000001" + }, + "createdAt": "2026-08-01T00:00:00.000Z" + }, + { + "id": "edge-c2f31264abae8b0540eb7bfe03f65c1b", + "kind": "attached", + "source": "node-1aa9a629a2e07f36710f18b02fc5e06a", + "destination": "node-ec2900c174c34db40d84754174be2451", + "provenance": { + "operationId": "op-terminal-000001" + }, + "createdAt": "2026-08-01T00:00:00.000Z" + } + ], + "operation": { + "id": "op-terminal-000001", + "kind": "conversation-create", + "requestDigest": "7a75bfce18a117f13bc21bf68e0bcc60064c6e31a756ebf2cfc4251870ab2065", + "status": "acknowledged", + "target": { + "kind": "conversation", + "id": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d" + }, + "createdAt": "2026-08-01T00:00:00.000Z", + "updatedAt": "2026-08-01T00:00:00.000Z", + "acknowledgedAt": "2026-08-01T00:00:00.000Z" + } + } + } + }, + { + "sequence": 3, + "revision": 3, "kind": "draft.recorded", "payload": { "value": { "kind": "draft.recorded", "draft": { - "id": "draft-branch-1", - "branchId": "branch-1", + "id": "draft-eca55dcb13e97865b3c0d3e7fdacfc9d", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", "text": "parallel run A", "updatedAt": "2026-08-01T00:00:00.000Z" }, "operation": { - "id": "op-terminal-000001", + "id": "op-terminal-000002", "kind": "draft-update", - "requestDigest": "2b70cd41971f5975d2a77f74b949b7f89f969524c2f9d1b783a41e256cdbaa74", + "requestDigest": "cb4603a670e4f803b2255a4089f8a300a08928e72010efb4c05fe6fb3e095433", "status": "acknowledged", "target": { "kind": "branch", - "id": "branch-1" + "id": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d" }, "createdAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z", @@ -797,8 +944,8 @@ } }, { - "sequence": 3, - "revision": 3, + "sequence": 4, + "revision": 4, "kind": "run.requested", "payload": { "runId": "run-000001", @@ -807,9 +954,9 @@ "version": 1, "runId": "run-000001", "turnId": "turn-000002", - "operationId": "op-terminal-000002", - "conversationId": "conv-1", - "branchId": "branch-1", + "operationId": "op-terminal-000003", + "conversationId": "conversation-eca55dcb13e97865b3c0d3e7fdacfc9d", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", "admittedAt": "2026-08-01T00:00:00.000Z", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "requested": { @@ -859,26 +1006,26 @@ "provider": "agent-runtime" }, "admissionStatus": "admitted", - "requestDigest": "bf7485ad9b99163e1eec1403d698d67f3f50674339f594a18f35743130d6c111", + "requestDigest": "50405c1bb0c466e5f5132cbb783d2ad0652ba8e3b50e9b02af403e54b7644d18", "capabilitiesDigest": "93c4c21593f9e2fa1fe68ce73da84f48c173f1e13269633678b512a16a81a001", "materializationDigest": "46c7162244a3aa789bd2703e2805a3faa0da1a87d83d97484fa26294a0b00671", - "digest": "77286fd674a5469650641eb72019947850ba458ad7bdb6ecc29c8264e9d0cacc" + "digest": "9e5c8a7466a8d26f2757db1415d6816db3b58a146a132cbb42ce46388a1e16ba" }, "status": "admitted" } }, { - "sequence": 4, - "revision": 4, + "sequence": 5, + "revision": 5, "kind": "effect.upserted", "payload": { "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-37d43d9c775c1f774aa1d066", - "operationId": "op-terminal-000002", + "id": "effect-op-terminal-000003-d174dbb8e2383475eab353d3", + "operationId": "op-terminal-000003", "effectKind": "run.execute", - "requestDigest": "37d43d9c775c1f774aa1d06674f9efdc09da7743c68a1122810c87ec0589853a", + "requestDigest": "d174dbb8e2383475eab353d34da3a1426d2180170776443b2899b3595e213c4e", "kind": "send", "status": "pending", "attempt": 1, @@ -889,21 +1036,21 @@ } }, { - "sequence": 5, - "revision": 5, + "sequence": 6, + "revision": 6, "kind": "run.provider.event", "payload": { "runId": "run-000001", "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-28T23:29:30.634Z", + "occurredAt": "2026-08-29T04:15:21.460Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-0a94a1e7-925a-4e2d-93cc-78ad591dc2c5", + "id": "turn-028ef0ae-3cdd-4c34-99d0-b983efb529c8", "intent": "parallel run A", "metadata": { "identity": { @@ -913,11 +1060,11 @@ } }, "session": { - "id": "f8e13592-ea90-4178-9460-efa2b20b8e59", + "id": "d20e6806-ad36-415b-9828-1b49b09fb5e8", "backend": "executor", "status": "active", - "createdAt": "2026-08-28T23:29:30.634Z", - "updatedAt": "2026-08-28T23:29:30.634Z", + "createdAt": "2026-08-29T04:15:21.460Z", + "updatedAt": "2026-08-29T04:15:21.460Z", "metadata": "[unavailable]" }, "backend": "router", @@ -939,16 +1086,16 @@ }, "execution": { "kind": "request", - "id": "turn-0a94a1e7-925a-4e2d-93cc-78ad591dc2c5" + "id": "turn-028ef0ae-3cdd-4c34-99d0-b983efb529c8" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-0a94a1e7-925a-4e2d-93cc-78ad591dc2c5:attempt:d7513b00-52c3-49ca-84ca-9d3d03be3b41", - "materializationReceiptDigest": "sha256:325489a984aa84c8f120cf9e7427677374dc00020c1334a42afedf9c483f77b7", - "bindingDigest": "sha256:fbcd91188d379a9849b934aad227fcc679c8ba7021fd6c484884a6beb7d54675", + "attemptId": "turn-028ef0ae-3cdd-4c34-99d0-b983efb529c8:attempt:454171f4-cadb-420a-b665-9de034350015", + "materializationReceiptDigest": "sha256:b93b8fc11a0470674a3a68a6a037023beda2d92150578489bc88fe306f8d1225", + "bindingDigest": "sha256:2247d4612ce7678ad0365258e93e346ca66de599b67abf376a85ffb532317ddf", "descriptor": { "kind": "router-request", "transport": "http", @@ -960,34 +1107,34 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-28T23:29:30.632Z" + "startedAt": "2026-08-29T04:15:21.458Z" } }, - "timestamp": "2026-08-28T23:29:30.634Z" + "timestamp": "2026-08-29T04:15:21.460Z" } } }, { - "sequence": 6, - "revision": 6, + "sequence": 7, + "revision": 7, "kind": "draft.recorded", "payload": { "value": { "kind": "draft.recorded", "draft": { - "id": "draft-branch-1", - "branchId": "branch-1", + "id": "draft-eca55dcb13e97865b3c0d3e7fdacfc9d", + "branchId": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d", "text": "", "updatedAt": "2026-08-01T00:00:00.000Z" }, "operation": { - "id": "op-terminal-000003", + "id": "op-terminal-000004", "kind": "draft-update", - "requestDigest": "5047a045e4c339a7598847f36d4f31a4192d5c2b83606eb77a3a146984803700", + "requestDigest": "16839e957bcd074eba38cbda37a681f30d6db5c4d04ca74467fbfbf26816f203", "status": "acknowledged", "target": { "kind": "branch", - "id": "branch-1" + "id": "branch-eca55dcb13e97865b3c0d3e7fdacfc9d" }, "createdAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z", @@ -997,41 +1144,41 @@ } }, { - "sequence": 7, - "revision": 7, + "sequence": 8, + "revision": 8, "kind": "conversation.created", "payload": { "value": { "kind": "conversation.created", "conversation": { - "id": "conversation-623aa83c342b79cfdbe81474af629727", + "id": "conversation-9a119371c39642360c09b1815ce5e788", "workspaceId": "workspace-348f516c21ce5b4b7b7591b59b1ceb82", "title": "Parallel run B", - "activeBranchId": "branch-623aa83c342b79cfdbe81474af629727", + "activeBranchId": "branch-9a119371c39642360c09b1815ce5e788", "createdAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z", "archived": false, "retention": {} }, "branch": { - "id": "branch-623aa83c342b79cfdbe81474af629727", - "conversationId": "conversation-623aa83c342b79cfdbe81474af629727", + "id": "branch-9a119371c39642360c09b1815ce5e788", + "conversationId": "conversation-9a119371c39642360c09b1815ce5e788", "overrides": {}, - "draftId": "draft-623aa83c342b79cfdbe81474af629727", - "queueId": "queue-623aa83c342b79cfdbe81474af629727", + "draftId": "draft-9a119371c39642360c09b1815ce5e788", + "queueId": "queue-9a119371c39642360c09b1815ce5e788", "status": "active", "createdAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z" }, "draft": { - "id": "draft-623aa83c342b79cfdbe81474af629727", - "branchId": "branch-623aa83c342b79cfdbe81474af629727", + "id": "draft-9a119371c39642360c09b1815ce5e788", + "branchId": "branch-9a119371c39642360c09b1815ce5e788", "text": "", "updatedAt": "2026-08-01T00:00:00.000Z" }, "queue": { - "id": "queue-623aa83c342b79cfdbe81474af629727", - "branchId": "branch-623aa83c342b79cfdbe81474af629727", + "id": "queue-9a119371c39642360c09b1815ce5e788", + "branchId": "branch-9a119371c39642360c09b1815ce5e788", "entryIds": [], "createdAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z" @@ -1047,20 +1194,20 @@ "updatedAt": "2026-08-01T00:00:00.000Z" }, { - "id": "node-c7dc2944472f67993dccf59a1533494a", + "id": "node-092b94696f8f3017cd1294b67cc5479c", "reference": { "kind": "conversation", - "id": "conversation-623aa83c342b79cfdbe81474af629727" + "id": "conversation-9a119371c39642360c09b1815ce5e788" }, "title": "Parallel run B", "createdAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z" }, { - "id": "node-7e208f0d2f25d2e063f8bd4a5a9c0ecc", + "id": "node-101d26d050e08c06e1c2cc2fe0e8f722", "reference": { "kind": "branch", - "id": "branch-623aa83c342b79cfdbe81474af629727" + "id": "branch-9a119371c39642360c09b1815ce5e788" }, "title": "Main", "createdAt": "2026-08-01T00:00:00.000Z", @@ -1069,34 +1216,34 @@ ], "graphEdges": [ { - "id": "edge-ada52748a5ea251d8955146e17605eb4", + "id": "edge-ea1106e2eafa7461b0fd52fd335a2d69", "kind": "attached", "source": "node-2cf9eb0e5b621d770007b4d94b1da232", - "destination": "node-c7dc2944472f67993dccf59a1533494a", + "destination": "node-092b94696f8f3017cd1294b67cc5479c", "provenance": { - "operationId": "op-terminal-000004" + "operationId": "op-terminal-000005" }, "createdAt": "2026-08-01T00:00:00.000Z" }, { - "id": "edge-80918d47423e09d76b3e214f9d6ac918", + "id": "edge-f58b991ec98b28a4310ccb8f973536ed", "kind": "attached", - "source": "node-c7dc2944472f67993dccf59a1533494a", - "destination": "node-7e208f0d2f25d2e063f8bd4a5a9c0ecc", + "source": "node-092b94696f8f3017cd1294b67cc5479c", + "destination": "node-101d26d050e08c06e1c2cc2fe0e8f722", "provenance": { - "operationId": "op-terminal-000004" + "operationId": "op-terminal-000005" }, "createdAt": "2026-08-01T00:00:00.000Z" } ], "operation": { - "id": "op-terminal-000004", + "id": "op-terminal-000005", "kind": "conversation-create", "requestDigest": "2155e7c1691fc72df8bd545c75a1c55eaa918faaa1597c9d73919ea6ef0f4584", "status": "acknowledged", "target": { "kind": "conversation", - "id": "conversation-623aa83c342b79cfdbe81474af629727" + "id": "conversation-9a119371c39642360c09b1815ce5e788" }, "createdAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z", @@ -1106,26 +1253,26 @@ } }, { - "sequence": 8, - "revision": 8, + "sequence": 9, + "revision": 9, "kind": "draft.recorded", "payload": { "value": { "kind": "draft.recorded", "draft": { - "id": "draft-623aa83c342b79cfdbe81474af629727", - "branchId": "branch-623aa83c342b79cfdbe81474af629727", + "id": "draft-9a119371c39642360c09b1815ce5e788", + "branchId": "branch-9a119371c39642360c09b1815ce5e788", "text": "parallel run B", "updatedAt": "2026-08-01T00:00:00.000Z" }, "operation": { - "id": "op-terminal-000005", + "id": "op-terminal-000006", "kind": "draft-update", - "requestDigest": "37807e5c9b56a85a4d2e3cd20968741c85c48fd8b369ca72c964287d37f48f97", + "requestDigest": "0a056d6246054b30a6b2bd89b52b050e3c2973203cb047f517df93ec9361e495", "status": "acknowledged", "target": { "kind": "branch", - "id": "branch-623aa83c342b79cfdbe81474af629727" + "id": "branch-9a119371c39642360c09b1815ce5e788" }, "createdAt": "2026-08-01T00:00:00.000Z", "updatedAt": "2026-08-01T00:00:00.000Z", @@ -1135,8 +1282,8 @@ } }, { - "sequence": 9, - "revision": 9, + "sequence": 10, + "revision": 10, "kind": "run.requested", "payload": { "runId": "run-000005", @@ -1145,9 +1292,9 @@ "version": 1, "runId": "run-000005", "turnId": "turn-000006", - "operationId": "op-terminal-000006", - "conversationId": "conversation-623aa83c342b79cfdbe81474af629727", - "branchId": "branch-623aa83c342b79cfdbe81474af629727", + "operationId": "op-terminal-000007", + "conversationId": "conversation-9a119371c39642360c09b1815ce5e788", + "branchId": "branch-9a119371c39642360c09b1815ce5e788", "admittedAt": "2026-08-01T00:00:00.000Z", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "requested": { @@ -1197,26 +1344,26 @@ "provider": "agent-runtime" }, "admissionStatus": "admitted", - "requestDigest": "3cf6bd581d84811e290b94649b419e520979cb14da5819161ebacb6bd382531d", + "requestDigest": "a902bdacce05f9def5cda3f16fe2bfbc5e99d62c829f2f7d758e66d8f7d036ff", "capabilitiesDigest": "93c4c21593f9e2fa1fe68ce73da84f48c173f1e13269633678b512a16a81a001", "materializationDigest": "46c7162244a3aa789bd2703e2805a3faa0da1a87d83d97484fa26294a0b00671", - "digest": "9b56d211ee2af762f698facf40df3fcdb201d276e95a08fb1edbfee5fdf4f722" + "digest": "7cb3a904fa472b4c2fbed92a7a9dfbba6e56d298958cad3d23eae1025e65e338" }, "status": "admitted" } }, { - "sequence": 10, - "revision": 10, + "sequence": 11, + "revision": 11, "kind": "effect.upserted", "payload": { "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000006-5dc5b8ff874d08d9243e39cb", - "operationId": "op-terminal-000006", + "id": "effect-op-terminal-000007-4a847a76b9a4d6290ed3a3a3", + "operationId": "op-terminal-000007", "effectKind": "run.execute", - "requestDigest": "5dc5b8ff874d08d9243e39cba683eecfe2cb59d2a2f3d81c8f5a816bc54dbb2a", + "requestDigest": "4a847a76b9a4d6290ed3a3a3befece5bdeae03b24de7737e689e85797d1a6c4d", "kind": "send", "status": "pending", "attempt": 1, @@ -1227,21 +1374,21 @@ } }, { - "sequence": 11, - "revision": 11, + "sequence": 12, + "revision": 12, "kind": "run.provider.event", "payload": { "runId": "run-000005", "source": { "eventId": "run-000005:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-28T23:29:30.769Z", + "occurredAt": "2026-08-29T04:15:21.592Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-a6148a7f-8a37-4d4e-b73b-1bbd0449e2a6", + "id": "turn-29c5c445-4178-48a8-a168-62f3eb7308cf", "intent": "parallel run B", "metadata": { "identity": { @@ -1251,11 +1398,11 @@ } }, "session": { - "id": "bc7d3183-528f-48c3-85b1-8118e809a27a", + "id": "b4160315-c375-4305-8a73-a6c9e31a0794", "backend": "executor", "status": "active", - "createdAt": "2026-08-28T23:29:30.769Z", - "updatedAt": "2026-08-28T23:29:30.769Z", + "createdAt": "2026-08-29T04:15:21.592Z", + "updatedAt": "2026-08-29T04:15:21.592Z", "metadata": "[unavailable]" }, "backend": "router", @@ -1277,16 +1424,16 @@ }, "execution": { "kind": "request", - "id": "turn-a6148a7f-8a37-4d4e-b73b-1bbd0449e2a6" + "id": "turn-29c5c445-4178-48a8-a168-62f3eb7308cf" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-a6148a7f-8a37-4d4e-b73b-1bbd0449e2a6:attempt:375dd622-b8a5-4590-8f4f-8106b6b15b16", - "materializationReceiptDigest": "sha256:720b904d1d7e16c02d86d7e0e13adce41cd750d6d9f3528339de3f1048f22024", - "bindingDigest": "sha256:4b27f327ac95d6417d1a0fb24d407bab74ba052ebbb400ef8011db43dda4c158", + "attemptId": "turn-29c5c445-4178-48a8-a168-62f3eb7308cf:attempt:be932c80-10e8-44d2-b9a0-46d56599159d", + "materializationReceiptDigest": "sha256:5c038e4a6a5dd351511bc01b00c7a39431d3d6e159d13de2a09c68e23ca7a22b", + "bindingDigest": "sha256:3d2a321da1932d051ccd9abaeae31bfc3c897930fea2fa00fbcf481aeb1f3e6f", "descriptor": { "kind": "router-request", "transport": "http", @@ -1298,16 +1445,16 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-28T23:29:30.768Z" + "startedAt": "2026-08-29T04:15:21.592Z" } }, - "timestamp": "2026-08-28T23:29:30.769Z" + "timestamp": "2026-08-29T04:15:21.592Z" } } }, { - "sequence": 12, - "revision": 12, + "sequence": 13, + "revision": 13, "kind": "run.focused", "payload": { "runId": "run-000001", diff --git a/artifacts/verification/w6/states/multi-run.png b/artifacts/verification/w6/states/multi-run.png index bea9c49d1ccc92850cf1e9c91518190ac8ba444c..7034b124535d0eb3e6ff7d29b49d76a377ee80f6 100644 GIT binary patch literal 24549 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 diff --git a/artifacts/verification/w6/states/multi-run.txt b/artifacts/verification/w6/states/multi-run.txt index 9977b608..b584e1f7 100644 --- a/artifacts/verification/w6/states/multi-run.txt +++ b/artifacts/verification/w6/states/multi-run.txt @@ -19,6 +19,6 @@ ─────────────────── type / for commands · Alt+Enter · paste ──────────────────── -profile Braid starter · pi · via not connected Ctrl+C cancel -focus branch-1 · running · pi/fixture/deterministic actions switch/cancel -work branch-623aa83c34…af629727 · running actions switch/cancel +profile Braid starter · pi · via local Ctrl+C cancel +focus Parallel run A · running · pi/fixture/deterministic actions switch/cancel +work Parallel run B · running · pi/fixture/deterministic actions switch/cancel diff --git a/artifacts/verification/w6/states/narrow.json b/artifacts/verification/w6/states/narrow.json index ea5fd7f5..864dd4ae 100644 --- a/artifacts/verification/w6/states/narrow.json +++ b/artifacts/verification/w6/states/narrow.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 40, diff --git a/artifacts/verification/w6/states/narrow.png b/artifacts/verification/w6/states/narrow.png index 53f8e9fbebdabe561816c7b06a03f9cf0757c6e5..8aa55f0986f931f33377e6bab261228d5a581dfe 100644 GIT binary patch delta 19 acmZ4Pz1(|37KbbgzpBz)v&kEaOjQ9vy9Pl3 delta 19 acmZ4Pz1(|37Ke4%3%^R}EH>87j!cup075?xUBA{ye)Q{9hoMH0RUCE2WbER diff --git a/artifacts/verification/w6/states/supervision.json b/artifacts/verification/w6/states/supervision.json index dd3b47c7..2bc47d2d 100644 --- a/artifacts/verification/w6/states/supervision.json +++ b/artifacts/verification/w6/states/supervision.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" + "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" }, "dimensions": { "columns": 80, @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 12, - "frame": " workers · 4\n────────────────────────────────────────────────────────────────────────────────\n › └ ● release review · worker · running · 3h 29m\n └ ● terminal proof · worker · running · 3h 29m\n └ ● stream and replay · worker · running · 3h 29m\n ● prove the Braid release · supervisor · running · 3h 29m\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ move · enter/→ open · ←/esc close · s steer · x cancel · a/r\n", + "frame": " workers · 4\n────────────────────────────────────────────────────────────────────────────────\n › └ ● release review · worker · running · 1.2s\n └ ● terminal proof · worker · running · 3.1s\n └ ● stream and replay · worker · running · 4.2s\n ● prove the Braid release · supervisor · running · 6.2s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ move · enter/→ open · ←/esc close · s steer · x cancel · a/r\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -200,7 +200,8 @@ "kind": "supervisor", "title": "prove the Braid release", "status": "running", - "startedAt": "2026-08-28T20:00:00.000Z", + "elapsedMs": 6200, + "startedAt": "2026-08-28T19:59:53.800Z", "occurredAt": "2026-08-28T20:00:00.000Z", "entityType": "supervisor", "entityId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", @@ -212,8 +213,8 @@ "title": "stream and replay", "status": "running", "detail": "stream and replay: working", - "elapsedMs": 1840, - "startedAt": "2026-08-28T20:00:00.000Z", + "elapsedMs": 4200, + "startedAt": "2026-08-28T19:59:55.800Z", "occurredAt": "2026-08-28T20:00:00.000Z", "entityType": "worker", "entityId": "worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af", @@ -227,8 +228,8 @@ "title": "terminal proof", "status": "running", "detail": "terminal proof: working", - "elapsedMs": 2310, - "startedAt": "2026-08-28T20:00:00.000Z", + "elapsedMs": 3100, + "startedAt": "2026-08-28T19:59:56.900Z", "occurredAt": "2026-08-28T20:00:00.000Z", "entityType": "worker", "entityId": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", @@ -242,8 +243,8 @@ "title": "release review", "status": "running", "detail": "release review: working", - "elapsedMs": 940, - "startedAt": "2026-08-28T20:00:00.000Z", + "elapsedMs": 1200, + "startedAt": "2026-08-28T19:59:58.800Z", "occurredAt": "2026-08-28T20:00:00.000Z", "entityType": "worker", "entityId": "worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf", @@ -280,7 +281,7 @@ "title": "prove the Braid release", "status": "running", "depth": 0, - "startedAt": "2026-08-28T20:00:00.000Z" + "startedAt": "2026-08-28T19:59:53.800Z" }, { "id": "worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af", @@ -292,37 +293,37 @@ "parentIds": [ "supervisor:supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" ], - "elapsedMs": 0, - "startedAt": "2026-08-28T20:00:00.000Z", + "elapsedMs": 4200, + "startedAt": "2026-08-28T19:59:55.800Z", "costUsd": 0.021 }, { - "id": "worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf", + "id": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", "type": "worker", - "title": "release review", + "title": "terminal proof", "status": "running", - "depth": 2, + "depth": 1, "edgeLabel": "spawned", "parentIds": [ - "worker:worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2" + "supervisor:supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" ], - "elapsedMs": 0, - "startedAt": "2026-08-28T20:00:00.000Z", - "costUsd": 0.012 + "elapsedMs": 3100, + "startedAt": "2026-08-28T19:59:56.900Z", + "costUsd": 0.028 }, { - "id": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", + "id": "worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf", "type": "worker", - "title": "terminal proof", + "title": "release review", "status": "running", - "depth": 1, + "depth": 2, "edgeLabel": "spawned", "parentIds": [ - "supervisor:supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" + "worker:worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2" ], - "elapsedMs": 0, - "startedAt": "2026-08-28T20:00:00.000Z", - "costUsd": 0.028 + "elapsedMs": 1200, + "startedAt": "2026-08-28T19:59:58.800Z", + "costUsd": 0.012 } ], "graphQuery": "", @@ -340,7 +341,7 @@ "tree usage: ≥3054 in · ≥2036 out · ≥$0.0610 · observed-floor", "tree latency: 5090ms · workers 3", "driver usage: ≥3054 in · ≥2036 out · ≥$0.0610 · observed-floor", - "started: 2026-08-28T20:00:00.000Z", + "started: 2026-08-28T19:59:53.800Z", "updated: 2026-08-28T20:00:00.000Z" ] }, @@ -616,7 +617,7 @@ "completeness": "observed-floor" }, "workerCount": 3, - "createdAt": "2026-08-28T20:00:00.000Z", + "createdAt": "2026-08-28T19:59:53.800Z", "updatedAt": "2026-08-28T20:00:00.000Z" } } @@ -641,7 +642,7 @@ "usageCompleteness": "observed-floor", "logTail": "stream and replay: working", "title": "stream and replay", - "createdAt": "2026-08-28T20:00:00.000Z", + "createdAt": "2026-08-28T19:59:55.800Z", "updatedAt": "2026-08-28T20:00:00.000Z" } } @@ -666,7 +667,7 @@ "usageCompleteness": "observed-floor", "logTail": "terminal proof: working", "title": "terminal proof", - "createdAt": "2026-08-28T20:00:00.000Z", + "createdAt": "2026-08-28T19:59:56.900Z", "updatedAt": "2026-08-28T20:00:00.000Z" } } @@ -693,7 +694,7 @@ "usageCompleteness": "observed-floor", "logTail": "release review: working", "title": "release review", - "createdAt": "2026-08-28T20:00:00.000Z", + "createdAt": "2026-08-28T19:59:58.800Z", "updatedAt": "2026-08-28T20:00:00.000Z" } } @@ -713,7 +714,7 @@ "id": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" }, "title": "prove the Braid release", - "createdAt": "2026-08-28T20:00:00.000Z", + "createdAt": "2026-08-28T19:59:53.800Z", "updatedAt": "2026-08-28T20:00:00.000Z", "status": "running" } @@ -734,7 +735,7 @@ "id": "worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af" }, "title": "stream and replay", - "createdAt": "2026-08-28T20:00:00.000Z", + "createdAt": "2026-08-28T19:59:55.800Z", "updatedAt": "2026-08-28T20:00:00.000Z", "status": "running" } @@ -755,7 +756,7 @@ "id": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2" }, "title": "terminal proof", - "createdAt": "2026-08-28T20:00:00.000Z", + "createdAt": "2026-08-28T19:59:56.900Z", "updatedAt": "2026-08-28T20:00:00.000Z", "status": "running" } @@ -776,7 +777,7 @@ "id": "worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf" }, "title": "release review", - "createdAt": "2026-08-28T20:00:00.000Z", + "createdAt": "2026-08-28T19:59:58.800Z", "updatedAt": "2026-08-28T20:00:00.000Z", "status": "running" } @@ -796,7 +797,7 @@ "source": "node-817106315e3655a201c128d85d7ad264", "destination": "node-5c7ea4ca8725acf9c9dd2e864be77b2d", "provenance": {}, - "createdAt": "2026-08-28T20:00:00.000Z" + "createdAt": "2026-08-28T19:59:55.800Z" } } } @@ -814,7 +815,7 @@ "source": "node-817106315e3655a201c128d85d7ad264", "destination": "node-7ca1a4db2e2ba68a4234b9616d01cbba", "provenance": {}, - "createdAt": "2026-08-28T20:00:00.000Z" + "createdAt": "2026-08-28T19:59:56.900Z" } } } @@ -832,7 +833,7 @@ "source": "node-7ca1a4db2e2ba68a4234b9616d01cbba", "destination": "node-77ce14da605f109bfa47f3834808e4c5", "provenance": {}, - "createdAt": "2026-08-28T20:00:00.000Z" + "createdAt": "2026-08-28T19:59:58.800Z" } } } diff --git a/artifacts/verification/w6/states/supervision.png b/artifacts/verification/w6/states/supervision.png index 386a5c82f7349447205785ee7301b60dbabf349f..2c533554c0085e2075b6cc8bda3e4e373e90973d 100644 GIT binary patch literal 24507 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 ou|T8Kffq1nw7Xy6I!`YTh2{@H8)0HhyG_5c6? literal 25615 zcmcG$2UL?=x9^SHtsp3%h^Po`M7n^0fYfLZkluroz@~SQ-a$7YC;}qVJ4kQRLMIlG z-iZMc2)%?7S_nONdERsGdGCG8xZl0wBN<_kC*dJ$J!`HxfB*mFjh2Se73$m66ciL! zl%GA-p`bW_gM#9>2UNd-XFi%bxPotgSU%HHr=alXqM&#gMnQ1|o_e`LLE-g)f&%|1 z1%*^H1qIWK^d@Z?aNweas?t*m@~>NVYhgTihSF16U4ar$b%%+C{doLSWVDIXJE^!Ltf26m_4pB7wBp~V^*Xn&E_!XhS(l*$n?u%Hr@pmZ7PXjHJYe6plG z&x;`ImOb;7{`xHu{m0_>Udn`gD!4ATAo6r=`E)LJA;x1+lEfA0L1=u_SCAR?>+if? z=g{=)qYSd$y$*h~dddTS=#JC^j~}k)fX90r&~p?N&lJPJtKPq(x&S`zt*c--9*g|@ zH|*b6ED~nBZyNl_9~*%~dn%OZzyp>Eq%a}K9oePO4ly_r1%;O3phegbftQ!}mYC(M z%(f@$2ES8K=v}!xHaavB^2v4=(P)?=2EPhkDdx%Fvh+=T`N})Bf_-Nbe+x{-`5yzO zfxe?X{g4pOFuTb%$1HTgn8)^gJ)VjT2*SF9Ts?9PMWdO5oLtKvP^zyO7)i$+HR?IUZRWaCX4HGh*-Dv$sn2=O!DJ zub~F}n?mM$8sUyeRrR-}n}QY2hOS>4NUkQ5Suglodb5X7t&$WJTi5kupdCu#0j*<= z6|Ekt*DdB}?uIq6FbcB%;6-`L28DW0UGx=ql^~R7N=``T_u9`dn_+S{EhWrNFb+K} zW{$>VtuNehmAg3I#ln#eYId2ldN0T7qhmV7Qr)rm9w&^~mr`BGakCuEd!y;f=g-w< zGV=-e%{g>IkRTduc8oNHUu@By!hi|WRO;Z+b6>wwnIwggY)nf|4f*Ve$v8;X?DVYj zesL9guXBnIjQzpVF*Ne?OgwTR1lKbV+;f7u0rL(H{XsCQ`Q$12qfS6PkZj+zecEV9 zQqe?9Jj^^nQ8Ozg(QuQ>QzhyazMf|fD}$A@Gb~fFiwltP3j=lj?uRey<<`eY32l|? zyev7a#sx|>2xw&KlTKKW7~H^Mu+FWUqGdswn$i|(q2eQMo?RJLIN zQoR@HPhHqdLGeXbcbm$Kn;k}FzARz+CXfq}4<7=GsB##-npvwh?%LQ$<58&7YkcI&e_Anjo&*t4_lpP%1i=ZR8Dork)b`fJUjhg@^` zIDygx~Ga7{` z!gQ1MQHw3dq!0DwCrc-B8z^++4ROIAb^Rs|62`$RiT)PNF6UEgiD|+`)i0MJ z!=6P_GeNPc?^;8I45@~fiN!za%JC9*(-oM<>`#5SE(!E%s<*MQG5Xt(xmZ{-t`dTB zQj>2oR2(_HG$#b=pr;K5lhAcO`(RBXB?=OZ|3tI9?gv<=wyK8q1t^=dbJH+Vv#_v8 zbCd9E*n^^>H&Z645U}!ZK+~mLGIT*ylOga0-%z27qh}ay@^EE;>Up5=NXdkn4_l#P z4^!j9Aa>HKYM3M(2_$6svR*F^nH1=WVf!Fn6@>Z#%kXc0=(IFSCNfBeglL(x1fe82 z3WFxfTC*HJe^i;tj9$E9ZRIpcBJu{AW#wk(>RoT2dgtp9bcKTAOq7o?M`tcKjGjc` zT(+5tY7T~p2_JfY#D6{H!0dX|pl~#d!R#+OODcP?-Ub!evVZ`z5Q~(X26=c?C_^qa zA@OE|ZII$*#-@B{>Ff76^>?lANAJbE*JldMcHL_*2S=s&_?rxk%du>=$a-23pw(@3 z2lEToKn&kXpQSYYe~9J(N5Oy9A+zhXyVZH8k~CYmf*tw z)jsmKbFVAB(>mE=qo64I#3cM{L(;qU_nT0Y82p^f^h`1H9a&5parT zX~Ym0Sike+r|qJ+?__MthSQKAc)e?@q>-5!xw0SQ&?Nej{M+5@ndeI$U$XnWaGd4P zM7=m(L&!eb?k`$lcx8J;+^}|XN>58OPO+#|dYVZkqx<|hPZ-q|8i?0XS!FC~A0Du? zvlC7)+wAiu=8d$sj8@(7dCJ(!m$z`OK1c__mpy+#?K|qdTI(akT<2ii+{l%u&rWiQ zSA7Wi_Khwq#c&Yhbtzg#sEOQmz}71^{TkCvQd_7}vr&`(w!{D{ZqE&7 zl$&TRXWwBYC1tu1A+h-(s?+ z>Ubp9OdC63N}|N*zUdQ@mA(pBL6&2E_&}FoK+Ool7+Tq~SYJvngN^>An8tFj_zB0<}+eEpywx%^`TCDdv+zeOiY^&iNjh9-iIM7Lhot_4yrJ-UppEbFQdH(s59O1E?pYL!yQbDWU zdK*%V&~!goc{8F(u(euQSxHVyDTaP%&DiKrH5l`lcj;VPS@HF6Fl)Q!V2E~~#?lQ& zm^h6zXzRG|9L_|w26*%H37WReq1)RRZm<770(h%2GR=}(iy`*7R@Akwj z>nCmElH!1Oof2_Zs<|X2!Upky+8z_|mfqqNeYS?&M~gnF$j`I1(GNM;>+k3YcSNou z{9SAnOqa5i*R1M#a2%-yo_m24Jzv*`*hG_BaaP|YPCbd2Bh=sqs!B>?2DmP#p-*DP zZ_ptb7{84q*=sK8j#%>s@m~|n=$8Vn6o15~L6bc!=1L_c*&|^V(_Mkn@Qy~hX&h@j zi)nNsOg8oHfQ>{=U|q*T5Y~CseHT`%8ni6J0JiM=_xmg@Txi(S@30hTq|!6{9EZj( z37)wWhsw9|y2ggorcbvv(XcNGn25N}UgMCLCz|T6u1~p*zdx718(){O*mp~ph9*ib zi$qMPbr|1CjnOj(8;MR<7 zxyo7m+(#m*%JrR$+s@c=4P>I8tVPJ2Drq(z^Yrq%Exxr!+?ERvY}n)F>F*!=5D{T) zZa&+pqkQx=^n*z6b7Pb~MB~}B6Zfy=^o%=Zo8y}`el#CG#0QYp&&Ha5^R3W-5;h|7 zFo;O@PBuhUt|IiJ&b3uAM2HKC4v#-;+lhBkRD3;|6rbfm2G>5w-avwsFmG^_9WXV3SP7;Tc-p0{E2`r)h-fX|SS(_dwPB ztDiq%Af(r&8&_EbcoY1kJ#tssxq z)6Vt@BV%Rf>suBje^Gfk9G`SWHJhbWp?)+fs7ojr_lB659BF?4VEJ1MtMt?e*6w{} z&5)7W%B+ZPI`_I1hg6ixk z1aatkI5M%vs~;TY4$f$X(IW)QM+ogaJ0hH7N~*)dRp3Gr|LGO3hFDn>dQD4B4{d08 zl#gx9Yf7He!SQm5YXrrQ^%vQp+C>&k+O8dq@3cxI*yOBc8fR#%H+vnipP!5qsfYq_ zFs>lzNlHpO7&;M)zubt5ieiY@(Tf!osR^SmC@3%*D1Tlxpg~)oYl%`->};3K7)X({ z-CQ6|lV=OfWMr|Ov3~Gl4W6X9xY=Y0#p%`nSImGc{!K(|<_jN>jrA#QO*7p0sk+jv zSckEXsn8sHD9?43a2@tAExv@Kix)Ku`Cl%>QSZW~ngg^qq=-kF2Ywyt-eOa^JL>5& z@Z<0)mVUkmYub{xc**{P@vF=!;;Rp8l_PTUxp7D)U5zJ;In$B8gi6|@>o$S(k6kMf3c)*sA#J-Y z*~!0BS)oS0&d3-MuH-b`WO>pc5tAj8|8^|FzJNYAF=jxT;m7LQTF~yi2$7eEy?v2C zXHCLo^JjXV`lO>MmE+WtYrsbXK!298zLDNUGmc{R8@2= zgfNf9sy@55`a8(yA% zG48wX?#{0IyJ%EY@1lF7$=Qm4b_X46$Y9D3F* zau&&Xq2KEv_XGAclHv;o(q+69i48H~jhUG;yl;l*9y1pGMdLSp-bTW15xE@_y4en| zSY6U;{40Z~_ zO!Vlz{BRw4rSJNk!_*3_gG%yJgwZj)JJnOE#9w2bX0Y!lsiWjkr98~!1UHfr3q1Up zaK65R)oIx8W6m4Dx$>D3XCwRi+`Nnome$)6O}B4*FFGV^a=Yp>#IGceBORHU2s$`J znUfcU*-gH%$l*B~{)BX_iMCF){|1|ljm`H6T0PC!$d=XBS=eH8S?a>VLeHW*k>^f? zzqgoiRs-geO9c_730IX3mRjF%QcxJYnmAnV6N_**DnIdZR&$a};=t57$ETz)`tAPI zb-BNlrFY?~N?cZ}x%T5#%o16(4fjG)qH=3^br~8TYc{n1n%qe}d0d`fu7oydD{(f| zR6>6N(Kcyz7i+vH*sA8f-T}@3RyzMo8$Z^x#0ZwC>zMaTka3@E1VWzc7 ziH8rXpJ_JU@;ZDRpJdiQ*!@hkO}iUmN6+Aandlzw>f(`H96$|y)|h7TaCeW_JsZF& z#ZrQDmyTKHOIO#>^nmx)m$U8dH&-QGR3_V}0_@Z3H@7y&+Z1+@uC(Kg0a+R4{c9Yr zQB`FeNxc~vca$!(jZ`bt;2mwOu?>uH6BBH`4;{FSRD*1@2ByIPhepIoNlSXK%~}4L zjTJ$_m?H<>fU)h>4nsn*nMu=ISvRpw}Tgs$?{hEgo zI+`+W?B?GLUM1X@lwDl

    Q5U@*|)~KCAd!1zZYYSyR_p{6FuBq>wCPoen++5sFI) zJZ9oG`FDkMci-B22O6px_NE_KMNOI_~oZ(?HFt~A{ccYm@vtWiRUq?X&;U1gzp$dq>7<4Hv! z8-uqVmD}=u0;o9L*B2dFX5IL?6b%d{_KX_n=U{4O(BjDG*79i!?8X6Gu+i0_O446` z9v~a62sa};_U==kFw@8cA(Z14D_f=Ri;IhMh)ORGOkId-TSM2Q(@BM^tE-$`oEcZB z+pgV)1@)J`+pFF4VwNDSqNWPtN#!dmvH^7OSjBR8I@-i7p05u7S<)=O&+@3n5^dVg zKmG2lX{&c@2+s7}=~4Ss46d0x^Zv;>1%+!B1FCh-%bPCnK+4|_(BfjPS#IROu8tr| zT7YS^x-FWI4!f+Xhw~IaZVnQX&h7-u>QK3nOpRdP`|s>^9n(^|xH!qx4$*j?3tE06 zY5sy@@QCG?uU?(K7ZmK5xxY*OHYVbp-p&cbOWSCWi9I=Yrdts5<<@Nqqd81>osL%a zfu*bUVEuVtZ;<97#Vrov^0?<1uB~sZHywD(F?eR4{QfuqfMlWEzkXBb3RmSYyJcZ% z8AJ|Ne9;viL|L+3=t^-ydcjTyAVoD_0|)p%qagnufO%aqMk_T01Mo%mkxb{W5=X!{%oxp{%e_B4F>J zCL*hbK&Yxh9IeMsKq^gwR(DXT6}_U)lVd(RySqu12jvC)xo_g)%()3M&Y0Tj5@U(e zVE-3g`R5~It}~vV?v8^h7;KRqJ++29QRSBA)8(aE26-26+_*u~(bdejB;`G)w_16$ zKAr=Qb!kiV!h@i8F@tWRj`T7S*?lEDl|HAII7^Dkz)o@PT`F3AtJhPTQ%TK!5h-cY zgN=1;5}Yi_&)ePB#BG=~yP*D30Msx+h`#9ZzW@WVLH`e6fa&&CykQ}=tdI!5F*658 z9{-c&ZcVbEY8$z@pj4|(_W0~DZaqzVnESWEy){hl`1m6UiF%O^)7VIvtG1I`!THuGW5in{=&nMYOzVygDrDC*S)^Mm4FVvzhN7a= z5a(O6r*MVfGj3P)x70NJHRZZsNwmF}uo!6{7M(u!Jdt({del4J&3gvh%Qf`4D`=+O zpU}J5`kHQIw`b_+icG?Vx4pKZus$*uJ6FL6xP;5n-m5&^f%A5KrP@t1%(pqCu5iv8 zh#-93GOh6}A}fqupjEm}(&Kf&{ErKVhs&`nX8RLKtM;pSMzKB?Vf#7b8ru@qL9CBi8(I_!<(M zQ%*nEwf*HhC7UivL&(S1dORD2bfuzgEK0R-w3L1E5*d+}R#D-y5S_*>?yT?g*M0{q zhugWfPoEDIC!|8nL;vCWs;c^q?~c!rWhSD3WLE;V5{5)< zJs(!`g!vY$m!6%q_V+tFL?m->1jkJw32Lm(P!HbgQ5D^7I5b`aDDYQvc}|h)G=0%$%IuS#)jV&9?Qqb90OQ z!Rl&i6<=8?On(;|da={UFzIYEgf6TL&2NmWfp2J^whUC@aXBf@jr{vBoLAOn{O#8E zyGnD~Xe&w}M2H3@Q&N_z>l>UKF2G_FBgP^Dz!)+4mI z=qL)s2z?5t38+azDlrI=uYT|JUcJiTXSwjP9#vW-?zy_&s8o6{sW;*s+ws>mOT}6e zjE8zDkPKmuFSe=M+g#a1+0DK)JY}x;Elon2n7MYFtu4@T{AqnNEp_ka!60Qo(V?KhS!|h}3-@eIkEg|T?bq|~4KV7PFtA`xeZO#!Ar5=r? z?d%_j^pZAFa4KQf*$;j+NjGoZmYY<_XqBdA7RmMuu0~X+OIkXZn-4GVwq@?FG96yH zKu}Npqf}oN}8n1UJrv z3~0m%`8bg#S}rJecLUTE;&4jQ^4atwmDm@w*WA#OHP>zCZiC>F{;saiBAl^lVjK_& zpR;CB9bKIfozb?_8F?DVQkT$+9}VwINC$MBgctMjf_pDA-AqsKURZ;#6wjh}pbGR` z-TNrO0nC#Gr5o+V+Ksv51&%GwGTJ}Yj@9<_2Yb1D)m7E&_DhAVw||&m>wG%RbN_xz zeDdD0k81h4(^Q(TejA;&$V99M^4Z&HRdwaVv%JCejEumey%B65G~azCEl+fmAauIk z+xM<7xr-SRBv<*QrodUMwamzL7pqcTUjsjzpPLXZv~LVlb4ss?*H!LDo@qBelDx$3 z($P-EeiA6XxUg_mXB}W_8m!~qljtlBQZ;7rt^2Kk!NF%S@BmR!5pb{H7>C<@sRY|? zPU!hyc#TE|2rj3`M17u*rRa*@uD*fp0Yju4$bAi)#mj4j5Y*B+ADB_Y!xJsewnwM$ z($~{1JI|McNqC;@C|PgOvA;e|^bY(so5xK}eLcr~mYqpZ*}*dW*ml;yBjjX1jZ~m^ znJ)JEZl~gg^b=;63c>zV-wTm`Li;e0b( z#j2hPX7cmc!KJ#tT1?oV25Y#OY9Q#Laapc*R-gJ6RaI1SIqvGk>JqS5p~;44r+#`} zR-w2%HTa?FR*4E0%}7&(M-=_H@%9FlCgHi+{IIa(# z`d2u8v=L&+W>fbD3yY(bm7OKrpvx+%?aX2&n}R(oDoVE}L%Jl2SCE)tVKF}@p*;2O zElmABybDyYntZrs%i~%3i>Bl=p|4FROg`1riU4p!@X`-_8sNDC6{abRidwcB-)r9$CUY}Y% zt!A2sAd#@vxU?eE;(2g1rp&>GY<+RmH#5)eUhRQxZGo|l>o1jPbpZV%DHuJ_6oSjG zux{*sSPYlu=a4_G&HlrzSnoFEBsSO2g_D!B&`yr8Co)P?i;pHFBO^Lm9k5O=(`a$$ zso8~FA+~KDkS?rXcY12r~lxpF?@28@V6uCr2 zMD{kvr@>f{(BM?nQPtxm8(}IgdtXB-=WvDFR&`eY!GHh@$`{IATvTN?g{PeH^6}Bq z#E!Rkbso66-hue3Fc$NVsQatt6F#=L|3LY;*Vfe0%6JvXA19TS-v?#0kPG=3Yit_a_GTNhyt@Fff}oIxs@`@e zH>-Ub!ii3X;i1RT7=XyZ!sJ<|haW#KEG~jYIf<~We_dkFgE*3D8lDTG^Z`_1@9(I> z^WwD~#`ho7?}mM@tI}2~>hTR~f1pGe;TrOMej){qyLz*I-hTkWltJi?J&MAlW4Yu}F6&eY4IY&{_YBM9t#`^jS zs$m!ux%>v-1Eu`ZQj3m-;kyPaE2f{KPq1rM)b>pq>RXw9rV zWl5pZ)9Jmv7yP0Z*Csy3$MYxkqU2xP!B3z(qn~0oewRQW;R`GBSs^U@-iX|5g_l&< zFwIIB@p9N%lQD&YZ=*#T}g#c()sYwLUMQlqAsTA#Bmw-U(57d}cG$bXme^XcpERuA^| z+F99t%)l^j9!h!h)~!j*1TE`0L{3h4?uWW^T0?-4^X^ZUX%eI>toM$J_mmaNx7v8~qL?3=bRJ_?sFU8e9pi?y|B;M+0&ht&UBKb2GDfV5gpH zIskQ?1knLoqOjYOR6Maz-&yZ6f$hVpRTM6x8fHP&dFj#{bcK>$_4vLs=76+%c-#b$ z|Nf0F!_nFL)=*_^V@k1!W~F6>caXmq*>P8VTc+J*2C^>M_MW?&n7rqf#bP3b85}vu z+MeVVyr*`+r`3CH-|1kq#xQ;`_^|uihz?hLF_H=IJyx!KdNDe4dwMXyd*#+jr{eT@ zvzzYFY+gdy*1HR4MCQY{N5y#Q+@At)(@npr&q1cNm{>}Tc73Vg=87*%)Ao!$Z9hd7H(>4%0Yh%r?0oLU{p~6dL8lehX%|x zF_rs%ZeJ^bcq_c6?KFSC_WG4{6hp@kWv6>*}#yu8Inkrp?nx*UFc{L31vhgsG4hUD*^UmP(WrW?%};B`wufrL%)SWd7{% zebh1SosyF$7}TH=S9~-e4W3EC$i3yQwK!;GGiju{y2e&5%?LC0P?+~HN#9XViTCC0 zdo{(&I-_2`{+BQBMR>Z|FPWzpXnD%qd(ykBNl%9~8b!L*g|t)heFw5jHU*h?6f$%9 z%1iuyZhE*5FOSwqRekj`=A4W)csuy}Pr8N~wl7`U_x6SdN@rb?(hUA>>w3%ctJGgY z)SkS$yYMYPuJUqKRaILEgyYe|x3=@B<24D2>>Ueu*Lk4!UlZzK@dM?*e&pXd&#IRn zK@-ki0XyBx!c`Eq(bt)^DJGR;%c}kC zJMODrayal=IqMUxQ6X8Gx&{3ojGS0#c3t47Ew{x0fp17k^~b9XRWTH*gaib1(r);B z?$(v*a&vP_tORydv{JHOPa5uMtv=(56k$b+P%fdgwzfvD^D|cWxwsYh2lU)QtntpNrWibY zXJf)g>-4}zZ|}_)(bJ=S5pnT>{{C{cDm2Gk&EGS5@87=;4f{W?_+Q!x!NPW&;e-wI z{Ecejw#)oVz*pkLr}vTVH8IjxE?xV7a_#>4Z-XZ@fOcVAguS-W5ACQD9XVWEGZ z47(BW3sSo#efpU88K+oR3q+g0AZ^eV!Xv!HZ>V8c9Xxy5q zl*j&YEJU@DrP4@MFo|?qu6B@LeobOa?*@-x))gaRa#~pO&Eunie-8@k*){oKRKouT z6I5ax$7i$&8pV#b0sJRNDe~8XU#rQ}*=>foi5Ak`IsM@pg$%O(b})J41{x}OKjpNl z1i|Q7@aom<&(g2PU{7+Gh2SE$QK<>y`}^}vq~ad=@{fmRf$sa*!;EHJUTj(f5SLDvvyd-pcrccpU#q7TvNdP_%VHh zuG0Lp+P(kf%Ql$T8qm;4vC(OIH9Z-nXZU!KK=q~%54X&zIvWv51ZNkRv>f|t4{GSu zxihwbjHJX86h?t)k4GI;)uCp9RGObPJ=irgJS;3BsvCX}D7#TfXMWM0Q!(h_;qAQ_ zv6^bB5~T0D>`ZA7T|RzH50pEw02=t)w^0DUi3tlg+DM=C^=^6my?gmzS`HQ~>}*`b zLx?3SYgaj>y;*Usq;Or^qnMi&nV9c&IhCPnIpr9R%GXCy4JBt|Wb&A4fX@f|xpLD} z93F*4q@;kt{Au;2_!b&gsy(KYPjf zCwXr-vfId6!-I~B{h`lapoAIw)R}#bKpW)ssou=ZZTK4`xHLaccN390*7w(6Cma~> z{o7JcrvybkYQ!^INN0`3JCx(`*cQeO9b9AIQwCiI8k*hYWDJywTPdPAo~!-G)Y(j4 zV-(UDKcnT^gPHHWk83vYVQ+5KVN4o0fX@FZi5dcnrFG8y?mjFVH0)A}%JmnNYHSW6d{mj*(76dhDl zj2tHG*#hm%ol(w16sVo$*o@~Q$Mc|=2L+PPwfJDNOL0O*c>seD3L8}z3V>tby?Z7! zjmar-x4c)YwN9VBv?X^iaFa-}MuM(~lK&oJ<^4dPr>~B!c}eq8XBCOJ;py$}H2$S#Z|CsvP}+N=zptyWuM3N?^hr5~3~tMKO-p;=)i320d=0usKpW&} zRhTvl0+oVW+V=E^I*{ZxCTmC9#!K+8MEE{y1IJ}Q#=8JF2uz}q-ZDdzlO;fhO!VN_ zavI!(0~^{MIse@3$5(IPV0EAUFeVObh`JFhM(T7$`nmSBZ*4`2g*c71G1Sg3;YZ5e z7|g8xfhyIciu;&u;YuFtd9VNG)J7kCU{4>^YB5TaW ze6p0RAF;pL>bBtv-K)+p4x|6U^`j)^f?p#v@+2MGlJ3MFb{B#h>Uvh{Z+9Q@>C-)_ zyHMgI;s6VKSjr+UOKGb0c7$0=ncxz>aW{eRYDfAB75mfn?=)8~2@6XaPT;>7RM{w+ zw7IYOKP9~ip*tbS`F>dqjQ}i%A7NZ~_5Wx7uu4!}zLjDKrP9^a1=@Y~b6f5Rnx*uCje0RSR? zbuFNw*_*hl9i6J9&2t?}6%H-d;tQi!$=AVsnJM@7Oj(pgCR3Hhc5^Ehy?ci2U&}%vYSy|ytg2WoSP~*1n;YRqV z?L{_7Tztm-=3?E>mkJRB^E3Ty@1#E;G8sRA{(R}<%NTrWs+x_teM&-HPG)8rhhL;) z3hPh-Ll`}{(DQMlHJiBlB1gk+o6S>?(S{V!Hu4K#Janvt34|EeKGl&21nVA4fZO&Z z73-XunwqLA+bMmroDk>^^bYI2-6ln9Et!^g^y!xLi z)I`JS>pVTDQyyrTnGw?1l8QB-Tw)hAy97tNdDIKa$x~8dTa%iC=a;tUr@Ml8N{xTv ziZ4+!zi`C@f2MC$_G3f6O}uUF9oc||B9L3C!UGF}_q&&o_gS{9D?d>K$3|kX(ay{h z4cLAR4qcv%+^XvJVUwAeSt{@JK0Wmt?x{EtHl8f{vx<|GG&@#2xjrpwgD-@|^-L=m=jOuP$i2q5}nD(sh;@J-b!Rh!kCf= zHx>Io#U+F+SIP!|Ibgaj!WG3?Z{qptQv$?KCMKKnGUDgY@GVT50ze_DiO-9R({=|5 zYmRwFi}cdM0vDvE+HcP{`^}r}&tK02EBD5R6D8d`8(Y>*xA}rk>R@Fd{MKj*F&oAY zT}x7{JxFrW#%XA!%cYivN`gt!(vmSZ0a>gN|L7j-KJQjU;|75uF zCoB;te!!>OL)`o26fZO&A;nz-sM+{ll3z0|LZ|;1RAP?)8!GvX^^(^}FLQJhonI45 zm%)07hzzpIH935huuhz)nbjP$QI|Vj|Hd{A-F*(g?6dVP0vC-Mo=( z&?(S5Z>Xh7h7jNOkmSRoT0QZ7=usRSar5IP51T1!WZPM%_55_@f!$33u=~ZOWq7<; z+b4)SKd32V@SYthLo1ecDgm#X#r%!_^zxDfH7**v5goAyEm#{d3Bo-t z{WiwMCPs!lP@4D)m{0+i1uRFe{l_$nj{i+F3;DYy|8GY`(+93DK)kBkS_^TWFntwb z`KoYG+Ij?5#2Q zNCy+nLV@e$I%7ge2T}yU`Kj_K!b=MBWI+K*bTf;tv4QXzMmNLC|;G4kp&A&zNz8i?&m&! z9x2ujTAPR5WA{-8jzDNifmk0=re~hhnv8P4 zp^~5dc)N4DC-Y|K?!cEXFXlRHbg#v0tWTL8j%?w8mxnwVIjaUY}H;($>*& zhX@GF^`Oj{1m94XR%a2PSKG_GzdNkW zy(ljz&$cK~58{SELJr^J02~?2U(O}{^X81F#Cg^KHfS*NAY#J(>MMdxqi=&W0;{Sn z>&3M){zexsB)0L71`P_cjn}CPVg9$}PJ*lAn=xT>=QM3Sz$W*)ZA_a=8~xK8j5Knp zHrO*M6NryuQ&;ruCx;Be>47pOYQ5PBIv8id=l?G-4K%Vq{dVka$&u@FO0H8c^DylGa@1-re+ym1k?5`gPAtkGPGM$-G z)0qG7Z5_bje2s;{XWcj3A&Qcg_14W9WB}o;rR5}b^Kwgrg9!8xQ9;`Oyrhl=P8OyN zsyAk}a&w!lweD!0)4lcoopQKA)!sQ&sGc9h#jIxmMO%Fmu__xFNpG=Rf?5kXI2I_* z_vw_d9eCl2ZTJI1KB=1Tl{*%Z6@XKj+qfWB=Nhw+MxU)0Az8UVkBa~BKD)_cabZ*3 ze4uP;1GC!YC6pm~eA=0nkBvbWL{sK*?CtI8#l~_!EoD8Ba7c{L$n(bn%vUd$ZcSLY z9>VWGTqb!nsj>)NzNM%-I-Eeme))3rm~Q5nf_q~N8f2oTw~Ual3acNx9XbuYJ;W7B zBRo$vSsv}JgtwS}zZmQ9qXL)47|)^y?|j&DyqW4_7%n}l%%6zqD{#iV3krE1VPL87 z5NMN)St3EY6gxfI zviYyzkI@;%{y*T4a{pNNUJhqiLsnc)UY@0kO=41#tE+9m_6Wo^_J2A-gv>70l{ref zZbmH23yRxgd3Yrc1GhQ=GGJt60*zOW78dSTynj2}b#Qugh`qESF1WHbI{9@3+ciRmlZS;;Dh&Hbm2$GrK&GpxVe!WJgts3 zQ1k!XRWe*qB5T47uoCNJlkAQ|QDtZ;Uh@?BL@K! zBi5w|EEBpLAvKHjVxg(^hUC#fpw|izeSOyjOJ8u?J=gXS1sTRtr72^Otc6wQzOM=hwQ1z#%P@z48YL{&Wq_RrB%{nqQu9GdAe#ItqH{SC+%a0=l! z6G#5ubMichTE#=OZh3YV_WZdo!Mq`4D|=l?*7)Bw$UJQRO(;9{jn?@|MHZlk%ysIIoyw$dMuM!K4sPEW{3gwxO4^mh&RXOK7FfinO% ziYw$`=-XroCi`3hfigu6u^x2@;1e*rh*ut2Yf(;8x>BFuHwHL{uXK{D(|gC2!4 zwX0JmR*YB+v9N9tj5si+$9?+KmX)0aoNv)#x{yJKyQk3mi~GFOe4*r&fL|u8MJNI z*lLWn8RI7~z@(5t)Al|oDJw0F`Hp+l-i43u-B#7=#)!iF0?<-JZnTfmhxh&zNWH{< zL|QA=;xVX%C&i^?#Ann5&vOCw*4x=A!B7@#-+$ky6Rc%&$9=ZCG|B^r(5TeG z9Y)VjdU$x*|7_>q@_dh<`h!=pWBM#>a2%WpN_GBx5b+}@wt#cbesvYB6VRrzlKjZn zk-wPv!oA`YDlx8^ZE~_efAqyeDMwvs`*+c%zhNNjvr$U9O`KZjjs6O=rm|p$%U7sx zKp*-a#2u}_3I(ttm`?NQ;SovFW98YCS5T^Lon?)$+~*Uh!yRB6-WnF3WlHf}3519b zA3m%^QlaL@qnn z*xg;#*OXKlmYCsA1l=`Gs2#!}q}*5>dCgxPt`Uy;uWq1u)PHmXxv%L?@gX|q=H}Wz zAtAL^RyLQ|)zsB{GxTRIfDg(=p|gZ3DyFys^Cz2_#{jmQ&ymz(9;DoJ-fLyInkV#+13`(>}UXCL%rt}3x|UK9-fcX`B17HJwD=< z%b7+7GaY)OmO0p8?L4Xi5D0QFihJ!WD5@zjpXr%;wqrjXv)ius=P>?^U%4$vsku>>+&owD1x5^i=VQU;_gk zq^nb<$Dj=dRie+&wZGpK9byk@kuN?$pG!1=))3f-D({h6DhT| zvPw+RDbjoWI=tQmH3#sY_)i!uEfFN_28Re>CtUh?`?U%9SkIpWYtpLHny&hkX}5r! z@77}$N_}9=SsVZ*{V!t37jX5R%&X^Yp;9YT};06)$+DQI@_zl=(eVjkKUTMcloHw5K`9Ct7g2_ZJClKYc9h?Xzc9cenHZn2 zfyUv`$iXUjz}VG|Z^fhKril+;le7;T{rsvBIH8t{N?sH`1IxZN0ZKmFJuW;}3x|=WR#%{dc?3sO$Y~nCMmf@s%WxT~?3W6%)IiZJIZW z6{b2mB7U2l`^1d3$w`gVozaD`_Af!ly>Q3T9+ZvOeXgLRxRk~eP$c=t9X{Y&KMIe? zvIl5Ad~TubRK7FTV|(vW(^?kYO6iTW!HH4JAAeOkW!wRFGTAh-G&ypw2ATCsg`wxu zPkE)PqX_5PCPA12Gb41Ys%-bio==7e+~>5a4IBQC2u}Xn|7h>Lqnf_gKi<|_tz1B> z$ORON7Ll#&%Bl)dHinHMC<+)Lq%vfL;e;vzDugLh0SO}_O9BZ3DoaEl?2Qn1B4Gvy z`90Y7-g|oMIsVSC=luTh@F$0pknd+a&+~r2UkTLs@A(^*9F9NjE{@a?L71CUvD7;G zQhoGhfvM&-eGId~53VPHe@>{Cm3s^A-1(g^0XC9kpTvE|MVIxd_f^IbJS5UF$h*&? zTz2pBGYh;m`YLY%j&}+fSGTx;oKjo!T9PgF*VC(iTeU@c+BP9Eo=4=Es*;Sx=!m1} zi#PpiGj14^$kE&g$NgnU`pl@R!^+(lnFO?1Mtb^)R9Yu#l|?Nql?s$YIreybY@p|~ z=`8haY#Q|(3I^esz9foEfN zVQQn3hDkpmvgHZ^p}^0~uYDA`HZ#=P9TY?31lYIS;`(+sWe3%1v2W(V^)scxrReMN zj!93rVx7p!wuxWnspO;BXQ^G66r9~izQ#7Gs<@RpX7hM9M~$$rw>S$Fk;&}r*ygXZ z#RnotO4);{o7n`vW*&_#?5;W?oQnI7V*%!COZ4vdSn;98~hosnKQximd zIDuZb`vmv`UutUy9d+!1O0L1ql{G%^<>kE>gUrby219du4XrRvM5QIGft!teijp2g zkPPl`9V6t}#u_KF{8!f=4kXD#n+?5gC+C@4-x}XOThZ*@zfbad@;^-Scs-I+uI`{3cx;pC`$eoOCLEVwAy)d!Cgp8Wc=r)S|kB2RH4*dUv@$$Kg6VX>b@ zwLfBN@?QjpP3pWTXPN#3SlcGzo{7Y4a>`_&+YDYo>-Z(WD+U3*NoUfATFxb*&M;FsFO z5}$jYqr?`{3OBKRK5wwtp3vqTWZuSCWi~e6i#EN&iJlZuFBI6b()_p{D=zn&i%LA` z%OM@7kB#@ouS1btKB12o3R@0~oL6ry0 zH)rf+tOL|E)4)l-?)M6Zg^0PJFDXYDCfnr9oGsA|0j-NEbFu2lng^%~nAeYYm6RyY z^UG#uG6Cnbcdu|&@9~%F@5rTqY`d{@)4RtjVBO~JciCdu;2-zZ-));!*tlQYR(rF8 zKNg4%5FBG~;{~j0vcZDz`xC=rk-8RDHjiP9h|(wry0&&aF`1T9!@;jN> z3eDJ?#I<1v1sDmc=<6G6iUbruyc6hijaKUkadEk}nOC!LKUGq|V1n0ov|d>>>b*?6 zFb?X1Y@CV@40D08V;Z|OoGSn`Quv!pf0zHxARCz&5b3f(t*1a}ggDo@oK)vOwokZP zl+ydleK=juBtQsr$rFi@zS}rPs0HLvuK)W1P7~mfqI-9Oclaa7HOY<~=T2xAAe?T| z`ns0BM^rnQgQ6sneP%V@KFmoeD7a+k)<@zF9w5hBx^tp?b(E%CK*utJj+A#|u(PF# z^5n^3^#dNYZ~6t|yEC{p5pIyY!?@)t6g~w9^-O;-cuuSn6U^OSiq8@~T+bYoOZUJL zzml?~iCK!tJ(mPUTi(0%Yv^`ZT>Lpp<&c#He&9NV-VE)G?OtZr$;UAf#%m=I4(+2P zlgWteic1PEYj66etlZ0pM%~C+g;Vch;0X>FY!Gzobw|YO$n*o@+JBKB*DI4uiP6NIygj?OUQ`rtoMb~vB zA#79>*sBb{Lqs09B8K~Myw>f-(z3D}Lp9Bp85&P;j4#`9re)kmm6YZt*FE}4F=+H; zC3a$o}?m55=DY#|SSR(6D(t#Tnhb9LepW9+)79|oxRQF%7 zZaajsTMwW%QTz5b*_mG#p4DjLJ}NH{U;y0k@UBgq1Cweas{Jqo+Pi)PzpC%qN)Q$y zU61X5Wi)a$PydH47f-nlg5fZ=XjR+Kh=a zIDpN}%77nT9UcBXhttoGxaH-U7k)G_3}Fo9vze(8WNkIF_`{lR>R;Uv z90nB7JR))_nHB=`90+|L;|~x8fk#C}MRjx}IdEJ1bVtDv#z?OpnuWJiJ0M2ifkXbyx6DgAS<;VtYR zEoHY>4?FHqQ)}NBAzGzBh-IlCmNl+SDd0Tc#l_|6th;TIWa5u;(Ug`7-fn?m;Cl`E zny_(vy`3w(kKJw@yEOGWve6O*5&#)(4GaFc%(GOVkn!gz?p2o-rN)i{0;jmrb-}{-v4Nu362W`ZMbcFKspp@C9-FS)0zM z-i@?1Ug3N77lKXh*Ms({&)FJ^6x8%ejgio=F+P1O$Tx)ZFJ;EIB*VeZ{J4BKIC~T0 z;(j=k6+Ic=nj#_6h8t5Fb$77^jNs5!Hc*-rkGz#Dv@zlJ0du#M$$-5HVwg{fA;(>u zcaQ%bZ6GItPf4Ya3CA1%Ug1mYFS5VIMxgtjvIy;!QhYmPtf&FoS***e6W0X>WmjD` z?dj~n@)O$w*}ADngSq|vSxqRy#)Nph@+ zK@C8*4&!fTXvK`t#^Mtb(cLk(y;@EpeBx6gePH|C*g43-2F2TWYHp~rgI-1X6Z=9g zI9=Fy>S4q{^$*4$$%ib&(Sp)W%({U_N%M;r*4yvl^V)}!e_Nc3FM2Fjb0`j zY?zYS@X0+V%!=UKoSVI8M|O*(97aD$4LP}qP$2tzoms05c{05VbVdKg8O>yNP#%Iv z5hp7v?T@jz^!tjO>xx~kv~aV3r!~Y{LtL*|57>SF{Gu7SXk#1anM@0lld{MJ)gVKN zoGIs>p^c4&>S%9}k$QS46l!QP6{B`pi%hbtJyk4QxKj1brUtssAo4#vKLQEf<(U?Xwc*!-JZYCPXSOBrQhu4dJ%!%y ziP3FxIVPP_5L=<#6tHfvF_=uFyi&;U2b{EXWPTEg{{0Oo8bB^7@Ka6BmWQFU-IQ8b zsCb5YpWV%!M|rh;?YOuA7zxvVznqvRITQu4I;yKZYGlG&nx)=Aye|YW1ro{eyt`QA zOwUUdEiKMwQe}4=!@2LyZCQ3_g-ukdXBDI>S~Crs)ZkKGeShHIA7TRnUzFhj>bf-R zT)Yj&OjJ95z|`Ky*NuT5ybJzuNKHlVQ#*I=Ts}QtNaf+}urTnMN)}i5KoFs_$_HA$_eDMsqR=BABQJ<6Mq!{n7QxT?BRs8--6D}BwQlDlzus(bUBQ)Z}+AT(g zcS5;^&jS1aE?M8RoRyUqzY3{Xc!u4+O}v4co*Fl69*|WXb(rMyp$|AayUv4dGU>nlkLamUrS% z2M-hko&ntw(oayFwGX!BUR4GVR)mDC?9v?FbaiKIMWrIO_V zIO8%;pQ>~Q(3O?O*=V2}-O|%@zJ86U&Wb6LJY652d<^%dzJ56G5;iU&q2Ypjdu)e! zrXf(C;9z^8YO}HY)kRi@cF#=oU(CmmVCmxgrKZMBb4@DWJ zu+E`Sln1;rt&Euup2uK4}Ea;r*V`HD!pT{Nadh|k!Wr!(>*=22.19.0'} '@esbuild/aix-ppc64@0.28.2': @@ -504,54 +509,51 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} - '@tangle-network/agent-core@0.9.4': - resolution: {integrity: sha512-2iSPCHPKI/9A4t1XXPTbpaJTzf3BkwNzXOJfb3M7AMjpIGR1SKNiRHKpDTTEUVbfx4tRny5qDDMhCnFmKgPsHA==} + '@tangle-network/agent-core@0.9.5': + resolution: {integrity: sha512-F+frKU7BqKANuXVcI4+mu93HrzCe8/hBzRz0R1UGG0poe2Rbrud4w4L3mFqd/7I06Qzi3eLnrxgXyPwBh5VKzw==} peerDependencies: '@modelcontextprotocol/sdk': ^1.30.0 peerDependenciesMeta: '@modelcontextprotocol/sdk': optional: true - '@tangle-network/agent-eval@0.163.2': - resolution: {integrity: sha512-uKhaHpeSgwiExr9fhU4aHuhK0bb5U7bZEf4uH2ElA+LyJIhXA7suMBPCHWVeIhiun9Nz8hbemOxX60Z1J5W0YQ==} + '@tangle-network/agent-eval@0.170.0': + resolution: {integrity: sha512-GoUIrtnXbN4gSDxHNB3c8vhA2JvPTlLtx7dnWZRCUFArQU2EMIvqhyVPaKnCmoJgDfbPgCwRuv60Pw2w9jSOeA==} engines: {node: '>=20'} hasBin: true - '@tangle-network/agent-interface@1.3.0': - resolution: {integrity: sha512-FsuSUkWyEvpGIjp9ENX3yrcXD8G7QhnVIoepknRYaPaaCaDPlHJzF483mBNix1GZ2bTU3aCr2KgHDSUdcjn1kg==} + '@tangle-network/agent-interface@1.8.0': + resolution: {integrity: sha512-8xp6L/rC58VBcNlq4wgOwwLIFy+XIERlcIWVb4ipGjJLzavIYnuv93wL6QmVcE4w0uLXPF525flBKeFq3dB6fg==} - '@tangle-network/agent-interface@1.4.0': - resolution: {integrity: sha512-oUN5Ok0DJuNXIwlpi/ZHLeOUQq/LSAAa1Boe4RTt7S4feAWGddya1fTgQogHbnRiHEswFHdw2wvpEb8qyVx49g==} - - '@tangle-network/agent-knowledge@10.7.0': - resolution: {integrity: sha512-zBrDmwAZzvpGm3YzlVXnjrAPgG/bhGsLFl9FXJn2XjwmI4x5ziX9xrHVlHEnG+LCCjAkwu7dn1I+976H+v8/nA==} + '@tangle-network/agent-knowledge@10.8.0': + resolution: {integrity: sha512-3XJvf5mtAUpT6B1cDAzkbc1tVHhXuC56ZFU/srlecKFceEiZ5CRwH9NouBThbwNGfF8Q0qhTvfQ8fxqT4urEnQ==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: - '@tangle-network/agent-eval': '>=0.163.2 <0.164.0' - '@tangle-network/agent-interface': ^1.4.0 + '@tangle-network/agent-eval': '>=0.170.0 <0.171.0' + '@tangle-network/agent-interface': 1.8.0 '@tangle-network/agent-profile-materialize@0.17.1': resolution: {integrity: sha512-Nk/2PhkHndabvT53Wtrpd19V7btcJiJqvWcsUyRMSZQsjwAXDT/v3ipqhV4ysbyDRidAspadpDbo86enx/eExw==} peerDependencies: - '@tangle-network/agent-interface': ^1.0.0 + '@tangle-network/agent-interface': 1.8.0 - '@tangle-network/agent-provider-cli-bridge@0.9.5': - resolution: {integrity: sha512-9FrptdbnEelsziDpfaOGlpLE+xS0bw4fgNjzzOHBYBLkZWPRB+TOtGf9iuD4muOIcjnjzWchyKQzoB3P01i+Dg==} + '@tangle-network/agent-provider-cli-bridge@0.10.0': + resolution: {integrity: sha512-G4EzQ8UErCFYVU/R0LHc9kjVOadIrrZYecqCX6Az8dlGzKPDRup8niu50EYKjR/VuaUNdmyNxNuWhcRExuPWyg==} - '@tangle-network/agent-provider-tangle@0.13.1': - resolution: {integrity: sha512-DxEZ29SMp/BsjreaD6HM/KroDzinePC65dtLVE0yqdg0KbBT/vkUX8/S7pXsBJTPAxPkjb7rtGCk5uv51pVvzA==} + '@tangle-network/agent-provider-tangle@0.14.1': + resolution: {integrity: sha512-tTv0y+OSSZtiIGjOtgJ3XL7N8dvl8lOGlZfK5CG+iHc2RNlcfp/gjjCz8X9VOUoJsNAWX1Lw8MIxy/C2JN9fHg==} peerDependencies: - '@tangle-network/sandbox': '>=0.30.1 <1.0.0' + '@tangle-network/sandbox': '>=0.33.1 <1.0.0' - '@tangle-network/agent-runtime@0.153.2': - resolution: {integrity: sha512-xlRgKLh9r7TnqUd/We7X+O+pQF7wxaR+8Yi7vd90Cf7VQDMLcm0F2gxF3UKUc6IpfnLVPxHj+UdF9cCN2bRVkQ==} + '@tangle-network/agent-runtime@0.178.0': + resolution: {integrity: sha512-CltB1+dhcIOVKj+t2jpW4cM7qn8aLuY039RlfssZ+VTID0tBeXJZUa+G9dQIMTMLJA3qn2hxuh2u+dRgwhmnUQ==} engines: {node: '>=22.13.0'} hasBin: true peerDependencies: - '@tangle-network/agent-eval': '>=0.163.2 <0.164.0' - '@tangle-network/agent-interface': ^1.4.0 - '@tangle-network/sandbox': '>=0.31.0 <0.32.0' + '@tangle-network/agent-eval': '>=0.163.2 <0.171.0' + '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/sandbox': '>=0.34.0 <0.35.0' peerDependenciesMeta: '@tangle-network/sandbox': optional: true @@ -559,8 +561,8 @@ packages: '@tangle-network/agent-trace-contract@1.0.2': resolution: {integrity: sha512-v7uMh56jkEp4vckevEU9xKsIatbs5dqzGPp69dFLSSXUVit0RP6VD6EANMXVlTCUk+6wVKBLHJx23XspVCEiIA==} - '@tangle-network/sandbox@0.31.0': - resolution: {integrity: sha512-3NotVKNH/VbppdQCyRM3EuxttbO/WxBkZfHM8tR1ujtW18sC4beYYG0NYvTsIbqtTGOMhTJI0ji1kETpdrlaDA==} + '@tangle-network/sandbox@0.34.0': + resolution: {integrity: sha512-jzP1JS6WPP/nMOtlkJtor1GgkdEKs3L+A8TV0VLkxtuZn70FqB/4/FZOPBFtQJX8nNWfhD8DHm9LneU3gsS9Cg==} peerDependencies: '@mastra/core': ^1.36.0 '@modelcontextprotocol/sdk': ^1.30.0 @@ -579,6 +581,10 @@ packages: viem: optional: true + '@tangle-network/tcloud-attestation@0.1.1': + resolution: {integrity: sha512-+TAF9s5t1jOWGyGHvKhIWe2FYmG7puVaxmmg0Et67ylAjGa7GqUAvISXGjG/6dzld7A170V0kQHK0WVdh2Wh0Q==} + engines: {node: '>=18'} + '@types/node@26.2.0': resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} @@ -719,16 +725,16 @@ packages: react-native-b4a: optional: true - bare-events@2.9.1: - resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + bare-events@2.9.2: + resolution: {integrity: sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==} peerDependencies: bare-abort-controller: '*' peerDependenciesMeta: bare-abort-controller: optional: true - bare-fs@4.8.0: - resolution: {integrity: sha512-fM+MhCvdQhZ7NV6S95a07gPSqjIYKn6mFaXfx266wN3ajZGl/+1AzH+ubkXQ0fFZvOe2nk9VHkzdYkQE5zMV3Q==} + bare-fs@4.8.1: + resolution: {integrity: sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg==} engines: {bare: '>=1.28.0'} peerDependencies: bare-buffer: '*' @@ -739,8 +745,8 @@ packages: bare-path@3.1.1: resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} - bare-stream@2.13.3: - resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} + bare-stream@2.13.4: + resolution: {integrity: sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==} peerDependencies: bare-abort-controller: '*' bare-buffer: '*' @@ -822,8 +828,8 @@ packages: ml-matrix@6.15.0: resolution: {integrity: sha512-wFa1v6KP8bKp+fj0nYmRs1Pb5K4zRkXGKsOvLinvILENFIADncm4XlOI+S1M7yuACMGfI6cfk0IifDgd4j5xmw==} - ml-spectra-processing@14.33.0: - resolution: {integrity: sha512-zg71v6exRvPpzDh9SiN5iNAIG8yTFpzfJrRCRSb/hWf5gMsik7q60DkO5ew4knR7xF4DbjYmNWeqLq8gWcQdEQ==} + ml-spectra-processing@14.34.0: + resolution: {integrity: sha512-sNM3nOg7s4tyinRnU5FyYZFV//cPHMvjwfxQvFh3GyrvWNuZmPIZTPS+kiT/SPXMymxA4+qx8oFSZ9K03clGyQ==} ml-xsadd@3.0.1: resolution: {integrity: sha512-Fz2q6dwgzGM8wYKGArTUTZDGa4lQFA2Vi6orjGeTVRy22ZnQFKlJuwS9n8NRviqz1KHAHAzdKJwbnYhdo38uYg==} @@ -864,8 +870,8 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - streamx@2.28.0: - resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + streamx@2.28.1: + resolution: {integrity: sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==} tar-stream@3.2.0: resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} @@ -969,7 +975,7 @@ snapshots: '@dataiku/uv-win32-ia32': 0.12.0 '@dataiku/uv-win32-x64': 0.12.0 - '@earendil-works/pi-tui@0.84.2': + '@earendil-works/pi-tui@0.84.3': dependencies: get-east-asian-width: 1.6.0 marked: 18.0.5 @@ -1154,17 +1160,17 @@ snapshots: '@noble/hashes@1.8.0': {} - '@tangle-network/agent-core@0.9.4': + '@tangle-network/agent-core@0.9.5': dependencies: - '@tangle-network/agent-interface': 1.3.0 + '@tangle-network/agent-interface': 1.8.0 zod: 4.4.3 - '@tangle-network/agent-eval@0.163.2': + '@tangle-network/agent-eval@0.170.0': dependencies: '@asteasolutions/zod-to-openapi': 9.1.0(zod@4.4.3) '@hono/node-server': 2.1.1(hono@4.13.0) - '@tangle-network/agent-core': 0.9.4 - '@tangle-network/agent-interface': 1.4.0 + '@tangle-network/agent-core': 0.9.5 + '@tangle-network/agent-interface': 1.8.0 '@tangle-network/agent-trace-contract': 1.0.2 hono: 4.13.0 linear-sum-assignment: 1.0.9 @@ -1173,51 +1179,45 @@ snapshots: transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@tangle-network/agent-interface@1.3.0': + '@tangle-network/agent-interface@1.8.0': dependencies: '@noble/hashes': 1.8.0 spdx-expression-parse: 5.0.0 zod: 4.4.3 - '@tangle-network/agent-interface@1.4.0': + '@tangle-network/agent-knowledge@10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)': dependencies: - '@noble/hashes': 1.8.0 - spdx-expression-parse: 5.0.0 - zod: 4.4.3 - - '@tangle-network/agent-knowledge@10.7.0(@tangle-network/agent-eval@0.163.2)(@tangle-network/agent-interface@1.4.0)': - dependencies: - '@tangle-network/agent-eval': 0.163.2 - '@tangle-network/agent-interface': 1.4.0 + '@tangle-network/agent-eval': 0.170.0 + '@tangle-network/agent-interface': 1.8.0 '@types/proper-lockfile': 4.1.4 proper-lockfile: 4.1.2 zod: 4.4.3 - '@tangle-network/agent-profile-materialize@0.17.1(@tangle-network/agent-interface@1.4.0)': + '@tangle-network/agent-profile-materialize@0.17.1(@tangle-network/agent-interface@1.8.0)': dependencies: - '@tangle-network/agent-interface': 1.4.0 + '@tangle-network/agent-interface': 1.8.0 - '@tangle-network/agent-provider-cli-bridge@0.9.5': + '@tangle-network/agent-provider-cli-bridge@0.10.0': dependencies: - '@tangle-network/agent-interface': 1.4.0 + '@tangle-network/agent-interface': 1.8.0 undici: 7.29.0 - '@tangle-network/agent-provider-tangle@0.13.1(@tangle-network/sandbox@0.31.0)': + '@tangle-network/agent-provider-tangle@0.14.1(@tangle-network/sandbox@0.34.0)': dependencies: - '@tangle-network/agent-interface': 1.4.0 - '@tangle-network/sandbox': 0.31.0 + '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/sandbox': 0.34.0 - '@tangle-network/agent-runtime@0.153.2(@tangle-network/agent-eval@0.163.2)(@tangle-network/agent-interface@1.4.0)(@tangle-network/sandbox@0.31.0)': + '@tangle-network/agent-runtime@0.178.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)(@tangle-network/sandbox@0.34.0)': dependencies: - '@tangle-network/agent-core': 0.9.4 - '@tangle-network/agent-eval': 0.163.2 - '@tangle-network/agent-interface': 1.4.0 - '@tangle-network/agent-knowledge': 10.7.0(@tangle-network/agent-eval@0.163.2)(@tangle-network/agent-interface@1.4.0) - '@tangle-network/agent-profile-materialize': 0.17.1(@tangle-network/agent-interface@1.4.0) + '@tangle-network/agent-core': 0.9.5 + '@tangle-network/agent-eval': 0.170.0 + '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-knowledge': 10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0) + '@tangle-network/agent-profile-materialize': 0.17.1(@tangle-network/agent-interface@1.8.0) '@tangle-network/agent-trace-contract': 1.0.2 tar-stream: 3.2.0 optionalDependencies: - '@tangle-network/sandbox': 0.31.0 + '@tangle-network/sandbox': 0.34.0 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bare-abort-controller @@ -1226,12 +1226,14 @@ snapshots: '@tangle-network/agent-trace-contract@1.0.2': {} - '@tangle-network/sandbox@0.31.0': + '@tangle-network/sandbox@0.34.0': dependencies: - '@tangle-network/agent-core': 0.9.4 - '@tangle-network/agent-interface': 1.3.0 + '@tangle-network/agent-core': 0.9.5 + '@tangle-network/agent-interface': 1.8.0 zod: 4.4.3 + '@tangle-network/tcloud-attestation@0.1.1': {} + '@types/node@26.2.0': dependencies: undici-types: 8.3.0 @@ -1306,13 +1308,13 @@ snapshots: b4a@1.8.1: {} - bare-events@2.9.1: {} + bare-events@2.9.2: {} - bare-fs@4.8.0: + bare-fs@4.8.1: dependencies: - bare-events: 2.9.1 + bare-events: 2.9.2 bare-path: 3.1.1 - bare-stream: 2.13.3(bare-events@2.9.1) + bare-stream: 2.13.4(bare-events@2.9.2) bare-url: 2.5.2 fast-fifo: 1.3.2 transitivePeerDependencies: @@ -1321,13 +1323,13 @@ snapshots: bare-path@3.1.1: {} - bare-stream@2.13.3(bare-events@2.9.1): + bare-stream@2.13.4(bare-events@2.9.2): dependencies: b4a: 1.8.1 - streamx: 2.28.0 + streamx: 2.28.1 teex: 1.0.1 optionalDependencies: - bare-events: 2.9.1 + bare-events: 2.9.2 transitivePeerDependencies: - react-native-b4a @@ -1376,7 +1378,7 @@ snapshots: events-universal@1.0.1: dependencies: - bare-events: 2.9.1 + bare-events: 2.9.2 transitivePeerDependencies: - bare-abort-controller @@ -1414,7 +1416,7 @@ snapshots: dependencies: cheminfo-types: 1.15.0 ml-matrix: 6.15.0 - ml-spectra-processing: 14.33.0 + ml-spectra-processing: 14.34.0 marked@18.0.5: {} @@ -1437,7 +1439,7 @@ snapshots: is-any-array: 3.0.0 ml-array-rescale: 2.0.0 - ml-spectra-processing@14.33.0: + ml-spectra-processing@14.34.0: dependencies: binary-search: 1.3.6 cheminfo-types: 1.15.0 @@ -1481,7 +1483,7 @@ snapshots: spdx-license-ids@3.0.23: {} - streamx@2.28.0: + streamx@2.28.1: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 @@ -1493,9 +1495,9 @@ snapshots: tar-stream@3.2.0: dependencies: b4a: 1.8.1 - bare-fs: 4.8.0 + bare-fs: 4.8.1 fast-fifo: 1.3.2 - streamx: 2.28.0 + streamx: 2.28.1 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -1503,7 +1505,7 @@ snapshots: teex@1.0.1: dependencies: - streamx: 2.28.0 + streamx: 2.28.1 transitivePeerDependencies: - bare-abort-controller - react-native-b4a diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 708f90b3..96753b1d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,6 @@ overrides: + '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-knowledge': 10.8.0 hono: 4.13.0 undici: 7.29.0 allowBuilds: @@ -9,12 +11,12 @@ allowBuilds: node-pty: true ignoreScripts: false minimumReleaseAgeExclude: - - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0' + - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0 || 0.178.0' - '@tangle-network/agent-eval@0.143.0 || 0.144.0 || 0.144.1 || 0.144.3 || 0.144.4 || 0.144.6 || 0.144.8 || 0.144.10 || 0.144.11 || 0.144.13 || 0.145.0 || 0.145.1 || 0.145.2 || 0.145.3 || 0.145.9 || 0.145.10 || 0.145.11 || 0.145.14 || 0.145.15 || 0.145.21 || 0.149.0 || 0.163.2 || 0.170.0' - - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0 || 1.7.0 || 1.7.1' - - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0' + - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0 || 1.7.0 || 1.7.1 || 1.8.0' + - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0 || 10.8.0' - '@tangle-network/agent-profile-materialize@0.10.2 || 0.13.1 || 0.14.0 || 0.14.2 || 0.15.1 || 0.15.2 || 0.17.1' - - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6' + - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0' - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1' - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0' - hono@4.13.0 diff --git a/scripts/capture-visual-definitions.mjs b/scripts/capture-visual-definitions.mjs index 62674912..19cb603a 100644 --- a/scripts/capture-visual-definitions.mjs +++ b/scripts/capture-visual-definitions.mjs @@ -47,6 +47,9 @@ export function createStateDefinitions(normalized) { rows: 24, environment: { BRAID_FIXTURE_CHUNK_DELAY_MS: '10000' }, run: async (terminal) => { + terminal.input('/new Parallel run A') + terminal.input('\r') + await new Promise((resolve) => setTimeout(resolve, 100)) terminal.input('parallel run A') terminal.input('\r') await terminal.waitFor( diff --git a/scripts/live-bridge/config.mjs b/scripts/live-bridge/config.mjs index ae844320..1595eb38 100644 --- a/scripts/live-bridge/config.mjs +++ b/scripts/live-bridge/config.mjs @@ -172,7 +172,7 @@ export async function probePackedAnalysisReadiness(installRoot, endpoint, target } } -export async function loadProviderCapabilities(installRoot) { +export async function loadProviderCapabilities(installRoot, backend) { const module = await import( pathToFileURL( join( @@ -185,7 +185,7 @@ export async function loadProviderCapabilities(installRoot) { ), ).href ) - return module.defaultCliBridgeCapabilities() + return module.defaultCliBridgeCapabilities(backend) } export async function writeTargetConfig(root, endpoint, target, credential) { diff --git a/scripts/live-bridge/constants.mjs b/scripts/live-bridge/constants.mjs index 241d1ea0..3ae31ba5 100644 --- a/scripts/live-bridge/constants.mjs +++ b/scripts/live-bridge/constants.mjs @@ -46,6 +46,21 @@ export const targetDefinitions = Object.freeze([ }, ]) +export const releaseRunnerTargetDefinitions = Object.freeze([ + { + key: 'pi-tangle-router-deepseek-v4-flash', + label: 'Pi with Tangle Router DeepSeek V4 Flash', + modelId: 'pi/tangle-router/deepseek-v4-flash', + backend: 'pi', + }, + { + key: 'codex-default', + label: 'Codex default', + modelId: 'codex/default', + backend: 'codex', + }, +]) + export const livePrompts = Object.freeze({ normal: (key) => `Output only this token, with no punctuation or explanation: LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_OK`, diff --git a/scripts/live-bridge/endpoint.mjs b/scripts/live-bridge/endpoint.mjs index b71614f1..643c646b 100644 --- a/scripts/live-bridge/endpoint.mjs +++ b/scripts/live-bridge/endpoint.mjs @@ -1,3 +1,5 @@ +import { createHash } from 'node:crypto' + import { exitCodes } from './constants.mjs' import { LiveBridgeError } from './errors.mjs' import { evidenceValue, redactString } from './redaction.mjs' @@ -62,29 +64,58 @@ export function bridgeAuthToken() { ) } -export async function requestJson(endpoint, path, token, timeoutMs = 10_000) { +/** + * Issue one bounded JSON request against CLI Bridge. + * + * The optional request object keeps live checks on this shared transport while + * allowing them to prove POST acknowledgements without retaining raw bodies. + */ +export async function requestJson( + endpoint, + path, + token, + timeoutMs = 10_000, + { + method = 'GET', + body: requestBody, + headers: requestHeaders = {}, + captureWireDigest = false, + } = {}, +) { const controller = new AbortController() const timer = setTimeout(() => controller.abort(), timeoutMs) try { const response = await fetch(`${endpoint}${path}`, { + method, headers: { accept: 'application/json', + ...(requestBody === undefined ? {} : { 'content-type': 'application/json' }), + ...requestHeaders, ...(token === undefined ? {} : { authorization: `Bearer ${token}` }), }, + ...(requestBody === undefined ? {} : { body: requestBody }), signal: controller.signal, }) const text = await response.text() - let body + let responseBody try { - body = text.length === 0 ? undefined : JSON.parse(text) + responseBody = text.length === 0 ? undefined : JSON.parse(text) } catch { - body = undefined + responseBody = undefined } return { status: response.status, ok: response.ok, - body: evidenceValue(body, '', 0, token === undefined ? [] : [token]), + body: evidenceValue(responseBody, '', 0, token === undefined ? [] : [token]), text: redactString(text, token === undefined ? [] : [token]).slice(0, 64_000), + ...(captureWireDigest + ? { + wire: { + bytes: Buffer.byteLength(text), + digest: `sha256:${createHash('sha256').update(text).digest('hex')}`, + }, + } + : {}), } } catch (error) { return { diff --git a/scripts/live-bridge/evidence.mjs b/scripts/live-bridge/evidence.mjs index a9e99cbf..2eb0797f 100644 --- a/scripts/live-bridge/evidence.mjs +++ b/scripts/live-bridge/evidence.mjs @@ -39,8 +39,9 @@ export async function removeTemp(paths) { } } -export async function writeEvidence(evidence) { +export async function writeEvidence(evidence, destinationOverride) { const destination = + destinationOverride ?? process.env.BRAID_LIVE_BRIDGE_EVIDENCE ?? (process.env.BRAID_RELEASE_ARTIFACT_ROOT ? join(process.env.BRAID_RELEASE_ARTIFACT_ROOT, 'live', 'bridge', 'evidence.json') diff --git a/scripts/live-bridge/main.mjs b/scripts/live-bridge/main.mjs index 1692f940..3d450c22 100644 --- a/scripts/live-bridge/main.mjs +++ b/scripts/live-bridge/main.mjs @@ -8,6 +8,7 @@ import { exitCodes, liveProofScope, liveReleaseProofScope, + releaseRunnerTargetDefinitions, repository, } from './constants.mjs' import { @@ -142,11 +143,22 @@ export async function main({ requireCompleteReleaseProof = false } = {}) { bridgeCleanup = bridge.cleanup let selected = bridge.selected if (discoverFromHealth) { - const releaseDefinitions = releaseTargetDefinitions( - policy.definitions, + const preferredDefinitions = [...policy.definitions, ...releaseRunnerTargetDefinitions] + const requiredDefinitions = requireCompleteReleaseProof + ? preferredDefinitions + : policy.definitions + const discoveredDefinitions = releaseTargetDefinitions( + preferredDefinitions, bridgeEvidence.models, bridge.health, ) + const releaseDefinitions = [ + ...(requireCompleteReleaseProof ? requiredDefinitions : []), + ...discoveredDefinitions, + ].filter( + (definition, index, definitions) => + definitions.findIndex(({ modelId }) => modelId === definition.modelId) === index, + ) if (releaseDefinitions.length === 0) { throw new LiveBridgeError( 'LIVE_RELEASE_TARGETS_UNAVAILABLE', @@ -169,10 +181,17 @@ export async function main({ requireCompleteReleaseProof = false } = {}) { } evidence.selectedTargets = bridgeEvidence.selectedTargets const packed = await buildPackedBinary(evidence, repository, (path) => tempPaths.push(path)) - const providerCapabilities = await loadProviderCapabilities(packed.installRoot) + const providerCapabilitiesByBackend = Object.fromEntries( + await Promise.all( + [...new Set(selected.map(({ backend }) => backend))].map(async (backend) => [ + backend, + await loadProviderCapabilities(packed.installRoot, backend), + ]), + ), + ) evidence.provider = { package: '@tangle-network/agent-provider-cli-bridge', - capabilities: evidenceValue(providerCapabilities), + capabilitiesByBackend: evidenceValue(providerCapabilitiesByBackend), } evidence.analysis = await probePackedAnalysisReadiness( packed.installRoot, @@ -190,7 +209,7 @@ export async function main({ requireCompleteReleaseProof = false } = {}) { packed.installRoot, targetRoot, endpoint, - providerCapabilities, + providerCapabilitiesByBackend[target.backend], target, token, Number(process.env.BRAID_LIVE_BRIDGE_TIMEOUT_MS ?? defaultTimeoutMs), @@ -229,7 +248,7 @@ export async function main({ requireCompleteReleaseProof = false } = {}) { installRoot: packed.installRoot, root: targetRoot, endpoint, - providerCapabilities, + providerCapabilitiesByBackend, targets: selected, targetRecords: evidence.targets, token, diff --git a/scripts/live-bridge/matrix.mjs b/scripts/live-bridge/matrix.mjs index a378572c..8d2658fc 100644 --- a/scripts/live-bridge/matrix.mjs +++ b/scripts/live-bridge/matrix.mjs @@ -383,7 +383,10 @@ async function runSemanticMatrix() { interactionFromResponse( { type: 'event', - event: { kind: 'run.interaction', runId: 'run-live', request: interactionRequest }, + event: { + kind: 'run.interaction', + payload: { runId: 'run-live', interaction: interactionRequest }, + }, }, 'run-live', ), @@ -391,7 +394,13 @@ async function runSemanticMatrix() { ) assert.equal( interactionFromResponse( - { type: 'event', event: { kind: 'run.interaction', runId: 'other-run' } }, + { + type: 'event', + event: { + kind: 'run.interaction', + payload: { runId: 'other-run', interaction: interactionRequest }, + }, + }, 'run-live', ), undefined, diff --git a/scripts/live-bridge/native-continuation.mjs b/scripts/live-bridge/native-continuation.mjs new file mode 100644 index 00000000..6715c24a --- /dev/null +++ b/scripts/live-bridge/native-continuation.mjs @@ -0,0 +1,1378 @@ +import { join } from 'node:path' +import { fileURLToPath } from 'node:url' + +import { + AgentEnvironmentCapabilitiesSchema, + AgentExactRunControlRefSchema, + AgentNativeContextContinuationAdmissionSchema, + AgentNativeContextContinuationResultSchema, + AgentRunCancellationAcknowledgementSchema, + AgentRunCancellationRequestSchema, + agentNativeContextContinuationAdmissionMatchesRequest, + agentNativeContextContinuationResultMatchesRequest, + agentRunCancellationAcknowledgementMatchesRequest, + agentRunCancellationRequestDigest, + NativeContextBoundaryProofSchema, + NativeContextContinuationRequestSchema, + NativeContextContinuationTurnSchema, + nativeContextContinuationRequestDigest, + nativeContextContinuationTurnDigest, +} from '@tangle-network/agent-interface' +import { createCliBridgeProvider } from '@tangle-network/agent-provider-cli-bridge' + +import { defaultTimeoutMs, exitCodes, repository } from './constants.mjs' +import { + bridgeAuthToken, + endpointForEvidence, + healthBackendsReady, + requestJson, + safeEndpoint, +} from './endpoint.mjs' +import { LiveBridgeError } from './errors.mjs' +import { errorEvidence, writeEvidence } from './evidence.mjs' +import { evidenceValue, redactString } from './redaction.mjs' + +export const NATIVE_CONTINUATION_RECEIPT_SCHEMA = 'braid.live-bridge.native-continuation.v1' +export const NATIVE_CONTINUATION_MODEL = 'pi/tangle-router/deepseek-v4-flash' +export const NATIVE_CONTINUATION_EVIDENCE_PATH = join( + repository, + 'artifacts', + 'verification', + 'live', + 'bridge', + 'native-continuation.json', +) + +const DEFAULT_FIRST_PROMPT = 'Reply exactly with: Braid live continuation first complete.' +const DEFAULT_CANCEL_PROMPT = + 'Use the terminal to run `sleep 30`. After it finishes, reply exactly: cancelled continuation.' +const DEFAULT_SUCCESS_PROMPT = 'Reply exactly with: Braid live continuation success.' +const DEFAULT_EVENT_TIMEOUT_MS = 3_000 +const DEFAULT_REQUEST_TIMEOUT_MS = 30_000 +const DEFAULT_MAX_SSE_EVENTS = 12 +const RUNNER_NAME = 'pi' +const ROUTER_PROVIDER = 'tangle-router' + +export function nativeContinuationTarget(route) { + const prefix = `${RUNNER_NAME}/${ROUTER_PROVIDER}/` + if (typeof route !== 'string' || !route.startsWith(prefix)) return undefined + const model = route.slice(prefix.length) + if (model.length === 0) return undefined + return { route, runner: RUNNER_NAME, provider: ROUTER_PROVIDER, model } +} + +function recordValue(value) { + return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined +} + +function stringValue(value) { + return typeof value === 'string' && value.length > 0 ? value : undefined +} + +function fail(code, message, details = {}, exitCode = exitCodes.failed) { + throw new LiveBridgeError(code, message, exitCode, details) +} + +function assertCondition(condition, code, message, details = {}, exitCode = exitCodes.failed) { + if (!condition) fail(code, message, details, exitCode) +} + +function responseFailureDetails(response) { + return { + status: response?.status, + ...(response?.error === undefined ? {} : { error: response.error }), + } +} + +function requireResponse(response, expectedStatus, label, { unavailable = false } = {}) { + if (response?.status === expectedStatus && response.ok === true) return response + fail( + unavailable ? 'LIVE_NATIVE_BRIDGE_UNAVAILABLE' : 'LIVE_NATIVE_REQUEST_FAILED', + `${label} returned an unexpected response`, + responseFailureDetails(response), + unavailable ? exitCodes.unavailable : exitCodes.failed, + ) +} + +function assertRunCoordinates(reference, label = 'run reference') { + try { + return AgentExactRunControlRefSchema.parse(reference) + } catch (error) { + fail('LIVE_NATIVE_RUN_IDENTITY_INVALID', `${label} is not an exact run reference`, { + cause: error instanceof Error ? error.message : String(error), + }) + } +} + +function assertBoundaryCoordinates(boundary, reference) { + assertCondition( + boundary.runId === reference.runId && + boundary.provider === reference.provider && + boundary.environmentId === reference.environmentId && + boundary.sessionId === reference.sessionId && + boundary.executionId === reference.executionId && + boundary.requestDigest === reference.requestDigest, + 'LIVE_NATIVE_BOUNDARY_IDENTITY_MISMATCH', + 'native context boundary does not bind to the source run', + ) +} + +function advancedReference(source, candidate) { + return ( + candidate.provider === source.provider && + candidate.environmentId === source.environmentId && + candidate.sessionId === source.sessionId && + (candidate.runId !== source.runId || candidate.executionId !== source.executionId) + ) +} + +function statusSummary(body) { + const value = recordValue(body) + if (!value) return undefined + return { + status: stringValue(value.status), + terminal: typeof value.terminal === 'boolean' ? value.terminal : undefined, + state: stringValue(value.state), + canonicalLastSeq: Number.isSafeInteger(value.canonicalLastSeq) + ? value.canonicalLastSeq + : undefined, + } +} + +function sessionIdentitySummary(body) { + const value = recordValue(body) + if (!value) return undefined + return { + id: stringValue(value.id), + backend: stringValue(value.backend), + model: stringValue(value.model), + status: stringValue(value.status), + runId: stringValue(value.runId ?? value.run_id), + } +} + +async function readSessionIdentity(endpoint, sessionId, token, timeoutMs) { + const response = await requestJson( + endpoint, + `/v1/sessions/${encodeURIComponent(sessionId)}`, + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + ) + requireResponse(response, 200, `session ${sessionId} identity`) + const session = sessionIdentitySummary(response.body) + assertCondition( + session?.id === sessionId && + session.backend === RUNNER_NAME && + nativeContinuationTarget(session.model) !== undefined, + 'LIVE_NATIVE_SESSION_IDENTITY_MISMATCH', + 'CLI Bridge session identity did not retain the requested Pi model route', + { session }, + ) + return session +} + +function referenceSummary(reference) { + const parsed = assertRunCoordinates(reference) + return { + runId: parsed.runId, + provider: parsed.provider, + environmentId: parsed.environmentId, + sessionId: parsed.sessionId, + executionId: parsed.executionId, + requestDigest: parsed.requestDigest, + } +} + +function boundarySummary(boundary) { + const parsed = NativeContextBoundaryProofSchema.parse(boundary) + return { + runId: parsed.runId, + provider: parsed.provider, + environmentId: parsed.environmentId, + sessionId: parsed.sessionId, + executionId: parsed.executionId, + requestDigest: parsed.requestDigest, + kind: parsed.boundary.kind, + observedAt: parsed.observedAt, + } +} + +function capabilitySummary(capabilities) { + return evidenceValue({ + nativeContinuation: capabilities.nativeContinuation, + retainedControl: capabilities.retainedControl, + streaming: capabilities.streaming, + sessions: capabilities.sessions, + interactions: capabilities.interactions, + }) +} + +function assertNativeCapabilities(capabilities) { + const parsed = AgentEnvironmentCapabilitiesSchema.parse(capabilities) + const retained = parsed.retainedControl + const native = parsed.nativeContinuation + assertCondition( + parsed.sessions.continue === true && + parsed.streaming.live === true && + parsed.streaming.replay === true && + parsed.streaming.detach === true && + parsed.streaming.turnIdempotency === true, + 'LIVE_NATIVE_CAPABILITY_INCOMPLETE', + 'CLI Bridge did not advertise the complete retained stream contract', + ) + assertCondition( + retained?.exactRunIdentity === true && + retained.resultIdentity === true && + retained.eventIdentity === true && + retained.cancellationIdempotency === true, + 'LIVE_NATIVE_CAPABILITY_INCOMPLETE', + 'CLI Bridge did not advertise exact retained-run controls', + ) + assertCondition( + native?.atomicBoundary === true && + native.requestIdempotency === true && + native.admissionControl === true, + 'LIVE_NATIVE_CAPABILITY_INCOMPLETE', + 'CLI Bridge did not advertise native admission control', + ) + return parsed +} + +/** Build the canonical native continuation request used by the live check. */ +export function nativeContinuationRequest({ operationId, run, expectedBoundary, prompt }) { + const turn = { prompt } + const material = { + operationId, + turnDigest: nativeContextContinuationTurnDigest(turn), + run: assertRunCoordinates(run), + expectedBoundary: NativeContextBoundaryProofSchema.parse(expectedBoundary), + } + const request = NativeContextContinuationRequestSchema.parse({ + ...material, + requestDigest: nativeContextContinuationRequestDigest(material), + }) + return { request, turn } +} + +/** Build the canonical exact cancellation request used by the live check. */ +export function exactCancellationRequest({ operationId, run, reason }) { + const material = { + operationId, + run: assertRunCoordinates(run), + ...(reason === undefined ? {} : { reason }), + } + return AgentRunCancellationRequestSchema.parse({ + ...material, + requestDigest: agentRunCancellationRequestDigest(material), + }) +} + +/** Encode one continuation body without provider-specific fields. */ +export function nativeContinuationBody(input) { + const request = NativeContextContinuationRequestSchema.parse(input.request) + const turn = NativeContextContinuationTurnSchema.parse(input.turn) + return JSON.stringify({ request, turn }) +} + +/** Parse complete SSE frames without interpreting provider-native payloads. */ +export function parseSseEvents(value) { + const text = String(value).replaceAll('\r\n', '\n').replaceAll('\r', '\n') + return text.split('\n\n').flatMap((frame) => { + const eventLines = [] + const dataLines = [] + for (const line of frame.split('\n')) { + if (line.startsWith('event:')) eventLines.push(line.slice(6).trimStart()) + else if (line.startsWith('data:')) dataLines.push(line.slice(5).trimStart()) + } + if (dataLines.length === 0) return [] + const dataText = dataLines.join('\n') + let data + try { + data = JSON.parse(dataText) + } catch { + data = undefined + } + return [{ event: eventLines.at(-1) ?? 'message', data }] + }) +} + +async function raceWithTimeout(promises, timeoutMs, message) { + let timer + try { + return await Promise.race([ + ...promises, + new Promise((_, reject) => { + timer = setTimeout(() => reject(new Error(message)), timeoutMs) + }), + ]) + } finally { + clearTimeout(timer) + } +} + +async function observeSettlement(promise, timeoutMs, onFulfilled) { + let timer + try { + await Promise.race([ + promise.then(onFulfilled, () => {}), + new Promise((resolve) => { + timer = setTimeout(resolve, timeoutMs) + }), + ]) + } finally { + clearTimeout(timer) + } +} + +export function eventSummary(frame) { + const event = recordValue(frame.data) + // Retained Bridge streams wrap the native event as envelope.event.event. + // Pi puts provider and model on message_start.message (or messages[*]). + const bridgeEvent = recordValue(event?.event) + const nativeEvent = recordValue(bridgeEvent?.event) + const nativeData = recordValue(nativeEvent?.data) + const nativeProviderEvent = recordValue(nativeEvent?.providerEvent) + const nativeMessage = recordValue(nativeEvent?.message) + const nativeMessages = Array.isArray(nativeEvent?.messages) + ? nativeEvent.messages.map(recordValue).filter(Boolean) + : [] + const candidates = [ + event, + bridgeEvent, + recordValue(event?.data), + recordValue(event?.providerEvent), + nativeEvent, + nativeData, + nativeProviderEvent, + nativeMessage, + ...nativeMessages, + ].filter(Boolean) + const eventType = + stringValue(frame.event) ?? + candidates + .map((candidate) => stringValue(candidate.type) ?? stringValue(candidate.kind)) + .find(Boolean) + const backend = candidates.map((candidate) => stringValue(candidate.backend)).find(Boolean) + const provider = candidates + .map((candidate) => stringValue(candidate.provider) ?? stringValue(candidate.providerName)) + .find(Boolean) + const model = candidates.map((candidate) => stringValue(candidate.model)).find(Boolean) + const status = candidates.map((candidate) => stringValue(candidate.status)).find(Boolean) + return { + ...(eventType === undefined ? {} : { type: eventType }), + ...(backend === undefined ? {} : { backend }), + ...(provider === undefined ? {} : { provider }), + ...(model === undefined ? {} : { model }), + ...(status === undefined ? {} : { status }), + } +} + +function appendSseFrames(buffer, maxEvents) { + const frames = [] + let remainder = buffer + while (frames.length < maxEvents) { + const separator = remainder.indexOf('\n\n') + if (separator < 0) break + const frame = remainder.slice(0, separator) + remainder = remainder.slice(separator + 2) + frames.push(...parseSseEvents(`${frame}\n\n`)) + } + return { frames: frames.slice(0, maxEvents), remainder } +} + +async function captureRunEvents( + endpoint, + runId, + token, + { timeoutMs = DEFAULT_EVENT_TIMEOUT_MS, maxEvents = DEFAULT_MAX_SSE_EVENTS } = {}, +) { + const controller = new AbortController() + const timer = setTimeout(() => controller.abort(), timeoutMs) + let response + let reader + let raw = '' + let frames = [] + let remainder = '' + try { + response = await fetch(`${endpoint}/v1/runs/${encodeURIComponent(runId)}/events`, { + headers: { + accept: 'text/event-stream', + ...(token === undefined ? {} : { authorization: `Bearer ${token}` }), + }, + signal: controller.signal, + }) + if (!response.ok || !response.body) { + return { + ok: false, + status: response.status, + error: `run events returned HTTP ${String(response.status)}`, + events: [], + } + } + reader = response.body.getReader() + const decoder = new TextDecoder() + while (frames.length < maxEvents) { + const next = await reader.read() + if (next.done) break + raw += decoder.decode(next.value, { stream: true }) + if (Buffer.byteLength(raw) > 128_000) { + return { + ok: false, + status: response.status, + error: 'run events exceeded the bounded observation window', + events: frames.map(eventSummary), + } + } + const parsed = appendSseFrames(`${remainder}${raw}`, maxEvents - frames.length) + frames = [...frames, ...parsed.frames] + remainder = parsed.remainder + raw = '' + } + return { + ok: true, + status: response.status, + contentType: response.headers.get('content-type'), + events: frames.map(eventSummary), + } + } catch (error) { + if (response?.ok === true) { + return { + ok: true, + status: response.status, + contentType: response.headers.get('content-type'), + events: frames.map(eventSummary), + ...(frames.length === 0 + ? { + error: redactString( + error instanceof Error ? error.message : String(error), + token ? [token] : [], + ), + } + : {}), + } + } + return { + ok: false, + status: response?.status, + error: redactString( + error instanceof Error ? error.message : String(error), + token ? [token] : [], + ), + events: frames.map(eventSummary), + } + } finally { + clearTimeout(timer) + controller.abort() + if (reader !== undefined) await reader.cancel().catch(() => {}) + } +} + +export function observedProviderAndModel(events, expectedRoute = NATIVE_CONTINUATION_MODEL) { + const target = nativeContinuationTarget(expectedRoute) + const backends = [...new Set(events.map((event) => event.backend).filter(Boolean))] + const providers = [...new Set(events.map((event) => event.provider).filter(Boolean))] + const models = [...new Set(events.map((event) => event.model).filter(Boolean))] + return { + backends, + providers, + models, + backend: backends.find((value) => value === target?.runner), + provider: providers.find((value) => value === target?.provider), + model: models.find( + (value) => value === target?.model || value.endsWith(`/${target?.model ?? ''}`), + ), + } +} + +function observedIdentityMatchesSession(observed, session) { + const target = nativeContinuationTarget(session?.model) + if (target === undefined) return false + return ( + observed.backend === session?.backend && + observed.backends.every((value) => value === session?.backend) && + observed.providers.every((value) => value === target.provider) && + observed.models.every( + (value) => `${observed.backend}/${target.provider}/${value}` === session?.model, + ) && + observed.provider === target.provider && + observed.model !== undefined && + `${observed.backend}/${observed.provider}/${observed.model}` === session?.model + ) +} + +export function assertObservedIdentity(observed, session) { + assertCondition( + (observed.backend === undefined || observed.backend === session?.backend) && + (observed.provider === undefined && observed.model === undefined + ? true + : observedIdentityMatchesSession(observed, session)), + 'LIVE_NATIVE_PROVIDER_UNVERIFIED', + 'live events reported a provider or model that did not match the retained session route', + { + session, + backends: observed.backends, + providers: observed.providers, + models: observed.models, + }, + ) +} + +async function readActiveStatus(endpoint, runId, token, timeoutMs) { + const response = await requestJson( + endpoint, + `/v1/runs/${encodeURIComponent(runId)}`, + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + ) + requireResponse(response, 200, 'active run status') + const status = statusSummary(response.body) + assertCondition( + status?.status === 'running' && status.terminal === false, + 'LIVE_NATIVE_ADMISSION_NOT_ACTIVE', + 'native continuation was not observable as an active run after admission', + { status }, + ) + return status +} + +async function closeSession(endpoint, sessionId, token, timeoutMs) { + const response = await requestJson( + endpoint, + `/v1/sessions/${encodeURIComponent(sessionId)}/close`, + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + { method: 'POST' }, + ) + requireResponse(response, 200, `close session ${sessionId}`) + assertCondition( + recordValue(response.body)?.closed === true, + 'LIVE_NATIVE_CLEANUP_FAILED', + 'CLI Bridge did not confirm retained session cleanup', + ) + return { + status: response.status, + closed: true, + session: statusSummary(recordValue(response.body)?.session), + } +} + +async function firstTurn(environment, sessionId, suffix, prompt, endpoint, token, timeoutMs) { + const session = environment.session(sessionId) + const startedAt = performance.now() + const result = await session.prompt({ + prompt, + turnId: `${suffix}-turn-1`, + executionId: `${suffix}-execution-1`, + }) + const elapsedMs = Math.round(performance.now() - startedAt) + assertCondition( + result.success === true && result.metadata?.status === 'done', + 'LIVE_NATIVE_FIRST_TURN_FAILED', + 'the real Pi first turn did not complete successfully', + { status: result.metadata?.status }, + ) + const controlRef = assertRunCoordinates(session.controlRef, 'first turn control reference') + const boundaryValue = await session.contextBoundary?.() + assertCondition( + boundaryValue !== null && boundaryValue !== undefined, + 'LIVE_NATIVE_BOUNDARY_MISSING', + 'the real Pi session did not return a context boundary', + ) + const boundary = NativeContextBoundaryProofSchema.parse(boundaryValue) + assertBoundaryCoordinates(boundary, controlRef) + const sessionIdentity = await readSessionIdentity(endpoint, sessionId, token, timeoutMs) + return { + session, + controlRef, + boundary, + receipt: { + success: true, + status: result.metadata?.status, + elapsedMs, + run: referenceSummary(controlRef), + boundary: boundarySummary(boundary), + session: sessionIdentity, + }, + } +} + +async function runCancellationCase({ + environment, + endpoint, + token, + timeoutMs, + suffix, + cleanupReports = [], +}) { + const sessionId = `${suffix}-session` + let session + let continuationPromise + let admitted + let cancellationSent = false + let terminalOutcome + let cleanup + let cleanupCancellation = { attempted: false } + try { + const first = await firstTurn( + environment, + sessionId, + suffix, + DEFAULT_FIRST_PROMPT, + endpoint, + token, + timeoutMs, + ) + session = first.session + const continuation = nativeContinuationRequest({ + operationId: `${suffix}-continue`, + run: first.controlRef, + expectedBoundary: first.boundary, + prompt: DEFAULT_CANCEL_PROMPT, + }) + const admissionStartedAt = performance.now() + let resolveAdmission + let rejectAdmission + const admissionPromise = new Promise((resolve, reject) => { + resolveAdmission = resolve + rejectAdmission = reject + }) + continuationPromise = session.continueNative?.(continuation.request, { + turn: continuation.turn, + onAdmission: (controlRef) => { + try { + const parsed = assertRunCoordinates(controlRef, 'native continuation admission') + if (!advancedReference(first.controlRef, parsed)) { + rejectAdmission( + new Error('native continuation admission did not advance the run identity'), + ) + return + } + admitted = { + controlRef: parsed, + elapsedMs: Math.round(performance.now() - admissionStartedAt), + } + resolveAdmission(admitted) + } catch (error) { + rejectAdmission(error) + } + }, + }) + assertCondition( + continuationPromise !== undefined, + 'LIVE_NATIVE_CONTINUATION_UNAVAILABLE', + 'the Braid CLI Bridge provider did not expose native continuation', + ) + const admission = await raceWithTimeout( + [ + admissionPromise, + continuationPromise.then( + () => + fail( + 'LIVE_NATIVE_ADMISSION_MISSING', + 'native continuation completed without early admission', + ), + (error) => { + throw error + }, + ), + ], + timeoutMs, + 'native continuation admission timed out', + ) + const activeStatus = await readActiveStatus( + endpoint, + admission.controlRef.runId, + token, + timeoutMs, + ) + const events = await captureRunEvents(endpoint, admission.controlRef.runId, token) + assertCondition( + events.ok === true && events.events.length > 0, + 'LIVE_NATIVE_EVENTS_UNAVAILABLE', + 'the admitted real run did not expose live events', + { status: events.status, eventCount: events.events.length, error: events.error }, + ) + const observed = observedProviderAndModel(events.events, first.receipt.session.model) + assertObservedIdentity(observed, first.receipt.session) + const cancellation = exactCancellationRequest({ + operationId: `${suffix}-cancel`, + run: admission.controlRef, + reason: 'live native continuation cancellation proof', + }) + const cancelStartedAt = performance.now() + const acknowledgement = await session.cancelRun?.(cancellation) + cancellationSent = true + const cancelElapsedMs = Math.round(performance.now() - cancelStartedAt) + const parsedAcknowledgement = AgentRunCancellationAcknowledgementSchema.parse(acknowledgement) + assertCondition( + agentRunCancellationAcknowledgementMatchesRequest(cancellation, parsedAcknowledgement), + 'LIVE_NATIVE_CANCEL_IDENTITY_MISMATCH', + 'exact cancellation acknowledgement did not match its request', + ) + assertCondition( + parsedAcknowledgement.status === 'accepted' || parsedAcknowledgement.status === 'replayed', + 'LIVE_NATIVE_CANCEL_REJECTED', + 'exact cancellation was not accepted', + { status: parsedAcknowledgement.status, effect: parsedAcknowledgement.effect }, + ) + assertCondition( + parsedAcknowledgement.effect === 'cancel_requested' || + parsedAcknowledgement.effect === 'cancelled', + 'LIVE_NATIVE_CANCEL_UNCERTAIN', + 'exact cancellation did not return a known cancellation effect', + { effect: parsedAcknowledgement.effect }, + ) + const terminalStartedAt = performance.now() + terminalOutcome = await continuationPromise + const terminalElapsedMs = Math.round(performance.now() - terminalStartedAt) + const parsedOutcome = AgentNativeContextContinuationResultSchema.parse(terminalOutcome) + assertCondition( + parsedOutcome.acknowledgement.status === 'accepted' || + parsedOutcome.acknowledgement.status === 'replayed', + 'LIVE_NATIVE_CANCEL_TERMINAL_REJECTED', + 'the continuation did not return a durable terminal acknowledgement', + { status: parsedOutcome.acknowledgement.status }, + ) + assertCondition( + parsedOutcome.result.success === false && + parsedOutcome.result.metadata?.status === 'cancelled', + 'LIVE_NATIVE_CANCEL_TERMINAL_NOT_CANCELLED', + 'the cancelled continuation did not replay a cancelled terminal result', + { status: parsedOutcome.result.metadata?.status, success: parsedOutcome.result.success }, + ) + assertCondition( + agentNativeContextContinuationResultMatchesRequest(continuation.request, parsedOutcome), + 'LIVE_NATIVE_RESULT_IDENTITY_MISMATCH', + 'the cancelled continuation result did not match its exact request', + ) + const terminalStatusResponse = await requestJson( + endpoint, + `/v1/runs/${encodeURIComponent(admission.controlRef.runId)}`, + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + ) + requireResponse(terminalStatusResponse, 200, 'cancelled terminal status') + const terminalStatus = statusSummary(terminalStatusResponse.body) + assertCondition( + terminalStatus?.status === 'cancelled' && terminalStatus.terminal === true, + 'LIVE_NATIVE_CANCEL_TERMINAL_NOT_CANCELLED', + 'the Bridge terminal run snapshot was not cancelled', + { status: terminalStatus }, + ) + const body = nativeContinuationBody(continuation) + const replayResponse = await requestJson( + endpoint, + `/v1/sessions/${encodeURIComponent(sessionId)}/continue`, + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + { method: 'POST', body }, + ) + requireResponse(replayResponse, 200, 'cancelled continuation replay') + const replayOutcome = AgentNativeContextContinuationResultSchema.parse(replayResponse.body) + assertCondition( + replayOutcome.acknowledgement.status === 'replayed' && + replayOutcome.result.success === false && + replayOutcome.result.metadata?.status === 'cancelled', + 'LIVE_NATIVE_CANCEL_REPLAY_INVALID', + 'the post-terminal continuation replay was not byte-stable cancelled state', + { + status: replayOutcome.acknowledgement.status, + resultStatus: replayOutcome.result.metadata?.status, + }, + ) + assertCondition( + agentNativeContextContinuationResultMatchesRequest(continuation.request, replayOutcome), + 'LIVE_NATIVE_REPLAY_IDENTITY_MISMATCH', + 'the cancelled terminal replay did not match its exact request', + ) + const admissionReplayResponses = await Promise.all([ + requestJson( + endpoint, + `/v1/sessions/${encodeURIComponent(sessionId)}/continue?return=admission`, + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + { method: 'POST', body, captureWireDigest: true }, + ), + requestJson( + endpoint, + `/v1/sessions/${encodeURIComponent(sessionId)}/continue?return=admission`, + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + { method: 'POST', body, captureWireDigest: true }, + ), + ]) + for (const response of admissionReplayResponses) + requireResponse(response, 202, 'duplicate admission replay') + const admissionReplays = admissionReplayResponses.map((response) => + AgentNativeContextContinuationAdmissionSchema.parse(response.body), + ) + for (const replay of admissionReplays) { + assertCondition( + agentNativeContextContinuationAdmissionMatchesRequest(continuation.request, replay), + 'LIVE_NATIVE_ADMISSION_REPLAY_IDENTITY_MISMATCH', + 'duplicate admission did not match the exact continuation request', + ) + } + const firstWire = admissionReplayResponses[0].wire + const secondWire = admissionReplayResponses[1].wire + assertCondition( + firstWire?.bytes === secondWire?.bytes && firstWire?.digest === secondWire?.digest, + 'LIVE_NATIVE_ADMISSION_REPLAY_NOT_BYTE_IDENTICAL', + 'duplicate admission responses were not byte-identical', + { firstWire, secondWire }, + ) + const terminalAt = admissionStartedAt + admission.elapsedMs + terminalElapsedMs + return { + sessionId, + first: first.receipt, + admission: { + ...admitted, + request: { + operationId: continuation.request.operationId, + requestDigest: continuation.request.requestDigest, + turnDigest: continuation.request.turnDigest, + }, + }, + active: { + status: activeStatus, + events: { + status: events.status, + contentType: events.contentType, + count: events.events.length, + types: [...new Set(events.events.map((event) => event.type).filter(Boolean))], + session: first.receipt.session, + backends: observed.backends, + providers: observed.providers, + models: observed.models, + }, + }, + cancellation: { + request: { + operationId: cancellation.operationId, + requestDigest: cancellation.requestDigest, + }, + acknowledgement: { + status: parsedAcknowledgement.status, + effect: parsedAcknowledgement.effect, + }, + elapsedMs: cancelElapsedMs, + }, + terminal: { + status: terminalStatus, + acknowledgement: parsedOutcome.acknowledgement.status, + result: { + success: parsedOutcome.result.success, + status: parsedOutcome.result.metadata?.status, + error: parsedOutcome.result.error, + }, + elapsedMs: terminalElapsedMs, + }, + terminalReplay: { + status: replayResponse.status, + acknowledgement: replayOutcome.acknowledgement.status, + result: { + success: replayOutcome.result.success, + status: replayOutcome.result.metadata?.status, + }, + }, + duplicateAdmission: { + statuses: admissionReplayResponses.map((response) => response.status), + phases: admissionReplays.map((replay) => replay.phase), + controlRefs: admissionReplays.map((replay) => referenceSummary(replay.controlRef)), + byteIdentical: true, + wire: { bytes: firstWire.bytes, digest: firstWire.digest }, + }, + assertions: { + admissionBeforeTerminal: true, + activeStatus: true, + activeEvents: true, + exactCancel: true, + cancelledTerminalReplay: true, + duplicateAdmissionByteIdentical: true, + timing: { + admissionElapsedMs: admitted.elapsedMs, + cancelElapsedMs: cancelElapsedMs, + terminalElapsedMs: terminalElapsedMs, + terminalObservedAfterCancel: terminalAt >= admissionStartedAt, + }, + }, + } + } finally { + if (continuationPromise !== undefined && !terminalOutcome && admitted && !cancellationSent) { + try { + const cleanupRequest = exactCancellationRequest({ + operationId: `${suffix}-cleanup-cancel`, + run: admitted.controlRef, + reason: 'live check cleanup', + }) + const acknowledgement = await session?.cancelRun?.(cleanupRequest) + cleanupCancellation = { + attempted: true, + acknowledged: acknowledgement !== undefined, + } + } catch (error) { + cleanupCancellation = { + attempted: true, + acknowledged: false, + error: errorEvidence(error), + } + } + } + if (continuationPromise !== undefined && !terminalOutcome) { + await observeSettlement(continuationPromise, Math.min(timeoutMs, 10_000), (result) => { + terminalOutcome = result + }) + } + try { + cleanup = await closeSession(endpoint, sessionId, token, timeoutMs) + } catch (error) { + cleanup = { closed: false, error: errorEvidence(error) } + } + cleanupReports.push({ + scope: 'session', + sessionId, + continuationObserved: terminalOutcome !== undefined, + cancellation: cleanupCancellation, + ...cleanup, + }) + } +} + +async function runSuccessCase({ + environment, + endpoint, + token, + timeoutMs, + suffix, + cleanupReports = [], +}) { + const sessionId = `${suffix}-session` + let session + let continuationPromise + let admitted + let terminalOutcome + let cleanup + let cleanupCancellation = { attempted: false } + try { + const first = await firstTurn( + environment, + sessionId, + suffix, + DEFAULT_FIRST_PROMPT, + endpoint, + token, + timeoutMs, + ) + session = first.session + const continuation = nativeContinuationRequest({ + operationId: `${suffix}-continue`, + run: first.controlRef, + expectedBoundary: first.boundary, + prompt: DEFAULT_SUCCESS_PROMPT, + }) + const admissionStartedAt = performance.now() + continuationPromise = session.continueNative?.(continuation.request, { + turn: continuation.turn, + onAdmission: (controlRef) => { + admitted = { + controlRef: assertRunCoordinates(controlRef, 'successful continuation admission'), + elapsedMs: Math.round(performance.now() - admissionStartedAt), + } + }, + }) + assertCondition( + continuationPromise !== undefined, + 'LIVE_NATIVE_CONTINUATION_UNAVAILABLE', + 'the Braid CLI Bridge provider did not expose native continuation', + ) + terminalOutcome = await continuationPromise + const parsedOutcome = AgentNativeContextContinuationResultSchema.parse(terminalOutcome) + assertCondition( + admitted !== undefined, + 'LIVE_NATIVE_ADMISSION_MISSING', + 'successful continuation omitted early admission', + ) + assertCondition( + advancedReference(first.controlRef, admitted.controlRef), + 'LIVE_NATIVE_ADMISSION_IDENTITY_MISMATCH', + 'successful continuation did not advance the run identity', + ) + assertCondition( + (parsedOutcome.acknowledgement.status === 'accepted' || + parsedOutcome.acknowledgement.status === 'replayed') && + parsedOutcome.result.success === true && + parsedOutcome.result.metadata?.status === 'done', + 'LIVE_NATIVE_SUCCESS_CONTINUATION_FAILED', + 'the real Pi successful continuation did not complete', + { + acknowledgement: parsedOutcome.acknowledgement.status, + status: parsedOutcome.result.metadata?.status, + success: parsedOutcome.result.success, + }, + ) + assertCondition( + agentNativeContextContinuationResultMatchesRequest(continuation.request, parsedOutcome), + 'LIVE_NATIVE_RESULT_IDENTITY_MISMATCH', + 'the successful continuation result did not match its exact request', + ) + const terminalStatusResponse = await requestJson( + endpoint, + `/v1/runs/${encodeURIComponent(admitted.controlRef.runId)}`, + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + ) + requireResponse(terminalStatusResponse, 200, 'successful terminal status') + const terminalStatus = statusSummary(terminalStatusResponse.body) + assertCondition( + terminalStatus?.status === 'done' && terminalStatus.terminal === true, + 'LIVE_NATIVE_SUCCESS_TERMINAL_INVALID', + 'the successful continuation did not expose a done terminal run', + { status: terminalStatus }, + ) + return { + sessionId, + first: first.receipt, + admission: { + ...admitted, + request: { + operationId: continuation.request.operationId, + requestDigest: continuation.request.requestDigest, + turnDigest: continuation.request.turnDigest, + }, + }, + terminal: { + status: terminalStatus, + acknowledgement: parsedOutcome.acknowledgement.status, + result: { + success: parsedOutcome.result.success, + status: parsedOutcome.result.metadata?.status, + text: parsedOutcome.result.text, + }, + }, + assertions: { + admissionBeforeTerminal: admitted.elapsedMs >= 0, + successfulContinuation: true, + }, + } + } finally { + if (continuationPromise !== undefined && !terminalOutcome && admitted) { + try { + const acknowledgement = await session?.cancelRun?.( + exactCancellationRequest({ + operationId: `${suffix}-cleanup-cancel`, + run: admitted.controlRef, + reason: 'live check cleanup', + }), + ) + cleanupCancellation = { + attempted: true, + acknowledged: acknowledgement !== undefined, + } + } catch (error) { + cleanupCancellation = { + attempted: true, + acknowledged: false, + error: errorEvidence(error), + } + } + await observeSettlement(continuationPromise, Math.min(timeoutMs, 10_000), (result) => { + terminalOutcome = result + }) + } + try { + cleanup = await closeSession(endpoint, sessionId, token, timeoutMs) + } catch (error) { + cleanup = { closed: false, error: errorEvidence(error) } + } + cleanupReports.push({ + scope: 'session', + sessionId, + continuationObserved: terminalOutcome !== undefined, + cancellation: cleanupCancellation, + ...cleanup, + }) + } +} + +function defaultEndpoint() { + return ( + process.env.BRAID_CLI_BRIDGE_URL ?? + process.env.CLI_BRIDGE_URL ?? + `http://127.0.0.1:${process.env.BRIDGE_PORT ?? '3344'}` + ) +} + +function receiptBase(endpoint, model, timeoutMs) { + return { + schema: NATIVE_CONTINUATION_RECEIPT_SCHEMA, + command: 'pnpm test:live:bridge:continuation', + scope: { + claims: [ + 'admission before terminal output', + 'active status and event access', + 'exact cancellation', + 'cancelled terminal replay', + 'byte-identical duplicate admission', + 'successful native continuation', + ], + provider: 'real Pi through Tangle Router', + }, + startedAt: new Date().toISOString(), + runtime: { + node: process.version, + platform: process.platform, + arch: process.arch, + }, + environment: { + endpoint: endpointForEvidence(endpoint), + bearerConfigured: bridgeAuthToken() !== undefined, + model, + runner: RUNNER_NAME, + provider: ROUTER_PROVIDER, + timeoutMs, + }, + } +} + +/** Run the provider-backed live continuation release check. */ +export async function runNativeContinuationProof({ + endpoint: rawEndpoint = defaultEndpoint(), + token = bridgeAuthToken(), + model = NATIVE_CONTINUATION_MODEL, + timeoutMs = Number(process.env.BRAID_LIVE_BRIDGE_TIMEOUT_MS ?? defaultTimeoutMs), + now = () => new Date().toISOString(), +} = {}) { + const endpoint = safeEndpoint(rawEndpoint) + const target = nativeContinuationTarget(model) + assertCondition( + Number.isSafeInteger(timeoutMs) && timeoutMs > 0, + 'LIVE_NATIVE_TIMEOUT_INVALID', + 'native continuation timeout must be a positive safe integer', + ) + if (!new URL(endpoint).hostname.match(/^(localhost|127\.0\.0\.1|::1)$/u) && token === undefined) + fail( + 'BRIDGE_CREDENTIAL_REQUIRED', + 'a non-loopback CLI Bridge endpoint requires a bearer credential', + {}, + exitCodes.unavailable, + ) + assertCondition( + target !== undefined, + 'LIVE_NATIVE_MODEL_INVALID', + `native continuation proof requires a ${RUNNER_NAME}/${ROUTER_PROVIDER}/ route`, + ) + const health = await requestJson( + endpoint, + '/health', + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + ) + requireResponse(health, 200, 'CLI Bridge health', { unavailable: true }) + assertCondition( + healthBackendsReady(health, [target.runner]), + 'LIVE_NATIVE_BACKEND_UNAVAILABLE', + 'CLI Bridge did not report a ready Pi backend', + { health: statusSummary(health.body) }, + exitCodes.unavailable, + ) + const capabilityResponse = await requestJson( + endpoint, + `/v1/capabilities?model=${encodeURIComponent(model)}`, + token, + Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + ) + requireResponse(capabilityResponse, 200, 'CLI Bridge capabilities', { unavailable: true }) + const capabilities = assertNativeCapabilities(capabilityResponse.body) + const provider = createCliBridgeProvider({ + baseUrl: endpoint, + ...(token === undefined ? {} : { bearerToken: token }), + defaultModel: model, + defaultExecution: { kind: 'host', jail: { mode: 'fs-jail' } }, + headersTimeoutMs: Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + bodyTimeoutMs: Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + cancelWaitMs: Math.min(timeoutMs, DEFAULT_REQUEST_TIMEOUT_MS), + }) + const providerCapabilities = assertNativeCapabilities(await provider.capabilities()) + let environment + const startedAt = now() + const cleanupReports = [] + let proof + let failure + try { + environment = await provider.create({ + profile: { + name: 'Braid live native continuation', + harness: target.runner, + model: { provider: target.provider, default: target.model }, + }, + }) + const suffix = `braid-live-native-${Date.now()}` + const cancellation = await runCancellationCase({ + environment, + endpoint, + token, + timeoutMs, + suffix: `${suffix}-cancel`, + cleanupReports, + }) + const success = await runSuccessCase({ + environment, + endpoint, + token, + timeoutMs, + suffix: `${suffix}-success`, + cleanupReports, + }) + assertCondition( + cleanupReports.every((report) => report.scope !== 'session' || report.closed === true), + 'LIVE_NATIVE_CLEANUP_FAILED', + 'the live continuation check did not confirm every retained session was closed', + { cleanup: cleanupReports }, + ) + proof = { + schema: NATIVE_CONTINUATION_RECEIPT_SCHEMA, + startedAt, + capabilities: capabilitySummary(providerCapabilities), + bridgeCapabilities: capabilitySummary(capabilities), + provider: { + name: provider.name, + environmentId: environment.id, + route: model, + real: true, + }, + cleanup: cleanupReports, + cancellation, + success, + assertions: { + admissionBeforeTerminal: cancellation.assertions.admissionBeforeTerminal, + activeStatus: cancellation.assertions.activeStatus, + activeEvents: cancellation.assertions.activeEvents, + exactCancel: cancellation.assertions.exactCancel, + cancelledTerminalReplay: cancellation.assertions.cancelledTerminalReplay, + duplicateAdmissionByteIdentical: cancellation.assertions.duplicateAdmissionByteIdentical, + successfulContinuation: success.assertions.successfulContinuation, + }, + } + } catch (error) { + failure = error + } finally { + if (environment !== undefined) { + try { + await environment.destroy?.() + cleanupReports.push({ + scope: 'environment', + environmentId: environment.id, + destroyed: true, + }) + } catch (error) { + cleanupReports.push({ + scope: 'environment', + environmentId: environment.id, + destroyed: false, + error: errorEvidence(error), + }) + } + } + } + if (failure !== undefined) { + if (failure instanceof LiveBridgeError) { + failure.details = { ...failure.details, cleanup: cleanupReports } + throw failure + } + throw new LiveBridgeError( + 'LIVE_NATIVE_CONTINUATION_FAILED', + failure instanceof Error ? failure.message : String(failure), + exitCodes.failed, + { cause: errorEvidence(failure), cleanup: cleanupReports }, + ) + } + assertCondition( + cleanupReports.every((report) => report.scope !== 'environment' || report.destroyed === true), + 'LIVE_NATIVE_CLEANUP_FAILED', + 'the live continuation check did not confirm provider environment cleanup', + { cleanup: cleanupReports }, + ) + return proof +} + +/** Write a redacted native continuation receipt to the release artifact path. */ +export async function writeNativeContinuationReceipt(receipt, destination) { + const output = + destination ?? + process.env.BRAID_LIVE_BRIDGE_CONTINUATION_EVIDENCE ?? + NATIVE_CONTINUATION_EVIDENCE_PATH + return writeEvidence(receipt, output) +} + +/** Execute the live check and always persist a sanitized receipt. */ +export async function executeNativeContinuationReleaseCheck(options = {}) { + const endpoint = safeEndpoint(options.endpoint ?? defaultEndpoint()) + const model = + options.model ?? process.env.BRAID_LIVE_BRIDGE_CONTINUATION_MODEL ?? NATIVE_CONTINUATION_MODEL + const timeoutMs = + options.timeoutMs ?? Number(process.env.BRAID_LIVE_BRIDGE_TIMEOUT_MS ?? defaultTimeoutMs) + const base = receiptBase(endpoint, model, timeoutMs) + let proof + let failure + try { + proof = await runNativeContinuationProof({ ...options, endpoint, model, timeoutMs }) + } catch (error) { + failure = error + } + const receipt = evidenceValue({ + ...base, + ...(proof ?? {}), + status: + failure === undefined + ? 'passed' + : failure instanceof LiveBridgeError && failure.exitCode === exitCodes.unavailable + ? 'unavailable' + : 'failed', + ...(failure === undefined ? {} : { error: errorEvidence(failure) }), + finishedAt: new Date().toISOString(), + }) + const evidencePath = await writeNativeContinuationReceipt(receipt, options.evidencePath) + if (failure !== undefined) { + if (failure instanceof LiveBridgeError) { + failure.details = { ...failure.details, evidencePath } + throw failure + } + throw new LiveBridgeError( + 'LIVE_NATIVE_CONTINUATION_FAILED', + failure instanceof Error ? failure.message : String(failure), + exitCodes.failed, + { evidencePath }, + ) + } + return { receipt, evidencePath } +} + +function isMainModule() { + return process.argv[1] !== undefined && fileURLToPath(import.meta.url) === process.argv[1] +} + +if (isMainModule()) { + try { + const result = await executeNativeContinuationReleaseCheck() + process.stdout.write( + `${JSON.stringify({ + status: result.receipt.status, + evidence: result.evidencePath, + assertions: result.receipt.assertions, + })}\n`, + ) + } catch (error) { + const details = error instanceof LiveBridgeError ? error.details : {} + process.stdout.write( + `${JSON.stringify({ + status: + error instanceof LiveBridgeError && error.exitCode === exitCodes.unavailable + ? 'unavailable' + : 'failed', + evidence: details?.evidencePath, + error: errorEvidence(error), + })}\n`, + ) + process.exitCode = error instanceof LiveBridgeError ? error.exitCode : exitCodes.failed + } +} diff --git a/scripts/live-bridge/process-tree.mjs b/scripts/live-bridge/process-tree.mjs index 26a7e33d..bb920eb7 100644 --- a/scripts/live-bridge/process-tree.mjs +++ b/scripts/live-bridge/process-tree.mjs @@ -69,7 +69,7 @@ function processStat(pid) { } } -function processTable(token) { +function processTable(token, requiredPids) { let names try { names = readdirSync(procRoot) @@ -80,22 +80,45 @@ function processTable(token) { const marked = [] for (const name of names) { if (!/^\d+$/u.test(name)) continue + const pid = Number(name) let record + let marker + let markerInspected = false try { - record = processStat(Number(name)) - } catch (error) { - return { error: `The POSIX process table could not be inspected: ${errorMessage(error)}` } + record = processStat(pid) + } catch { + try { + marker = readOwnershipMarker(pid, token) + markerInspected = true + } catch (markerError) { + if (markerError?.code !== 'EACCES') + return { + error: `The POSIX process ownership could not be inspected: ${errorMessage(markerError)}`, + } + markerInspected = true + } + if (marker !== true && !requiredPids.has(pid)) continue + try { + record = processStat(pid) + } catch (retryError) { + return { + error: `The POSIX process table could not be inspected: ${errorMessage(retryError)}`, + } + } } if (record === undefined) continue records.set(record.pid, record) - try { - if (readOwnershipMarker(record.pid, token) === true) marked.push(record) - } catch (error) { - if (error?.code !== 'EACCES') - return { - error: `The POSIX process ownership could not be inspected: ${errorMessage(error)}`, - } + if (!markerInspected) { + try { + marker = readOwnershipMarker(record.pid, token) + } catch (error) { + if (error?.code !== 'EACCES') + return { + error: `The POSIX process ownership could not be inspected: ${errorMessage(error)}`, + } + } } + if (marker === true) marked.push(record) } return { records, marked } } @@ -178,7 +201,8 @@ class PosixProcessTreeTracker { this.failure = 'The POSIX process has no valid owner PID' return } - const table = processTable(this.token) + const requiredPids = new Set([this.rootPid, ...this.entries.keys()]) + const table = processTable(this.token, requiredPids) if (table.error !== undefined) { this.failure = table.error return diff --git a/scripts/live-bridge/protocol.mjs b/scripts/live-bridge/protocol.mjs index 9ac93a3b..a8615db9 100644 --- a/scripts/live-bridge/protocol.mjs +++ b/scripts/live-bridge/protocol.mjs @@ -32,6 +32,24 @@ export function runFromState(state, runId) { return state?.runs?.find((run) => run.id === runId) } +export function runWithAdmissionReceipt(run, admission) { + if (run === undefined || admission?.runId !== run.id) return run + return { ...run, receipt: structuredClone(admission) } +} + +export function eventPayload(response) { + if (response?.type !== 'event') return undefined + const payload = response.event?.payload + return payload !== null && typeof payload === 'object' && !Array.isArray(payload) + ? payload + : undefined +} + +export function runEventPayload(response, runId) { + const payload = eventPayload(response) + return payload?.runId === runId ? payload : undefined +} + export function terminalMessage(state, runId) { return ( state?.messages?.findLast?.( @@ -60,13 +78,14 @@ export function interactionFromResponse(response, runId) { } } if (response?.type === 'event' && response.event?.kind === 'run.interaction') { - if (response.event.runId !== runId) return undefined - const interactionId = response.event.interactionId ?? response.event.request?.id + const payload = runEventPayload(response, runId) + const request = payload?.interaction + const interactionId = request?.id if (typeof interactionId !== 'string' || interactionId.length === 0) return undefined return { runId, interactionId, - request: response.event.request ?? response.event, + request, } } return undefined @@ -99,6 +118,16 @@ export function capabilityAvailability(providerValue, effectiveValue) { } } +export function retainedCancellationAdvertised(capabilities) { + const retained = capabilities?.retainedControl + return ( + retained?.exactRunIdentity === true && + retained.resultIdentity === true && + retained.eventIdentity === true && + retained.cancellationIdempotency === true + ) +} + export function assertSemanticOutcome(name, status, advertised, details = {}) { const expected = advertised ? 'verified' : 'reported-unavailable' if (status === expected) return diff --git a/scripts/live-bridge/release-operations.mjs b/scripts/live-bridge/release-operations.mjs index b47c9bdc..a17ebfba 100644 --- a/scripts/live-bridge/release-operations.mjs +++ b/scripts/live-bridge/release-operations.mjs @@ -6,7 +6,9 @@ import { classifyPackedStartup, interactionFromResponse, requestBase, + runEventPayload, runFromState, + runWithAdmissionReceipt, terminalMessage, } from './protocol.mjs' import { evidenceValue } from './redaction.mjs' @@ -293,9 +295,11 @@ export async function executeInteractiveProtocol( timeoutMs, ) const interaction = interactionFromResponse(interactionResponse, started.runId) + const interactionPayload = runEventPayload(interactionResponse, started.runId) if ( typeof interaction?.interactionId !== 'string' || - interaction.interactionId.length === 0 + interaction.interactionId.length === 0 || + !Number.isSafeInteger(interactionPayload?.source?.providerSequence) ) { throw new LiveBridgeError( 'LIVE_RELEASE_INTERACTION_INVALID', @@ -347,6 +351,7 @@ export async function executeInteractiveProtocol( const staleCodes = new Set([ 'INTERACTION_RESPONSE_IN_PROGRESS', 'INTERACTION_RESPONSE_CONFLICT', + 'INTERACTION_STALE', ]) if (duplicateResponse.type !== 'error' || !staleCodes.has(duplicateResponse.code)) { throw new LiveBridgeError( @@ -356,6 +361,56 @@ export async function executeInteractiveProtocol( { response: duplicateResponse }, ) } + const responseIndex = session.responses.indexOf(responseAck) + const providerProgress = await session.waitFor( + 'post-response provider progress', + (response) => { + const payload = runEventPayload(response, started.runId) + return ( + session.responses.indexOf(response) > responseIndex && + Number.isSafeInteger(payload?.source?.providerSequence) && + payload.source.providerSequence > interactionPayload.source.providerSequence + ) + }, + timeoutMs, + ) + const providerProgressPayload = runEventPayload(providerProgress, started.runId) + const postResponseState = await operationState( + session, + result, + operationPrefix, + 'post-response', + timeoutMs, + ) + const postResponseRun = runFromState(postResponseState.state, started.runId) + let cleanupCancel + if (['running', 'waiting', 'streaming', 'reconnecting'].includes(postResponseRun?.status)) { + const cancelRequest = operationRequest( + result, + operationPrefix, + 'cleanup-cancel', + 'cancel_run', + { + runId: started.runId, + reason: 'live interactive proof completed', + }, + ) + cleanupCancel = await sendOperationRequest( + session, + result, + cancelRequest, + 'interactive proof cleanup cancellation', + timeoutMs, + ) + if (cleanupCancel.type !== 'ack') { + throw new LiveBridgeError( + 'LIVE_RELEASE_INTERACTION_CLEANUP_FAILED', + 'The named interactive operation did not acknowledge cleanup cancellation', + exitCodes.failed, + { response: cleanupCancel }, + ) + } + } const terminal = await terminalOperationState( session, result, @@ -378,11 +433,13 @@ export async function executeInteractiveProtocol( { run: terminal.run, interaction: interactionState }, ) } - const targetProof = assertTargetRunIdentity(terminal.run, target) - const usage = assertObservedUsage(terminal.run) + const verifiedRun = runWithAdmissionReceipt(terminal.run, started.response.admission) + const targetProof = assertTargetRunIdentity(verifiedRun, target) const retainedInteraction = assertRetainedInteraction( - terminal.run, + session.responses, + started.runId, interaction.interactionId, + responseRequest.operationId, responseAck, ) return { @@ -395,10 +452,27 @@ export async function executeInteractiveProtocol( interaction: evidenceValue(interaction), response: evidenceValue(responseAck), staleDuplicate: evidenceValue(duplicateResponse), - terminalRun: evidenceValue(terminal.run), + providerProgress: evidenceValue({ + kind: providerProgress.event.kind, + sequence: providerProgress.sequence, + revision: providerProgress.revision, + providerSequence: providerProgressPayload.source.providerSequence, + cursor: providerProgressPayload.source.cursor ?? null, + }), + postResponseStatus: postResponseRun?.status ?? null, + ...(cleanupCancel === undefined ? {} : { cleanupCancel: evidenceValue(cleanupCancel) }), + terminalRun: evidenceValue(verifiedRun), interactionStatus: retainedInteraction.status, responseOutcome: retainedInteraction.responseOperation.outcome, - usage, + usage: evidenceValue({ + terminalStatus: verifiedRun.status, + input: verifiedRun.inputTokens, + output: verifiedRun.outputTokens, + tokenStatus: verifiedRun.tokenStatus, + costStatus: verifiedRun.costStatus, + settled: false, + reason: 'The interactive proof cancels after provider progress', + }), }, } }, @@ -466,24 +540,28 @@ export async function executeRestartReconciliation( } const activeStream = await getSession().waitFor( 'restart operation streamed active run event', - (response) => - response.type === 'event' && - response.event?.runId === started.runId && - getSession().responses.indexOf(response) > admissionResponseIndex && - [ - 'run.text.delta', - 'run.part.updated', - 'run.reasoning.delta', - 'run.tool.call', - 'run.tool.result', - 'run.artifact', - 'run.proposal', - 'run.interaction', - ].includes(response.event.kind) && - Number.isSafeInteger(response.event?.provider?.providerSequence) && - response.event.provider.providerSequence > 0, + (response) => { + const payload = runEventPayload(response, started.runId) + return ( + payload !== undefined && + getSession().responses.indexOf(response) > admissionResponseIndex && + [ + 'run.text.delta', + 'run.part.updated', + 'run.reasoning.delta', + 'run.tool.call', + 'run.tool.result', + 'run.artifact', + 'run.proposal', + 'run.interaction', + ].includes(response.event.kind) && + Number.isSafeInteger(payload.source?.providerSequence) && + payload.source.providerSequence > 0 + ) + }, timeoutMs, ) + const activeStreamPayload = runEventPayload(activeStream, started.runId) const streamedState = await operationState( getSession(), result, @@ -515,8 +593,8 @@ export async function executeRestartReconciliation( responseIndex: activeStreamResponseIndex, sequence: activeStream.sequence, revision: activeStream.revision, - providerSequence: activeStream.event.provider.providerSequence, - cursor: activeStream.event.provider.cursor ?? null, + providerSequence: activeStreamPayload.source.providerSequence, + cursor: activeStreamPayload.source.cursor ?? null, }, } const savedCursor = streamedRun?.lastCursor @@ -547,7 +625,7 @@ export async function executeRestartReconciliation( (response) => response.type === 'event' && response.event?.kind === 'run.detached' && - response.event?.runId === started.runId, + runEventPayload(response, started.runId) !== undefined, timeoutMs, ) const detachedState = await operationState( @@ -615,7 +693,7 @@ export async function executeRestartReconciliation( restarted.responses.indexOf(response) >= responseCountBeforeReconnect && response.type === 'event' && response.event?.kind === 'run.reconnecting' && - response.event?.runId === started.runId && + runEventPayload(response, started.runId) !== undefined && Number.isSafeInteger(response.sequence) && response.sequence > 0 && Number.isSafeInteger(response.revision) && @@ -623,25 +701,30 @@ export async function executeRestartReconciliation( timeoutMs, ) const reconnectBoundaryResponseIndex = restarted.responses.indexOf(reconnectBoundaryResponse) + const reconnectBoundaryPayload = runEventPayload(reconnectBoundaryResponse, started.runId) const replayEvent = await restarted.waitFor( 'restart replayed post-cursor event', - (response) => - restarted.responses.indexOf(response) > reconnectBoundaryResponseIndex && - response.type === 'event' && - response.event?.runId === started.runId && - response.event?.kind !== 'run.reconnecting' && - Number.isSafeInteger(response.sequence) && - response.sequence > reconnectBoundaryResponse.sequence && - Number.isSafeInteger(response.revision) && - response.revision > reconnectBoundaryResponse.revision && - Number.isSafeInteger(response.event?.provider?.providerSequence) && - Number.isSafeInteger(savedProviderSequence) && - savedProviderSequence > 0 && - response.event.provider.providerSequence === savedProviderSequence + 1 && - response.sequence <= reconnectResponse.revision && - response.revision <= reconnectResponse.revision, + (response) => { + const payload = runEventPayload(response, started.runId) + return ( + restarted.responses.indexOf(response) > reconnectBoundaryResponseIndex && + payload !== undefined && + response.event?.kind !== 'run.reconnecting' && + Number.isSafeInteger(response.sequence) && + response.sequence > reconnectBoundaryResponse.sequence && + Number.isSafeInteger(response.revision) && + response.revision > reconnectBoundaryResponse.revision && + Number.isSafeInteger(payload.source?.providerSequence) && + Number.isSafeInteger(savedProviderSequence) && + savedProviderSequence > 0 && + payload.source.providerSequence === savedProviderSequence + 1 && + response.sequence <= reconnectResponse.revision && + response.revision <= reconnectResponse.revision + ) + }, timeoutMs, ) + const replayPayload = runEventPayload(replayEvent, started.runId) const terminal = await terminalOperationState( restarted, result, @@ -678,15 +761,15 @@ export async function executeRestartReconciliation( reconnectRequest, reconnectResponse, reconnectBoundary: { - runId: reconnectBoundaryResponse.event.runId, + runId: reconnectBoundaryPayload.runId, kind: reconnectBoundaryResponse.event.kind, responseIndex: reconnectBoundaryResponseIndex, sequence: reconnectBoundaryResponse.sequence, revision: reconnectBoundaryResponse.revision, - savedCursor: reconnectBoundaryResponse.event.after ?? null, + savedCursor: reconnectBoundaryPayload.cursor ?? null, }, replayEvent: { - event: replayEvent.event, + event: replayPayload, kind: replayEvent.event.kind, responseIndex: restarted.responses.indexOf(replayEvent), sequence: replayEvent.sequence, @@ -696,8 +779,9 @@ export async function executeRestartReconciliation( finalState: terminal.response, terminalSession: newProcess.instanceId, }) - const targetProof = assertTargetRunIdentity(terminal.run, target) - const usage = assertObservedUsage(terminal.run) + const verifiedRun = runWithAdmissionReceipt(terminal.run, started.response.admission) + const targetProof = assertTargetRunIdentity(verifiedRun, target) + const usage = assertObservedUsage(verifiedRun) return { runId: started.runId, runIds: [started.runId], diff --git a/scripts/live-bridge/release-proof-validation.mjs b/scripts/live-bridge/release-proof-validation.mjs index bf2ca4d3..ea2c1aa1 100644 --- a/scripts/live-bridge/release-proof-validation.mjs +++ b/scripts/live-bridge/release-proof-validation.mjs @@ -1,5 +1,6 @@ import { exitCodes } from './constants.mjs' import { LiveBridgeError } from './errors.mjs' +import { runEventPayload } from './protocol.mjs' const ACTIVE_RUN_STATUSES = new Set(['running', 'waiting', 'streaming']) const ACTIVE_PROGRESS_KINDS = new Set([ @@ -140,30 +141,54 @@ export function assertObservedUsage(run) { return { inputTokens: run.inputTokens, outputTokens: run.outputTokens, llmCalls: run.llmCalls } } -export function assertRetainedInteraction(run, interactionId, responseAck) { - if (responseAck?.type !== 'ack') +export function assertRetainedInteraction( + responses, + runId, + interactionId, + operationId, + responseAck, +) { + if ( + responseAck?.type !== 'ack' || + responseAck.operationId !== operationId || + !['accepted', 'already-applied'].includes(responseAck.outcome) + ) fail('LIVE_RELEASE_INTERACTION_NOT_RETAINED', 'The interaction response was not acknowledged', { responseAck, }) - const interaction = run?.interactions?.find((item) => item?.request?.id === interactionId) - if (interaction === undefined || interaction.status === 'unknown') + const retained = (kind) => + responses + .map((response, index) => ({ response, index, payload: runEventPayload(response, runId) })) + .find( + ({ response, payload }) => + response.event?.kind === kind && + payload?.value?.interactionId === interactionId && + payload.value.operationId === operationId, + ) + const requested = retained('run.interaction.response.requested') + const responded = retained('run.interaction.responded') + if (requested === undefined || responded === undefined) fail('LIVE_RELEASE_INTERACTION_UNKNOWN', 'The interaction outcome is unknown or absent', { - run, + runId, interactionId, + operationId, }) - if (!['declined', 'resolved'].includes(interaction.status)) - fail( - 'LIVE_RELEASE_INTERACTION_NOT_RETAINED', - 'The interaction did not retain a declined or resolved outcome', - { interaction }, - ) - if (interaction.responseOperation?.outcome !== 'declined') + if ( + requested.index >= responded.index || + requested.payload.value.outcome !== 'declined' || + responded.payload.value.outcome !== 'declined' + ) fail( 'LIVE_RELEASE_INTERACTION_NOT_RETAINED', - 'The durable interaction receipt did not retain the declined response', - { interaction }, + 'The durable interaction events did not retain one ordered declined response', + { requested, responded }, ) - return interaction + return { + status: 'declined', + responseOperation: responded.payload.value, + requestedSequence: requested.response.sequence, + respondedSequence: responded.response.sequence, + } } export function assertContextTransfer({ sourceRunId, sourceMessageId, plan, destinationRun }) { @@ -239,13 +264,14 @@ function nonNegativeInteger(value) { export function terminalReceipts(responses, session, runId) { if (!Array.isArray(responses)) return [] return responses.flatMap((response, responseIndex) => { + const payload = runEventPayload(response, runId) if ( response?.type !== 'event' || response.event?.kind !== 'run.finished' || - response.event?.runId !== runId + payload === undefined ) return [] - const provider = response.event.provider + const provider = payload.source return [ { session, @@ -253,7 +279,7 @@ export function terminalReceipts(responses, session, runId) { runId, sequence: response.sequence ?? null, revision: response.revision ?? null, - status: response.event.status ?? null, + status: payload.status ?? null, providerEventId: provider?.eventId ?? null, providerSequence: provider?.providerSequence ?? null, cursor: provider?.cursor ?? null, diff --git a/scripts/live-bridge/release-proof-validation.test.mjs b/scripts/live-bridge/release-proof-validation.test.mjs index 1dc410c0..09b71817 100644 --- a/scripts/live-bridge/release-proof-validation.test.mjs +++ b/scripts/live-bridge/release-proof-validation.test.mjs @@ -2,6 +2,17 @@ import assert from 'node:assert/strict' import test from 'node:test' import { bridgeLaunchEnvironment } from './bridge.mjs' import { StreamingRedactor } from './capture.mjs' +import { + assertObservedIdentity, + eventSummary, + observedProviderAndModel, + parseSseEvents, +} from './native-continuation.mjs' +import { + interactionFromResponse, + retainedCancellationAdvertised, + runWithAdmissionReceipt, +} from './protocol.mjs' import { evidenceValue, secretValues, @@ -18,6 +29,7 @@ import { terminalReceipts, } from './release-proof-validation.mjs' import { assertTargetSemantics, verifyInteraction } from './target-actions.mjs' +import { operationRequest, operationState } from './target-flow.mjs' const target = { key: 'pi-test', @@ -25,6 +37,110 @@ const target = { definition: { backend: 'pi' }, } +test('retained cancellation proof reads the environment capability contract', () => { + assert.equal(retainedCancellationAdvertised({}), false) + assert.equal( + retainedCancellationAdvertised({ + retainedControl: { + exactRunIdentity: true, + resultIdentity: true, + eventIdentity: true, + cancellationIdempotency: true, + }, + }), + true, + ) +}) + +test('native continuation proof reads provider identity from retained Bridge envelopes', () => { + const [frame] = parseSseEvents( + [ + 'event: raw', + 'data: {"runId":"run-1","event":{"type":"raw","backend":"pi","event":{"type":"message_start","message":{"provider":"tangle-router","model":"glm-5.2"}}}}', + '', + ].join('\n'), + ) + const summary = eventSummary(frame) + assert.deepEqual(summary, { + type: 'raw', + backend: 'pi', + provider: 'tangle-router', + model: 'glm-5.2', + }) + assert.deepEqual(observedProviderAndModel([summary], 'pi/tangle-router/glm-5.2'), { + backends: ['pi'], + providers: ['tangle-router'], + models: ['glm-5.2'], + backend: 'pi', + provider: 'tangle-router', + model: 'glm-5.2', + }) +}) + +test('native continuation identity stays bound to the retained session route', () => { + const session = { backend: 'pi', model: 'pi/tangle-router/glm-5.2' } + assert.doesNotThrow(() => + assertObservedIdentity( + observedProviderAndModel([{ type: 'status', backend: 'pi' }], session.model), + session, + ), + ) + assert.throws( + () => + assertObservedIdentity( + observedProviderAndModel( + [{ type: 'raw', backend: 'pi', provider: 'other', model: 'glm-5.2' }], + session.model, + ), + session, + ), + /did not match the retained session route/u, + ) + assert.throws( + () => + assertObservedIdentity( + observedProviderAndModel( + [{ type: 'raw', backend: 'pi', provider: 'tangle-router', model: 'glm-5.3' }], + session.model, + ), + session, + ), + /did not match the retained session route/u, + ) + assert.throws( + () => + assertObservedIdentity( + observedProviderAndModel( + [ + { type: 'raw', backend: 'pi', provider: 'tangle-router', model: 'glm-5.2' }, + { type: 'raw', backend: 'pi', provider: 'tangle-router', model: 'glm-5.3' }, + ], + session.model, + ), + session, + ), + /did not match the retained session route/u, + ) + + const alternateSession = { backend: 'pi', model: 'pi/tangle-router/gpt-5.4-mini' } + assert.doesNotThrow(() => + assertObservedIdentity( + observedProviderAndModel( + [ + { + type: 'raw', + backend: 'pi', + provider: 'tangle-router', + model: 'gpt-5.4-mini', + }, + ], + alternateSession.model, + ), + alternateSession, + ), + ) +}) + function run(overrides = {}) { return { id: 'run-1', @@ -146,14 +262,26 @@ test('identity validation retains nested and runner-only model routes', () => { assert.equal(assertTargetRunIdentity(defaultRun, defaultTarget).provider, undefined) }) -test('usage, replay, and cancellation unavailable states cannot pass strict conformance', () => { +test('usage and cancellation unavailable states cannot pass strict conformance', () => { assert.throws(() => assertObservedUsage(run({ tokensKnown: false })), /known token usage/u) assert.throws(() => assertObservedUsage(run({ llmCalls: 0 })), /model-call usage/u) - const unavailable = { + const cancellationUnavailable = { cancel: { status: 'reported-unavailable', advertised: false }, interaction: { status: 'reported-unavailable', advertised: false }, } - assert.throws(() => assertTargetSemantics(unavailable, { strict: true }), /verified live proof/u) + assert.throws( + () => assertTargetSemantics(cancellationUnavailable, { strict: true }), + /verified live proof/u, + ) + assert.doesNotThrow(() => + assertTargetSemantics( + { + cancel: { status: 'verified', advertised: true }, + interaction: { status: 'reported-unavailable', advertised: false }, + }, + { strict: true }, + ), + ) assert.throws( () => assertTargetSemantics( @@ -454,9 +582,11 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal revision: 4, event: { kind: 'run.finished', - runId: 'run-1', - status: 'completed', - provider: { eventId: 'provider-finished', providerSequence: 3, cursor: '3:0' }, + payload: { + runId: 'run-1', + status: 'completed', + source: { eventId: 'provider-finished', providerSequence: 3, cursor: '3:0' }, + }, }, } assert.deepEqual(terminalReceipts([terminalResponse], 'restarted-session', 'run-1'), [ @@ -474,32 +604,126 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal ]) }) -test('interaction proof requires durable declined or resolved state', () => { - const retained = { - request: { id: 'interaction-1' }, - status: 'declined', - responseOperation: { outcome: 'declined' }, +test('release RPC reads state and interaction frames from the public envelope', async () => { + const stateFrame = { + version: 1, + type: 'state', + requestId: 'interactive-proof-execution-a-state-active-pi-test', + state: { runs: [{ id: 'run-1', status: 'streaming' }] }, + } + const sent = [] + const session = { + send(request) { + sent.push(request) + }, + async waitFor(label, predicate, timeoutMs) { + assert.equal(label, 'release operation state') + assert.equal(timeoutMs, 15_000) + assert.equal(predicate(stateFrame), true) + return stateFrame + }, + } + const result = { operationNamespace: 'proof-execution-a', targetKey: 'pi-test', requests: [] } + assert.equal(await operationState(session, result, 'interactive', 'active', 120_000), stateFrame) + assert.deepEqual(sent, result.requests) + + const requestInput = ['interactive', 'respond', 'respond_interaction', { runId: 'run-1' }] + const first = operationRequest(result, ...requestInput) + const retry = operationRequest(result, ...requestInput) + const independent = operationRequest( + { ...result, operationNamespace: 'proof-execution-b' }, + ...requestInput, + ) + assert.deepEqual(retry, first) + assert.notEqual(independent.operationId, first.operationId) + + const projectedRun = { id: 'run-1', status: 'completed' } + const admission = { runId: 'run-1', profileDigest: 'profile-digest' } + assert.deepEqual(runWithAdmissionReceipt(projectedRun, admission), { + ...projectedRun, + receipt: admission, + }) + assert.equal( + runWithAdmissionReceipt(projectedRun, { ...admission, runId: 'run-2' }), + projectedRun, + ) + + const interactionFrame = { + version: 1, + type: 'event', + sequence: 10, + revision: 10, + event: { + kind: 'run.interaction', + payload: { + runId: 'run-1', + interaction: { + id: 'interaction-local-1', + kind: 'permission', + title: 'Permission: bash', + }, + }, + }, } + assert.deepEqual(interactionFromResponse(interactionFrame, 'run-1'), { + runId: 'run-1', + interactionId: 'interaction-local-1', + request: interactionFrame.event.payload.interaction, + }) +}) + +test('interaction proof requires ordered durable response events', () => { + const operationId = 'operation-interaction-1' + const event = (sequence, kind, outcome = 'declined') => ({ + type: 'event', + sequence, + revision: sequence, + event: { + kind, + payload: { + runId: 'run-1', + value: { interactionId: 'interaction-1', operationId, outcome }, + }, + }, + }) + const requested = event(1, 'run.interaction.response.requested') + const responded = event(2, 'run.interaction.responded') + const acknowledgement = { type: 'ack', operationId, outcome: 'accepted' } assert.deepEqual( - assertRetainedInteraction({ interactions: [retained] }, 'interaction-1', { type: 'ack' }), - retained, + assertRetainedInteraction( + [requested, responded], + 'run-1', + 'interaction-1', + operationId, + acknowledgement, + ), + { + status: 'declined', + responseOperation: responded.event.payload.value, + requestedSequence: 1, + respondedSequence: 2, + }, ) - for (const interaction of [ - undefined, - { request: { id: 'interaction-1' }, status: 'unknown' }, - { request: { id: 'interaction-1' }, status: 'pending' }, + for (const input of [ + { responses: [], acknowledgement }, + { responses: [responded, requested], acknowledgement }, + { + responses: [requested, event(2, 'run.interaction.responded', 'unknown')], + acknowledgement, + }, { - request: { id: 'interaction-1' }, - status: 'resolved', - responseOperation: { outcome: 'accepted' }, + responses: [requested, responded], + acknowledgement: { ...acknowledgement, outcome: 'rejected' }, }, ]) { assert.throws( () => assertRetainedInteraction( - { interactions: interaction === undefined ? [] : [interaction] }, + input.responses, + 'run-1', 'interaction-1', - { type: 'ack' }, + operationId, + input.acknowledgement, ), /interaction/u, ) diff --git a/scripts/live-bridge/release-proofs.mjs b/scripts/live-bridge/release-proofs.mjs index 5ebdcc29..2abfb9bd 100644 --- a/scripts/live-bridge/release-proofs.mjs +++ b/scripts/live-bridge/release-proofs.mjs @@ -24,6 +24,16 @@ function targetForHarness(targets, harness) { return (targets ?? []).find((target) => target.definition.backend === harness) } +function capabilitiesForTarget(capabilitiesByBackend, target) { + return target === undefined ? undefined : capabilitiesByBackend?.[target.definition.backend] +} + +function interactionTarget(targets, capabilitiesByBackend) { + return (targets ?? []).find( + (target) => capabilitiesForTarget(capabilitiesByBackend, target)?.interactions !== undefined, + ) +} + function proofTarget(target, operationResult) { const proof = operationResult?.targetProof if ( @@ -167,7 +177,7 @@ export async function executeReleaseProofs({ installRoot, root, endpoint, - providerCapabilities, + providerCapabilitiesByBackend = {}, targets = [], targetRecords = [], token, @@ -249,7 +259,7 @@ export async function executeReleaseProofs({ installRoot, root, endpoint, - providerCapabilities, + capabilitiesForTarget(providerCapabilitiesByBackend, target), target, token, timeoutMs, @@ -272,7 +282,7 @@ export async function executeReleaseProofs({ installRoot, root, endpoint, - providerCapabilities, + capabilitiesForTarget(providerCapabilitiesByBackend, piTarget), piTarget, target, token, @@ -280,7 +290,7 @@ export async function executeReleaseProofs({ ), ) - const interactiveTarget = targets[0] + const interactiveTarget = interactionTarget(targets, providerCapabilitiesByBackend) await execute( REQUIREMENTS.interactive, liveReleaseProofOperations.interactive, @@ -291,7 +301,7 @@ export async function executeReleaseProofs({ installRoot, root, endpoint, - providerCapabilities, + capabilitiesForTarget(providerCapabilitiesByBackend, target), target, token, timeoutMs, @@ -305,7 +315,7 @@ export async function executeReleaseProofs({ installRoot, root, endpoint, - providerCapabilities, + capabilitiesForTarget(providerCapabilitiesByBackend, target), target, token, timeoutMs, @@ -319,7 +329,7 @@ export async function executeReleaseProofs({ installRoot, root, endpoint, - providerCapabilities, + capabilitiesForTarget(providerCapabilitiesByBackend, candidate), candidate, token, timeoutMs, diff --git a/scripts/live-bridge/target-actions.mjs b/scripts/live-bridge/target-actions.mjs index a3c1ac1c..bd28d9ee 100644 --- a/scripts/live-bridge/target-actions.mjs +++ b/scripts/live-bridge/target-actions.mjs @@ -10,7 +10,9 @@ import { interactionFromResponse, requestBase, responseForRequest, + retainedCancellationAdvertised, runFromState, + runWithAdmissionReceipt, semanticCommandStatus, stateForRequest, stateForRun, @@ -131,7 +133,10 @@ export async function runNormalTurn( (response) => response.requestId === send.requestId && stateForRun(response, runId), timeoutMs, ) - const finalRun = runFromState(terminal.state, runId) + const finalRun = runWithAdmissionReceipt( + runFromState(terminal.state, runId), + sendResponse.admission, + ) const finalMessage = terminalMessage(terminal.state, runId) const markerObserved = exactMarker(finalMessage?.text, expectedMarker) result.normal = { @@ -173,9 +178,9 @@ export async function verifyCancel( const advertisedByNormalAdmission = result.send?.admission?.capabilities?.controls?.cancel === true const advertisedByNormalRun = finalRun?.capabilities?.controls?.cancel === true - const advertisedByProvider = capabilityAdvertised(providerCapabilities.controls?.cancel) + const advertisedByProvider = retainedCancellationAdvertised(providerCapabilities) if (!advertisedByProvider && !advertisedByNormalAdmission && !advertisedByNormalRun) { - const availability = capabilityAvailability(providerCapabilities.controls?.cancel, false) + const availability = capabilityAvailability(advertisedByProvider, false) const cancel = { ...requestBase( requestIdFor(operationPrefix, 'cancel', target.key), @@ -233,10 +238,7 @@ export async function verifyCancel( return } const advertisedByRun = cancelSendResponse.admission?.capabilities?.controls?.cancel === true - const availability = capabilityAvailability( - providerCapabilities.controls?.cancel, - advertisedByRun, - ) + const availability = capabilityAvailability(advertisedByProvider, advertisedByRun) result.cancel.advertisedByProvider = availability.advertisedByProvider result.cancel.advertisedByNormalAdmission = advertisedByNormalAdmission result.cancel.advertisedByNormalRun = advertisedByNormalRun @@ -361,7 +363,7 @@ export function assertTargetSemantics(result, { strict = false } = {}) { ['interaction', result.interaction], ]) { assertSemanticOutcome(name, capability.status, capability.advertised, { capability }) - if (strict && capability.status !== 'verified') + if (strict && name === 'cancel' && capability.status !== 'verified') throw new LiveBridgeError( 'LIVE_RELEASE_REQUIRED_PROOF_MISSING', `${name} did not produce a verified live proof`, diff --git a/scripts/live-bridge/target-flow.mjs b/scripts/live-bridge/target-flow.mjs index 7c1aa361..6fac8373 100644 --- a/scripts/live-bridge/target-flow.mjs +++ b/scripts/live-bridge/target-flow.mjs @@ -1,3 +1,4 @@ +import { randomUUID } from 'node:crypto' import { join, relative } from 'node:path' import { createLiveCredentialReference, @@ -15,6 +16,7 @@ import { requestBase, responseForRequest, runFromState, + stateForRequest, stateForRun, } from './protocol.mjs' import { @@ -216,6 +218,7 @@ export async function executeTarget( function targetResult(config, target, providerCapabilities, credential, operation) { return { + operationNamespace: randomUUID(), targetKey: target.key, workspace: config.workspace, label: target.definition.label, @@ -439,7 +442,14 @@ export async function executeNamedOperation({ } export function operationRequest(result, prefix, action, command, params, suffix) { - const stem = `${prefix}-${action}${suffix === undefined ? '' : `-${suffix}`}-${result.targetKey}` + if (typeof result.operationNamespace !== 'string' || result.operationNamespace.length === 0) { + throw new LiveBridgeError( + 'LIVE_RELEASE_OPERATION_NAMESPACE_MISSING', + 'The release operation has no stable execution namespace', + exitCodes.failed, + ) + } + const stem = `${prefix}-${result.operationNamespace}-${action}${suffix === undefined ? '' : `-${suffix}`}-${result.targetKey}` return { ...requestBase(stem, command, command === 'get_state' ? undefined : `op-${stem}`), params, @@ -485,11 +495,11 @@ export async function operationState(session, result, prefix, suffix, timeoutMs) { projection: 'full' }, suffix, ) - const response = await sendOperationRequest( - session, - result, - request, + result.requests.push(evidenceValue(request)) + session.send(request) + const response = await session.waitFor( 'release operation state', + stateForRequest(request.requestId), Math.min(timeoutMs, 15_000), ) if (response.type !== 'state') { diff --git a/scripts/live-required/multirun-contract.mjs b/scripts/live-required/multirun-contract.mjs index 208b242c..78e1e40a 100644 --- a/scripts/live-required/multirun-contract.mjs +++ b/scripts/live-required/multirun-contract.mjs @@ -53,10 +53,7 @@ function assertRun(run, index) { `multirun proof run ${index} has no streamed events`, ) assert(run.eventIdsUnique === true, `multirun proof run ${index} has duplicate event identities`) - assert( - text(run.localEnvironmentId), - `multirun proof run ${index} has no local environment id`, - ) + assert(text(run.localEnvironmentId), `multirun proof run ${index} has no local environment id`) assert( text(run.providerEnvironmentId), `multirun proof run ${index} has no provider environment id`, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index f1e7436b..60a17e39 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -555,7 +555,9 @@ export function renderedWorkStripCount(screen) { return screen .split('\n') .filter((line) => - /^(?:focus|work) .+ · [^/\s]+\/[^\s]+ · \d+ interactions?/u.test(line.trimStart()), + /^(?:focus|work) .+ · (?:queued|starting|running|waiting|detached|reconnecting|cancelling)(?: ·|\s|$)/u.test( + line.trimStart(), + ), ).length } diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs index d06796e8..8bbde9c5 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.test.mjs @@ -173,9 +173,9 @@ test('rendered work-strip guard counts only actionable ownership rows', () => { assert.equal( renderedWorkStripCount( [ - 'work branch-a · streaming · opencode/model · 1 interaction · actions switch/!ask/!steer/cancel', + 'work branch-a · running · opencode/model · actions switch/!ask/!steer/cancel', 'status text mentioning work', - 'focus branch-b · streaming · opencode/model · 0 interactions · actions swi…', + 'focus branch-b · running · opencode/model · 1 waiting interaction · actions swi…', ].join('\n'), ), 2, diff --git a/scripts/package-proof-parity.mjs b/scripts/package-proof-parity.mjs index 10fc697a..c1bc8773 100644 --- a/scripts/package-proof-parity.mjs +++ b/scripts/package-proof-parity.mjs @@ -1,28 +1,8 @@ import { loadPackageProofCanonicalDigest } from './package-proof-product-modules.mjs' -const canonicalDigest = await loadPackageProofCanonicalDigest() +export { baselineEventEnd, firstTerminalTrace } from './package-proof-trace.mjs' -export function baselineEventEnd(events) { - const finishIndex = events.findIndex( - (event) => event.kind === 'run.finished' && event.payload?.status === 'completed', - ) - if (finishIndex < 0) throw new Error('proof has no completed baseline run') - const requested = events.slice(0, finishIndex).find((event) => event.kind === 'run.requested') - const operationId = - requested?.payload?.operationId ?? - requested?.payload?.admission?.operationId ?? - requested?.payload?.receipt?.operationId - let end = finishIndex + 1 - while ( - typeof operationId === 'string' && - events[end]?.kind === 'effect.upserted' && - (events[end]?.payload?.effect?.operationId === operationId || - events[end]?.payload?.value?.effect?.operationId === operationId) - ) { - end += 1 - } - return end -} +const canonicalDigest = await loadPackageProofCanonicalDigest() function sortParityValue(value, parentKey) { if (Array.isArray(value)) return value.map((item) => sortParityValue(item, parentKey)) @@ -196,25 +176,3 @@ export function firstDifference(left, right, path = '$') { } return { path, left, right } } - -export function firstTerminalTrace(evidence) { - const finishIndex = evidence.events.findIndex( - (event) => event.kind === 'run.finished' && event.payload?.status === 'completed', - ) - if (finishIndex < 0) throw new Error('terminal proof has no completed baseline run') - const finish = evidence.events[finishIndex] - const baselineEnd = baselineEventEnd(evidence.events) - const lastBaselineEvent = evidence.events[baselineEnd - 1] ?? finish - return { - state: { - ...evidence.state, - revision: lastBaselineEvent.revision, - sequence: lastBaselineEvent.sequence, - messages: evidence.state.messages.slice(0, 2), - runs: evidence.state.runs.slice(0, 1), - activeRunId: null, - lastError: null, - }, - events: evidence.events.slice(0, baselineEnd), - } -} diff --git a/scripts/package-proof-trace.mjs b/scripts/package-proof-trace.mjs new file mode 100644 index 00000000..fa2638cb --- /dev/null +++ b/scripts/package-proof-trace.mjs @@ -0,0 +1,45 @@ +export function baselineEventEnd(events) { + const finishIndex = events.findIndex( + (event) => event.kind === 'run.finished' && event.payload?.status === 'completed', + ) + if (finishIndex < 0) throw new Error('proof has no completed baseline run') + const requested = events.slice(0, finishIndex).find((event) => event.kind === 'run.requested') + const operationId = + requested?.payload?.operationId ?? + requested?.payload?.admission?.operationId ?? + requested?.payload?.receipt?.operationId + let end = finishIndex + 1 + while ( + typeof operationId === 'string' && + events[end]?.kind === 'effect.upserted' && + (events[end]?.payload?.effect?.operationId === operationId || + events[end]?.payload?.value?.effect?.operationId === operationId) + ) { + end += 1 + } + return end +} + +export function firstTerminalTrace(evidence) { + const finishIndex = evidence.events.findIndex( + (event) => event.kind === 'run.finished' && event.payload?.status === 'completed', + ) + if (finishIndex < 0) throw new Error('terminal proof has no completed baseline run') + const finish = evidence.events[finishIndex] + const baselineEnd = baselineEventEnd(evidence.events) + const lastBaselineEvent = evidence.events[baselineEnd - 1] ?? finish + const baselineRun = evidence.state.runs[0] + return { + state: { + ...evidence.state, + revision: lastBaselineEvent.revision, + sequence: lastBaselineEvent.sequence, + messages: evidence.state.messages.slice(0, 2), + runs: evidence.state.runs.slice(0, 1), + focusedRunId: baselineRun?.id ?? null, + activeRunId: null, + lastError: null, + }, + events: evidence.events.slice(0, baselineEnd), + } +} diff --git a/scripts/performance/memory-child.mjs b/scripts/performance/memory-child.mjs index 09810435..ba05ae2b 100644 --- a/scripts/performance/memory-child.mjs +++ b/scripts/performance/memory-child.mjs @@ -9,14 +9,17 @@ if (!databasePath || !workspaceRoot || !keyPath || !credentialRoot || !packageRo ) const indexUrl = (relativePath) => pathToFileURL(join(packageRoot, relativePath)).href -const [tui, composition] = await Promise.all([ - import(indexUrl('dist/adapters/tui/application-ui-controller.js')), - import(indexUrl('dist/app/composition.js')), -]) +if (typeof globalThis.gc === 'function') globalThis.gc() +const processStartRssMiB = process.memoryUsage().rss / (1024 * 1024) +const composition = await import(indexUrl('dist/startup/durable-runtime.js')) +if (typeof globalThis.gc === 'function') globalThis.gc() +const durableRuntimeRssMiB = process.memoryUsage().rss / (1024 * 1024) +const tui = await import(indexUrl('dist/adapters/tui/application-ui-controller.js')) const profile = { name: 'Braid performance profile', harness: 'pi' } const credentials = new FileCredentialStore(credentialRoot) if (typeof globalThis.gc === 'function') globalThis.gc() -const baselineRssMiB = process.memoryUsage().rss / (1024 * 1024) +const viewRuntimeRssMiB = process.memoryUsage().rss / (1024 * 1024) +const baselineRssMiB = viewRuntimeRssMiB const durable = await composition.createDurableBraidApplication({ path: databasePath, workspaceRoot, @@ -31,6 +34,9 @@ try { process.stdout.write( `${JSON.stringify({ baselineRssMiB, + processStartRssMiB, + durableRuntimeRssMiB, + viewRuntimeRssMiB, rssMiB: process.memoryUsage().rss / (1024 * 1024), eventCount: state.sequence, loadedTailEventCount: durable.app.events().length, diff --git a/scripts/performance/process-measurements.mjs b/scripts/performance/process-measurements.mjs index 33c11ce7..537fffcb 100644 --- a/scripts/performance/process-measurements.mjs +++ b/scripts/performance/process-measurements.mjs @@ -25,10 +25,12 @@ function readyFramePredicate(marker) { !READY_ERROR.test(output) } -function interactiveReadyFramePredicate(marker) { +export function interactiveReadyFramePredicate(marker) { const ready = readyFramePredicate(marker) return (lines, output) => - ready(lines, output) && lines.some((line) => line.includes('AgentProfile')) + ready(lines, output) && + lines.some((line) => line.includes('profile Braid performance profile')) && + lines.some((line) => line.includes('type / for commands')) } function composerKeyPredicate(snapshot, token) { diff --git a/src/adapters/runtime/agent-runtime-execution.ts b/src/adapters/runtime/agent-runtime-execution.ts index 075f2779..157c8073 100644 --- a/src/adapters/runtime/agent-runtime-execution.ts +++ b/src/adapters/runtime/agent-runtime-execution.ts @@ -1,8 +1,8 @@ -import type { RuntimeStreamEvent } from '@tangle-network/agent-runtime' import type { AgentWorkspaceBranchingProvider, ConfidentialAttestationVerifier, } from '@tangle-network/agent-interface' +import type { RuntimeStreamEvent } from '@tangle-network/agent-runtime' import type { AgentTurnBackend, Executor } from '@tangle-network/agent-runtime/kernel' import { canonicalDigest } from '../../domain/canonical.js' import { publicMaterializationReceipt } from '../../domain/materialization-receipt.js' diff --git a/src/adapters/runtime/lazy-execution.ts b/src/adapters/runtime/lazy-execution.ts index 7d50fd1a..dfe90a1c 100644 --- a/src/adapters/runtime/lazy-execution.ts +++ b/src/adapters/runtime/lazy-execution.ts @@ -39,6 +39,7 @@ export class LazyExecutionPort implements ExecutionPort { readonly admissionMode = 'async' as const readonly #loadPort: () => Promise #portPromise: Promise | undefined + #loadedPort: ExecutionPort | undefined constructor(options: LazyExecutionOptions) { this.#loadPort = options.load @@ -130,8 +131,35 @@ export class LazyExecutionPort implements ExecutionPort { return port.environmentCapabilities() } + get context(): ExecutionPort['context'] { + return this.#loadedPort?.context + } + + get contextTransfer(): ExecutionPort['contextTransfer'] { + return this.#loadedPort?.contextTransfer + } + + get workspaceBranching(): ExecutionPort['workspaceBranching'] { + return this.#loadedPort?.workspaceBranching + } + + get workspaceBranchingProvider(): ExecutionPort['workspaceBranchingProvider'] { + return this.#loadedPort?.workspaceBranchingProvider + } + + get confidentialAttestationVerifier(): ExecutionPort['confidentialAttestationVerifier'] { + return this.#loadedPort?.confidentialAttestationVerifier + } + + get provider(): ExecutionPort['provider'] { + return this.#loadedPort?.provider + } + #load(): Promise { - this.#portPromise ??= this.#loadPort() + this.#portPromise ??= this.#loadPort().then((port) => { + this.#loadedPort = port + return port + }) return this.#portPromise } } diff --git a/src/adapters/runtime/retained-execution-contract.ts b/src/adapters/runtime/retained-execution-contract.ts index dfe3aecb..62d93dc8 100644 --- a/src/adapters/runtime/retained-execution-contract.ts +++ b/src/adapters/runtime/retained-execution-contract.ts @@ -1,6 +1,8 @@ import type { AgentExactRunControlRef } from '@tangle-network/agent-interface' -import type { AgentTurnResult } from '@tangle-network/agent-interface/environment-provider' -import type { RetainedRunHandle } from '@tangle-network/agent-runtime/kernel' +import type { + NativeContextContinuationExecution, + RetainedRunHandle, +} from '@tangle-network/agent-runtime/kernel' import type { TurnUsage } from '../../domain/entities.js' import type { ExecutionEnvironmentObservation } from '../../domain/execution-observation.js' import type { RuntimeEventEnvelope } from '../../domain/runtime-events.js' @@ -19,6 +21,11 @@ export interface RetainedResultProjection { readonly error?: string } +export type RetainedTurnResult = Extract< + NativeContextContinuationExecution, + { readonly result: unknown } +>['result'] + /** Provider-specific facts and operations needed by the retained lifecycle. */ export interface RetainedExecutionPlan { readonly providerName: string @@ -53,11 +60,11 @@ export interface RetainedExecutionPlan { readonly detached: boolean }) => ProviderRunSnapshot['status'] readonly isTerminalStatus: (status: ProviderRunSnapshot['status']) => boolean - readonly projectResult: (result: AgentTurnResult) => RetainedResultProjection + readonly projectResult: (result: RetainedTurnResult) => RetainedResultProjection readonly projectFinal: (input: { readonly runId: string readonly sequence: number - readonly result: AgentTurnResult + readonly result: RetainedTurnResult }) => RuntimeEventEnvelope } diff --git a/src/adapters/runtime/retained-execution-projection.ts b/src/adapters/runtime/retained-execution-projection.ts index f4f5bdc8..7d63a544 100644 --- a/src/adapters/runtime/retained-execution-projection.ts +++ b/src/adapters/runtime/retained-execution-projection.ts @@ -1,13 +1,10 @@ -import type { TokenUsage } from '@tangle-network/agent-interface' -import type { - AgentEnvironmentCapabilities, - AgentTurnResult, -} from '@tangle-network/agent-interface/environment-provider' +import type { AgentEnvironmentCapabilities } from '@tangle-network/agent-interface/environment-provider' import type { TurnUsage } from '../../domain/entities.js' import { redactSensitiveText } from '../../domain/redaction.js' import type { BraidFinalRuntimeEvent, RuntimeEventEnvelope } from '../../domain/runtime-events.js' import type { RunStatus } from '../../domain/state.js' import type { RunCapabilities } from '../../ports/execution.js' +import type { RetainedTurnResult } from './retained-execution-contract.js' export function retainedCapabilities( environment: AgentEnvironmentCapabilities, @@ -16,6 +13,12 @@ export function retainedCapabilities( readonly exactStatus?: boolean } = {}, ): RunCapabilities { + const retainedControl = + environment.retainedControl?.exactRunIdentity === true && + environment.retainedControl.resultIdentity === true && + environment.retainedControl.eventIdentity === true && + environment.retainedControl.cancellationIdempotency === true + const exactStatus = retainedControl && (options.exactStatus ?? true) return Object.freeze({ streaming: { live: environment.streaming.live, @@ -28,11 +31,11 @@ export function retainedCapabilities( messages: false, }, controls: { - cancel: true, + cancel: retainedControl, steer: false, queue: true, - status: options.exactStatus ?? true, - recreate: true, + status: exactStatus, + recreate: retainedControl, }, events: { stableIdentity: true, sequence: true, cursor: true }, usage: environment.usage, @@ -68,7 +71,7 @@ export function isTerminalRetainedStatus(status: RunStatus): boolean { } export function retainedTurnUsage( - usage: TokenUsage | undefined, + usage: RetainedTurnResult['usage'], model: string | undefined, calls?: number, ): TurnUsage { @@ -88,7 +91,7 @@ export function finalRetainedEnvelope( runId: string, sequence: number, model: string, - result: AgentTurnResult, + result: RetainedTurnResult, intent: string, ): RuntimeEventEnvelope { const timestamp = new Date().toISOString() @@ -137,7 +140,7 @@ export function finalRetainedEnvelope( } } -export function modelRequestsFromResult(result: AgentTurnResult): number | undefined { +export function modelRequestsFromResult(result: RetainedTurnResult): number | undefined { const value = result.metadata?.modelRequests return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : undefined } diff --git a/src/adapters/runtime/retained-execution-stream.ts b/src/adapters/runtime/retained-execution-stream.ts index 87b236a8..3034ed07 100644 --- a/src/adapters/runtime/retained-execution-stream.ts +++ b/src/adapters/runtime/retained-execution-stream.ts @@ -1,6 +1,6 @@ import type { RetainedRunHandle } from '@tangle-network/agent-runtime/kernel' import type { RuntimeEventEnvelope } from '../../domain/runtime-events.js' -import type { RetainedExecutionPlan } from './retained-execution-contract.js' +import type { RetainedExecutionPlan, RetainedTurnResult } from './retained-execution-contract.js' import type { RetainedExecutionState } from './retained-execution-state.js' export async function* streamRetainedExecution(input: { @@ -12,6 +12,7 @@ export async function* streamRetainedExecution(input: { readonly includeObservation: boolean readonly afterSequence: number readonly after?: string + readonly terminalResult?: Promise }): AsyncGenerator { const reader = new AbortController() const previous = input.state.replaceReader(input.runId, reader) @@ -50,7 +51,8 @@ export async function* streamRetainedExecution(input: { sequence = envelope.sequence + 1 yield { ...envelope, runId: input.runId, sequence } } - const result = await input.handle.result() + const result = + input.terminalResult === undefined ? await input.handle.result() : await input.terminalResult sequence += 1 yield input.plan.projectFinal({ runId: input.runId, sequence, result }) } finally { diff --git a/src/adapters/runtime/retained-execution.ts b/src/adapters/runtime/retained-execution.ts index e2375cb7..415cdfc0 100644 --- a/src/adapters/runtime/retained-execution.ts +++ b/src/adapters/runtime/retained-execution.ts @@ -22,15 +22,19 @@ import { canonicalAgentProfileDigestHex } from '../agent-interface/profile-runti import type { RetainedExecutionDriver, RetainedExecutionPlan, + RetainedTurnResult, } from './retained-execution-contract.js' import { RetainedExecutionState, retainedExecutionKey } from './retained-execution-state.js' import { streamRetainedExecution } from './retained-execution-stream.js' +import type { RetainedNativeContinuation } from './retained-native-continuation.js' import { continueRetainedNative, controlRefFromBoundaryProof, nativeContinuationInputFromRecovery, } from './retained-native-continuation.js' +const CANCEL_STATUS_WAIT_MS = 30_000 + export type { RetainedExecutionDriver, RetainedExecutionPlan, @@ -43,6 +47,11 @@ interface ResolvedRetainedHandle { readonly wasStarting: boolean } +interface RetainedRunStart { + readonly handle: RetainedRunHandle + readonly terminalResult?: Promise +} + /** Provider-neutral durable execution lifecycle used by Braid adapters. */ export class RetainedExecutionPort implements ExecutionPort { readonly admissionMode = 'async' as const @@ -98,18 +107,21 @@ export class RetainedExecutionPort implements ExecutionPort { if (plan === undefined) { throw new Error('Retained run was not admitted with this exact request') } - const starting = Promise.resolve().then(() => - input.nativeContextBoundaryProof === undefined - ? plan.start(input) - : continueRetainedNative(plan, input), - ) - this.#state.rememberStartingHandle(input.runId, starting) + const starting = Promise.resolve().then(async (): Promise => { + if (input.nativeContextBoundaryProof === undefined) return { handle: await plan.start(input) } + return continueRetainedNative(plan, input) + }) + const startingHandle = starting.then(({ handle }) => handle) + this.#state.rememberStartingHandle(input.runId, startingHandle) let handle: RetainedRunHandle + let terminalResult: Promise | undefined try { - handle = await starting + const started = await starting + handle = started.handle + terminalResult = started.terminalResult this.#state.rememberHandle(input.runId, plan, handle) } finally { - this.#state.clearStartingHandle(input.runId, starting) + this.#state.clearStartingHandle(input.runId, startingHandle) } if (this.#state.isDetached(input.runId)) return this.#state.markDetached(input.runId, false) @@ -121,6 +133,7 @@ export class RetainedExecutionPort implements ExecutionPort { signal: input.signal, includeObservation: true, afterSequence: 0, + ...(terminalResult === undefined ? {} : { terminalResult }), }) } @@ -162,17 +175,26 @@ export class RetainedExecutionPort implements ExecutionPort { if (!runSupportsNativeContinuation(plan.capabilities)) { throw new Error('Provider does not support verified same-session continuation') } - const handle = await continueRetainedNative(plan, continuationInput) - this.#state.rememberHandle(input.runId, plan, handle) + const starting = continueRetainedNative(plan, continuationInput) + const startingHandle = starting.then(({ handle }) => handle) + this.#state.rememberStartingHandle(input.runId, startingHandle) + let continued: RetainedNativeContinuation + try { + continued = await starting + } finally { + this.#state.clearStartingHandle(input.runId, startingHandle) + } + this.#state.rememberHandle(input.runId, plan, continued.handle) this.#state.markDetached(input.runId, false) yield* streamRetainedExecution({ runId: input.runId, - handle, + handle: continued.handle, plan, state: this.#state, signal: input.signal, includeObservation: true, afterSequence: 0, + terminalResult: continued.terminalResult, }) return } @@ -323,19 +345,16 @@ export class RetainedExecutionPort implements ExecutionPort { if (result.status === 'unknown') { return { operationId: input.operationId, outcome: 'unknown', detail: result.effect } } - if (result.effect === 'cancel_requested') { - return { - operationId: input.operationId, - outcome: 'unknown', - detail: 'cancel_requested', - } - } let effect = result.effect - if (effect === 'unknown' || effect === 'not_live') { + if (effect === 'cancel_requested' || effect === 'unknown' || effect === 'not_live') { if (resolved.plan.exactStatus === false) { return { operationId: input.operationId, outcome: 'unknown', detail: result.effect } } - const reconciled = await this.#reconcileCancelled(resolved, input) + const reconciled = await this.#reconcileCancelled( + resolved, + input, + effect === 'cancel_requested' ? CANCEL_STATUS_WAIT_MS : 0, + ) if (!reconciled) { return { operationId: input.operationId, outcome: 'unknown', detail: result.effect } } @@ -506,6 +525,9 @@ export class RetainedExecutionPort implements ExecutionPort { if (starting === undefined) throw new Error('Retained run state is incomplete') handle = await starting } + if (providerSessionId !== undefined && handle.controlRef.sessionId !== providerSessionId) { + throw new Error('retained provider session conflicts with the active run') + } if (suppliedControlRef !== undefined) { const exact = this.#state.validateControlRef(activePlan, suppliedControlRef) this.#state.assertSameControlRef(handle.controlRef, exact) @@ -534,10 +556,12 @@ export class RetainedExecutionPort implements ExecutionPort { async #reconcileCancelled( resolved: ResolvedRetainedHandle, input: CancelRunInput & { readonly signal?: AbortSignal }, + waitMs: number, ): Promise { try { const signal = resolved.wasStarting || input.signal?.aborted ? undefined : input.signal const snapshot = await resolved.handle.status({ + ...(waitMs === 0 ? {} : { waitMs }), ...(signal === undefined ? {} : { signal }), }) const exact = this.#state.validateControlRef(resolved.plan, snapshot.controlRef) @@ -634,9 +658,16 @@ export class RetainedExecutionPort implements ExecutionPort { const plan = this.#state.plan(runId) if (plan === undefined) return this.#state.assertProviderSession(plan, providerSessionId) + const active = this.#state.handle(runId) + if ( + providerSessionId !== undefined && + active !== undefined && + active.controlRef.sessionId !== providerSessionId + ) { + throw new Error('retained provider session conflicts with the active run') + } if (controlRef === undefined) return const exact = this.#state.validateControlRef(plan, controlRef) - const active = this.#state.handle(runId) if (active !== undefined) this.#state.assertSameControlRef(active.controlRef, exact) } } diff --git a/src/adapters/runtime/retained-native-continuation.ts b/src/adapters/runtime/retained-native-continuation.ts index c55f84e9..474b16d3 100644 --- a/src/adapters/runtime/retained-native-continuation.ts +++ b/src/adapters/runtime/retained-native-continuation.ts @@ -9,7 +9,12 @@ import { import type { RetainedRunHandle } from '@tangle-network/agent-runtime/kernel' import { canonicalDigest } from '../../domain/canonical.js' import type { ExecuteTurnInput, RetainedExecutionRecoveryContext } from '../../ports/execution.js' -import type { RetainedExecutionPlan } from './retained-execution-contract.js' +import type { RetainedExecutionPlan, RetainedTurnResult } from './retained-execution-contract.js' + +export interface RetainedNativeContinuation { + readonly handle: RetainedRunHandle + readonly terminalResult: Promise +} export function controlRefFromBoundaryProof( value: NativeContextBoundaryProof, @@ -28,7 +33,7 @@ export function controlRefFromBoundaryProof( export async function continueRetainedNative( plan: RetainedExecutionPlan, input: ExecuteTurnInput, -): Promise { +): Promise { const proof = input.nativeContextBoundaryProof if (proof === undefined) throw new Error('Native continuation requires an exact boundary proof') const sourceControlRef = controlRefFromBoundaryProof(proof) @@ -53,28 +58,51 @@ export async function continueRetainedNative( ...material, requestDigest: nativeContextContinuationRequestDigest(material), } - const outcome = await handle.continueNative(request, { ...turn, signal: input.signal }) - if ( - outcome.acknowledgement.status !== 'accepted' && - outcome.acknowledgement.status !== 'replayed' - ) { - throw new Error(`Native continuation was ${outcome.acknowledgement.status}`) - } - if (!('controlRef' in outcome) || !('result' in outcome)) { - throw new Error('Native continuation omitted its exact result') + const continuation = handle.beginNativeContinuation(request, { ...turn, signal: input.signal }) + void continuation.result.catch(() => undefined) + const admitted = AgentExactRunControlRefSchema.parse(await continuation.admission) + assertAdvancedControlRef(sourceControlRef, admitted) + if (canonicalDigest(handle.controlRef) !== canonicalDigest(admitted)) { + throw new Error('Native continuation handle did not advance to the admitted run') } - const next = AgentExactRunControlRefSchema.parse(outcome.controlRef) + const terminalResult = continuation.result.then((outcome) => { + if ( + outcome.acknowledgement.status !== 'accepted' && + outcome.acknowledgement.status !== 'replayed' + ) { + throw new Error(`Native continuation was ${outcome.acknowledgement.status}`) + } + if (!('controlRef' in outcome) || !('result' in outcome)) { + throw new Error('Native continuation omitted its exact result') + } + const next = AgentExactRunControlRefSchema.parse(outcome.controlRef) + assertAdvancedControlRef(sourceControlRef, next) + if (canonicalDigest(admitted) !== canonicalDigest(next)) { + throw new Error('Native continuation result changed its admitted run reference') + } + if (canonicalDigest(handle.controlRef) !== canonicalDigest(next)) { + throw new Error('Native continuation handle did not advance to the result run') + } + return outcome.result + }) + void terminalResult.catch(() => undefined) + return { handle, terminalResult } +} + +function assertAdvancedControlRef( + initial: AgentExactRunControlRef, + next: AgentExactRunControlRef, +): void { if ( - next.provider !== sourceControlRef.provider || - next.environmentId !== sourceControlRef.environmentId || - next.sessionId !== sourceControlRef.sessionId + next.provider !== initial.provider || + next.environmentId !== initial.environmentId || + next.sessionId !== initial.sessionId ) { throw new Error('Native continuation moved to another provider session') } - if (canonicalDigest(handle.controlRef) !== canonicalDigest(next)) { - throw new Error('Native continuation handle did not advance to the admitted run') + if (next.runId === initial.runId && next.executionId === initial.executionId) { + throw new Error('Native continuation did not return a new exact run execution') } - return handle } export function nativeContinuationInputFromRecovery( diff --git a/src/adapters/tui/application-ui-controller.ts b/src/adapters/tui/application-ui-controller.ts index 0b43a286..2f44e31f 100644 --- a/src/adapters/tui/application-ui-controller.ts +++ b/src/adapters/tui/application-ui-controller.ts @@ -144,7 +144,9 @@ export class ApplicationUiController implements BraidUiController { storageFailure: string | undefined, cleanupUncertain: string | undefined, ): BraidViewModel { - const canRespond = app.canRespondToInteractions(interactionViews(state)[0]?.runId) + const canRespond = interactionViews(state).some((interaction) => + app.canRespondToInteractions(interaction.runId), + ) const view = withRunUsage( buildBraidViewModel( state, diff --git a/src/adapters/tui/ui-capabilities.ts b/src/adapters/tui/ui-capabilities.ts index 491e7ccb..c1c62129 100644 --- a/src/adapters/tui/ui-capabilities.ts +++ b/src/adapters/tui/ui-capabilities.ts @@ -1,4 +1,9 @@ -import { activeRunForBranch, type BraidState, isLiveRunStatus } from '../../domain/state.js' +import { + activeRunForBranch, + type BraidState, + isLiveRunStatus, + isRecoverableRun, +} from '../../domain/state.js' import type { CapabilityMap } from '../../views/shared/models.js' import type { UiFixture } from './ui-fixtures.js' @@ -204,18 +209,10 @@ export function capabilityMap( ? 'The current runtime does not acknowledge provider cancellation' : 'There is no active run to cancel', } - const activeRun = focusedActive ? focusedRun : undefined - const recoverableRun = activeRun - ? undefined - : [...state.runs] - .reverse() - .find( - (run) => - (run.status === 'detached' || - run.status === 'reconnecting' || - run.status === 'unknown') && - (run.controlRef !== undefined || run.receipt.nativeContextBoundaryProof !== undefined), - ) + const focusedRecoverable = + focusedRun !== undefined && isRecoverableRun(focusedRun) ? focusedRun : undefined + const activeRun = focusedActive && focusedRecoverable === undefined ? focusedRun : undefined + const recoverableRun = focusedRecoverable ?? [...state.runs].reverse().find(isRecoverableRun) capabilities['run.queue'] = activeRun?.capabilities.controls.queue ? { available: true, source: 'provider' } : { @@ -244,15 +241,17 @@ export function capabilityMap( : 'There is no active run', } capabilities['run.reconnect'] = - recoverableRun?.capabilities.streaming.replay && recoverableRun.capabilities.controls.recreate + recoverableRun?.capabilities.streaming.replay && + recoverableRun.capabilities.events.cursor && + recoverableRun.capabilities.controls.recreate ? { available: true, source: 'provider' } : { available: false, source: 'provider', - reason: active - ? 'Detach the active run before reconnecting it' - : recoverableRun - ? 'The detached run cannot be recreated by this provider' + reason: recoverableRun + ? 'The detached run cannot be recreated by this provider' + : active + ? 'There is no recoverable run to reconnect while another run is active' : 'There is no recoverable run to reconnect', } capabilities['run.reconcile'] = recoverableRun?.capabilities.controls.status @@ -260,10 +259,10 @@ export function capabilityMap( : { available: false, source: 'provider', - reason: active - ? 'Detach the active run before reconciling it' - : recoverableRun - ? 'The detached run does not expose provider status' + reason: recoverableRun + ? 'The detached run does not expose provider status' + : active + ? 'There is no recoverable run to reconcile while another run is active' : 'There is no recoverable run to reconcile', } if (fixture === 'interaction') { diff --git a/src/adapters/tui/ui-command-dispatch.ts b/src/adapters/tui/ui-command-dispatch.ts index 3a5508f8..930ab137 100644 --- a/src/adapters/tui/ui-command-dispatch.ts +++ b/src/adapters/tui/ui-command-dispatch.ts @@ -1,4 +1,5 @@ import { commandAvailability, isMutatingCommand } from '../../views/shared/command-registry.js' +import { isRecoverableRun } from '../../domain/state.js' import type { BraidIntent, UiDispatchResult } from '../../views/shared/intents.js' import type { InteractionOutcome, InteractionView } from '../../views/shared/models.js' import { dispatchAutomationCommand } from './ui-automation-command.js' @@ -50,17 +51,17 @@ export async function dispatchCommandIntent( intent.command === 'reconcile' ) { const state = context.app.state() + const focusedRun = + state.focusedRunId === null + ? undefined + : state.runs.find((run) => run.id === state.focusedRunId) const runId = intent.args[0] ?? (intent.command === 'detach' ? (state.activeRunId ?? undefined) - : [...state.runs] - .reverse() - .find( - (run) => - (run.status === 'detached' || run.status === 'unknown') && - run.controlRef !== undefined, - )?.id) + : focusedRun !== undefined && isRecoverableRun(focusedRun) + ? focusedRun.id + : [...state.runs].reverse().find(isRecoverableRun)?.id) if (runId === undefined) { return { kind: 'error', diff --git a/src/adapters/tui/ui-projection.ts b/src/adapters/tui/ui-projection.ts index cfd9b0d5..50106b89 100644 --- a/src/adapters/tui/ui-projection.ts +++ b/src/adapters/tui/ui-projection.ts @@ -8,7 +8,7 @@ import { profileModelSettings } from '../../app/profile-model-settings.js' import { isSensitiveFieldName } from '../../domain/bounded-structured.js' import type { BraidEventEnvelope } from '../../domain/events.js' import { interactionRemainingMs } from '../../domain/interaction-timeout.js' -import { activeRunForBranch, isActiveRunStatus, type BraidState } from '../../domain/state.js' +import { activeRunForBranch, type BraidState, isActiveRunStatus } from '../../domain/state.js' import { environmentView } from '../../views/shared/environment-presentation.js' import type { UiEvent } from '../../views/shared/intents.js' import type { @@ -19,9 +19,9 @@ import type { InteractionView, MessageView, RunView, - WorkStripItemView, TranscriptPartView, ViewStatus, + WorkStripItemView, } from '../../views/shared/models.js' import { freezeView } from '../../views/shared/models.js' import { @@ -246,11 +246,26 @@ export function workStripFor(state: BraidState): readonly WorkStripItemView[] | return run === undefined ? [] : [{ entry, run }] }) const focusedRunId = state.focusedRunId ?? state.activeRunId + const branchesByConversation = new Map>() + for (const run of [...runs, ...queued.map(({ run }) => run)]) { + const branches = branchesByConversation.get(run.conversationId) ?? new Set() + branches.add(run.branchId) + branchesByConversation.set(run.conversationId, branches) + } + const labelFor = (run: BraidState['runs'][number]): string => { + const title = state.conversations.find((item) => item.id === run.conversationId)?.title + if (title === undefined) return sanitizeTerminalText(run.branchId) + const safeTitle = sanitizeTerminalText(title) + return (branchesByConversation.get(run.conversationId)?.size ?? 0) > 1 + ? `${safeTitle} / ${sanitizeTerminalText(run.branchId)}` + : safeTitle + } const items: WorkStripItemView[] = runs.map((run) => ({ id: run.id, runId: run.id, conversationId: String(run.conversationId), branchId: String(run.branchId), + label: labelFor(run), state: viewStatusForRun(run.status), ...(run.receipt.requested.runner === undefined ? {} @@ -271,6 +286,7 @@ export function workStripFor(state: BraidState): readonly WorkStripItemView[] | runId: run.id, conversationId: String(run.conversationId), branchId: String(run.branchId), + label: labelFor(run), state: 'queued', ...(run.receipt.requested.runner === undefined ? {} diff --git a/src/adapters/tui/ui-view-model.ts b/src/adapters/tui/ui-view-model.ts index de23c19c..067af231 100644 --- a/src/adapters/tui/ui-view-model.ts +++ b/src/adapters/tui/ui-view-model.ts @@ -36,10 +36,28 @@ interface SemanticViewProjection { readonly hiddenGraphNodeCount: number } +interface ViewModelCacheEntry { + readonly selectedSurface: BraidViewModel['selectedSurface'] + readonly color: ColorMode + readonly highContrast: boolean + readonly reducedMotion: boolean + readonly canCancel: boolean + readonly storageFailure: string | undefined + readonly cleanupUncertain: string | undefined + readonly canRespond: boolean + readonly graphQuery: string + readonly value: BraidViewModel +} + const semanticViewCache = new WeakMap< BraidState, { readonly graphQuery: string; readonly projection: SemanticViewProjection } >() +/* + * State identity changes on every durable revision, so one completed view is safe to retain. + * Pending interactions contain wall-clock countdowns, so those views must rebuild. + */ +const viewModelCache = new WeakMap() function semanticViewFor(state: BraidState, graphQuery: string): SemanticViewProjection { const cached = semanticViewCache.get(state) @@ -67,6 +85,29 @@ export function buildBraidViewModel( canRespond = false, graphQuery = '', ): BraidViewModel { + const color = + appearance.color === undefined ? ('truecolor' as const) : resolveColorMode(appearance.color) + const highContrast = appearance.highContrast ?? false + const reducedMotion = appearance.reducedMotion ?? false + const hasPendingInteraction = state.runs.some((run) => + run.interactions.some((interaction) => interaction.status === 'pending'), + ) + const cached = viewModelCache.get(state) + if ( + cached !== undefined && + !hasPendingInteraction && + cached.selectedSurface === selectedSurface && + cached.color === color && + cached.highContrast === highContrast && + cached.reducedMotion === reducedMotion && + cached.canCancel === canCancel && + cached.storageFailure === storageFailure && + cached.cleanupUncertain === cleanupUncertain && + cached.canRespond === canRespond && + cached.graphQuery === graphQuery + ) { + return cached.value + } const status = storageFailure ? ('storage-failure' as const) : statusFor(state) const latest = state.runs.at(-1) const latestUsage = latest === undefined ? undefined : usageForRun(latest) @@ -98,12 +139,10 @@ export function buildBraidViewModel( ? 'cancelled' : status const model = profile.model?.default ?? 'automatic' - const color = - appearance.color === undefined ? ('truecolor' as const) : resolveColorMode(appearance.color) const semantic = semanticViewFor(state, graphQuery) const selectedActiveRun = activeRunForBranch(state, state.conversationId, state.branchId) const workStrip = workStripFor(state) - return freezeView({ + const view = freezeView({ revision: state.revision, workspace: state.workspace ? sanitizeTerminalText(state.workspace) : null, profileName: sanitizeTerminalText(profile.name ?? 'Unnamed profile'), @@ -206,8 +245,23 @@ export function buildBraidViewModel( selectedSurface, appearance: Object.freeze({ color, - highContrast: appearance.highContrast ?? false, - reducedMotion: appearance.reducedMotion ?? false, + highContrast, + reducedMotion, }), }) + if (!hasPendingInteraction) { + viewModelCache.set(state, { + selectedSurface, + color, + highContrast, + reducedMotion, + canCancel, + storageFailure, + cleanupUncertain, + canRespond, + graphQuery, + value: view, + }) + } + return view } diff --git a/src/app/application-interaction-actions.ts b/src/app/application-interaction-actions.ts index df3fdb2f..ac2c5d15 100644 --- a/src/app/application-interaction-actions.ts +++ b/src/app/application-interaction-actions.ts @@ -1,6 +1,7 @@ import type { InteractionResponse } from '@tangle-network/agent-interface' import type { AutomationRuleRecord } from '../domain/entities-runtime.js' import type { BraidEvent, BraidEventEnvelope } from '../domain/events.js' +import { localInteractionId } from '../domain/interaction-identity.js' import { DomainInvariantError } from '../domain/invariants-base.js' import { assertAutomationRuleRecord } from '../domain/invariants-runtime.js' import type { BraidState } from '../domain/state.js' @@ -10,7 +11,11 @@ import { operationId } from './application-guards.js' import type { PortViews } from './application-port-builder.js' import type { RuntimeEventEnvelopeLike, RuntimeEventIngestionResult } from './application-ports.js' import type { InteractionReceipt } from './application-types.js' -import { type AutomationActions, createAutomationActions } from './automation-actions.js' +import { + type AutomationActions, + type AutomationApplyOptions, + createAutomationActions, +} from './automation-actions.js' import type { SerializedEffectCoordinator } from './effect-coordinator.js' import { AppError } from './errors.js' import { InteractionAutomationCoordinator } from './interaction-automation-coordinator.js' @@ -30,6 +35,7 @@ export interface ApplicationInteractionActionsOptions { readonly owner: string readonly ports: () => Pick readonly whenDurable: () => Promise + readonly startupReconciliation?: Promise readonly responseTimeoutMs?: number } @@ -41,28 +47,35 @@ export interface ApplicationInteractionResponseInput { readonly automationRule?: AutomationRuleRecord } +interface InteractionReconciliationOptions { + readonly bypassStartupReconciliation?: boolean +} + /** Owns interaction response ordering and automatic rule application. */ export class ApplicationInteractionActions { readonly automation: AutomationActions readonly #options: ApplicationInteractionActionsOptions readonly #responses = new KeyedActionQueue() readonly #coordinator: InteractionAutomationCoordinator + readonly #startupReconciliation: Promise constructor(options: ApplicationInteractionActionsOptions) { this.#options = options + this.#startupReconciliation = options.startupReconciliation ?? Promise.resolve() this.automation = createAutomationActions({ state: options.state, events: options.events, commitAndWait: options.commitAndWait, now: options.now, - respond: (input) => this.respond(input), + respond: (input, applyOptions) => this.#respond(input, applyOptions), + startupReconciliation: this.#startupReconciliation, reconcilePending: () => this.reconcile(), canRespond: (runId) => this.canRespond(runId), }) this.#coordinator = new InteractionAutomationCoordinator({ state: options.state, events: options.events, - apply: (input) => this.automation.apply(input), + apply: (input) => this.automation.apply(input, { bypassStartupReconciliation: true }), }) } @@ -83,46 +96,65 @@ export class ApplicationInteractionActions { !this.canRespond(envelope.runId) ) return - const interactionId = envelope.event.request.id + const interactionId = localInteractionId(envelope.runId, envelope.event.request.id) const target = this.#options .state() .runs.find((run) => run.id === envelope.runId) ?.interactions.find((interaction) => interaction.request.id === interactionId) - if (target !== undefined) void this.#coordinator.schedule(target) + if (target !== undefined) this.#schedule(target) } respond(input: ApplicationInteractionResponseInput): Promise { - return this.#responses.run(`${input.runId}\u0000${input.interactionId}`, () => { - if (input.automationRule !== undefined) assertAutomationRule(input.automationRule) - const ports = this.#options.ports() - return respondInteractionController({ - operationId: operationId(input.operationId, 'respond-interaction'), - runId: input.runId, - interactionId: input.interactionId, - response: input.response, - ...(input.automationRule === undefined ? {} : { automationRule: input.automationRule }), - state: ports.state, - events: this.#options.events, - commitAndWait: ports.journal.commitAndWait, - ledger: this.#options.ledger, - effects: this.#options.effects, - execution: this.#options.execution, - owner: this.#options.owner, - responseTimeoutMs: - this.#options.responseTimeoutMs ?? DEFAULT_INTERACTION_RESPONSE_TIMEOUT_MS, - whenDurable: this.#options.whenDurable, - }) - }) + return this.#respond(input) + } + + #respond( + input: ApplicationInteractionResponseInput, + options: AutomationApplyOptions = {}, + ): Promise { + const ready = + options.bypassStartupReconciliation === true ? Promise.resolve() : this.#startupReconciliation + return ready.then(() => + this.#responses.run(`${input.runId}\u0000${input.interactionId}`, () => { + if (input.automationRule !== undefined) assertAutomationRule(input.automationRule) + const ports = this.#options.ports() + return respondInteractionController({ + operationId: operationId(input.operationId, 'respond-interaction'), + runId: input.runId, + interactionId: input.interactionId, + response: input.response, + ...(input.automationRule === undefined ? {} : { automationRule: input.automationRule }), + state: ports.state, + events: this.#options.events, + commitAndWait: ports.journal.commitAndWait, + ledger: this.#options.ledger, + effects: this.#options.effects, + execution: this.#options.execution, + owner: this.#options.owner, + responseTimeoutMs: + this.#options.responseTimeoutMs ?? DEFAULT_INTERACTION_RESPONSE_TIMEOUT_MS, + whenDurable: this.#options.whenDurable, + }) + }), + ) } - reconcile(): Promise { - return this.#coordinator.reconcile() + reconcile(options: InteractionReconciliationOptions = {}): Promise { + const ready = + options.bypassStartupReconciliation === true ? Promise.resolve() : this.#startupReconciliation + return ready.then(() => this.#coordinator.reconcile()) } async whenIdle(): Promise { await this.#coordinator.whenIdle() await this.#responses.whenIdle() } + + #schedule(target: Parameters[0]): void { + void this.#startupReconciliation + .then(() => this.#coordinator.schedule(target)) + .catch(() => undefined) + } } function assertAutomationRule(rule: AutomationRuleRecord): void { diff --git a/src/app/application.ts b/src/app/application.ts index cbd61f9e..c0119b88 100644 --- a/src/app/application.ts +++ b/src/app/application.ts @@ -12,7 +12,7 @@ import type { import { redactSensitiveText } from '../domain/redaction.js' import { replayEvents } from '../domain/reducer.js' import type { RuntimeEventEnvelope } from '../domain/runtime-events.js' -import { isLiveRunStatus, type BraidState, initialState } from '../domain/state.js' +import { type BraidState, initialState, isLiveRunStatus } from '../domain/state.js' import type { Clock } from '../ports/clock.js' import type { ExecuteTurnInput, ExecutionPort } from '../ports/execution.js' import type { IdSource } from '../ports/ids.js' @@ -97,6 +97,22 @@ export type { BraidApplicationOptions, CancelInput, CancelReceipt } from './appl const MAX_MESSAGE_BYTES = 1024 * 1024 const DEFAULT_CANCEL_TIMEOUT_MS = 5_000 +interface Deferred { + readonly promise: Promise + readonly resolve: (value: T | PromiseLike) => void + readonly reject: (reason?: unknown) => void +} + +function deferred(): Deferred { + let resolve!: Deferred['resolve'] + let reject!: Deferred['reject'] + const promise = new Promise((resolvePromise, rejectPromise) => { + resolve = resolvePromise + reject = rejectPromise + }) + return { promise, resolve, reject } +} + export class BraidApplication { readonly conversations: ConversationActions readonly intelligence: IntelligenceActions @@ -171,6 +187,10 @@ export class BraidApplication { this.#state = replayEvents(baseState, persisted) assertBraidState(this.#state) this.runtimeSelection.syncFromState(this.#state) + const interactionReconciliation = deferred() + // Keep startup failures observable to callers without creating an unhandled rejection when + // no interaction action consumes the barrier. + void interactionReconciliation.promise.catch(() => undefined) this.#interactions = new ApplicationInteractionActions({ state: () => this.#state, events: () => this.#journal.all(), @@ -186,6 +206,7 @@ export class BraidApplication { owner: this.#controlOwner, ports: () => this.#portViews, whenDurable: () => this.whenDurable(), + startupReconciliation: interactionReconciliation.promise, ...(options.interactionResponseTimeoutMs === undefined ? {} : { responseTimeoutMs: options.interactionResponseTimeoutMs }), @@ -290,6 +311,7 @@ export class BraidApplication { }, coordinate: (input, action) => this.#conversationOperations.run(input.operationId, input.digest, action), + profile: () => this.runtimeSelection.profile(), execution: this.#execution, send: (input) => this.send(input), ...(options.conversationStorage === undefined @@ -308,7 +330,11 @@ export class BraidApplication { throw error }) this.#automationReconciliation = this.#restartReconciliation.then(() => - this.#interactions.reconcile(), + this.#interactions.reconcile({ bypassStartupReconciliation: true }), + ) + void this.#automationReconciliation.then( + () => interactionReconciliation.resolve(), + (error: unknown) => interactionReconciliation.reject(error), ) this.#durableSender = createDurableSender({ currentState: () => this.#state, diff --git a/src/app/automation-actions.ts b/src/app/automation-actions.ts index 48eec37e..f7d5f061 100644 --- a/src/app/automation-actions.ts +++ b/src/app/automation-actions.ts @@ -74,11 +74,19 @@ export interface AutomationApplyCommand { readonly interactionId: string } +export interface AutomationApplyOptions { + /** Used by startup reconciliation, which already owns the readiness barrier. */ + readonly bypassStartupReconciliation?: boolean +} + export interface AutomationActions { readonly create: (input: AutomationRuleCreateCommand) => Promise readonly update: (input: AutomationRuleUpdateCommand) => Promise readonly dryRun: (input: AutomationDryRunCommand) => Promise - readonly apply: (input: AutomationApplyCommand) => Promise + readonly apply: ( + input: AutomationApplyCommand, + options?: AutomationApplyOptions, + ) => Promise readonly disable: (input: { readonly operationId: string readonly ruleId: string @@ -95,13 +103,17 @@ export function createAutomationActions(options: { readonly events: () => readonly BraidEventEnvelope[] readonly commitAndWait: AutomationStoreInput['commitAndWait'] readonly now: () => string - readonly respond: (input: { - readonly operationId: string - readonly runId: string - readonly interactionId: string - readonly response: import('@tangle-network/agent-interface').InteractionResponse - readonly automationRule?: AutomationRuleRecord - }) => Promise + readonly respond: ( + input: { + readonly operationId: string + readonly runId: string + readonly interactionId: string + readonly response: import('@tangle-network/agent-interface').InteractionResponse + readonly automationRule?: AutomationRuleRecord + }, + options?: AutomationApplyOptions, + ) => Promise + readonly startupReconciliation?: Promise readonly reconcilePending?: () => Promise readonly canRespond: (runId?: string) => boolean }): AutomationActions { @@ -158,28 +170,38 @@ export function createAutomationActions(options: { context: contextFor(state, target, input.context), }) }), - apply: (input) => - queue.run(async () => { - const state = options.state() - const target = targetFor(state, input.runId, input.interactionId) - if (target === undefined) - throw new AppError('UNKNOWN_INTERACTION', 'The interaction is no longer available') - assertCanRespond(options, target) - return applyAutomation({ - ...store(), - operationId: input.operationId, - interaction: target, - context: contextFor(state, target, undefined), - respond: (response, { rule }) => - options.respond({ - operationId: input.operationId, - runId: input.runId, - interactionId: input.interactionId, - response, - automationRule: rule, - }), - }) - }), + apply: (input, applyOptions = {}) => { + const ready = + applyOptions.bypassStartupReconciliation === true + ? Promise.resolve() + : (options.startupReconciliation ?? Promise.resolve()) + return ready.then(() => + queue.run(async () => { + const state = options.state() + const target = targetFor(state, input.runId, input.interactionId) + if (target === undefined) + throw new AppError('UNKNOWN_INTERACTION', 'The interaction is no longer available') + assertCanRespond(options, target) + return applyAutomation({ + ...store(), + operationId: input.operationId, + interaction: target, + context: contextFor(state, target, undefined), + respond: (response, { rule }) => + options.respond( + { + operationId: input.operationId, + runId: input.runId, + interactionId: input.interactionId, + response, + automationRule: rule, + }, + applyOptions, + ), + }) + }), + ) + }, disable: async (input) => { const receipt = await queue.run(() => disableAutomationRule({ ...store(), ...input })) await options.reconcilePending?.() diff --git a/src/app/composition-options.ts b/src/app/composition-options.ts new file mode 100644 index 00000000..df1157d6 --- /dev/null +++ b/src/app/composition-options.ts @@ -0,0 +1,27 @@ +import type { AgentProfile } from '@tangle-network/agent-interface' +import type { AgentTurnBackendResolver } from '../adapters/runtime/agent-runtime-execution.js' +import type { Clock } from '../ports/clock.js' +import type { EffectStoragePort, JournalPort } from '../ports/effect-storage.js' +import type { ExecutionPort } from '../ports/execution.js' +import type { IdSource } from '../ports/ids.js' +import type { SerializedEffectCoordinator } from './effect-coordinator.js' +import type { IntelligenceActionsOptions } from './intelligence-actions.js' +import type { ProductionCompositionConfig } from './production-composition.js' + +/** Shared inputs for in-memory, production, and durable application composition. */ +export interface CompositionOptions { + readonly fixture?: 'deterministic' + readonly clock?: Clock + readonly ids?: IdSource + readonly profile?: Readonly + readonly chunkDelayMs?: number + readonly journal?: JournalPort + readonly effectStorage?: EffectStoragePort + readonly effectCoordinator?: SerializedEffectCoordinator + readonly cancelTimeoutMs?: number + readonly interactionResponseTimeoutMs?: number + readonly execution?: ExecutionPort + readonly backendResolver?: AgentTurnBackendResolver + readonly production?: ProductionCompositionConfig + readonly intelligence?: IntelligenceActionsOptions +} diff --git a/src/app/composition.ts b/src/app/composition.ts index 9ced4d5c..aaa6406d 100644 --- a/src/app/composition.ts +++ b/src/app/composition.ts @@ -1,28 +1,14 @@ -import { performance } from 'node:perf_hooks' -import type { AgentProfile } from '@tangle-network/agent-interface' -import { defineAgentProfile } from '../adapters/agent-interface/profile-runtime.js' -import type { HeadlessKeySource } from '../adapters/credentials/headless-key.js' import { createOperatingSystemCredentialStore } from '../adapters/credentials/os.js' -import { - AgentRuntimeExecutionPort, - type AgentTurnBackendResolver, -} from '../adapters/runtime/agent-runtime-execution.js' +import { AgentRuntimeExecutionPort } from '../adapters/runtime/agent-runtime-execution.js' import { UnavailableExecutionPort } from '../adapters/runtime/unavailable-execution.js' -import { - openSqliteStorage, - type SqliteStartupStage, - type SqliteStorage, -} from '../adapters/storage/sqlite.js' -import { type Clock, FixedClock, SystemClock } from '../ports/clock.js' +import { FixedClock, SystemClock } from '../ports/clock.js' import { type CredentialPort, credentialRef } from '../ports/credentials.js' import type { EffectStoragePort, JournalPort } from '../ports/effect-storage.js' -import type { ExecutionPort } from '../ports/execution.js' -import { type IdSource, RandomIds, SequenceIds } from '../ports/ids.js' -import type { NativeInteractiveExecutionControl } from '../ports/native-interactive-execution.js' +import { RandomIds, SequenceIds } from '../ports/ids.js' import { deterministicBackend } from '../testing/deterministic-backend.js' import { BraidApplication } from './application.js' -import type { ConnectionRegistry } from './connections.js' -import type { SerializedEffectCoordinator } from './effect-coordinator.js' +import type { CompositionOptions } from './composition-options.js' +import { DETERMINISTIC_PROFILE, STARTER_PROFILE } from './default-profiles.js' import { FailClosedJournal } from './fail-closed-journal.js' import type { IntelligenceActionsOptions } from './intelligence-actions.js' import { createMemoryJournal } from './journal.js' @@ -31,75 +17,16 @@ import { type ProductionCompositionConfig, ProductionCompositionError, } from './production-composition.js' -import { StorageJournal } from './storage-journal.js' import { UnavailableAnalyst } from './unavailable-analyst.js' -export const STARTER_PROFILE: Readonly = defineAgentProfile({ - name: 'Braid starter', - description: 'A portable starter profile for the Braid terminal', -}) - -export const DETERMINISTIC_PROFILE: Readonly = defineAgentProfile({ - name: 'Braid starter', - description: 'A portable starter profile for the Braid terminal', - harness: 'pi', - model: { - default: 'fixture/deterministic', - provider: 'fixture', - reasoningEffort: 'none', - }, -}) - -export interface CompositionOptions { - readonly fixture?: 'deterministic' - readonly clock?: Clock - readonly ids?: IdSource - readonly profile?: Readonly - readonly chunkDelayMs?: number - readonly journal?: JournalPort - readonly effectStorage?: EffectStoragePort - readonly effectCoordinator?: SerializedEffectCoordinator - readonly cancelTimeoutMs?: number - readonly interactionResponseTimeoutMs?: number - readonly execution?: ExecutionPort - readonly backendResolver?: AgentTurnBackendResolver - readonly production?: ProductionCompositionConfig - readonly intelligence?: IntelligenceActionsOptions -} - -export interface DurableCompositionOptions - extends Omit { - readonly path: string - /** Directory that may contain Braid's encrypted database and backups. */ - readonly storageRoot?: string - /** Project directory materialized for agent execution. */ - readonly workspaceRoot?: string - readonly credentialStore?: CredentialPort - readonly databaseKeyRef?: import('../ports/credentials.js').CredentialRef - readonly databaseKeySource?: HeadlessKeySource - readonly backupDirectory?: string - readonly execution?: ExecutionPort - readonly backendResolver?: AgentTurnBackendResolver - /** Mutable catalog shared with the product connection service. */ - readonly connectionRegistry?: ConnectionRegistry - readonly startupObserver?: (stage: DurableStartupStage) => void -} - -export interface DurableStartupStage { - readonly name: - | 'production-composition' - | 'storage-open' - | `storage.${SqliteStartupStage['name']}` - | 'journal-restore' - | 'application-create' - readonly durationMs: number -} - -export interface DurableBraidApplication { - readonly app: BraidApplication - readonly storage: SqliteStorage - readonly nativeInteractive?: NativeInteractiveExecutionControl -} +export { + createDurableBraidApplication, + type DurableBraidApplication, + type DurableCompositionOptions, + type DurableStartupStage, +} from '../startup/durable-runtime.js' +export { DETERMINISTIC_PROFILE, STARTER_PROFILE } from './default-profiles.js' +export type { CompositionOptions } from './composition-options.js' export type ProductionBraidApplicationOptions = Omit @@ -212,123 +139,3 @@ export function createProductionBraidApplication( } return createBraidApplication(options) } - -export async function createDurableBraidApplication( - options: DurableCompositionOptions, -): Promise { - const clock = options.clock ?? new SystemClock() - const credentialStore = options.credentialStore ?? createOperatingSystemCredentialStore() - let stageStarted = performance.now() - const production = - options.production === undefined - ? undefined - : createProductionComposition( - withProductionCredentialOptions( - { - ...options.production, - ...(options.workspaceRoot === undefined - ? {} - : { workspaceRoot: options.workspaceRoot }), - }, - credentialStore, - ), - options.connectionRegistry, - ) - reportStartupStage(options.startupObserver, 'production-composition', stageStarted) - stageStarted = performance.now() - const storage = await openSqliteStorage({ - path: options.path, - credentialStore, - ...(options.storageRoot === undefined && options.workspaceRoot === undefined - ? {} - : { workspaceRoot: options.storageRoot ?? options.workspaceRoot }), - ...(options.databaseKeyRef === undefined ? {} : { databaseKeyRef: options.databaseKeyRef }), - ...(options.databaseKeySource === undefined - ? {} - : { databaseKeySource: options.databaseKeySource }), - ...(options.backupDirectory === undefined ? {} : { backupDirectory: options.backupDirectory }), - startupObserver: (stage) => - reportObservedStartupStage( - options.startupObserver, - `storage.${stage.name}`, - stage.durationMs, - ), - }) - reportStartupStage(options.startupObserver, 'storage-open', stageStarted) - try { - stageStarted = performance.now() - const scopedJournal = await StorageJournal.fromStorage(storage, clock) - reportStartupStage(options.startupObserver, 'journal-restore', stageStarted) - stageStarted = performance.now() - const configuredIntelligence: IntelligenceActionsOptions = options.intelligence ?? { - analyst: new UnavailableAnalyst(), - } - const intelligence = - production?.supervisorController === undefined - ? configuredIntelligence - : { - ...configuredIntelligence, - supervisorController: - configuredIntelligence.supervisorController ?? production.supervisorController, - } - const app = new BraidApplication({ - profile: options.profile ?? production?.profile ?? STARTER_PROFILE, - execution: - options.execution ?? - production?.execution ?? - (options.backendResolver - ? new AgentRuntimeExecutionPort(options.backendResolver) - : new UnavailableExecutionPort()), - clock, - ids: options.ids ?? new RandomIds(), - journal: scopedJournal, - effectStorage: storage, - conversationStorage: storage, - intelligence, - ...(options.effectCoordinator === undefined - ? {} - : { effectCoordinator: options.effectCoordinator }), - ...(options.cancelTimeoutMs === undefined - ? {} - : { cancelTimeoutMs: options.cancelTimeoutMs }), - ...(options.interactionResponseTimeoutMs === undefined - ? {} - : { interactionResponseTimeoutMs: options.interactionResponseTimeoutMs }), - }) - reportStartupStage(options.startupObserver, 'application-create', stageStarted) - return { - app, - storage, - ...(production?.nativeInteractive === undefined - ? {} - : { nativeInteractive: production.nativeInteractive }), - } - } catch (error) { - await storage.close().catch(() => undefined) - throw error - } -} - -function reportObservedStartupStage( - observer: DurableCompositionOptions['startupObserver'], - name: DurableStartupStage['name'], - durationMs: number, -): void { - try { - observer?.({ name, durationMs }) - } catch { - // Diagnostics cannot change application startup. - } -} - -function reportStartupStage( - observer: DurableCompositionOptions['startupObserver'], - name: DurableStartupStage['name'], - startedAt: number, -): void { - try { - observer?.({ name, durationMs: performance.now() - startedAt }) - } catch { - // Diagnostics cannot change application startup. - } -} diff --git a/src/app/conversation-branch-effects.ts b/src/app/conversation-branch-effects.ts index 43f720e9..ca7dadeb 100644 --- a/src/app/conversation-branch-effects.ts +++ b/src/app/conversation-branch-effects.ts @@ -3,6 +3,7 @@ import { type ContextTransferResult, contextTransferRequestDigest, contextTransferResultMatchesRequest, + forkedEnvironmentConfidentialityVerified, type PlacementInfo, type PortableContextPlanRequest, type PortableContextPlanResult, @@ -14,7 +15,6 @@ import { type WorkspaceCleanupRequest, type WorkspaceForkRequest, type WorkspaceForkResult, - forkedEnvironmentConfidentialityVerified, workspaceCheckpointRequestDigest, workspaceCheckpointResultMatchesRequest, workspaceCleanupAcknowledgementMatches, @@ -41,7 +41,8 @@ import { parseOperationId, parseRunId, } from '../domain/ids.js' -import type { BraidState } from '../domain/state.js' +import { assertJsonValue, objectValue } from '../domain/invariants-base.js' +import { type BraidState, isActiveRunStatus } from '../domain/state.js' import type { ExecutionPort } from '../ports/execution.js' import type { ConversationHost, @@ -214,6 +215,11 @@ async function executeCrossRunner( 'CAPABILITY_UNAVAILABLE', 'Canonical context transfer requires a recorded source environment', ) + if (sourceEnvironment.placement.provider !== portablePlan.source.source.provider) + throw new AppError( + 'FORK_PLAN_CONFLICT', + 'The portable plan names a different source provider than the recorded environment', + ) if (sourceEnvironment.providerEnvironmentId !== portablePlan.source.source.environmentId) throw new AppError( 'FORK_PLAN_CONFLICT', @@ -343,6 +349,16 @@ async function executeWorkspace( 'CAPABILITY_UNAVAILABLE', 'Workspace fork requires an exact recorded source environment', ) + if (sourceEnvironmentRecord.placement.provider !== source.provider) + throw new AppError( + 'FORK_PLAN_CONFLICT', + 'The source run and environment belong to different providers', + ) + if (!sourceRun.complete || isActiveRunStatus(sourceRun.status) || sourceRun.status === 'unknown') + throw new AppError( + 'CAPABILITY_UNAVAILABLE', + 'Workspace fork requires a completed source run boundary', + ) const capabilities = sourceRun.capabilities.environment?.branching if ( capabilities?.checkpoint !== true || @@ -664,7 +680,9 @@ function sourceEnvironmentForCleanup( : undefined })()) if (sourceCheckpoint === undefined) return undefined - return state.environments.find((candidate) => candidate.id === sourceCheckpoint.sourceEnvironmentId) + return state.environments.find( + (candidate) => candidate.id === sourceCheckpoint.sourceEnvironmentId, + ) } function cleanupResultFromOperation( @@ -973,7 +991,7 @@ async function acknowledgeOperation( operationId: ReturnType, digest: string, branch: BranchRecord, - result: Record, + result: unknown, ): Promise { const current = host.state().operations.find((operation) => operation.id === operationId) if (current === undefined) @@ -985,7 +1003,7 @@ async function acknowledgeOperation( requestDigest: digest as Digest, status: 'acknowledged', target: { kind: 'branch', id: branch.id }, - result: result as unknown as NonNullable, + result: operationResult(result), updatedAt: host.now(), acknowledgedAt: host.now(), }, @@ -1007,13 +1025,19 @@ async function acknowledgeCleanupOperation( ...current, requestDigest: digest as Digest, status: 'acknowledged', - result: result as unknown as NonNullable, + result: operationResult(result), updatedAt: host.now(), acknowledgedAt: host.now(), }, }) } +function operationResult(value: unknown): NonNullable { + objectValue(value, 'operation.result') + assertJsonValue(value, 'operation.result') + return value +} + function branchForOperation(state: BraidState, operation: OperationRecord): BranchRecord { if (operation.target?.kind !== 'branch') throw new AppError('OPERATION_INCOMPLETE', `Operation ${operation.id} has no branch result`) diff --git a/src/app/conversation-branches.ts b/src/app/conversation-branches.ts index 8760bde4..26be69f4 100644 --- a/src/app/conversation-branches.ts +++ b/src/app/conversation-branches.ts @@ -12,7 +12,7 @@ import { parseMessageId, parseOperationId, } from '../domain/ids.js' -import type { BraidState } from '../domain/state.js' +import { type BraidState, isActiveRunStatus } from '../domain/state.js' import type { ExecutionPort } from '../ports/execution.js' import { cleanupWorkspaceFork, executeBranchEffect } from './conversation-branch-effects.js' import { @@ -38,8 +38,8 @@ import { stableConversationIds, } from './conversation-support.js' import type { - ConfidentialExecutionRequest, CloneConversationInput, + ConfidentialExecutionRequest, ConversationHost, CreateBranchInput, ForkPlan, @@ -47,6 +47,7 @@ import type { SetRunOverridesInput, } from './conversation-types.js' import { AppError } from './errors.js' +import { resolveEffectiveProfile } from './profile-selection.js' interface ResolvedSource { readonly conversation: ConversationRecord @@ -281,7 +282,22 @@ export class ConversationBranches { const branchDigest = requestDigest('branch', normalized) const destinationBranchId = stableBranchIds(operationId, branchDigest).branchId const sourceRunner = source.branch.overrides.runner ?? state.profile.harness - const requestedRunner = input.runner ?? sourceRunner + const targetOverrides = runOverrides({ + inherited: source.branch.overrides, + ...(input.runner === undefined ? {} : { runner: input.runner }), + ...(input.model === undefined ? {} : { model: input.model }), + ...(input.effort === undefined ? {} : { effort: input.effort }), + ...(input.mode === undefined ? {} : { mode: input.mode }), + }) + const requestedRunner = targetOverrides.runner ?? sourceRunner + const targetProfile = resolveEffectiveProfile({ + profile: { profile: this.#host.profile?.() ?? state.profile }, + branchOverrides: { + ...(targetOverrides.runner === undefined ? {} : { harness: targetOverrides.runner }), + ...(targetOverrides.model === undefined ? {} : { model: targetOverrides.model }), + ...(targetOverrides.effort === undefined ? {} : { effort: targetOverrides.effort }), + }, + }).effectiveProfile const sourceRun = sourceRunForBranch(state, source.branch.id, source.through?.runId) const sourceEnvironmentId = source.branch.environmentId ?? sourceRun?.environmentId const kind = @@ -311,8 +327,10 @@ export class ConversationBranches { ...(input.destinationProvider === undefined ? {} : { destinationProvider: input.destinationProvider }), - ...(input.model === undefined ? {} : { destinationModel: input.model }), - profileDigest: canonicalAgentProfileDigestHex(state.profile), + ...(targetOverrides.model === undefined + ? {} + : { destinationModel: targetOverrides.model }), + profileDigest: canonicalAgentProfileDigestHex(targetProfile), }) : undefined const contextPort = contextTransferPort(this.#host.execution) @@ -323,7 +341,8 @@ export class ConversationBranches { state.environments.some( (environment) => environment.id === sourceEnvironmentId && - environment.providerEnvironmentId === portableContextPlan.source.source.environmentId, + environment.providerEnvironmentId === portableContextPlan.source.source.environmentId && + environment.placement.provider === portableContextPlan.source.source.provider, ) && contextPort?.transfer !== undefined const allowed = @@ -531,9 +550,17 @@ function workspaceForkReported( confidentialRequested: boolean, ): boolean { if (sourceEnvironmentId === undefined || run?.environmentId !== sourceEnvironmentId) return false + if ( + run === undefined || + !run.complete || + isActiveRunStatus(run.status) || + run.status === 'unknown' + ) + return false const environment = state.environments.find((candidate) => candidate.id === sourceEnvironmentId) if (environment?.providerEnvironmentId === undefined) return false if (run?.controlRef?.environmentId !== environment.providerEnvironmentId) return false + if (run.controlRef.provider !== environment.placement.provider) return false const branching = run?.capabilities.environment?.branching const supported = Boolean( hasWorkspaceBranchingMethods(execution) && diff --git a/src/app/conversation-composition.ts b/src/app/conversation-composition.ts index 5c6f2cf7..b7e1268b 100644 --- a/src/app/conversation-composition.ts +++ b/src/app/conversation-composition.ts @@ -14,6 +14,7 @@ export interface ConversationCompositionInput { input: { readonly operationId: string; readonly digest: string }, action: () => Promise, ) => Promise + readonly profile?: () => Readonly readonly execution?: import('../ports/execution.js').ExecutionPort readonly send?: (input: SendInput) => import('./application-types.js').SendReceipt readonly storage?: Pick @@ -27,6 +28,7 @@ export function createConversationActions( now: input.now, commit: input.commit, coordinate: input.coordinate, + ...(input.profile === undefined ? {} : { profile: input.profile }), ...(input.execution === undefined ? {} : { execution: input.execution }), ...(input.send === undefined ? {} : { send: input.send }), ...(input.storage === undefined diff --git a/src/app/conversation-types.ts b/src/app/conversation-types.ts index 3057c10a..c0ae87f1 100644 --- a/src/app/conversation-types.ts +++ b/src/app/conversation-types.ts @@ -1,4 +1,5 @@ import type { + AgentProfile, ConfidentialExecutionRequest, PortableContextPlan as CanonicalPortableContextPlan, HarnessType, @@ -25,6 +26,8 @@ export interface ConversationHost { state(): BraidState now(): string commit(event: BraidEvent): Promise + /** Exact profile selected for the next Runtime admission. */ + profile?: () => Readonly destroy?(input: { readonly conversationId: string; readonly operationId: string }): Promise coordinate?( input: { readonly operationId: string; readonly digest: string }, diff --git a/src/app/default-profiles.ts b/src/app/default-profiles.ts new file mode 100644 index 00000000..6bec7b2b --- /dev/null +++ b/src/app/default-profiles.ts @@ -0,0 +1,18 @@ +import type { AgentProfile } from '@tangle-network/agent-interface' +import { defineAgentProfile } from '../adapters/agent-interface/profile-runtime.js' + +export const STARTER_PROFILE: Readonly = defineAgentProfile({ + name: 'Braid starter', + description: 'A portable starter profile for the Braid terminal', +}) + +export const DETERMINISTIC_PROFILE: Readonly = defineAgentProfile({ + name: 'Braid starter', + description: 'A portable starter profile for the Braid terminal', + harness: 'pi', + model: { + default: 'fixture/deterministic', + provider: 'fixture', + reasoningEffort: 'none', + }, +}) diff --git a/src/app/interaction-controller.ts b/src/app/interaction-controller.ts index 11e6624e..b38d26cb 100644 --- a/src/app/interaction-controller.ts +++ b/src/app/interaction-controller.ts @@ -49,21 +49,25 @@ export interface InteractionControllerInput { export async function respondInteraction( input: InteractionControllerInput, ): Promise { - const run = findRun(input.state, input.runId) - const interaction = run.interactions.find( + let run = findRun(input.state, input.runId) + let interaction = run.interactions.find( (candidate) => candidate.request.id === input.interactionId, ) if (!interaction) throw new AppError('UNKNOWN_INTERACTION', 'The interaction is no longer available') const checked = checkInteractionResponse(interaction.request, input.response) + const providerResponse = { + ...checked.response, + id: interaction.responseBinding.interactionId, + } const request: InteractionEffectRequest = createInteractionResponseCommand( interaction.responseBinding, input.operationId, - checked.response, + providerResponse, ) const digest = effectRequestDigest({ effectKind: 'interaction.respond', request }) assertBinding(input, run, interaction.responseBinding) - const recorded = recordedInteractionOperation(input.events(), input.operationId) + let recorded = recordedInteractionOperation(input.events(), input.operationId) if (recorded.conflict) throw new AppError('OPERATION_CONFLICT', recorded.conflict) if (recorded.requested !== undefined) assertRecordedInteractionMatchesInput( @@ -79,42 +83,81 @@ export async function respondInteraction( input.interactionId, input.operationId, ) + let durableRequest = interaction.responseOperation + let retryUnknown = durableRequest?.outcome === 'unknown' const previous = input.ledger.getInteraction(input.operationId) if (previous) { if (previous.digest !== digest) throw new AppError('OPERATION_CONFLICT', `Operation ${input.operationId} has different input`) - return { - operationId: input.operationId, - runId: input.runId, - interactionId: input.interactionId, - replayed: true, - acknowledgement: { operationId: input.operationId, outcome: 'already-applied' }, - completion: previous.completion, + await previous.completion + run = findRun(input.state, input.runId) + interaction = run.interactions.find((candidate) => candidate.request.id === input.interactionId) + if (!interaction) + throw new AppError('UNKNOWN_INTERACTION', 'The interaction is no longer available') + durableRequest = interaction.responseOperation + retryUnknown = durableRequest?.outcome === 'unknown' + recorded = recordedInteractionOperation(input.events(), input.operationId) + if (recorded.conflict) throw new AppError('OPERATION_CONFLICT', recorded.conflict) + if (recorded.requested !== undefined) + assertRecordedInteractionMatchesInput( + recorded.requested, + input.runId, + input.interactionId, + input.operationId, + ) + if (recorded.responded !== undefined) + assertRecordedInteractionMatchesInput( + recorded.responded, + input.runId, + input.interactionId, + input.operationId, + ) + if (recorded.responded === undefined) + throw new AppError( + 'OPERATION_REQUIRES_RECONCILIATION', + `Operation ${input.operationId} has no durable interaction result`, + ) + if (recorded.responded.outcome !== 'unknown') { + assertRecordedResponseMatches(recorded.responded, checked, input.operationId) + return { + operationId: input.operationId, + runId: input.runId, + interactionId: input.interactionId, + replayed: true, + acknowledgement: { operationId: input.operationId, outcome: 'already-applied' }, + completion: previous.completion, + } } + retryUnknown = true } const existing = input.effects.current(input.operationId) if (existing && existing.requestDigest !== digest) throw new AppError('OPERATION_CONFLICT', `Operation ${input.operationId} has different input`) + const requestedOutcome = recorded.requested?.outcome ?? durableRequest?.requestedOutcome if (recorded.responded !== undefined) { - assertRecordedResponseMatches(recorded.responded, checked, input.operationId) - const completion = Promise.resolve(input.state.currentState()) - input.ledger.setInteraction(input.operationId, { digest, completion }) - return { - operationId: input.operationId, - runId: input.runId, - interactionId: input.interactionId, - replayed: true, - acknowledgement: - recorded.responded.outcome === 'unknown' - ? { - operationId: input.operationId, - outcome: 'unknown' as const, - detail: recorded.responded.detail ?? 'INTERACTION_RESPONSE_REQUIRES_RECONCILIATION', - } - : { operationId: input.operationId, outcome: 'already-applied' as const }, - completion, + retryUnknown ||= recorded.responded.outcome === 'unknown' + assertRecordedResponseMatches(recorded.responded, checked, input.operationId, { + allowUnknownOutcome: retryUnknown, + ...(requestedOutcome === undefined ? {} : { requestedOutcome }), + }) + if (recorded.responded.outcome !== 'unknown') { + const completion = Promise.resolve(input.state.currentState()) + input.ledger.setInteraction(input.operationId, { digest, completion }) + return { + operationId: input.operationId, + runId: input.runId, + interactionId: input.interactionId, + replayed: true, + acknowledgement: { operationId: input.operationId, outcome: 'already-applied' as const }, + completion, + } } } + if (durableRequest !== undefined && durableRequest.operationId === input.operationId) + assertDurableResponseMatches(durableRequest, checked, input.operationId, { + allowUnknownOutcome: retryUnknown, + ...(requestedOutcome === undefined ? {} : { requestedOutcome }), + }) if (!supportsInteractionResponse(run.receipt.capabilities)) throw new AppError( 'CAPABILITY_UNAVAILABLE', @@ -125,14 +168,11 @@ export async function respondInteraction( 'CAPABILITY_UNAVAILABLE', 'The current runtime cannot acknowledge interaction responses', ) - const durableRequest = interaction.responseOperation - if (durableRequest !== undefined && durableRequest.operationId === input.operationId) - assertDurableResponseMatches(durableRequest, checked, input.operationId) const alreadyRequested = recorded.requested !== undefined || durableRequest?.operationId === input.operationId if (recorded.requested !== undefined) assertRecordedResponseMatches(recorded.requested, checked, input.operationId) - assertInteractionIsOpen(input, run, interaction.status) + assertInteractionIsOpen(input, run, interaction.status, retryUnknown) const owner = durableRequest?.operationId ?? recordedInteractionOwner(input.events(), input.runId, input.interactionId) @@ -204,12 +244,21 @@ function assertBinding( run: ReturnType, binding: import('@tangle-network/agent-interface').InteractionBinding, ): void { + const exact = run.controlRef if ( binding.runId !== input.runId || - binding.interactionId !== input.interactionId || - (run.providerSessionId !== undefined && binding.sessionId !== run.providerSessionId) || - (run.environmentId !== undefined && binding.environmentId !== run.environmentId) || - (run.receipt.provider !== undefined && binding.provider !== run.receipt.provider) || + (exact !== undefined && + (binding.runId !== exact.runId || + binding.provider !== exact.provider || + binding.environmentId !== exact.environmentId || + binding.sessionId !== exact.sessionId || + binding.executionId !== exact.executionId)) || + (exact === undefined && + run.providerSessionId !== undefined && + binding.sessionId !== run.providerSessionId) || + (exact === undefined && + run.receipt.provider !== undefined && + binding.provider !== run.receipt.provider) || (input.providerSessionId !== undefined && binding.sessionId !== input.providerSessionId) ) { throw new AppError( @@ -223,10 +272,15 @@ function assertInteractionIsOpen( input: InteractionControllerInput, run: ReturnType, status: string, + allowUnknownResponseRetry = false, ): void { if (currentInteractionExpired(input, run)) throw new AppError('INTERACTION_EXPIRED', 'The interaction response window has expired') - if (status !== 'pending' && status !== 'responding') + if ( + status !== 'pending' && + status !== 'responding' && + !(allowUnknownResponseRetry && status === 'unknown') + ) throw new AppError('INTERACTION_STALE', `The interaction is already ${status}`) if (run.status === 'unknown' || run.status === 'expired' || run.status === 'cancelled') throw new AppError('INTERACTION_STALE', 'The run can no longer accept an interaction response') diff --git a/src/app/interaction-response-replay.ts b/src/app/interaction-response-replay.ts index 8d4d66d7..142a49f7 100644 --- a/src/app/interaction-response-replay.ts +++ b/src/app/interaction-response-replay.ts @@ -8,6 +8,8 @@ type RecordedInteractionEvent = Extract< { kind: 'run.interaction.response.requested' | 'run.interaction.responded' } > +type InteractionResponseOutcome = 'accepted' | 'declined' | 'cancelled' + export interface RecordedInteractionOperation { readonly requested?: Extract readonly responded?: Extract @@ -71,9 +73,13 @@ export function assertRecordedResponseMatches( event: RecordedInteractionEvent, checked: ReturnType, operationId: string, + options: { + readonly allowUnknownOutcome?: boolean + readonly requestedOutcome?: InteractionResponseOutcome + } = {}, ): void { if ( - event.outcome !== checked.response.outcome || + !responseOutcomeMatches(event.outcome, checked.response.outcome, options) || (event.dataDigest ?? undefined) !== (checked.dataDigest ?? undefined) ) throw new AppError('OPERATION_CONFLICT', `Operation ${operationId} has different input`) @@ -96,11 +102,33 @@ export function assertDurableResponseMatches( response: NonNullable, checked: ReturnType, operationId: string, + options: { + readonly allowUnknownOutcome?: boolean + readonly requestedOutcome?: InteractionResponseOutcome + } = {}, ): void { if ( - response.outcome !== checked.response.outcome || + !responseOutcomeMatches( + response.outcome, + checked.response.outcome, + response.requestedOutcome === undefined + ? options + : { ...options, requestedOutcome: response.requestedOutcome }, + ) || (response.dataDigest ?? undefined) !== (checked.dataDigest ?? undefined) || response.containsSecret !== checked.containsSecret ) throw new AppError('OPERATION_CONFLICT', `Operation ${operationId} has different input`) } + +function responseOutcomeMatches( + recorded: InteractionResponseOutcome | 'unknown', + checked: InteractionResponseOutcome, + options: { + readonly allowUnknownOutcome?: boolean + readonly requestedOutcome?: InteractionResponseOutcome + }, +): boolean { + if (recorded !== 'unknown') return recorded === checked + return options.allowUnknownOutcome === true && options.requestedOutcome === checked +} diff --git a/src/app/run-admission-context.ts b/src/app/run-admission-context.ts new file mode 100644 index 00000000..65a154e8 --- /dev/null +++ b/src/app/run-admission-context.ts @@ -0,0 +1,116 @@ +import { + ContextTransferReceiptSchema, + ContextTransferRequestSchema, + contextTransferResultMatchesRequest, + PortableContextPlanSchema, +} from '@tangle-network/agent-interface' +import { canonicalDigest } from '../domain/canonical.js' +import type { SendInput } from './application-types.js' +import { AppError } from './errors.js' + +export function validateContextPlan(input: SendInput): void { + if ( + input.contextPlan && + input.contextPlan.digest !== canonicalDigest({ ...input.contextPlan, digest: undefined }) + ) + throw new AppError('CONTEXT_DIGEST_INVALID', 'The portable context plan digest is invalid') + if ( + input.contextTransfer && + input.contextPlan && + input.contextTransfer.planDigest !== input.contextPlan.digest + ) + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The context transfer receipt does not match the accepted plan', + ) + const parsedPlan = + input.portableContextPlan === undefined + ? undefined + : PortableContextPlanSchema.safeParse(input.portableContextPlan) + if (parsedPlan !== undefined && !parsedPlan.success) + throw new AppError('CONTEXT_DIGEST_INVALID', 'The canonical portable context plan is invalid') + const parsedRequest = + input.portableContextTransferRequest === undefined + ? undefined + : ContextTransferRequestSchema.safeParse(input.portableContextTransferRequest) + const parsedReceipt = + input.portableContextTransferReceipt === undefined + ? undefined + : ContextTransferReceiptSchema.safeParse(input.portableContextTransferReceipt) + if (parsedReceipt !== undefined && !parsedRequest) { + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'A canonical context transfer receipt requires its exact request', + ) + } + if (parsedRequest !== undefined && !parsedRequest.success) + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The canonical context transfer request is invalid', + ) + if (parsedReceipt !== undefined && !parsedReceipt.success) + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The canonical context transfer receipt is invalid', + ) + if (parsedPlan?.success && parsedRequest?.success) { + if (parsedPlan.data.digest !== parsedRequest.data.plan.digest) + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The canonical context transfer request names another context plan', + ) + } + if (parsedRequest?.success && parsedReceipt?.success) { + if (!contextTransferResultMatchesRequest(parsedRequest.data, parsedReceipt.data)) + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The canonical context transfer receipt does not match its request', + ) + } + if (parsedRequest?.success) { + const destinationSessionId = parsedRequest.data.plan.destination.sessionId + if (input.sessionId !== destinationSessionId) + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The run session does not match the canonical context transfer destination', + ) + } + if (parsedReceipt?.success && input.sessionId !== parsedReceipt.data.sessionId) + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The run session does not match the context transfer receipt destination', + ) + if (input.contextTransfer !== undefined) { + const expectedPlanDigest = parsedPlan?.success + ? parsedPlan.data.digest + : parsedRequest?.success + ? parsedRequest.data.plan.digest + : parsedReceipt?.success + ? parsedReceipt.data.planDigest + : undefined + const expectedSourceRunId = parsedRequest?.success + ? parsedRequest.data.plan.source.source.runId + : parsedReceipt?.success + ? parsedReceipt.data.source.runId + : undefined + const expectedDestinationSessionId = parsedReceipt?.success + ? parsedReceipt.data.sessionId + : parsedRequest?.success + ? parsedRequest.data.plan.destination.sessionId + : undefined + const expectedAcceptedAt = parsedReceipt?.success ? parsedReceipt.data.admittedAt : undefined + if ( + (expectedPlanDigest !== undefined && + input.contextTransfer.planDigest !== expectedPlanDigest) || + (expectedSourceRunId !== undefined && + input.contextTransfer.sourceRunId !== expectedSourceRunId) || + (expectedDestinationSessionId !== undefined && + input.contextTransfer.destinationSessionId !== expectedDestinationSessionId) || + (expectedAcceptedAt !== undefined && input.contextTransfer.acceptedAt !== expectedAcceptedAt) + ) + throw new AppError( + 'CONTEXT_RECEIPT_CONFLICT', + 'The compact context transfer receipt does not match its canonical transfer', + ) + } +} diff --git a/src/app/run-admission-validation.ts b/src/app/run-admission-validation.ts index fa755030..34c4384a 100644 --- a/src/app/run-admission-validation.ts +++ b/src/app/run-admission-validation.ts @@ -2,16 +2,10 @@ import { type AgentProfile, NativeContextBoundaryProofSchema, } from '@tangle-network/agent-interface' -import { - ContextTransferRequestSchema, - contextTransferResultMatchesRequest, - PortableContextPlanSchema, -} from '@tangle-network/agent-interface' import { canonicalAgentProfileDigestHex, snapshotAgentProfile, } from '../adapters/agent-interface/profile-runtime.js' -import { canonicalDigest } from '../domain/canonical.js' import type { RunAdmissionReceipt, RunCapabilities } from '../domain/receipts.js' import type { ExecuteTurnInput, @@ -24,6 +18,8 @@ import type { SendInput } from './application-types.js' import { AppError } from './errors.js' import { branchHasVisibleHistory, resolveNativeContinuationRun } from './run-continuation.js' +export { validateContextPlan } from './run-admission-context.js' + export function validateNativeProof( context: StateReader & ExecutionAccess, input: SendInput & @@ -80,46 +76,6 @@ export function validateNativeProof( ) } -export function validateContextPlan(input: SendInput): void { - if ( - input.contextPlan && - input.contextPlan.digest !== canonicalDigest({ ...input.contextPlan, digest: undefined }) - ) - throw new AppError('CONTEXT_DIGEST_INVALID', 'The portable context plan digest is invalid') - if ( - input.contextTransfer && - input.contextPlan && - input.contextTransfer.planDigest !== input.contextPlan.digest - ) - throw new AppError( - 'CONTEXT_RECEIPT_CONFLICT', - 'The context transfer receipt does not match the accepted plan', - ) - if (input.portableContextPlan !== undefined) { - const parsedPlan = PortableContextPlanSchema.safeParse(input.portableContextPlan) - if (!parsedPlan.success) - throw new AppError('CONTEXT_DIGEST_INVALID', 'The canonical portable context plan is invalid') - } - if (input.portableContextTransferRequest !== undefined) { - const parsedRequest = ContextTransferRequestSchema.safeParse( - input.portableContextTransferRequest, - ) - if (!parsedRequest.success) - throw new AppError( - 'CONTEXT_RECEIPT_CONFLICT', - 'The canonical context transfer request is invalid', - ) - if ( - input.portableContextTransferReceipt !== undefined && - !contextTransferResultMatchesRequest(parsedRequest.data, input.portableContextTransferReceipt) - ) - throw new AppError( - 'CONTEXT_RECEIPT_CONFLICT', - 'The canonical context transfer receipt does not match its request', - ) - } -} - export function validateExecutionContext( state: ReturnType, input: ExecuteTurnInput, diff --git a/src/app/run-event-mapper.ts b/src/app/run-event-mapper.ts index d0253a27..8d43ab68 100644 --- a/src/app/run-event-mapper.ts +++ b/src/app/run-event-mapper.ts @@ -13,6 +13,7 @@ import type { TurnUsage, } from '../domain/events.js' import type { ExecutionEnvironmentObservation } from '../domain/execution-observation.js' +import { localInteractionId } from '../domain/interaction-identity.js' import { redactSensitiveText, redactStructuredValue } from '../domain/redaction.js' import { publicRuntimeDiagnostic } from '../domain/runtime-diagnostics.js' import type { BraidRuntimeEvent } from '../domain/runtime-events.js' @@ -52,17 +53,23 @@ interface SafeInteractionRequest { function safeInteractionRequest(value: unknown, runId: string): SafeInteractionRequest { const parsed = parseInteractionRequest(value) - if (parsed === undefined || parsed.binding.runId !== runId) + if ( + parsed === undefined || + parsed.binding.runId !== runId || + safePublicIdentifier(parsed.id) !== parsed.id + ) return invalidInteractionRequest(runId) - const material = safeValue(interactionRequestMaterial(parsed)) + const responseBinding = interactionResponseBinding(parsed) + const interactionId = localInteractionId(runId, parsed.id) + const material = safeValue({ + ...interactionRequestMaterial(parsed, { ...parsed.binding, interactionId }), + id: interactionId, + }) if (material === null || typeof material !== 'object' || Array.isArray(material)) return invalidInteractionRequest(runId) try { - const request = createInteractionRequest({ - ...(material as InteractionRequestMaterial), - binding: { ...parsed.binding }, - }) - return { request, responseBinding: interactionResponseBinding(parsed) } + const request = createInteractionRequest(material as InteractionRequestMaterial) + return { request, responseBinding } } catch { return invalidInteractionRequest(runId) } @@ -70,7 +77,7 @@ function safeInteractionRequest(value: unknown, runId: string): SafeInteractionR function invalidInteractionRequest(runId: string): SafeInteractionRequest { const exactRunId = safePublicIdentifier(runId) ?? 'run-invalid' - const interactionId = `${exactRunId}:interaction:invalid` + const interactionId = localInteractionId(exactRunId, 'invalid') const request = createInteractionRequest({ id: interactionId, kind: 'provider.invalid.interaction', @@ -463,7 +470,7 @@ export function providerEventFor( return { kind: 'run.interaction.cancelled', runId, - interactionId: safePublicIdentifier(event.id) ?? `${runId}:interaction`, + interactionId: localInteractionId(runId, safePublicIdentifier(event.id) ?? 'invalid'), ...(event.reason === undefined ? {} : { reason: safeText(event.reason) }), provider, } diff --git a/src/domain/interaction-identity.ts b/src/domain/interaction-identity.ts new file mode 100644 index 00000000..e4ce75df --- /dev/null +++ b/src/domain/interaction-identity.ts @@ -0,0 +1,9 @@ +import { canonicalDigest } from './canonical.js' +import { createInteractionId, type InteractionId } from './ids.js' + +/** Map one provider-owned interaction identity into Braid's local namespace. */ +export function localInteractionId(runId: string, providerInteractionId: string): InteractionId { + return createInteractionId( + `interaction-${canonicalDigest({ runId, providerInteractionId }).slice(0, 48)}`, + ) +} diff --git a/src/domain/invariants-run.ts b/src/domain/invariants-run.ts index bd099572..79d50233 100644 --- a/src/domain/invariants-run.ts +++ b/src/domain/invariants-run.ts @@ -12,6 +12,7 @@ import type { } from './entities.js' import type { AutomationRuleRecord } from './entities-runtime.js' import { isReplayCursor } from './ids.js' +import { localInteractionId } from './interaction-identity.js' import { assertDate, assertDigest, @@ -161,9 +162,12 @@ function assertBraidInteraction(value: unknown, runId: string, index: number): s if (value.runId !== runId) fail(`${label}.runId must match run.id`) if (request.binding.runId !== runId) fail(`${label}.request.binding.runId must match run.id`) if (responseBinding.runId !== runId) fail(`${label}.responseBinding.runId must match run.id`) + if (request.binding.interactionId !== request.id) + fail(`${label}.request.binding.interactionId must match request.id`) // Redaction recomputes the display request digest but preserves the response binding digest. - if (responseBinding.interactionId !== request.id) - fail(`${label}.responseBinding.interactionId must match request.id`) + assertPublicIdentifier(responseBinding.interactionId, `${label}.responseBinding.interactionId`) + if (localInteractionId(runId, responseBinding.interactionId) !== request.id) + fail(`${label}.responseBinding.interactionId does not map to request.id`) for (const key of ['provider', 'environmentId', 'sessionId', 'executionId'] as const) { if (responseBinding[key] !== request.binding[key]) fail(`${label}.responseBinding.${key} must match request.binding.${key}`) @@ -190,6 +194,13 @@ function assertBraidInteraction(value: unknown, runId: string, index: number): s assertDigest(responseOperation.dataDigest, `${label}.responseOperation.dataDigest`) if (typeof responseOperation.containsSecret !== 'boolean') fail(`${label}.responseOperation.containsSecret must be boolean`) + if ( + responseOperation.requestedOutcome !== undefined && + responseOperation.requestedOutcome !== 'accepted' && + responseOperation.requestedOutcome !== 'declined' && + responseOperation.requestedOutcome !== 'cancelled' + ) + fail(`${label}.responseOperation.requestedOutcome is invalid`) if ( responseOperation.outcome !== 'accepted' && responseOperation.outcome !== 'declined' && @@ -217,6 +228,18 @@ function assertBraidInteraction(value: unknown, runId: string, index: number): s !request.allowedOutcomes.includes(responseOperation.outcome) ) fail(`${label}.responseOperation.outcome is not allowed by request`) + if ( + responseOperation.requestedOutcome !== undefined && + request.allowedOutcomes !== undefined && + !request.allowedOutcomes.includes(responseOperation.requestedOutcome) + ) + fail(`${label}.responseOperation.requestedOutcome is not allowed by request`) + if ( + responseOperation.outcome !== 'unknown' && + responseOperation.requestedOutcome !== undefined && + responseOperation.outcome !== responseOperation.requestedOutcome + ) + fail(`${label}.responseOperation outcome does not match requestedOutcome`) if (responseOperation.containsSecret && responseOperation.dataDigest !== undefined) fail(`${label}.secret responseOperation cannot retain dataDigest`) if ( diff --git a/src/domain/legacy-interaction-snapshot.ts b/src/domain/legacy-interaction-snapshot.ts index e8eac1cf..094cd7cc 100644 --- a/src/domain/legacy-interaction-snapshot.ts +++ b/src/domain/legacy-interaction-snapshot.ts @@ -6,6 +6,7 @@ import { interactionRequestDigest, } from '@tangle-network/agent-interface' import { canonicalDigest } from './canonical.js' +import { localInteractionId } from './interaction-identity.js' import type { MaterializedState } from './materialized-state.js' import { MAX_RUN_INTERACTIONS, withPendingInteractionIndex } from './reducer-support.js' import type { BraidInteraction } from './runtime-projection.js' @@ -25,17 +26,19 @@ interface LegacyInteractionRecord { type LegacyMaterializedState = MaterializedState & { readonly interactions?: unknown } export function migrateLegacyInteractions(state: LegacyMaterializedState): MaterializedState { - if (!Object.hasOwn(state, 'interactions')) return state - if (!Array.isArray(state.interactions)) { + const hasLegacyInteractions = Object.hasOwn(state, 'interactions') + if (hasLegacyInteractions && !Array.isArray(state.interactions)) { throw new Error('Legacy snapshot interactions must be an array') } const { interactions: _legacyInteractions, ...withoutLegacyInteractions } = state - if (state.interactions.length === 0) return withoutLegacyInteractions + const legacyInteractions: readonly unknown[] = hasLegacyInteractions + ? (state.interactions as readonly unknown[]) + : [] const seen = new Set() const runs = [...state.runs] - for (const raw of state.interactions) { + for (const raw of legacyInteractions) { const legacy = legacyInteractionRecord(raw) const id = requiredString(legacy.id, 'legacy interaction id') const runId = requiredString(legacy.runId, `legacy interaction ${id} runId`) @@ -44,12 +47,15 @@ export function migrateLegacyInteractions(state: LegacyMaterializedState): Mater if (runIndex === -1) throw new Error(`Legacy snapshot interaction ${id} has no run ${runId}`) const run = runs[runIndex] if (!run) throw new Error(`Legacy snapshot interaction ${id} has no run ${runId}`) - const existing = run.interactions.find((interaction) => interaction.request.id === id) + const localId = localInteractionId(runId, id) + const existing = run.interactions.find( + (interaction) => interaction.request.id === id || interaction.request.id === localId, + ) if (existing !== undefined) { - assertLegacyInteractionMatches(legacy, existing) + assertLegacyInteractionMatches(legacy, existing, existing.request.id === localId) continue } - if (run.pendingInteractionIds?.includes(id)) { + if (run.pendingInteractionIds?.includes(id) || run.pendingInteractionIds?.includes(localId)) { throw new Error(`Legacy snapshot interaction ${id} conflicts with canonical pending identity`) } const migrated = migrateLegacyInteraction(legacy, run, id) @@ -61,7 +67,7 @@ export function migrateLegacyInteractions(state: LegacyMaterializedState): Mater ...(allInteractions.length > MAX_RUN_INTERACTIONS ? { interactionsTruncated: true } : {}), } } - return { ...withoutLegacyInteractions, runs } + return migrateStoredInteractions({ ...withoutLegacyInteractions, runs }) } function legacyInteractionRecord(value: unknown): LegacyInteractionRecord { @@ -77,15 +83,19 @@ function migrateLegacyInteraction( id: string, ): BraidInteraction { const legacyRequest = recordValue(legacy.request, `legacy interaction ${id} request`) - const request = legacyRequestWithBinding(legacyRequest, legacy, run, id) + const migratedRequest = localizeInteraction( + legacyRequestWithBinding(legacyRequest, legacy, run, id), + run.id, + id, + ) const status = legacyInteractionStatus(legacy.status, id) const responseOperation = legacyResponseOperation(legacy.resolution, status, id) if (status === 'responding' && responseOperation === undefined) { throw new Error(`Legacy snapshot interaction ${id} is responding without a response operation`) } return { - request, - responseBinding: { ...request.binding, requestDigest: request.requestDigest }, + request: migratedRequest.request, + responseBinding: migratedRequest.responseBinding, runId: run.id, source: { ...(isCanonicalIsoDateTime(legacy.createdAt) ? { occurredAt: legacy.createdAt } : {}), @@ -95,6 +105,76 @@ function migrateLegacyInteraction( } } +function migrateStoredInteractions(state: MaterializedState): MaterializedState { + const runs = state.runs.map((run) => { + const migratedIds = new Map() + const interactions = run.interactions.map((interaction) => { + const migrated = migrateStoredInteraction(interaction, run.id) + if (migrated.request.id !== interaction.request.id) + migratedIds.set(interaction.request.id, migrated.request.id) + return migrated + }) + const pendingInteractionIds = run.pendingInteractionIds?.map( + (interactionId) => migratedIds.get(interactionId) ?? interactionId, + ) + return { + ...run, + interactions, + ...(pendingInteractionIds === undefined ? {} : { pendingInteractionIds }), + } + }) + return { ...state, runs } +} + +function migrateStoredInteraction(interaction: BraidInteraction, runId: string): BraidInteraction { + const providerInteractionId = interaction.responseBinding.interactionId + if ( + interaction.request.id !== providerInteractionId || + interaction.request.binding.interactionId !== interaction.request.id || + localInteractionId(runId, providerInteractionId) === interaction.request.id + ) + return interaction + const localized = localizeInteraction( + interaction.request, + runId, + providerInteractionId, + interaction.responseBinding, + ) + return { ...interaction, ...localized } +} + +function localizeInteraction( + request: InteractionRequest, + runId: string, + providerInteractionId: string, + existingResponseBinding?: BraidInteraction['responseBinding'], +): { + readonly request: InteractionRequest + readonly responseBinding: BraidInteraction['responseBinding'] +} { + const localId = localInteractionId(runId, providerInteractionId) + const { requestDigest: _requestDigest, binding, ...requestFields } = request + const material = { + ...requestFields, + id: localId, + binding: { ...binding, interactionId: localId }, + } + const parsed = InteractionRequestSchema.safeParse({ + ...material, + requestDigest: interactionRequestDigest(material), + }) + if (!parsed.success) + throw new Error(`Legacy interaction ${providerInteractionId} request is invalid`) + return { + request: parsed.data as InteractionRequest, + responseBinding: existingResponseBinding ?? { + ...binding, + interactionId: providerInteractionId, + requestDigest: request.requestDigest, + }, + } +} + function legacyRequestWithBinding( value: Record, legacy: LegacyInteractionRecord, @@ -219,24 +299,39 @@ function legacyResponseOperation( function assertLegacyInteractionMatches( legacy: LegacyInteractionRecord, current: BraidInteraction, + mapped = false, ): void { const id = current.request.id const request = recordValue(legacy.request, `legacy interaction ${id} request`) - for (const key of [ - 'id', - 'kind', - 'title', - 'body', - 'subject', - 'answerSpec', - 'responseScopes', - 'allowedOutcomes', - 'default', - 'timeoutMs', - 'onTimeout', - 'binding', - 'requestDigest', - ] as const) { + const keys: readonly (keyof InteractionRequest)[] = mapped + ? [ + 'kind', + 'title', + 'body', + 'subject', + 'answerSpec', + 'responseScopes', + 'allowedOutcomes', + 'default', + 'timeoutMs', + 'onTimeout', + ] + : [ + 'id', + 'kind', + 'title', + 'body', + 'subject', + 'answerSpec', + 'responseScopes', + 'allowedOutcomes', + 'default', + 'timeoutMs', + 'onTimeout', + 'binding', + 'requestDigest', + ] + for (const key of keys) { if ( request[key] !== undefined && canonicalDigest(request[key]) !== canonicalDigest(current.request[key]) diff --git a/src/domain/reducer-interactions.ts b/src/domain/reducer-interactions.ts index 0542fa8c..27a14c71 100644 --- a/src/domain/reducer-interactions.ts +++ b/src/domain/reducer-interactions.ts @@ -142,6 +142,7 @@ export function reduceInteractionEvent( responseOperation: { operationId: createOperationId(event.operationId), outcome: event.outcome, + requestedOutcome: event.outcome, ...(event.dataDigest === undefined ? {} : { dataDigest: event.dataDigest }), containsSecret: event.containsSecret, ...(event.automationRule === undefined ? {} : { automationRule: event.automationRule }), @@ -170,13 +171,14 @@ export function reduceInteractionEvent( : {}), } } + if (!canResolveUnknownResponse(current, event)) + throw interactionInvariant( + `Interaction ${event.interactionId} has a different response result`, + ) + } else throw interactionInvariant( - `Interaction ${event.interactionId} has a different response result`, + `Interaction ${event.interactionId} cannot be resolved from ${current.status}`, ) - } - throw interactionInvariant( - `Interaction ${event.interactionId} cannot be resolved from ${current.status}`, - ) } const responseOperation = current.responseOperation if (responseOperation === undefined) @@ -299,7 +301,7 @@ function sameResponseRequest( return ( response !== undefined && response.operationId === createOperationId(event.operationId) && - response.outcome === event.outcome && + (response.requestedOutcome ?? response.outcome) === event.outcome && (response.dataDigest ?? undefined) === (event.dataDigest ?? undefined) && response.containsSecret === event.containsSecret && canonicalDigest(response.automationRule ?? null) === @@ -322,13 +324,31 @@ function sameResponseResult( ) } +function canResolveUnknownResponse( + current: BraidInteraction, + event: Extract, +): boolean { + const response = current.responseOperation + return ( + current.status === 'unknown' && + event.outcome !== 'unknown' && + response !== undefined && + response.outcome === 'unknown' && + response.requestedOutcome === event.outcome && + response.operationId === createOperationId(event.operationId) && + (response.dataDigest ?? undefined) === (event.dataDigest ?? undefined) && + response.containsSecret === event.containsSecret + ) +} + function assertResponseMatches( response: NonNullable, event: Extract, ): void { if ( response.operationId !== createOperationId(event.operationId) || - (event.outcome !== 'unknown' && response.outcome !== event.outcome) || + (event.outcome !== 'unknown' && + (response.requestedOutcome ?? response.outcome) !== event.outcome) || (response.dataDigest ?? undefined) !== (event.dataDigest ?? undefined) || response.containsSecret !== event.containsSecret ) { diff --git a/src/domain/reducer-lifecycle.ts b/src/domain/reducer-lifecycle.ts index 7bed7702..5e431409 100644 --- a/src/domain/reducer-lifecycle.ts +++ b/src/domain/reducer-lifecycle.ts @@ -170,7 +170,7 @@ export function reduceLifecycleEvent( return { ...state, ...base, - focusedRunId: event.runId, + ...(state.focusedRunId === null ? { focusedRunId: event.runId } : {}), runs: updateRun(state, event.runId, (run) => addActivity( { ...run, status: 'reconnecting' }, @@ -228,7 +228,6 @@ export function reduceLifecycleEvent( return { ...state, ...base, - ...(isTerminalStatus(to) ? {} : { focusedRunId: event.runId }), runs: updateRun(state, event.runId, (run) => addActivity( { ...run, status: to }, @@ -397,15 +396,3 @@ function reduceRequestedRun( { run, turn, userMessage, assistantMessage, at: occurredAt }, ) } - -function isTerminalStatus(status: import('./state.js').RunStatus): boolean { - return ( - status === 'completed' || - status === 'failed' || - status === 'aborted' || - status === 'cancelled' || - status === 'blocked' || - status === 'expired' || - status === 'unknown' - ) -} diff --git a/src/domain/runtime-projection.ts b/src/domain/runtime-projection.ts index 8aa613dd..0f895576 100644 --- a/src/domain/runtime-projection.ts +++ b/src/domain/runtime-projection.ts @@ -64,6 +64,8 @@ export interface BraidInteraction { readonly responseOperation?: { readonly operationId: OperationId readonly outcome: 'accepted' | 'declined' | 'cancelled' | 'unknown' + /** The user-selected outcome remains bound while provider status is unknown. */ + readonly requestedOutcome?: 'accepted' | 'declined' | 'cancelled' readonly dataDigest?: Digest readonly containsSecret: boolean readonly automationRule?: AutomationRuleRecord diff --git a/src/domain/state.ts b/src/domain/state.ts index 8bb05f00..59cbde5a 100644 --- a/src/domain/state.ts +++ b/src/domain/state.ts @@ -209,6 +209,16 @@ export function isLiveRunStatus(status: RunStatus): boolean { return isActiveRunStatus(status) && status !== 'detached' } +/** Returns true when a retained run has enough identity to resume or reconcile. */ +export function isRecoverableRun(run: BraidRun): boolean { + return ( + (run.status === 'detached' || run.status === 'reconnecting' || run.status === 'unknown') && + (run.controlRef !== undefined || + run.receipt?.nativeContextBoundaryProof !== undefined || + run.providerSessionId !== undefined) + ) +} + /** Derives the branch-scoped active run index from canonical run records. */ export function activeRunRefs(state: BraidState): readonly ActiveRunRef[] { return state.runs diff --git a/src/ports/execution.ts b/src/ports/execution.ts index b2bb813d..ba19c1d6 100644 --- a/src/ports/execution.ts +++ b/src/ports/execution.ts @@ -177,17 +177,17 @@ export interface ExecutionPort { ): Promise environmentCapabilities?(): AgentEnvironmentCapabilities | Promise /** Provider-owned context planning and fresh-session transfer, when supported. */ - readonly context?: ContextTransferExecutionPort + readonly context?: ContextTransferExecutionPort | undefined /** Alias retained for adapters that name the capability after its operation. */ - readonly contextTransfer?: ContextTransferExecutionPort + readonly contextTransfer?: ContextTransferExecutionPort | undefined /** Retry-safe checkpoint, fork, lookup, and cleanup operations, when supported. */ - readonly workspaceBranching?: AgentWorkspaceBranching + readonly workspaceBranching?: AgentWorkspaceBranching | undefined /** Provider-owned source lookup used to reconstruct branching after restart. */ - readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider + readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider | undefined /** External verifier required before Braid marks a confidential fork verified. */ - readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier + readonly confidentialAttestationVerifier?: ConfidentialAttestationVerifier | undefined /** Provider identity used when Braid builds a destination context plan. */ - readonly provider?: string + readonly provider?: string | undefined } export const DEFAULT_RUN_CAPABILITIES: RunCapabilities = Object.freeze({ @@ -225,11 +225,12 @@ export function supportsNativeContinuation(capabilities: AgentEnvironmentCapabil return ( capabilities.sessions.continue && capabilities.nativeContinuation?.atomicBoundary === true && - capabilities.nativeContinuation.requestIdempotency === true + capabilities.nativeContinuation.requestIdempotency === true && + capabilities.nativeContinuation.admissionControl === true ) } -/** A run can continue natively only when its environment proves both safety guarantees. */ +/** A run can continue natively only when its environment proves safe replay and early control. */ export function runSupportsNativeContinuation(capabilities: RunCapabilities): boolean { return ( capabilities.environment !== undefined && supportsNativeContinuation(capabilities.environment) diff --git a/src/startup/durable-runtime.ts b/src/startup/durable-runtime.ts index bd2bef5f..4cd4eb8e 100644 --- a/src/startup/durable-runtime.ts +++ b/src/startup/durable-runtime.ts @@ -13,7 +13,7 @@ import { type SqliteStorage, } from '../adapters/storage/sqlite.js' import { BraidApplication } from '../app/application.js' -import type { CompositionOptions } from '../app/composition.js' +import type { CompositionOptions } from '../app/composition-options.js' import type { ConnectionRegistry } from '../app/connections.js' import { STARTER_PROFILE } from '../app/default-profiles.js' import type { IntelligenceActionsOptions } from '../app/intelligence-actions.js' diff --git a/src/testing/supervision-ui-fixture.ts b/src/testing/supervision-ui-fixture.ts index 42242364..ef3aee47 100644 --- a/src/testing/supervision-ui-fixture.ts +++ b/src/testing/supervision-ui-fixture.ts @@ -5,6 +5,10 @@ import { createSupervisionSnapshot } from './supervision-fixture.js' const FIXTURE_TIME = Date.parse('2026-08-28T20:00:00.000Z') +function beforeFixtureTime(milliseconds: number): string { + return new Date(FIXTURE_TIME - milliseconds).toISOString() +} + /** Compose the normal Runtime projection path with stable data for terminal captures. */ export function createSupervisionUiFixture(): IntelligenceActionsOptions { const watcher = new RuntimeSupervisorWatcher((rootDir) => @@ -16,11 +20,13 @@ export function createSupervisionUiFixture(): IntelligenceActionsOptions { id: 'runtime-supervisor-release', status: 'running', task: 'prove the Braid release', + startedAt: beforeFixtureTime(6_200), budget: 3, workers: [ { id: 'runtime-worker-stream', label: 'stream and replay', + startedAt: beforeFixtureTime(4_200), latencyMs: 1_840, spend: { iterations: 1, @@ -34,6 +40,7 @@ export function createSupervisionUiFixture(): IntelligenceActionsOptions { { id: 'runtime-worker-ui', label: 'terminal proof', + startedAt: beforeFixtureTime(3_100), latencyMs: 2_310, spend: { iterations: 2, @@ -48,6 +55,7 @@ export function createSupervisionUiFixture(): IntelligenceActionsOptions { id: 'runtime-worker-review', label: 'release review', parent: 'terminal proof', + startedAt: beforeFixtureTime(1_200), latencyMs: 940, spend: { iterations: 3, tokensInput: 564, tokensOutput: 376, usd: 0.012, ms: 940 }, liveTail: ['release review: working'], diff --git a/src/views/shared/duration.ts b/src/views/shared/duration.ts index 6ceb07a2..17716123 100644 --- a/src/views/shared/duration.ts +++ b/src/views/shared/duration.ts @@ -10,13 +10,14 @@ export function effectiveElapsedMs( recorded: number | undefined, now = Date.now(), ): number | undefined { + if (recorded !== undefined && Number.isFinite(recorded) && recorded >= 0) return recorded if ( (status === 'running' || status === 'starting' || status === 'reconnecting') && startedAt !== undefined ) { return elapsedSince(startedAt, now) } - return recorded + return undefined } export function formatDuration(milliseconds: number): string { diff --git a/src/views/shared/models.ts b/src/views/shared/models.ts index f46321f3..a076c1f8 100644 --- a/src/views/shared/models.ts +++ b/src/views/shared/models.ts @@ -235,6 +235,7 @@ export interface WorkStripItemView { readonly runId: string readonly conversationId: string readonly branchId: string + readonly label: string readonly state: ViewStatus | 'queued' readonly runner?: string readonly model?: string diff --git a/src/views/shared/semantic-activity.ts b/src/views/shared/semantic-activity.ts index b1c3add2..9110674e 100644 --- a/src/views/shared/semantic-activity.ts +++ b/src/views/shared/semantic-activity.ts @@ -139,6 +139,7 @@ function activityForAnalysis(analysis: BraidState['analyses'][number]): Semantic function activityForSupervisor( supervisor: BraidState['supervisors'][number], ): SemanticActivityItem { + const wallElapsedMs = elapsedMs(supervisor.createdAt, supervisor.updatedAt) return { id: `supervisor:${supervisor.id}`, kind: 'supervisor', @@ -149,6 +150,7 @@ function activityForSupervisor( entityType: 'supervisor', entityId: supervisor.id, startedAt: supervisor.createdAt, + ...(wallElapsedMs === undefined ? {} : { elapsedMs: wallElapsedMs }), } } @@ -157,6 +159,7 @@ function activityForWorker( rootRunId: string | undefined, ): SemanticActivityItem { const runId = worker.runId ?? rootRunId + const wallElapsedMs = elapsedMs(worker.createdAt, worker.updatedAt) return { id: `worker:${worker.id}`, kind: 'worker', @@ -168,7 +171,7 @@ function activityForWorker( entityType: 'worker', entityId: worker.id, startedAt: worker.createdAt, - ...(worker.latencyMs === undefined ? {} : { elapsedMs: worker.latencyMs }), + ...(wallElapsedMs === undefined ? {} : { elapsedMs: wallElapsedMs }), } } diff --git a/src/views/tui/execution-target.ts b/src/views/tui/execution-target.ts index d9f452e9..40f213c2 100644 --- a/src/views/tui/execution-target.ts +++ b/src/views/tui/execution-target.ts @@ -1,4 +1,5 @@ import type { BraidViewModel, EnvironmentView, GraphNodeType, RunView } from '../shared/models.js' +import { isSyntheticFixture } from './terminal-identity.js' export interface ExecutionTargetView { readonly source: 'profile' | 'run' @@ -119,14 +120,16 @@ function runTarget(view: BraidViewModel, run: RunView): ExecutionTargetView { run.environmentId === undefined ? undefined : view.environments.find((candidate) => candidate.id === run.environmentId) - const backend = run.provider ?? environment?.provider + const model = run.model ?? run.usage?.model ?? view.model + const synthetic = isSyntheticFixture(model) + const backend = run.provider ?? environment?.provider ?? (synthetic ? 'fixture' : undefined) return Object.freeze({ source: 'run', runId: run.id, profileName: run.profileName ?? view.profileName, ...(run.profileDigest === undefined ? {} : { profileDigest: run.profileDigest }), runner: run.runner ?? view.runner, - model: run.model ?? run.usage?.model ?? view.model, + model, ...(backend === undefined ? {} : { backend }), ...(run.effort === undefined ? {} : { effort: run.effort }), ...(run.maxVisibleOutputTokens === undefined @@ -136,7 +139,8 @@ function runTarget(view: BraidViewModel, run: RunView): ExecutionTargetView { ...(run.maxTotalOutputTokens === undefined ? {} : { maxTotalOutputTokens: run.maxTotalOutputTokens }), - connection: run.connection ?? run.connectionId ?? 'not connected', + connection: + run.connection ?? run.connectionId ?? (synthetic ? 'deterministic fixture' : 'not connected'), ...(run.connectionId === undefined ? {} : { connectionId: run.connectionId }), ...(environment === undefined ? {} : { environment }), }) diff --git a/src/views/tui/profile-compatibility.ts b/src/views/tui/profile-compatibility.ts index 5ec471b3..e235c869 100644 --- a/src/views/tui/profile-compatibility.ts +++ b/src/views/tui/profile-compatibility.ts @@ -103,7 +103,7 @@ function readCompatibilityState( function supportedLines(values: SupportedValues): readonly string[] { return [ 'profile compatibility', - `supported pair: harness=${values.runner} · model=${values.model}`, + `supported pair: runner=${values.runner} · model=${values.model}`, `authored profile "${values.profileName}" remains unchanged`, ] } @@ -111,7 +111,7 @@ function supportedLines(values: SupportedValues): readonly string[] { function incompatibleLines(values: UnsupportedValues): readonly string[] { return [ 'profile compatibility', - `unsupported pair: harness=${values.runner} · model=${values.model}`, + `unsupported pair: runner=${values.runner} · model=${values.model}`, `authored profile "${values.profileName}" remains unchanged`, 'choose one explicit change:', `1. change runner to ${values.suggestedRunner} to keep model ${values.model}`, diff --git a/src/views/tui/terminal-chrome.ts b/src/views/tui/terminal-chrome.ts index 40de6a44..1912897d 100644 --- a/src/views/tui/terminal-chrome.ts +++ b/src/views/tui/terminal-chrome.ts @@ -153,7 +153,7 @@ function workStripItem( const runner = sanitizeNotification(item.runner ?? '?') const model = sanitizeNotification(item.model ?? '?') const branchWidth = Math.max(12, Math.min(mode === 'wide' ? 44 : 28, Math.floor(width / 3))) - const branch = compactWorkIdentity(item.branchId, branchWidth) + const branch = compactWorkIdentity(item.label, branchWidth) const actionEntries = Object.entries(item.actions) const actions = ( mode === 'wide' diff --git a/src/views/tui/terminal-identity.ts b/src/views/tui/terminal-identity.ts index e434b510..592f700c 100644 --- a/src/views/tui/terminal-identity.ts +++ b/src/views/tui/terminal-identity.ts @@ -76,7 +76,7 @@ export function renderTerminalContext( ) } - const route = terminalValuePart(theme, `harness ${identity.runner}`) + const route = terminalValuePart(theme, `runner ${identity.runner}`) const modelPart = model ? terminalValuePart(theme, `model ${model}`) : '' const backendLabel = executionBackendLabel(identity.backend, identity.connection) const backend = terminalValuePart(theme, `backend ${backendLabel}`) diff --git a/test/cli-bridge-retained-restart.test.ts b/test/cli-bridge-retained-restart.test.ts index 4d112c6f..496f5c29 100644 --- a/test/cli-bridge-retained-restart.test.ts +++ b/test/cli-bridge-retained-restart.test.ts @@ -152,6 +152,9 @@ function recoveryPlan(controlRef: AgentExactRunControlRef): RetainedExecutionPla async contextBoundary() { return null }, + beginNativeContinuation() { + throw new Error('native continuation is not part of this recovery test') + }, async continueNative() { throw new Error('native continuation is not part of this recovery test') }, diff --git a/test/cli-startup.test.ts b/test/cli-startup.test.ts index da0e313d..94558857 100644 --- a/test/cli-startup.test.ts +++ b/test/cli-startup.test.ts @@ -134,6 +134,13 @@ test('lazy execution defers provider loading and reuses the loaded port', async let loads = 0 let streamCalls = 0 const admission = { provider: 'test-provider' } + const context = {} as NonNullable + const contextTransfer = {} as NonNullable + const workspaceBranching = {} as NonNullable + const workspaceBranchingProvider = {} as NonNullable + const confidentialAttestationVerifier = (() => true) as NonNullable< + ExecutionPort['confidentialAttestationVerifier'] + > const execution = new LazyExecutionPort({ load: async () => { loads += 1 @@ -143,14 +150,27 @@ test('lazy execution defers provider loading and reuses the loaded port', async streamCalls += 1 yield* [] }, + context, + contextTransfer, + workspaceBranching, + workspaceBranchingProvider, + confidentialAttestationVerifier, + provider: 'test-provider', } satisfies ExecutionPort }, }) const input = {} as ExecuteTurnInput assert.equal(loads, 0) + assert.equal(execution.context, undefined) assert.deepEqual(await execution.admit(input), admission) assert.equal(loads, 1) + assert.equal(execution.context, context) + assert.equal(execution.contextTransfer, contextTransfer) + assert.equal(execution.workspaceBranching, workspaceBranching) + assert.equal(execution.workspaceBranchingProvider, workspaceBranchingProvider) + assert.equal(execution.confidentialAttestationVerifier, confidentialAttestationVerifier) + assert.equal(execution.provider, 'test-provider') for await (const _event of execution.streamTurn(input)) { // The test provider emits no events. } diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts index 79d34937..9927beb3 100644 --- a/test/conversation-branch-effects.test.ts +++ b/test/conversation-branch-effects.test.ts @@ -2,6 +2,7 @@ import assert from 'node:assert/strict' import test from 'node:test' import type { AgentExactRunControlRef, + AgentWorkspaceBranchingProvider, ContextTransferRequest, ContextTransferResult, WorkspaceCheckpointRequest, @@ -9,7 +10,8 @@ import type { WorkspaceForkRequest, WorkspaceForkResult, } from '@tangle-network/agent-interface' -import type { AgentWorkspaceBranchingProvider } from '@tangle-network/agent-interface' +import { defineAgentProfile } from '@tangle-network/agent-interface' +import { canonicalAgentProfileDigestHex } from '../src/adapters/agent-interface/profile-runtime.js' import { createBraidApplication } from '../src/app/composition.js' import { MemoryJournal } from '../src/app/journal.js' import { canonicalDigest } from '../src/domain/canonical.js' @@ -285,12 +287,16 @@ async function prepareSource(app: ReturnType): Pr function executionFor(options: { readonly capabilities: ReturnType + readonly sourceControlProvider?: string readonly contextState?: ContextProviderState readonly workspaceBranching?: NonNullable readonly workspaceBranchingProvider?: AgentWorkspaceBranchingProvider - readonly confidentialAttestationVerifier?: NonNullable + readonly confidentialAttestationVerifier?: NonNullable< + ExecutionPort['confidentialAttestationVerifier'] + > }): ExecutionPort { const contextState = options.contextState + const sourceControlProvider = options.sourceControlProvider ?? SOURCE_PROVIDER return { admissionMode: 'sync', capabilities: () => options.capabilities, @@ -331,7 +337,7 @@ function executionFor(options: { }, controlRef: exactControl({ runId: input.runId, - provider: SOURCE_PROVIDER, + provider: sourceControlProvider, environmentId: 'provider-source-environment', sessionId: SOURCE_SESSION, executionId: 'provider-source-execution', @@ -448,6 +454,53 @@ test('cross-runner handoff transfers canonical history and replays after restart ) }) +test('cross-runner planning binds the exact destination profile after redaction and overrides', async () => { + const contextState: ContextProviderState = { transfers: [] } + const profile = defineAgentProfile({ + name: 'Profile identity test', + harness: 'pi', + model: { + default: 'source-model', + metadata: { apiKey: 'profile-secret', maxTokens: 512 }, + }, + }) + const execution = executionFor({ + capabilities: branchCapabilities(), + contextState, + }) + const app = createBraidApplication({ + fixture: 'deterministic', + profile, + execution, + clock: new FixedClock(AT), + }) + await prepareSource(app) + await app.send({ operationId: 'op-profile-source', text: 'source history' }).completion + + const plan = app.conversations.branches.plan({ + operationId: 'op-profile-cross-runner', + kind: 'cross-runner', + runner: 'codex', + model: 'target-model', + destinationProvider: TARGET_PROVIDER, + }) + assert.equal(plan.allowed, true) + assert(plan.portableContextPlan) + const expectedProfile = { + ...profile, + harness: 'codex' as const, + model: { ...profile.model, default: 'target-model' }, + } + assert.equal( + plan.portableContextPlan.destination.profileDigest, + `sha256:${canonicalAgentProfileDigestHex(expectedProfile)}`, + ) + assert.notEqual( + plan.portableContextPlan.destination.profileDigest, + `sha256:${canonicalAgentProfileDigestHex(app.state().profile)}`, + ) +}) + test('fork execution on another branch preserves a live run', async () => { const started = deferred() const release = deferred() @@ -506,6 +559,83 @@ test('fork execution on another branch preserves a live run', async () => { } }) +test('workspace fork requires a completed source boundary', async () => { + const provider = workspaceProvider() + const started = deferred() + const release = deferred() + const workspaceBranchingProvider: AgentWorkspaceBranchingProvider = { + async forEnvironment(sourceEnvironmentId) { + return sourceEnvironmentId === 'provider-source-environment' ? provider.branching : null + }, + } + const baseExecution = executionFor({ + capabilities: branchCapabilities(true), + workspaceBranchingProvider, + }) + const execution: ExecutionPort = { + ...baseExecution, + async *streamTurn(input) { + let first = true + for await (const event of baseExecution.streamTurn(input)) { + yield event + if (first) { + first = false + started.resolve() + await release.promise + } + } + }, + } + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + }) + await prepareSource(app) + const live = app.send({ operationId: 'op-live-workspace-boundary', text: 'still running' }) + try { + await started.promise + await new Promise((resolve) => setImmediate(resolve)) + const plan = app.conversations.branches.plan({ + operationId: 'op-workspace-boundary-required', + kind: 'workspace', + }) + assert.equal(plan.allowed, false) + assert.match(plan.reason ?? '', /retry-safe checkpoint and environment fork support/u) + assert.equal(provider.state.checkpointRequests.length, 0) + } finally { + release.resolve() + await live.completion + } +}) + +test('workspace fork rejects a source control reference from another provider', async () => { + const provider = workspaceProvider() + const execution = executionFor({ + capabilities: branchCapabilities(true), + sourceControlProvider: 'foreign-provider', + workspaceBranchingProvider: { + async forEnvironment(sourceEnvironmentId) { + return sourceEnvironmentId === 'provider-source-environment' ? provider.branching : null + }, + }, + }) + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + }) + await prepareSource(app) + await app.send({ operationId: 'op-provider-mismatch-source', text: 'source' }).completion + const plan = app.conversations.branches.plan({ + operationId: 'op-provider-mismatch-fork', + kind: 'workspace', + }) + assert.equal(plan.allowed, false) + assert.match(plan.reason ?? '', /retry-safe checkpoint and environment fork support/u) + assert.equal(provider.state.checkpointRequests.length, 0) +}) + test('cross-runner retry reuses the original acceptance timestamp in its request digest', async () => { const contextState: ContextProviderState = { transfers: [] } let failOnce = true @@ -733,9 +863,9 @@ test('confidential workspace fork records verification only after canonical atte ...planInput, planDigest: plan.digest, }) - const destination = app.state().environments.find( - (environment) => environment.id === branch.environmentId, - ) + const destination = app + .state() + .environments.find((environment) => environment.id === branch.environmentId) assert(destination) assert.equal(destination.placement.confidentialRequested, true) assert.equal(destination.placement.confidentialVerified, true) diff --git a/test/conversations.test.ts b/test/conversations.test.ts index d758750a..0d22aa32 100644 --- a/test/conversations.test.ts +++ b/test/conversations.test.ts @@ -10,6 +10,7 @@ import { messagesVisibleOnBranch } from '../src/app/conversation-context.js' import { createInteractionRequest } from '../src/app/interaction-request.js' import { MemoryJournal } from '../src/app/journal.js' import { canonicalDigest } from '../src/domain/canonical.js' +import { localInteractionId } from '../src/domain/interaction-identity.js' import { assertBraidState } from '../src/domain/invariants.js' import { FixedClock } from '../src/ports/clock.js' import { DEFAULT_RUN_CAPABILITIES, type ExecutionPort } from '../src/ports/execution.js' @@ -1048,6 +1049,7 @@ test('conversation deletion blocks on a pending interaction retained by a termin const run = app.state().runs[0] assert.ok(run) + const pendingInteractionId = localInteractionId(run.id, 'interaction-delete-pending') assert.equal(run.complete, true) assert.equal(app.state().runs[0]?.interactions[0]?.status, 'pending') @@ -1060,7 +1062,7 @@ test('conversation deletion blocks on a pending interaction retained by a termin (error: unknown) => error instanceof AppError && error.code === 'DELETE_BLOCKED' && - error.message.includes('interaction-delete-pending'), + error.message.includes(pendingInteractionId), ) }) @@ -1115,11 +1117,16 @@ test('conversation deletion retains pending identity after 257-entry interaction assert.equal(run.complete, true) assert.equal(run.interactions.length, 256) assert.equal( - run.interactions.some((item) => item.request.id === 'interaction-delete-evicted-0'), + run.interactions.some( + (item) => item.request.id === localInteractionId(run.id, 'interaction-delete-evicted-0'), + ), false, ) assert.equal(run.pendingInteractionIds?.length, 257) - assert.equal(run.pendingInteractionIds?.includes('interaction-delete-evicted-0'), true) + assert.equal( + run.pendingInteractionIds?.includes(localInteractionId(run.id, 'interaction-delete-evicted-0')), + true, + ) await assert.rejects( () => @@ -1130,7 +1137,7 @@ test('conversation deletion retains pending identity after 257-entry interaction (error: unknown) => error instanceof AppError && error.code === 'DELETE_BLOCKED' && - error.message.includes('interaction-delete-evicted-0'), + error.message.includes(localInteractionId(run.id, 'interaction-delete-evicted-0')), ) const state = app.state() diff --git a/test/domain-invariants.test.ts b/test/domain-invariants.test.ts index 68ead242..5d4c6837 100644 --- a/test/domain-invariants.test.ts +++ b/test/domain-invariants.test.ts @@ -2,10 +2,7 @@ import assert from 'node:assert/strict' import test from 'node:test' import type { AgentExactRunControlRef } from '@tangle-network/agent-interface' import { STARTER_PROFILE } from '../src/app/composition.js' -import { - createInteractionRequest, - interactionResponseBinding, -} from '../src/app/interaction-request.js' +import { createInteractionRequest } from '../src/app/interaction-request.js' import type { ConnectionRecord, RunRecord } from '../src/domain/entities.js' import type { BraidEvent, JournalEventEnvelope } from '../src/domain/events.js' import type { Digest } from '../src/domain/ids.js' @@ -25,6 +22,7 @@ import { createTurnId, createWorkspaceId, } from '../src/domain/ids.js' +import { localInteractionId } from '../src/domain/interaction-identity.js' import { assertConnectionRecord, assertRunRecord } from '../src/domain/invariants.js' import { createAdmissionReceipt } from '../src/domain/receipts.js' import { reduceEvent } from '../src/domain/reducer.js' @@ -273,9 +271,10 @@ function canonicalRunInteraction( readonly bindingRunId?: string } = {}, ): BraidInteraction { - const interactionId = createInteractionId( + const providerInteractionId = createInteractionId( `interaction-run-invariant-${options.idSuffix ?? 'future'}`, ) + const interactionId = localInteractionId(run.id, providerInteractionId) const controlRef = run.controlRef const request = createInteractionRequest({ id: interactionId, @@ -295,7 +294,11 @@ function canonicalRunInteraction( }) return { request, - responseBinding: interactionResponseBinding(request), + responseBinding: { + ...request.binding, + interactionId: providerInteractionId, + requestDigest: request.requestDigest, + }, runId: run.id, source: { occurredAt: at }, status: 'pending', diff --git a/test/domain-reducer.test.ts b/test/domain-reducer.test.ts index e26b808f..29a98f09 100644 --- a/test/domain-reducer.test.ts +++ b/test/domain-reducer.test.ts @@ -1,10 +1,10 @@ import assert from 'node:assert/strict' import test from 'node:test' +import type { InteractionRequest } from '@tangle-network/agent-interface' import { STARTER_PROFILE } from '../src/app/composition.js' import { createInteractionRequest, interactionRequestMaterial, - interactionResponseBinding, } from '../src/app/interaction-request.js' import { canonicalDigest } from '../src/domain/canonical.js' import type { BraidEvent, JournalEventEnvelope } from '../src/domain/events.js' @@ -19,17 +19,27 @@ import { createTurnId, createWorkspaceId, } from '../src/domain/ids.js' +import { localInteractionId } from '../src/domain/interaction-identity.js' import { DuplicateEventConflictError, reduceEvent, replayEvents, SequenceGapError, } from '../src/domain/reducer.js' +import { reduceLifecycleEvent } from '../src/domain/reducer-lifecycle.js' import { MAX_RUN_INTERACTIONS } from '../src/domain/reducer-support.js' -import { initialState } from '../src/domain/state.js' +import { type BraidState, initialState } from '../src/domain/state.js' const at = '2026-08-02T00:00:00.000Z' +function providerResponseBinding(request: InteractionRequest, providerInteractionId: string) { + return { + ...request.binding, + interactionId: providerInteractionId, + requestDigest: request.requestDigest, + } +} + function envelope( event: BraidEvent, sequence: number, @@ -76,7 +86,8 @@ function verticalSliceEvents(): readonly JournalEventEnvelope[] { test('replay rejects malformed persisted interaction sources and automation rules', () => { const runId = createRunId('run-replay-interaction-invariants') - const interactionId = createInteractionId('interaction-replay-invariants') + const providerInteractionId = createInteractionId('interaction-replay-invariants') + const interactionId = localInteractionId(runId, providerInteractionId) const request = createInteractionRequest({ id: interactionId, kind: 'question', @@ -114,7 +125,7 @@ test('replay rejects malformed persisted interaction sources and automation rule kind: 'run.interaction', runId, request, - responseBinding: interactionResponseBinding(request), + responseBinding: providerResponseBinding(request, providerInteractionId), provider: { eventId: 'provider-replay-interaction', providerSequence, @@ -164,7 +175,8 @@ test('replay rejects malformed persisted interaction sources and automation rule test('interaction transitions reject reorder, unknown, conflicting, terminal, and evicted events', () => { const runId = createRunId('run-interaction-transition-contract') - const interactionId = createInteractionId('interaction-transition-contract') + const providerInteractionId = createInteractionId('interaction-transition-contract') + const interactionId = localInteractionId(runId, providerInteractionId) const request = createInteractionRequest({ id: interactionId, kind: 'question', @@ -198,25 +210,25 @@ test('interaction transitions reject reorder, unknown, conflicting, terminal, an ] const interactionEvent = ( sequence: number, - id = interactionId, + providerId = providerInteractionId, providerSequence = sequence - 2, providerEventId = `provider-transition-${sequence}`, requestOverride?: typeof request, ): JournalEventEnvelope => { const eventRequest = requestOverride ?? - (id === interactionId + (providerId === providerInteractionId ? request : createInteractionRequest({ - id, + id: localInteractionId(runId, providerId), kind: 'question', - title: `Question ${id}`, + title: `Question ${providerId}`, answerSpec: { fields: [{ type: 'boolean', name: 'continue', label: 'Continue', required: true }], }, binding: { ...request.binding, - interactionId: id, + interactionId: localInteractionId(runId, providerId), }, })) return envelope( @@ -224,7 +236,7 @@ test('interaction transitions reject reorder, unknown, conflicting, terminal, an kind: 'run.interaction', runId, request: eventRequest, - responseBinding: interactionResponseBinding(eventRequest), + responseBinding: providerResponseBinding(eventRequest, providerId), provider: { eventId: providerEventId, providerSequence, @@ -286,13 +298,13 @@ test('interaction transitions reject reorder, unknown, conflicting, terminal, an () => reduceEvent( afterInteraction, - interactionEvent(4, interactionId, 1, 'provider-transition-3', conflictingRequest), + interactionEvent(4, providerInteractionId, 1, 'provider-transition-3', conflictingRequest), ), /was requested with different data/u, ) const duplicateInteraction = reduceEvent( afterInteraction, - interactionEvent(4, interactionId, 1, 'provider-transition-3'), + interactionEvent(4, providerInteractionId, 1, 'provider-transition-3'), ) assert.equal(duplicateInteraction.runs[0]?.interactions.length, 1) const afterResponseRequested = reduceEvent(duplicateInteraction, responseRequested(5)) @@ -343,11 +355,15 @@ test('interaction transitions reject reorder, unknown, conflicting, terminal, an assert.equal(evictedRun.interactions.length, MAX_RUN_INTERACTIONS) assert.equal( evictedRun.interactions.some( - (interaction) => interaction.request.id === 'interaction-evicted-0', + (interaction) => + interaction.request.id === localInteractionId(runId, 'interaction-evicted-0'), ), false, ) - assert.equal(evictedRun.pendingInteractionIds?.includes('interaction-evicted-0'), true) + assert.equal( + evictedRun.pendingInteractionIds?.includes(localInteractionId(runId, 'interaction-evicted-0')), + true, + ) assert.throws( () => reduceEvent( @@ -356,7 +372,7 @@ test('interaction transitions reject reorder, unknown, conflicting, terminal, an { kind: 'run.interaction.cancelled', runId, - interactionId: 'interaction-evicted-0', + interactionId: localInteractionId(runId, 'interaction-evicted-0'), provider: { eventId: 'provider-transition-evicted-cancelled', providerSequence: 258, @@ -367,7 +383,7 @@ test('interaction transitions reject reorder, unknown, conflicting, terminal, an createEventId('event-transition-evicted-cancelled'), ), ), - /Interaction interaction-evicted-0 is unknown/u, + /Interaction interaction-[0-9a-f]+ is unknown/u, ) }) @@ -799,6 +815,43 @@ test('cancellation correction requires its durable cancel operation and updates assert.equal(assistant?.parts.find((part) => part.kind === 'reasoning')?.status, 'cancelled') }) +test('background recovery preserves the explicitly focused run', () => { + const primary = { id: 'run-focus-primary', status: 'streaming', activity: [] } as const + const background = { id: 'run-focus-background', status: 'streaming', activity: [] } as const + const state = { + ...initialState(STARTER_PROFILE), + focusedRunId: primary.id, + activeRunId: primary.id, + runs: [primary, background], + } as unknown as BraidState + + const reconnecting = reduceLifecycleEvent( + state, + { kind: 'run.reconnecting', runId: background.id, after: 'cursor-background' }, + { revision: 1, sequence: 1 }, + at, + ) + const reconciled = reduceLifecycleEvent( + reconnecting, + { + kind: 'run.reconciled', + runId: background.id, + status: 'streaming', + from: 'reconnecting', + to: 'streaming', + evidence: 'a'.repeat(64), + }, + { revision: 2, sequence: 2 }, + at, + ) + + assert.equal(reconnecting.focusedRunId, primary.id) + assert.equal(reconnecting.activeRunId, primary.id) + assert.equal(reconciled.focusedRunId, primary.id) + assert.equal(reconciled.activeRunId, primary.id) + assert.equal(reconciled.runs.find((run) => run.id === background.id)?.status, 'streaming') +}) + test('terminal outcomes close every running reasoning and tool part precisely', () => { const cases = [ ['completed', 'complete'], diff --git a/test/intelligence-dispatch.test.ts b/test/intelligence-dispatch.test.ts index 74fc4fdc..b7e53f4f 100644 --- a/test/intelligence-dispatch.test.ts +++ b/test/intelligence-dispatch.test.ts @@ -863,8 +863,21 @@ test('saved analysis results present status-aware next actions', () => { }) test('activity follows runtime workers while open and stops cleanly when closed', async () => { + const initialSnapshotAt = Date.parse(NOW) let raw = createSupervisionSnapshot({ - supervisors: [{ workers: [{ id: 'runtime-worker-1', label: 'worker-one' }] }], + generatedAt: initialSnapshotAt, + supervisors: [ + { + startedAt: new Date(initialSnapshotAt - 6_000).toISOString(), + workers: [ + { + id: 'runtime-worker-1', + label: 'worker-one', + startedAt: new Date(initialSnapshotAt - 4_000).toISOString(), + }, + ], + }, + ], }) let snapshotCalls = 0 const watcher = new RuntimeSupervisorWatcher(() => { @@ -921,6 +934,13 @@ test('activity follows runtime workers while open and stops cleanly when closed' terminal.sendInput('\r') await terminal.waitForRender() assert.match(terminal.getViewport().join('\n'), /worker-one/u) + const initialWorker = app.state().workers.find((worker) => worker.title === 'worker-one') + assert(initialWorker) + const initialWorkerActivity = controller + .view() + .activity.find((item) => item.id === `worker:${initialWorker.id}`) + assert.equal(initialWorkerActivity?.elapsedMs, 4_000) + assert.notEqual(initialWorkerActivity?.elapsedMs, initialWorker.latencyMs) const unchangedRevision = app.state().revision await new Promise((resolve) => setTimeout(resolve, 650)) assert.ok(snapshotCalls >= 3) diff --git a/test/interaction-response-durability.test.ts b/test/interaction-response-durability.test.ts index 2f6c733e..2ad85100 100644 --- a/test/interaction-response-durability.test.ts +++ b/test/interaction-response-durability.test.ts @@ -4,6 +4,7 @@ import { tmpdir } from 'node:os' import { join } from 'node:path' import test from 'node:test' import type { + InteractionBinding, InteractionRequest, InteractionRequestMaterial, } from '@tangle-network/agent-interface' @@ -17,9 +18,9 @@ import { createBraidApplication, DETERMINISTIC_PROFILE } from '../src/app/compos import { InteractionAutomationCoordinator } from '../src/app/interaction-automation-coordinator.js' import { createInteractionRequest, - interactionResponseBinding, rebindInteractionRequest, } from '../src/app/interaction-request.js' +import { MemoryJournal } from '../src/app/journal.js' import { StorageJournal } from '../src/app/storage-journal.js' import { toJson } from '../src/app/storage-journal-support.js' import { canonicalDigest } from '../src/domain/canonical.js' @@ -35,9 +36,12 @@ import { createTurnId, createWorkspaceId, } from '../src/domain/ids.js' +import { localInteractionId } from '../src/domain/interaction-identity.js' import { createMaterializedStateSnapshot } from '../src/domain/materialized-state-snapshot.js' import { replayEvents } from '../src/domain/reducer.js' +import type { BraidRuntimeEvent } from '../src/domain/runtime-events.js' import { type BraidState, initialState } from '../src/domain/state.js' +import { FixedClock } from '../src/ports/clock.js' import type { ExecutionPort } from '../src/ports/execution.js' import type { JournalEvent } from '../src/ports/storage.js' import { interactionResponseRunCapabilities } from './support/run-capabilities.js' @@ -68,6 +72,27 @@ function interactionRequest(id: string, runId = 'run-response-durability'): Inte return createInteractionRequest(material) } +function localInteractionRequest(providerRequest: InteractionRequest): { + readonly request: InteractionRequest + readonly responseBinding: InteractionBinding +} { + const localId = localInteractionId(providerRequest.binding.runId, providerRequest.id) + const { requestDigest: _requestDigest, binding, ...requestFields } = providerRequest + const request = createInteractionRequest({ + ...requestFields, + id: localId, + binding: { ...binding, interactionId: localId }, + }) + return { + request, + responseBinding: { + ...providerRequest.binding, + interactionId: providerRequest.id, + requestDigest: providerRequest.requestDigest, + }, + } +} + async function waitFor(predicate: () => boolean, timeoutMs = 2_000): Promise { const deadline = Date.now() + timeoutMs while (!predicate()) { @@ -197,6 +222,212 @@ test('a hung provider response cannot strand manual response, rule mutation, or await observeSettlement('send completion', send.completion) }) +test('a restarted unknown response reconciles the same provider operation once', async () => { + const journal = new MemoryJournal(new FixedClock(NOW)) + const request = interactionRequest('interaction-restart-response-retry') + let releaseStream: (() => void) | undefined + let firstResponseCount = 0 + const firstExecution: ExecutionPort = { + capabilities: () => interactionResponseRunCapabilities(), + async *streamTurn(input): AsyncIterable { + yield { + type: 'interaction', + request: rebindInteractionRequest(request, { + ...request.binding, + runId: input.runId, + executionId: input.runId, + }), + } + await new Promise((resolve) => { + releaseStream = resolve + if (input.signal.aborted) resolve() + else input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + yield { + type: 'final', + task: { id: input.runId, intent: 'restart response retry' }, + status: 'completed', + reason: 'completed', + text: 'done', + metadata: { tokenUsage: { input: 1, output: 1 } }, + timestamp: NOW, + } + }, + respondInteraction: async (input) => { + firstResponseCount += 1 + return { + operationId: input.command.operationId, + outcome: 'unknown' as const, + detail: 'INTERACTION_RESPONSE_UNKNOWN', + } + }, + } + const app = createBraidApplication({ + fixture: 'deterministic', + execution: firstExecution, + journal, + interactionResponseTimeoutMs: RESPONSE_TIMEOUT_MS, + }) + app.initialize('/workspace') + const send = app.send({ operationId: 'operation-send-restart-response-retry', text: 'ask' }) + await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') + const run = app.state().runs[0] + const interaction = run?.interactions[0] + assert(run && interaction) + const input = { + operationId: 'operation-restart-response-retry', + runId: run.id, + interactionId: interaction.request.id, + response: { + id: interaction.request.id, + outcome: 'accepted' as const, + data: { continue: true }, + }, + } + + const first = await app.respondInteraction(input) + await first.completion + assert.equal(first.acknowledgement.outcome, 'unknown') + assert.equal(firstResponseCount, 1) + releaseStream?.() + await send.completion + await app.close() + + let resumedResponseCount = 0 + const restarted = createBraidApplication({ + fixture: 'deterministic', + journal, + execution: { + capabilities: () => interactionResponseRunCapabilities(), + async *streamTurn(): AsyncIterable {}, + respondInteraction: async (response) => { + resumedResponseCount += 1 + return { operationId: response.command.operationId, outcome: 'accepted' as const } + }, + }, + }) + restarted.initialize('/workspace') + const retry = await restarted.respondInteraction(input) + await retry.completion + + assert.equal(retry.acknowledgement.outcome, 'accepted') + assert.equal(resumedResponseCount, 1) + assert.equal(restarted.state().runs[0]?.interactions[0]?.status, 'resolved') + assert.equal( + journal.all().filter((envelope) => envelope.event.kind === 'run.interaction.responded').length, + 2, + ) + await restarted.close() +}) + +test('a response waits for startup reconciliation before provider dispatch', async () => { + const journal = new MemoryJournal(new FixedClock(NOW)) + const request = interactionRequest('interaction-startup-response-race') + let releaseStream: (() => void) | undefined + const firstExecution: ExecutionPort = { + capabilities: () => interactionResponseRunCapabilities(), + async *streamTurn(input): AsyncIterable { + yield { + type: 'interaction', + request: rebindInteractionRequest(request, { + ...request.binding, + runId: input.runId, + executionId: input.runId, + }), + } + await new Promise((resolve) => { + releaseStream = resolve + if (input.signal.aborted) resolve() + else input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + yield { + type: 'final', + task: { id: input.runId, intent: 'startup response race' }, + status: 'completed', + reason: 'completed', + text: 'done', + metadata: { tokenUsage: { input: 1, output: 1 } }, + timestamp: NOW, + } + }, + respondInteraction: async (input) => ({ + operationId: input.command.operationId, + outcome: 'unknown' as const, + detail: 'INTERACTION_RESPONSE_UNKNOWN', + }), + } + const app = createBraidApplication({ + fixture: 'deterministic', + execution: firstExecution, + journal, + }) + app.initialize('/workspace') + const send = app.send({ operationId: 'operation-send-startup-response-race', text: 'ask' }) + await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') + const run = app.state().runs[0] + const interaction = run?.interactions[0] + assert(run && interaction) + const input = { + operationId: 'operation-startup-response-race', + runId: run.id, + interactionId: interaction.request.id, + response: { + id: interaction.request.id, + outcome: 'accepted' as const, + data: { continue: true }, + }, + } + const first = await app.respondInteraction(input) + await first.completion + + let statusCalls = 0 + let releaseStatus!: () => void + const statusReady = new Promise((resolve) => { + releaseStatus = resolve + }) + let responseCalls = 0 + const restarted = createBraidApplication({ + fixture: 'deterministic', + journal, + execution: { + capabilities: () => interactionResponseRunCapabilities(), + async *streamTurn(): AsyncIterable {}, + status: async (statusInput) => { + statusCalls += 1 + await statusReady + return { + runId: statusInput.runId, + status: 'completed' as const, + ...(statusInput.providerSessionId === undefined + ? {} + : { sessionId: statusInput.providerSessionId }), + } + }, + respondInteraction: async (response) => { + responseCalls += 1 + return { operationId: response.command.operationId, outcome: 'accepted' as const } + }, + }, + }) + restarted.initialize('/workspace') + const retry = restarted.respondInteraction(input) + await waitFor(() => statusCalls === 1) + await new Promise((resolve) => setImmediate(resolve)) + assert.equal(responseCalls, 0) + + releaseStatus() + const receipt = await retry + await receipt.completion + assert.equal(receipt.acknowledgement.outcome, 'accepted') + assert.equal(responseCalls, 1) + assert.equal(restarted.state().runs[0]?.interactions[0]?.status, 'resolved') + + releaseStream?.() + await send.completion + await restarted.close() + await app.close() +}) + function envelope(sequence: number, event: BraidEvent): BraidEventEnvelope { return { eventId: createEventId(`event-response-durability-${sequence}`), @@ -249,11 +480,14 @@ function boundaryFixture(): { const conversationId = createConversationId('conversation-response-durability') const runId = createRunId('run-response-durability') const turnId = createTurnId('turn-response-durability') - const interactionId = createInteractionId('interaction-response-durability') + const providerInteractionId = createInteractionId('interaction-response-durability') + const interactionId = localInteractionId(runId, providerInteractionId) const operationId = createOperationId('operation-automation-response-durability') const userMessageId = createMessageId('message-user-response-durability') const assistantMessageId = createMessageId('message-assistant-response-durability') - const request = interactionRequest(interactionId, runId) + const { request, responseBinding } = localInteractionRequest( + interactionRequest(providerInteractionId, runId), + ) const rule: StoredAutomationRule = { id: createRuleId('rule-response-durability'), enabled: true, @@ -287,7 +521,7 @@ function boundaryFixture(): { kind: 'run.interaction', runId, request, - responseBinding: interactionResponseBinding(request), + responseBinding, provider: { eventId: 'provider-event-response-durability', providerSequence: 1, diff --git a/test/interactions.test.ts b/test/interactions.test.ts index 34feaf37..936c1034 100644 --- a/test/interactions.test.ts +++ b/test/interactions.test.ts @@ -1,6 +1,7 @@ import assert from 'node:assert/strict' import test from 'node:test' import { + type AgentExactRunControlRef, type InteractionRequest, type InteractionRequestMaterial, type InteractionResponse, @@ -275,12 +276,14 @@ test('secret answers are validated in memory but never become public data or aut const app = applicationFor(provider.execution) app.send({ operationId: 'operation-send-secret', text: 'ask-for-secret' }) await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') - const runId = app.state().runs[0]?.id ?? '' + const run = app.state().runs[0] + const pendingInteraction = run?.interactions[0] + assert(run && pendingInteraction) await app.respondInteraction({ operationId: 'operation-respond-secret', - runId, - interactionId: request.id, - response: checked.response, + runId: run.id, + interactionId: pendingInteraction.request.id, + response: { ...checked.response, id: pendingInteraction.request.id }, }) assert.deepEqual(provider.lastResponse()?.data, { credential: 'secret-answer-fixture' }) assert.equal(JSON.stringify(app.events()).includes('secret-answer-fixture'), false) @@ -334,8 +337,8 @@ test('sensitive request context stays usable through a redacted display copy', a await app.respondInteraction({ operationId: 'operation-respond-sensitive-context', runId: stored.runId, - interactionId: request.id, - response: { id: request.id, outcome: 'declined' }, + interactionId: stored.request.id, + response: { id: stored.request.id, outcome: 'declined' }, }) const command = provider.lastCommand() assert.ok(command) @@ -370,33 +373,37 @@ test('application interaction response is idempotent, conflict-safe, and survive const app = applicationFor(provider.execution, journal) app.send({ operationId: 'operation-send-interaction', text: 'ask' }) await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') + const run = app.state().runs[0] + const localInteraction = run?.interactions[0] + assert(run && localInteraction) const response: InteractionResponse = { - id: request.id, + id: localInteraction.request.id, outcome: 'accepted', data: { continue: true }, } const first = await app.respondInteraction({ operationId: 'operation-respond-interaction', - runId: app.state().runs[0]?.id ?? '', - interactionId: request.id, + runId: run.id, + interactionId: localInteraction.request.id, response, }) assert.equal(first.acknowledgement.outcome, 'accepted') assert.equal(provider.responses(), 1) const command = provider.lastCommand() - const storedRequest = app.state().runs[0]?.interactions[0]?.request + const storedInteraction = app.state().runs[0]?.interactions[0] + const storedRequest = storedInteraction?.request assert.ok(command) - assert.ok(storedRequest) + assert.ok(storedInteraction && storedRequest) assert.equal(command.binding.runId, first.runId) assert.equal(command.binding.interactionId, request.id) - assert.equal(command.binding.requestDigest, storedRequest.requestDigest) + assert.equal(command.binding.requestDigest, storedInteraction.responseBinding.requestDigest) await assert.rejects( app.respondInteraction({ operationId: 'operation-stale-interaction', runId: first.runId, - interactionId: request.id, + interactionId: localInteraction.request.id, response, }), (error: unknown) => error instanceof AppError && error.code === 'INTERACTION_STALE', @@ -405,7 +412,7 @@ test('application interaction response is idempotent, conflict-safe, and survive const replay = await app.respondInteraction({ operationId: 'operation-respond-interaction', runId: first.runId, - interactionId: request.id, + interactionId: localInteraction.request.id, response, }) assert.equal(replay.replayed, true) @@ -426,8 +433,8 @@ test('application interaction response is idempotent, conflict-safe, and survive app.respondInteraction({ operationId: 'operation-respond-interaction', runId: first.runId, - interactionId: request.id, - response: { id: request.id, outcome: 'accepted', data: { continue: false } }, + interactionId: localInteraction.request.id, + response: { id: localInteraction.request.id, outcome: 'accepted', data: { continue: false } }, }), (error: unknown) => error instanceof AppError && error.code === 'OPERATION_CONFLICT', ) @@ -441,7 +448,7 @@ test('application interaction response is idempotent, conflict-safe, and survive const afterRestart = await restarted.respondInteraction({ operationId: 'operation-respond-interaction', runId: first.runId, - interactionId: request.id, + interactionId: localInteraction.request.id, response, }) assert.equal(afterRestart.replayed, true) @@ -449,6 +456,114 @@ test('application interaction response is idempotent, conflict-safe, and survive provider.release() }) +test('application answers a local interaction through its original provider binding', async () => { + const providerInteractionId = 'run-provider:interaction:opaque-provider-id' + const request = questionRequest(providerInteractionId) + const provider = interactionExecution(request) + const app = applicationFor(provider.execution) + app.send({ operationId: 'operation-send-provider-binding', text: 'ask' }) + await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') + + const run = app.state().runs[0] + const localRequest = run?.interactions[0]?.request + assert.ok(run) + assert.ok(localRequest) + assert.match(localRequest.id, /^interaction-/u) + assert.notEqual(localRequest.id, providerInteractionId) + + const receipt = await app.respondInteraction({ + operationId: 'operation-respond-provider-binding', + runId: run.id, + interactionId: localRequest.id, + response: { id: localRequest.id, outcome: 'declined' }, + }) + const command = provider.lastCommand() + assert.ok(command) + assert.equal(receipt.interactionId, localRequest.id) + assert.equal(command.binding.interactionId, providerInteractionId) + assert.equal(command.response.id, providerInteractionId) + provider.release() +}) + +test('interaction bindings use provider environment identity instead of the local projection id', async () => { + const providerEnvironmentId = 'provider-environment-opaque' + const providerSessionId = 'provider-session-opaque' + let command: InteractionResponseCommand | undefined + let releaseStream: (() => void) | undefined + const execution: ExecutionPort = { + capabilities: () => interactionResponseRunCapabilities(), + async *streamTurn(input): AsyncIterable { + const controlRef: AgentExactRunControlRef = { + runId: input.runId, + provider: 'test-provider', + environmentId: providerEnvironmentId, + sessionId: providerSessionId, + executionId: input.runId, + requestDigest: `sha256:${'a'.repeat(64)}` as `sha256:${string}`, + } + yield { + type: 'braid.execution.observed', + observation: { + kind: 'remote-service', + provider: 'test-provider', + providerEnvironmentId, + lifecycle: 'ready', + lifecycleMode: 'retained', + cleanup: 'explicit', + continuity: 'session', + location: 'remote', + createdAt: NOW, + observedAt: NOW, + unavailable: [], + }, + controlRef, + timestamp: NOW, + } + const providerInteractionId = `${input.runId}:interaction:opaque` + yield { + type: 'interaction', + request: questionRequest(providerInteractionId, { + binding: { + runId: controlRef.runId, + provider: controlRef.provider, + environmentId: controlRef.environmentId, + sessionId: controlRef.sessionId, + executionId: controlRef.executionId, + interactionId: providerInteractionId, + }, + }), + } + await new Promise((resolve) => { + releaseStream = resolve + if (input.signal.aborted) resolve() + else input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + }, + respondInteraction: async (input) => { + command = structuredClone(input.command) + releaseStream?.() + return { operationId: input.command.operationId, outcome: 'accepted' as const } + }, + } + const app = applicationFor(execution) + app.send({ operationId: 'operation-send-provider-environment', text: 'ask' }) + await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') + + const run = app.state().runs[0] + const localInteraction = run?.interactions[0] + assert.ok(run) + assert.ok(localInteraction) + assert.notEqual(run.environmentId, providerEnvironmentId) + assert.equal(run.controlRef?.environmentId, providerEnvironmentId) + await app.respondInteraction({ + operationId: 'operation-respond-provider-environment', + runId: run.id, + interactionId: localInteraction.request.id, + response: { id: localInteraction.request.id, outcome: 'declined' }, + }) + assert.equal(command?.binding.environmentId, providerEnvironmentId) +}) + test('declined and cancelled interaction outcomes remain distinct after restart', async () => { for (const outcome of ['declined', 'cancelled'] as const) { const request = questionRequest(`interaction-${outcome}`) @@ -457,11 +572,14 @@ test('declined and cancelled interaction outcomes remain distinct after restart' const app = applicationFor(provider.execution, journal) app.send({ operationId: `operation-send-${outcome}`, text: outcome }) await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') + const run = app.state().runs[0] + const interaction = run?.interactions[0] + assert(run && interaction) await app.respondInteraction({ operationId: `operation-respond-${outcome}`, - runId: app.state().runs[0]?.id ?? '', - interactionId: request.id, - response: { id: request.id, outcome }, + runId: run.id, + interactionId: interaction.request.id, + response: { id: interaction.request.id, outcome }, }) assert.equal(app.state().runs[0]?.interactions[0]?.status, outcome) @@ -504,12 +622,14 @@ test('the terminal API never reports an unconfirmed interaction response as acce const app = applicationFor(execution) const send = app.send({ operationId: 'operation-send-unconfirmed', text: 'ask' }) await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') + const interaction = app.state().runs[0]?.interactions[0] + assert(interaction) const controller = createApplicationUiController(app) const result = await controller.dispatch({ type: 'respond-interaction', operationId: 'operation-respond-unconfirmed', runId: app.state().runs[0]?.id ?? '', - interactionId: request.id, + interactionId: interaction.request.id, response: { outcome: 'accept', value: true }, }) @@ -524,19 +644,103 @@ test('the terminal API never reports an unconfirmed interaction response as acce await send.completion }) +test('an unknown response is reconciled on retry without changing operation identity', async () => { + const request = questionRequest('interaction-response-retry') + let releaseStream: (() => void) | undefined + let responseCount = 0 + const operationIds: string[] = [] + const execution: ExecutionPort = { + capabilities: () => interactionResponseRunCapabilities(), + async *streamTurn(input): AsyncIterable { + yield { + type: 'interaction', + request: rebindInteractionRequest(request, { + ...request.binding, + runId: input.runId, + executionId: input.runId, + }), + } + await new Promise((resolve) => { + releaseStream = resolve + if (input.signal.aborted) resolve() + else input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + }, + respondInteraction: async (input) => { + responseCount += 1 + operationIds.push(input.command.operationId) + if (responseCount === 1) + return { + operationId: input.command.operationId, + outcome: 'unknown' as const, + detail: 'INTERACTION_RESPONSE_UNKNOWN', + } + return { operationId: input.command.operationId, outcome: 'accepted' as const } + }, + } + const app = applicationFor(execution) + const send = app.send({ operationId: 'operation-send-response-retry', text: 'ask' }) + await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') + const run = app.state().runs[0] + const interaction = run?.interactions[0] + assert(run && interaction) + const input = { + operationId: 'operation-response-retry', + runId: run.id, + interactionId: interaction.request.id, + response: { + id: interaction.request.id, + outcome: 'accepted' as const, + data: { continue: true }, + }, + } + + const first = await app.respondInteraction(input) + await first.completion + assert.equal(first.acknowledgement.outcome, 'unknown') + assert.equal(app.state().runs[0]?.interactions[0]?.status, 'unknown') + + const second = await app.respondInteraction(input) + await second.completion + assert.equal(second.acknowledgement.outcome, 'accepted') + assert.equal(second.replayed, true) + assert.equal(app.state().runs[0]?.interactions[0]?.status, 'resolved') + assert.equal(responseCount, 2) + assert.equal(operationIds[0], operationIds[1]) + assert.deepEqual( + app + .events() + .map((envelope) => envelope.event) + .filter((event) => event.kind === 'run.interaction.responded') + .map((event) => event.outcome), + ['unknown', 'accepted'], + ) + + const replay = await app.respondInteraction(input) + await replay.completion + assert.equal(replay.acknowledgement.outcome, 'already-applied') + assert.equal(responseCount, 2) + + releaseStream?.() + await send.completion + await app.close() +}) + test('stale and expired interactions are rejected before provider dispatch', async () => { const request = questionRequest('interaction-expired', { timeoutMs: 1, onTimeout: 'fail' }) const provider = interactionExecution(request) const app = applicationFor(provider.execution) app.send({ operationId: 'operation-send-expired', text: 'expire' }) await waitFor(() => app.state().runs[0]?.interactions[0]?.status === 'pending') - const runId = app.state().runs[0]?.id ?? '' + const run = app.state().runs[0] + const interaction = run?.interactions[0] + assert(run && interaction) await assert.rejects( app.respondInteraction({ operationId: 'operation-respond-expired', - runId, - interactionId: request.id, - response: { id: request.id, outcome: 'accepted', data: { continue: true } }, + runId: run.id, + interactionId: interaction.request.id, + response: { id: interaction.request.id, outcome: 'accepted', data: { continue: true } }, }), (error: unknown) => error instanceof AppError && error.code === 'INTERACTION_EXPIRED', ) diff --git a/test/performance.test.ts b/test/performance.test.ts index 9090f507..b4e396e3 100644 --- a/test/performance.test.ts +++ b/test/performance.test.ts @@ -103,11 +103,11 @@ test('runtime activity projection stays bounded at 10k and 100k saved workers', } const stableState = { ...state, revision: 11 } - buildBraidViewModel(stableState) + const stableView = buildBraidViewModel(stableState) const unchangedRevision: number[] = [] for (let repetition = 0; repetition < 20; repetition += 1) { const started = performance.now() - buildBraidViewModel(stableState) + assert.equal(buildBraidViewModel(stableState), stableView) unchangedRevision.push(performance.now() - started) } diff --git a/test/profile-compatibility-ui.test.ts b/test/profile-compatibility-ui.test.ts index 77695445..323afe63 100644 --- a/test/profile-compatibility-ui.test.ts +++ b/test/profile-compatibility-ui.test.ts @@ -41,7 +41,7 @@ function incompatibleResult( test('names the exact unsupported pair, preserves the profile, and offers both choices', () => { const text = profileCompatibilityTextLines(incompatibleResult(), 80).join('\n') - assert.match(text, /harness=codex/) + assert.match(text, /runner=codex/) assert.match(text, /model=zai\/glm-5\.2/) assert.match(text, /authored profile "release profile" remains unchanged/) assert.match(text, /change runner to opencode to keep model zai\/glm-5\.2/) @@ -74,7 +74,7 @@ test('wraps all output without losing exact values at 40 and 80 columns', () => assert.ok(lines.length > 0) assert.ok(lines.every((line) => visibleWidth(line) <= width)) const text = lines.join('\n') - assert.match(text, /harness=codex/) + assert.match(text, /runner=codex/) assert.match(text, /model=zai\/glm-5\.2/) assert.match(text, /change runner to opencode/) assert.match(text, /change model to openai\/gpt-5\.6-luna/) @@ -112,7 +112,7 @@ test('does not offer recovery choices when the pair is already supported', () => 80, ).join('\n') - assert.match(text, /supported pair: harness=codex · model=zai\/glm-5\.2/) + assert.match(text, /supported pair: runner=codex · model=zai\/glm-5\.2/) assert.match(text, /authored profile "release profile" remains unchanged/) assert.doesNotMatch(text, /change runner to/) assert.doesNotMatch(text, /change model to/) @@ -172,7 +172,7 @@ test('profile validation reaches the same mismatch presenter through real termin terminal.sendInput('\u0016') await waitUntil(() => terminal.getViewport().join('\n').includes('unsupported pair')) const screen = terminal.getViewport().join('\n') - assert.match(screen, /harness=codex · model=zai\/glm-5\.2/u) + assert.match(screen, /runner=codex · model=zai\/glm-5\.2/u) assert.match(screen, /authored profile "GLM through Codex" remains unchanged/u) assert.match(screen, /change runner to opencode/u) assert.match(screen, /change model to openai\/gpt-5\.6-luna/u) diff --git a/test/retained-execution-lifecycle.test.ts b/test/retained-execution-lifecycle.test.ts index 64264fe0..3babd635 100644 --- a/test/retained-execution-lifecycle.test.ts +++ b/test/retained-execution-lifecycle.test.ts @@ -10,6 +10,7 @@ import { type RetainedExecutionPlan, RetainedExecutionPort, } from '../src/adapters/runtime/retained-execution.js' +import { retainedCapabilities } from '../src/adapters/runtime/retained-execution-projection.js' import { DEFAULT_RUN_CAPABILITIES, type ExecuteTurnInput, @@ -81,6 +82,9 @@ function handle( async contextBoundary() { return null }, + beginNativeContinuation() { + throw new Error('native continuation is not part of this test') + }, async continueNative() { throw new Error('native continuation is not part of this test') }, @@ -127,6 +131,39 @@ function plan( } } +test('retained controls follow complete provider capabilities', () => { + const unavailable = retainedCapabilities(RETAINED_RUN_HANDLE_CAPABILITIES) + assert.deepEqual(unavailable.controls, { + cancel: false, + steer: false, + queue: true, + status: false, + recreate: false, + }) + + const capableEnvironment = { + ...RETAINED_RUN_HANDLE_CAPABILITIES, + retainedControl: { + exactRunIdentity: true, + resultIdentity: true, + eventIdentity: true, + cancellationIdempotency: true, + }, + } + const available = retainedCapabilities(capableEnvironment) + assert.deepEqual(available.controls, { + cancel: true, + steer: false, + queue: true, + status: true, + recreate: true, + }) + assert.equal( + retainedCapabilities(capableEnvironment, { exactStatus: false }).controls.status, + false, + ) +}) + function executionFor( resolve: (input: ExecuteTurnInput) => Promise, ): RetainedExecutionPort { @@ -374,6 +411,62 @@ test('in-flight detach starts the cloud run but never opens a local event reader ) }) +test('active retained controls reject a provider session not bound to the handle', async () => { + const exact = controlRef('active-session') + let cancelCalls = 0 + let statusCalls = 0 + const retainedHandle = handle(exact, { + cancel: async (request) => { + cancelCalls += 1 + return { + operationId: request.operationId, + requestDigest: exact.requestDigest, + status: 'accepted', + effect: 'cancelled', + snapshot: { + runId: exact.runId, + controlRef: exact, + status: 'cancelled', + effect: 'cancelled', + observedAt: now, + }, + } + }, + status: async () => { + statusCalls += 1 + return { + runId: exact.runId, + controlRef: exact, + status: 'running', + effect: 'unknown', + observedAt: now, + } + }, + }) + const resolvedPlan = plan(exact, async () => retainedHandle, retainedHandle) + const { providerSessionId: _providerSessionId, ...unboundPlan } = resolvedPlan + const execution = executionFor(async () => unboundPlan) + const runInput = input('active-session') + await execution.admit(runInput) + const stream = execution.streamTurn(runInput)[Symbol.asyncIterator]() + await stream.next().catch(() => undefined) + + await assert.rejects( + execution.cancelRun({ + operationId: 'operation-active-session-cancel', + runId: runInput.runId, + providerSessionId: 'session-other', + }), + /active run/u, + ) + await assert.rejects( + execution.status({ runId: runInput.runId, providerSessionId: 'session-other' }), + /active run/u, + ) + assert.equal(cancelCalls, 0) + assert.equal(statusCalls, 0) +}) + test('ambiguous cancellation effects reconcile or remain unknown', async () => { for (const effect of ['unknown', 'not_live'] as const) { const exact = controlRef(`ambiguous-${effect}`) @@ -424,52 +517,55 @@ test('ambiguous cancellation effects reconcile or remain unknown', async () => { } }) -test('a reconciled cancelled snapshot confirms an ambiguous cancellation', async () => { - const exact = controlRef('reconciled') - let statusCalls = 0 - const retainedHandle = handle(exact, { - status: async () => { - statusCalls += 1 - return { - runId: exact.runId, - controlRef: exact, - status: 'cancelled', - effect: 'cancelled', - observedAt: now, - } - }, - cancel: async (request) => ({ - operationId: request.operationId, - requestDigest: exact.requestDigest, - status: 'accepted', - effect: 'unknown', - snapshot: { - runId: exact.runId, - controlRef: exact, - status: 'running', - effect: 'unknown', - observedAt: now, +test('a terminal snapshot confirms ambiguous and pending cancellations', async () => { + for (const effect of ['unknown', 'cancel_requested'] as const) { + const exact = controlRef(`reconciled-${effect}`) + const statusWaits: Array = [] + const retainedHandle = handle(exact, { + status: async (options) => { + statusWaits.push(options?.waitMs) + return { + runId: exact.runId, + controlRef: exact, + status: 'cancelled', + effect: 'cancelled', + observedAt: now, + } }, - }), - }) - const execution = executionFor(async () => - plan(exact, async () => retainedHandle, retainedHandle), - ) - const runInput = input('reconciled') - await execution.admit(runInput) - const stream = execution.streamTurn(runInput)[Symbol.asyncIterator]() - await stream.next().catch(() => undefined) + cancel: async (request) => ({ + operationId: request.operationId, + requestDigest: exact.requestDigest, + status: 'accepted', + effect, + snapshot: { + runId: exact.runId, + controlRef: exact, + status: 'running', + effect, + observedAt: now, + }, + }), + }) + const execution = executionFor(async () => + plan(exact, async () => retainedHandle, retainedHandle), + ) + const runInput = input(`reconciled-${effect}`) + await execution.admit(runInput) + const stream = execution.streamTurn(runInput)[Symbol.asyncIterator]() + await stream.next().catch(() => undefined) - const acknowledgement = await execution.cancelRun({ - operationId: 'operation-reconciled-cancel', - runId: runInput.runId, - }) - assert.deepEqual(acknowledgement, { - operationId: 'operation-reconciled-cancel', - outcome: 'accepted', - detail: 'cancelled', - }) - assert.equal(statusCalls, 1) + const operationId = `operation-reconciled-${effect}` + const acknowledgement = await execution.cancelRun({ + operationId, + runId: runInput.runId, + }) + assert.deepEqual(acknowledgement, { + operationId, + outcome: 'accepted', + detail: 'cancelled', + }) + assert.deepEqual(statusWaits, [effect === 'cancel_requested' ? 30_000 : undefined]) + } }) test('interaction response recovers the retained handle and preserves retry acknowledgement', async () => { diff --git a/test/retained-native-continuation.test.ts b/test/retained-native-continuation.test.ts index 744eba46..f43af47d 100644 --- a/test/retained-native-continuation.test.ts +++ b/test/retained-native-continuation.test.ts @@ -5,6 +5,8 @@ import { type AgentNativeContextContinuationResult, defineAgentProfile, type NativeContextBoundaryProof, + type NativeContextContinuationRequest, + type NativeContextContinuationTurn, } from '@tangle-network/agent-interface' import type { RetainedRunHandle } from '@tangle-network/agent-runtime/kernel' import { @@ -13,16 +15,52 @@ import { } from '../src/adapters/runtime/retained-execution.js' import { createAdmissionReceipt } from '../src/domain/receipts.js' import type { RuntimeEventEnvelope } from '../src/domain/runtime-events.js' -import { DEFAULT_RUN_CAPABILITIES, type ExecuteTurnInput } from '../src/ports/execution.js' +import { + DEFAULT_RUN_CAPABILITIES, + type ExecuteTurnInput, + supportsNativeContinuation, +} from '../src/ports/execution.js' import { RETAINED_RUN_HANDLE_CAPABILITIES } from './support/retained-run-capabilities.js' const at = '2026-08-19T12:00:00.000Z' + +type NativeContinuationHandle = { + readonly admission: Promise + readonly result: Promise +} + +type NativeContinuationRetainedRunHandle = RetainedRunHandle & { + readonly beginNativeContinuation: ( + request: NativeContextContinuationRequest, + turn: NativeContextContinuationTurn & { + readonly timeoutMs?: number + readonly signal?: AbortSignal + }, + ) => NativeContinuationHandle +} + const profile = defineAgentProfile({ name: 'Native continuation test', harness: 'pi', model: { default: 'openai/gpt-5.6-luna' }, }) +test('native continuation stays disabled until the provider exposes early control', () => { + const safeReplay = { + ...RETAINED_RUN_HANDLE_CAPABILITIES, + sessions: { continue: true, list: false, messages: false }, + nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + } + assert.equal(supportsNativeContinuation(safeReplay), false) + assert.equal( + supportsNativeContinuation({ + ...safeReplay, + nativeContinuation: { ...safeReplay.nativeContinuation, admissionControl: true }, + }), + true, + ) +}) + function exact(suffix: string): AgentExactRunControlRef { return { runId: `provider-run-${suffix}`, @@ -34,7 +72,9 @@ function exact(suffix: string): AgentExactRunControlRef { } } -function fixture() { +function fixture( + settings: { readonly pendingResult?: boolean; readonly streamEvents?: boolean } = {}, +) { const source = exact('source') const next = exact('next') const proof: NativeContextBoundaryProof = { @@ -50,12 +90,70 @@ function fixture() { readonly expectedBoundary: NativeContextBoundaryProof }> = [] const continuationStatuses: string[] = [] + const statusControlRefs: AgentExactRunControlRef[] = [] + const cancellationControlRefs: AgentExactRunControlRef[] = [] let continuationCalls = 0 let reconnectCalls = 0 + let resultCalls = 0 + let terminalSettled = settings.pendingResult !== true + let releaseTerminal: () => void = () => undefined + const terminalGate = + settings.pendingResult === true + ? new Promise((resolve) => { + releaseTerminal = resolve + }) + : Promise.resolve() + let resolveEventsActive: () => void = () => undefined + const eventsActive = + settings.streamEvents === true + ? new Promise((resolve) => { + resolveEventsActive = resolve + }) + : Promise.resolve() + let cancelled = false - const createHandle = (): RetainedRunHandle => { + const createHandle = (): NativeContinuationRetainedRunHandle => { let current = source const result = { text: 'continued exactly once', success: true, sessionId: source.sessionId } + const continueNative = async ( + request: NativeContextContinuationRequest, + turn: NativeContextContinuationTurn & { + readonly timeoutMs?: number + readonly signal?: AbortSignal + }, + ): Promise => { + continuationCalls += 1 + continuationRequests.push(structuredClone(request)) + assert.deepEqual(request.run, source) + assert.deepEqual(request.expectedBoundary, proof) + assert.equal(turn.prompt, 'Continue this exact Pi chat.') + assert.equal(turn.model, 'openai/gpt-5.6-luna') + const prior = outcomes.get(request.requestDigest) + if (prior !== undefined) { + continuationStatuses.push('replayed') + current = next + return { + ...prior, + acknowledgement: { ...prior.acknowledgement, status: 'replayed' }, + } as AgentNativeContextContinuationResult + } + current = next + const accepted: AgentNativeContextContinuationResult = { + acknowledgement: { + operationId: request.operationId, + requestDigest: request.requestDigest, + status: 'accepted', + historyMessagesSent: 0, + }, + result, + controlRef: next, + } + continuationStatuses.push('accepted') + outcomes.set(request.requestDigest, accepted) + await terminalGate + terminalSettled = true + return accepted + } return { get controlRef() { return current @@ -63,19 +161,42 @@ function fixture() { capabilities: { ...RETAINED_RUN_HANDLE_CAPABILITIES, sessions: { continue: true, list: false, messages: false }, - nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + nativeContinuation: { + atomicBoundary: true, + requestIdempotency: true, + admissionControl: true, + }, }, async status() { + statusControlRefs.push(current) return { runId: current.runId, controlRef: current, - status: 'completed', - effect: 'not_live', + status: cancelled ? 'cancelled' : 'running', + effect: cancelled ? 'cancelled' : 'unknown', observedAt: at, } }, - async *events() {}, + async *events(eventOptions) { + if (settings.streamEvents !== true) return + yield { + runId: current.runId, + eventId: `${current.runId}:progress`, + sequence: 1, + receivedAt: at, + event: { type: 'status', status: 'processing' }, + } + resolveEventsActive() + await new Promise((resolve) => { + if (eventOptions?.signal?.aborted === true) { + resolve() + return + } + eventOptions?.signal?.addEventListener('abort', () => resolve(), { once: true }) + }) + }, async result() { + resultCalls += 1 return result }, async respondToInteraction() { @@ -84,48 +205,29 @@ function fixture() { async contextBoundary() { return proof }, - async continueNative(request, turn) { - continuationCalls += 1 - continuationRequests.push(structuredClone(request)) - assert.deepEqual(request.run, source) - assert.deepEqual(request.expectedBoundary, proof) - assert.equal(turn.prompt, 'Continue this exact Pi chat.') - assert.equal(turn.model, 'openai/gpt-5.6-luna') - const prior = outcomes.get(request.requestDigest) - if (prior !== undefined) { - continuationStatuses.push('replayed') + beginNativeContinuation(request, turn) { + const admission = Promise.resolve().then(() => { current = next - return { - ...prior, - acknowledgement: { ...prior.acknowledgement, status: 'replayed' }, - } as AgentNativeContextContinuationResult - } - current = next - const accepted: AgentNativeContextContinuationResult = { - acknowledgement: { - operationId: request.operationId, - requestDigest: request.requestDigest, - status: 'accepted', - historyMessagesSent: 0, - }, - result, - controlRef: next, - } - continuationStatuses.push('accepted') - outcomes.set(request.requestDigest, accepted) - return accepted + return next + }) + return { admission, result: continueNative(request, turn) } + }, + async continueNative() { + throw new Error('legacy native continuation is not part of this test') }, async cancel(request) { + cancellationControlRefs.push(current) + cancelled = true return { operationId: request.operationId, requestDigest: current.requestDigest, status: 'accepted', - effect: 'not_live', + effect: 'cancelled', snapshot: { runId: current.runId, controlRef: current, - status: 'completed', - effect: 'not_live', + status: 'cancelled', + effect: 'cancelled', observedAt: at, }, } @@ -142,7 +244,11 @@ function fixture() { environment: { ...RETAINED_RUN_HANDLE_CAPABILITIES, sessions: { continue: true, list: false, messages: false }, - nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + nativeContinuation: { + atomicBoundary: true, + requestIdempotency: true, + admissionControl: true, + }, }, } as const const plan: RetainedExecutionPlan = { @@ -215,6 +321,14 @@ function fixture() { continuationRequests, continuationStatuses, reconnectCalls: () => reconnectCalls, + statusControlRefs, + cancellationControlRefs, + resultCalls: () => resultCalls, + eventsActive, + terminalSettled: () => terminalSettled, + releaseTerminal: () => { + releaseTerminal() + }, } } @@ -253,6 +367,53 @@ test('retained execution continues through Runtime without creating another envi f.next, ) assert.equal(events.at(-1)?.event.type, 'final') + assert.equal(f.resultCalls(), 0) +}) + +test('native continuation streams and accepts controls after admission while its result is pending', async () => { + const f = fixture({ pendingResult: true, streamEvents: true }) + const execution = new RetainedExecutionPort({ + resolve: async () => { + throw new Error('native continuation must not resolve a fresh plan') + }, + continue: async () => f.plan, + recover: async () => { + throw new Error('same-process continuation must not enter restart recovery') + }, + }) + + await execution.admit(f.input) + const stream = execution.streamTurn(f.input)[Symbol.asyncIterator]() + const observed = await stream.next() + assert.equal(observed.value?.event.type, 'braid.execution.observed') + const streamed = await stream.next() + assert.equal(streamed.value?.event.type, 'status') + const pendingStream = stream.next() + await f.eventsActive + + const status = await execution.status({ runId: f.input.runId }) + assert.equal(status?.runId, f.input.runId) + assert.deepEqual(f.statusControlRefs, [f.next]) + assert.equal(f.terminalSettled(), false) + + const cancellation = await execution.cancelRun({ + operationId: 'operation-native-next-cancel', + runId: f.input.runId, + }) + assert.deepEqual(cancellation, { + operationId: 'operation-native-next-cancel', + outcome: 'accepted', + detail: 'cancelled', + }) + assert.deepEqual(f.cancellationControlRefs, [f.next]) + assert.equal(f.terminalSettled(), false) + + f.releaseTerminal() + const final = await pendingStream + assert.equal(final.value?.event.type, 'final') + assert.equal(f.terminalSettled(), true) + assert.equal(f.resultCalls(), 0) + assert.deepEqual(await stream.next(), { done: true, value: undefined }) }) test('restart reconnect retries the same continuation request and receives a replay', async () => { @@ -304,4 +465,5 @@ test('restart reconnect retries the same continuation request and receives a rep assert.equal(f.continuationCalls(), 2) assert.deepEqual(f.continuationStatuses, ['accepted', 'replayed']) assert.deepEqual(f.continuationRequests[0], f.continuationRequests[1]) + assert.equal(f.resultCalls(), 0) }) diff --git a/test/run-admission-architecture.test.ts b/test/run-admission-architecture.test.ts index d746ac4a..b766e14c 100644 --- a/test/run-admission-architecture.test.ts +++ b/test/run-admission-architecture.test.ts @@ -40,6 +40,7 @@ const PROFILE = defineAgentProfile({ const MODULES = [ 'run-admission.ts', 'run-admission-request.ts', + 'run-admission-context.ts', 'run-admission-validation.ts', 'run-admission-receipt.ts', 'run-admission-dispatch.ts', diff --git a/test/run-event-mapper-stream-safety.test.ts b/test/run-event-mapper-stream-safety.test.ts index 6157807d..c75ad416 100644 --- a/test/run-event-mapper-stream-safety.test.ts +++ b/test/run-event-mapper-stream-safety.test.ts @@ -4,19 +4,20 @@ import type { RuntimeStreamEvent } from '@tangle-network/agent-runtime' import { buildBraidViewModel } from '../src/adapters/tui/ui-view-model.js' import { BraidApplication } from '../src/app/application.js' import { DETERMINISTIC_PROFILE } from '../src/app/composition.js' +import { createInteractionRequest } from '../src/app/interaction-request.js' import { MemoryJournal } from '../src/app/journal.js' import { providerEventFor } from '../src/app/run-event-mapper.js' import { ApplicationStreamSanitizer, MAX_ACTIVE_RUNTIME_STREAMS, } from '../src/app/run-stream-sanitizer.js' -import { redactSensitiveText } from '../src/domain/secret-sanitizer.js' import { replayEvents } from '../src/domain/reducer.js' +import { redactSensitiveText } from '../src/domain/secret-sanitizer.js' import { initialState } from '../src/domain/state.js' import { FixedClock } from '../src/ports/clock.js' import type { ExecutionPort } from '../src/ports/execution.js' -import { SequenceIds } from '../src/ports/ids.js' import { DEFAULT_RUN_CAPABILITIES } from '../src/ports/execution.js' +import { SequenceIds } from '../src/ports/ids.js' const CONTROL_CANARY = 'STREAM_CONTROL_CANARY' const BEARER_CANARY = 'STREAM_BEARER_CANARY' @@ -58,6 +59,54 @@ function streamAtBoundary(value: string, boundary: number): string { return `${first}${second}${sanitizer.finish(runId, 'text')}` } +test('provider interaction identities map to stable local ids without changing response bindings', () => { + const runId = 'run-provider-interaction' + const providerInteractionId = `${runId}:interaction:opaque-provider-id` + const request = createInteractionRequest({ + id: providerInteractionId, + kind: 'permission', + title: 'Permission: shell', + answerSpec: { + fields: [ + { + name: 'grant', + label: 'Decision', + required: true, + type: 'select', + options: [ + { value: 'allow_once', label: 'Allow once' }, + { value: 'deny', label: 'Deny' }, + ], + }, + ], + }, + binding: { + runId, + provider: 'cli-bridge', + environmentId: 'environment-provider-interaction', + sessionId: 'session-provider-interaction', + executionId: runId, + interactionId: providerInteractionId, + }, + }) + const first = providerEventFor(runId, { type: 'interaction', request }, provider(1)) + const replay = providerEventFor(runId, { type: 'interaction', request }, provider(2)) + const cancelled = providerEventFor( + runId, + { type: 'interaction.cancel', id: providerInteractionId }, + provider(3), + ) + + assert.equal(first.kind, 'run.interaction') + assert.equal(replay.kind, 'run.interaction') + assert.equal(cancelled.kind, 'run.interaction.cancelled') + assert.match(first.request.id, /^interaction-/u) + assert.equal(first.request.binding.interactionId, first.request.id) + assert.equal(first.responseBinding.interactionId, providerInteractionId) + assert.equal(replay.request.id, first.request.id) + assert.equal(cancelled.interactionId, first.request.id) +}) + test('incremental mapper redaction matches complete redaction at every credential boundary', () => { const values = [ `prefix Bearer ${BEARER_CANARY} suffix`, diff --git a/test/scripts.test.ts b/test/scripts.test.ts index 64fc0767..adf45986 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -39,6 +39,10 @@ const upstreamSupport = await import('../scripts/release/upstream-evidence.mjs') const { evaluateUpstreamRequirementChecks, UPSTREAM_REQUIREMENT_OWNERS } = upstreamSupport // @ts-expect-error The release scripts are intentionally JavaScript entry points. const { renderVerificationReport } = await import('../scripts/release/verification-report.mjs') +const processMeasurementsPath = '../scripts/performance/process-measurements.mjs' +const { interactiveReadyFramePredicate } = await import(processMeasurementsPath) +const packageProofTracePath = '../scripts/package-proof-trace.mjs' +const { firstTerminalTrace } = await import(packageProofTracePath) // @ts-expect-error The visual definitions are an executable JavaScript release helper. const visualDefinitions = await import('../scripts/capture-visual-definitions.mjs') const { createStateDefinitions, isRunningWorkStripRow } = visualDefinitions @@ -95,6 +99,73 @@ test('deterministic visual capture stays separate from the explicit live demo', assert.match(liveDemoSource, /assertPublicCapture/u) }) +test('packed startup readiness uses visible profile and composer contracts', () => { + const marker = 'Completed Braid performance conversation (10000 committed events)' + const ready = interactiveReadyFramePredicate(marker) + const frame = [ + marker, + 'braid', + 'profile Braid performance profile · pi · via Performance local bridge', + '──────── type / for commands · Alt+Enter newline · paste ────────', + ] + + assert.equal(ready(frame, frame.join('\n')), true) + assert.equal( + ready( + frame.filter((line) => !line.includes('profile ')), + frame.join('\n'), + ), + false, + ) + assert.equal( + ready( + frame.filter((line) => !line.includes('type / for commands')), + frame.join('\n'), + ), + false, + ) + assert.equal(ready(frame, `${frame.join('\n')}\nstartup error`), false) +}) + +test('terminal package parity restores baseline focus from the complete keyboard trace', () => { + const trace = firstTerminalTrace({ + state: { + revision: 9, + sequence: 9, + messages: [{ id: 'message-1' }, { id: 'message-2' }, { id: 'message-9' }], + runs: [{ id: 'run-000001' }, { id: 'run-000009' }], + focusedRunId: 'run-000009', + activeRunId: 'run-000009', + lastError: 'later failure', + }, + events: [ + { + kind: 'run.requested', + revision: 1, + sequence: 1, + payload: { operationId: 'op-baseline' }, + }, + { + kind: 'run.finished', + revision: 2, + sequence: 2, + payload: { status: 'completed' }, + }, + { + kind: 'run.requested', + revision: 3, + sequence: 3, + payload: { operationId: 'op-later' }, + }, + ], + }) + + assert.equal(trace.state.focusedRunId, 'run-000001') + assert.equal(trace.state.activeRunId, null) + assert.equal(trace.state.revision, 2) + assert.equal(trace.events.length, 2) +}) + test('active streaming capture waits for a terminal run state before exiting', async () => { let screen = 'working' let cancelled = false @@ -268,6 +339,7 @@ test('every scoped package alias forwards its declared file set', () => { 'eval.test.js', 'native-interactive-actions.test.js', 'native-interactive-run-broker.test.js', + 'nitro-confidential-attestation.test.js', 'observability.test.js', 'plain-accessibility.test.js', 'property.test.js', @@ -293,6 +365,7 @@ test('every scoped package alias forwards its declared file set', () => { 'coordination.test.js', 'domain-invariants.test.js', 'domain-reducer.test.js', + 'nitro-confidential-attestation.test.js', 'observability.test.js', 'reducer.test.js', 'scripts.test.js', @@ -357,6 +430,7 @@ test('every scoped package alias forwards its declared file set', () => { 'conversation-branch-effects.test.js', 'conversations.test.js', 'coordination.test.js', + 'nitro-confidential-attestation.test.js', 'observability.test.js', 'plain-accessibility.test.js', 'profile-connection-actions.test.js', @@ -387,6 +461,7 @@ test('every scoped package alias forwards its declared file set', () => { 'cli-bridge-retained-restart.test.js', 'cli-startup.test.js', 'configuration-product-flow.test.js', + 'nitro-confidential-attestation.test.js', 'observability.test.js', 'plain-accessibility.test.js', 'profile-connection-actions.test.js', diff --git a/test/storage-snapshots.test.ts b/test/storage-snapshots.test.ts index fa0b538c..8cdfa129 100644 --- a/test/storage-snapshots.test.ts +++ b/test/storage-snapshots.test.ts @@ -13,10 +13,7 @@ import { } from '../src/adapters/storage/sqlite-driver.js' import { applyConnectionPragmas } from '../src/adapters/storage/sqlite-schema.js' import { STARTER_PROFILE } from '../src/app/composition.js' -import { - createInteractionRequest, - interactionResponseBinding, -} from '../src/app/interaction-request.js' +import { createInteractionRequest } from '../src/app/interaction-request.js' import { StorageJournal } from '../src/app/storage-journal.js' import { toJson } from '../src/app/storage-journal-support.js' import { canonicalDigest } from '../src/domain/canonical.js' @@ -32,6 +29,7 @@ import { createTurnId, createWorkspaceId, } from '../src/domain/ids.js' +import { localInteractionId } from '../src/domain/interaction-identity.js' import { createMaterializedStateSnapshot, restoreMaterializedState, @@ -118,8 +116,9 @@ function fixture(): SnapshotFixture { } test('migrates legacy interactions, rejects snapshot conflicts, and recomputes the projection checksum', () => { - const interactionId = createInteractionId('interaction-snapshot') const runId = createRunId('run-snapshot-interaction') + const providerInteractionId = createInteractionId('interaction-snapshot') + const interactionId = localInteractionId(runId, providerInteractionId) const request = createInteractionRequest({ id: interactionId, kind: 'question', @@ -169,7 +168,11 @@ test('migrates legacy interactions, rejects snapshot conflicts, and recomputes t kind: 'run.interaction', runId, request, - responseBinding: interactionResponseBinding(request), + responseBinding: { + ...request.binding, + interactionId: providerInteractionId, + requestDigest: request.requestDigest, + }, provider: { eventId: 'provider-snapshot-interaction', providerSequence: 1, @@ -190,10 +193,10 @@ test('migrates legacy interactions, rejects snapshot conflicts, and recomputes t ...snapshot.state, interactions: [ { - id: interactionId, + id: providerInteractionId, runId, request: { - id: interactionId, + id: providerInteractionId, kind: request.kind, title: request.title, answerSpec: request.answerSpec, @@ -232,6 +235,11 @@ test('migrates legacy interactions, rejects snapshot conflicts, and recomputes t topLevelOnly.runs.find((run) => run.id === runId)?.interactions.map((item) => item.request.id), [interactionId], ) + assert.equal( + topLevelOnly.runs.find((run) => run.id === runId)?.interactions[0]?.responseBinding + .interactionId, + providerInteractionId, + ) assert.equal(topLevelOnly.projectionChecksum, canonicalProjectionChecksum(topLevelOnly)) const hiddenPendingState = { diff --git a/test/support/runtime-bridge-server.ts b/test/support/runtime-bridge-server.ts index 46cbffd2..396d032b 100644 --- a/test/support/runtime-bridge-server.ts +++ b/test/support/runtime-bridge-server.ts @@ -184,7 +184,11 @@ const PI_NATIVE_CAPABILITIES: AgentEnvironmentCapabilities = { eventIdentity: true, cancellationIdempotency: true, }, - nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + nativeContinuation: { + atomicBoundary: true, + requestIdempotency: true, + admissionControl: true, + }, sessions: { continue: true, list: true, messages: true }, interactions: { kinds: ['permission'], diff --git a/test/terminal-responsive.test.ts b/test/terminal-responsive.test.ts index 09772c71..e6db7640 100644 --- a/test/terminal-responsive.test.ts +++ b/test/terminal-responsive.test.ts @@ -10,6 +10,7 @@ import { } from '@earendil-works/pi-tui' import { createApplicationUiController } from '../src/adapters/tui/application-ui-controller.js' import { createBraidApplication } from '../src/app/composition.js' +import { effectiveElapsedMs } from '../src/views/shared/duration.js' import type { BraidViewModel, EnvironmentView, @@ -120,7 +121,7 @@ test('chrome uses complete responsive groups at every reference width', () => { assert.match(wide, /Release engineer/u) assert.match( wide, - /profile Release engineer · harness pi · model openai-codex\/gpt-5\.6-luna · backend Local CLI Bridge/u, + /profile Release engineer · runner pi · model openai-codex\/gpt-5\.6-luna · backend Local CLI Bridge/u, ) assert.match(wide, / · think high/u) assert.doesNotMatch(wide, /caps/u) @@ -138,7 +139,7 @@ test('chrome uses complete responsive groups at every reference width', () => { assert.equal(spaciousLines.length, 2) assert.match( spaciousLines[0] ?? '', - /^profile Release engineer · harness pi · model openai-codex\/gpt-5\.6-luna · backend Local CLI Bridge · think high · caps vis 8\.2k · reas 4\.1k · total 12k$/u, + /^profile Release engineer · runner pi · model openai-codex\/gpt-5\.6-luna · backend Local CLI Bridge · think high · caps vis 8\.2k · reas 4\.1k · total 12k$/u, ) assert.match(spaciousLines[1] ?? '', /^in 1\.2k · out 567 · \$0\.0312 · latency 842ms$/u) assert.doesNotMatch(spaciousLines.join('\n'), /(?:^|\n)rofile\b/u) @@ -151,6 +152,22 @@ test('chrome uses complete responsive groups at every reference width', () => { } }) +test('authoritative elapsed measurements beat the terminal host clock', () => { + assert.equal( + effectiveElapsedMs('running', '2026-08-28T20:00:00.000Z', 1_840, Date.parse('2027-01-01')), + 1_840, + ) + assert.equal( + effectiveElapsedMs( + 'running', + '2026-08-28T20:00:00.000Z', + undefined, + Date.parse('2026-08-28T20:00:05.000Z'), + ), + 5_000, + ) +}) + test('work strip is conditional and exposes branch work controls', () => { const base = viewForChrome() const item = (overrides: Partial): WorkStripItemView => ({ @@ -158,6 +175,7 @@ test('work strip is conditional and exposes branch work controls', () => { runId: 'run-background', conversationId: 'conversation-1', branchId: 'branch-background', + label: 'Background review', state: 'running', runner: 'pi', model: 'fixture/model', @@ -185,6 +203,7 @@ test('work strip is conditional and exposes branch work controls', () => { id: 'run-metrics', runId: 'run-metrics', branchId: 'branch-focused', + label: 'Focused release', focused: true, }), item({}), @@ -195,12 +214,12 @@ test('work strip is conditional and exposes branch work controls', () => { const wide = chrome.render(120).join('\n') assert.match( wide, - /focus branch-focused · running · pi\/fixture\/model\s+1 waiting interaction · actions switch\/ask\/steer\/cancel/u, + /focus Focused release · running · pi\/fixture\/model\s+1 waiting interaction · actions switch\/ask\/steer\/cancel/u, ) - assert.match(wide, /work branch-background · running · pi\/fixture\/model/u) + assert.match(wide, /work Background review · running · pi\/fixture\/model/u) const standardLines = chrome.render(80) const standard = standardLines.join('\n') - assert.match(standard, /focus branch-focused · running/u) + assert.match(standard, /focus Focused release · running/u) assert.match(standard, /1 waiting interaction/u) assert.match(standard, /actions switch\/ask\/steer\/cancel/u) assert.match(standardLines[1] ?? '', /actions switch\/ask\/steer\/cancel/u) @@ -215,6 +234,7 @@ test('work strip is conditional and exposes branch work controls', () => { id: 'run-metrics', runId: 'run-metrics', branchId: 'branch-0123456789abcdef0123456789abcdef-terminal', + label: 'Release 0123456789abcdef0123456789abcdef terminal', interactionCount: 0, focused: true, actions: { switch: true, ask: false, steer: true, cancel: true }, @@ -225,7 +245,7 @@ test('work strip is conditional and exposes branch work controls', () => { ...state, }) const generatedIdentityRow = chrome.render(80)[1] ?? '' - assert.match(generatedIdentityRow, /focus branch-0123456789…terminal · running/u) + assert.match(generatedIdentityRow, /focus Release 012345678…terminal · running/u) assert.match(generatedIdentityRow, /actions switch\/steer\/cancel/u) assert.doesNotMatch(generatedIdentityRow, /!ask|0123456789abcdef0123456789abcdef/u) const narrow = chrome.render(40) @@ -460,7 +480,7 @@ test('completed notices preserve the persistent route and measured context', () const wide = chrome.render(120).join('\n') assert.match( wide, - /profile Release engineer · harness pi · model openai-codex\/gpt-5\.6-luna · backend Local CLI Bridge/u, + /profile Release engineer · runner pi · model openai-codex\/gpt-5\.6-luna · backend Local CLI Bridge/u, ) assert.match(wide, /Prepared markdown export/u) assert.match(wide, /in 1\.2k/u) diff --git a/test/terminal-usage-status.test.ts b/test/terminal-usage-status.test.ts index da5b9e0f..384c974c 100644 --- a/test/terminal-usage-status.test.ts +++ b/test/terminal-usage-status.test.ts @@ -165,7 +165,7 @@ test('execution identity comes from one active run receipt instead of current pr }) const rendered = chrome.render(120).join('\n') assert.match(rendered, /Exact run profile/u) - assert.match(rendered, /harness pi · model tangle-router\/glm-5\.2/u) + assert.match(rendered, /runner pi · model tangle-router\/glm-5\.2/u) assert.match(rendered, /CLI Bridge/u) assert.doesNotMatch(rendered, /backend cli-bridge|pi · tangle-router/u) assert.doesNotMatch(rendered, /exec local CLI|active/u) diff --git a/test/tui-core-workflows.test.ts b/test/tui-core-workflows.test.ts index e6caa605..073812ba 100644 --- a/test/tui-core-workflows.test.ts +++ b/test/tui-core-workflows.test.ts @@ -6,8 +6,11 @@ import { fileURLToPath } from 'node:url' import { TuiMainScreen, visibleWidth } from '@earendil-works/pi-tui' import { comparePairedArms } from '@tangle-network/agent-eval' import { createApplicationUiController } from '../src/adapters/tui/application-ui-controller.js' +import { capabilityMap } from '../src/adapters/tui/ui-capabilities.js' import type { AnalysisComparisonResult } from '../src/app/analysis-comparison-contracts.js' import { createBraidApplication } from '../src/app/composition.js' +import { DEFAULT_RUN_CAPABILITIES } from '../src/ports/execution.js' +import { initialState, type BraidState } from '../src/domain/state.js' import type { BraidViewModel, InteractionView } from '../src/views/shared/models.js' import { ActivityBrowserPanel } from '../src/views/tui/activity-browser.js' import { AnalysisViewPanel } from '../src/views/tui/analysis.js' @@ -27,6 +30,43 @@ import { VirtualTerminal } from './support/virtual-terminal.js' const theme = createBraidTheme(false) +test('background recoverable runs remain available while another branch is active', () => { + const state = initialState({ + name: 'capability test', + harness: 'pi', + model: { default: 'provider/model' }, + }) + const run = (id: string, branchId: string, status: 'streaming' | 'detached') => ({ + id, + conversationId: state.conversationId, + branchId, + status, + capabilities: { + ...DEFAULT_RUN_CAPABILITIES, + streaming: { + ...DEFAULT_RUN_CAPABILITIES.streaming, + replay: true, + detach: true, + }, + controls: { ...DEFAULT_RUN_CAPABILITIES.controls, recreate: true }, + events: { ...DEFAULT_RUN_CAPABILITIES.events, cursor: true }, + }, + controlRef: {}, + }) + const viewState = { + ...state, + workspace: '/workspace', + focusedRunId: 'run-focused', + activeRunId: 'run-focused', + runs: [ + run('run-focused', state.branchId, 'streaming'), + run('run-background', 'branch-background', 'detached'), + ], + } as unknown as BraidState + + assert.equal(capabilityMap(viewState)['run.reconnect']?.available, true) +}) + async function waitUntil(predicate: () => boolean, timeoutMs = 1_000): Promise { const deadline = Date.now() + timeoutMs while (!predicate()) { diff --git a/test/tui-native-continuation.test.ts b/test/tui-native-continuation.test.ts index 1d7e602f..8ee8b843 100644 --- a/test/tui-native-continuation.test.ts +++ b/test/tui-native-continuation.test.ts @@ -27,7 +27,11 @@ const NATIVE_CAPABILITIES = { environment: { ...RETAINED_RUN_HANDLE_CAPABILITIES, sessions: { continue: true, list: false, messages: false }, - nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + nativeContinuation: { + atomicBoundary: true, + requestIdempotency: true, + admissionControl: true, + }, }, } as const diff --git a/test/w6-ui.test.ts b/test/w6-ui.test.ts index 44fa9b1b..0d4e93be 100644 --- a/test/w6-ui.test.ts +++ b/test/w6-ui.test.ts @@ -324,7 +324,7 @@ test('stable chrome keeps identity and status outside transcript history', () => assert.doesNotMatch(standard[0] ?? '', /\/ commands/u) assert.doesNotMatch(standard[0] ?? '', /Ctrl\+P/u) const wide = chrome.render(120).join('\n') - assert.match(wide, /profile reviewer · harness pi · backend local/u) + assert.match(wide, /profile reviewer · runner pi · backend local/u) assert.doesNotMatch(wide, /fixture|deterministic|50ms|in 6|out 12/u) for (const line of standard) assert.ok(visibleWidth(line) <= 80) }) diff --git a/test/w8-runs.test.ts b/test/w8-runs.test.ts index bdbe40ef..c353dd8c 100644 --- a/test/w8-runs.test.ts +++ b/test/w8-runs.test.ts @@ -1,11 +1,19 @@ import assert from 'node:assert/strict' import test from 'node:test' -import { defineAgentProfile } from '@tangle-network/agent-interface' +import { + contextTransferRequestDigest, + defineAgentProfile, + portableContextPlanDigest, + portableConversationContextDigest, +} from '@tangle-network/agent-interface' import type { RuntimeStreamEvent } from '@tangle-network/agent-runtime' +import { createApplicationUiController } from '../src/adapters/tui/application-ui-controller.js' import { buildBraidViewModel } from '../src/adapters/tui/ui-view-model.js' import { AppError, BraidApplication } from '../src/app/application.js' import { DETERMINISTIC_PROFILE } from '../src/app/composition.js' import { MemoryJournal } from '../src/app/journal.js' +import { validateContextPlan } from '../src/app/run-admission-validation.js' +import { localInteractionId } from '../src/domain/interaction-identity.js' import { createPortableContextPlan } from '../src/domain/receipts.js' import type { RuntimeEventEnvelope } from '../src/domain/runtime-events.js' import { type BraidState, initialState } from '../src/domain/state.js' @@ -28,7 +36,11 @@ const NATIVE_REPLAY_CAPABILITIES = { environment: { ...RETAINED_RUN_HANDLE_CAPABILITIES, sessions: { continue: true, list: false, messages: false }, - nativeContinuation: { atomicBoundary: true, requestIdempotency: true }, + nativeContinuation: { + atomicBoundary: true, + requestIdempotency: true, + admissionControl: true, + }, }, } as const @@ -120,6 +132,100 @@ test('admission receipt binds portable context and is deeply immutable', async ( assert.equal(Object.isFrozen(plan.messages), true) }) +test('canonical transfer receipts cannot bypass their request binding', () => { + assert.throws( + () => + validateContextPlan({ + operationId: 'op-unbound-context-receipt', + text: 'next', + portableContextTransferReceipt: {} as never, + }), + /requires its exact request/u, + ) +}) + +test('canonical context transfer binds admission to its destination session', () => { + const source = { + source: { + runId: 'source-run', + messageId: 'source-message', + provider: 'source-provider', + environmentId: 'source-environment', + sessionId: 'source-session', + executionId: 'source-execution', + requestDigest: `sha256:${'a'.repeat(64)}` as const, + }, + completeness: 'complete' as const, + messages: [ + { + id: 'source-message', + role: 'user' as const, + parts: [{ type: 'text' as const, text: 'prior context' }], + timestamp: '2026-08-01T00:00:00.000Z', + }, + ], + attachments: [], + } + const sourceContext = { ...source, digest: portableConversationContextDigest(source) } + const destination = { + runner: 'codex', + provider: 'target-provider', + environmentId: 'target-environment', + sessionId: 'target-session', + runId: 'target-run', + executionId: 'target-execution', + profileDigest: `sha256:${'b'.repeat(64)}` as const, + } + const planMaterial = { + planId: 'context-plan-session-binding', + source: sourceContext, + destination, + messages: [ + { + messageId: 'source-message', + action: 'include' as const, + parts: [{ partIndex: 0, action: 'include' as const }], + }, + ], + context: { ...sourceContext, messages: source.messages }, + requiresAcceptance: false, + } + const plan = { ...planMaterial, digest: portableContextPlanDigest(planMaterial) } + const requestMaterial = { + operationId: 'op-session-binding', + plan, + acceptance: { + planDigest: plan.digest, + acceptedAt: '2026-08-01T00:00:00.000Z', + acceptedBy: 'policy' as const, + }, + } + const request = { + ...requestMaterial, + requestDigest: contextTransferRequestDigest(requestMaterial), + } + assert.throws( + () => + validateContextPlan({ + operationId: request.operationId, + text: 'next', + sessionId: 'unrelated-session', + portableContextPlan: plan, + portableContextTransferRequest: request, + }), + /destination/u, + ) + assert.doesNotThrow(() => + validateContextPlan({ + operationId: request.operationId, + text: 'next', + sessionId: destination.sessionId, + portableContextPlan: plan, + portableContextTransferRequest: request, + }), + ) +}) + test('contract fixtures preserve parts, tools, reasoning, artifacts, proposals, warnings, usage, cost, and interactions', async () => { const execution: ExecutionPort = { capabilities: () => REPLAY_CAPABILITIES, @@ -144,7 +250,7 @@ test('contract fixtures preserve parts, tools, reasoning, artifacts, proposals, assert.equal(run.inputTokens, 3) assert.equal(run.outputTokens, 4) assert.equal(run.costUsd, 0.01) - assert.equal(run.interactions[0]?.request.id, 'interaction-1') + assert.equal(run.interactions[0]?.request.id, localInteractionId(run.id, 'interaction-1')) assert.equal(run.eventDetails.length, 0) assert.equal(new Set(app.events().flatMap((envelope) => envelope.event.kind)).size > 1, true) }) @@ -639,6 +745,10 @@ test('restart keeps a replayable run reconnecting until replay proves its outcom restarted.events().some((entry) => entry.event.kind === 'run.unknown'), false, ) + assert.equal( + createApplicationUiController(restarted).view().capabilities['run.reconnect']?.available, + true, + ) const recovered = await restarted.reconnectRun({ operationId: 'op-restart-replay-reconnect', From a0bb9044e47a6b4ffb08efc657f0ce273e31ce41 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 01:29:24 -0600 Subject: [PATCH 053/136] fix(process): support portable POSIX cleanup --- scripts/live-bridge/process-tree.mjs | 100 ++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 3 deletions(-) diff --git a/scripts/live-bridge/process-tree.mjs b/scripts/live-bridge/process-tree.mjs index bb920eb7..44162782 100644 --- a/scripts/live-bridge/process-tree.mjs +++ b/scripts/live-bridge/process-tree.mjs @@ -133,6 +133,19 @@ function processExists(pid) { } } +function processGroupPresent(pid) { + const normalizedPid = numericPid(pid) + if (normalizedPid === undefined) return undefined + try { + process.kill(-normalizedPid, 0) + return true + } catch (error) { + if (error?.code === 'ESRCH') return false + if (error?.code === 'EPERM') return true + return undefined + } +} + function readOwnershipMarker(pid, token) { try { const environment = readFileSync(procFile(pid, 'environ'), 'utf8') @@ -190,11 +203,39 @@ class PosixProcessTreeTracker { this.rootStartTime = undefined this.released = false this.failure = undefined + this.observeRoot() this.refresh() this.monitor = setInterval(() => this.refresh(), pollMs) this.monitor.unref() } + observeRoot() { + if (this.rootPid === undefined) { + this.failure = 'The POSIX process has no valid owner PID' + return + } + let root + let marker + try { + root = processStat(this.rootPid) + marker = readOwnershipMarker(this.rootPid, this.token) + } catch (error) { + this.failure = `The POSIX process ownership marker could not be read: ${errorMessage(error)}` + return + } + if (root === undefined) { + this.failure = 'The POSIX process exited before ownership was observed' + return + } + if (marker !== true) { + this.failure = 'The POSIX process did not retain its ownership marker' + return + } + this.rootObserved = true + this.rootStartTime = root.startTime + this.entries.set(root.pid, { ...root, depth: 0 }) + } + refresh() { if (this.released || this.failure !== undefined) return if (this.rootPid === undefined) { @@ -341,8 +382,55 @@ class PosixProcessTreeTracker { } } +class PosixProcessGroupTracker { + constructor(child) { + this.rootPid = numericPid(child.pid) + } + + status() { + if (this.rootPid === undefined) + return { + ...unsupported('The POSIX process has no valid owner PID'), + mechanism: 'posix-process-group', + } + const present = processGroupPresent(this.rootPid) + if (present === undefined) + return { + ...unsupported('The POSIX process group could not be inspected'), + mechanism: 'posix-process-group', + } + return { + supported: true, + gone: !present, + present, + pids: [], + roots: present ? [this.rootPid] : [], + version: present ? 0 : 1, + mechanism: 'posix-process-group', + ownership: 'kernel-process-group', + observed: true, + escaped: false, + } + } + + signal(signal) { + const status = this.status() + if (!status.supported) return { method: 'unavailable', sent: false, reason: status.reason } + if (status.gone) return { method: 'already-exited', sent: false } + try { + process.kill(-this.rootPid, signal) + return { method: 'process-group', sent: true } + } catch (error) { + if (error?.code === 'ESRCH') return { method: 'already-exited', sent: false } + return { method: 'failed', sent: false, error: errorMessage(error) } + } + } + + release() {} +} + export function processTreeEnvironment(environment = process.env) { - if (process.platform === 'win32') return { environment, token: undefined } + if (process.platform !== 'linux') return { environment, token: undefined } const token = randomUUID() return { environment: { ...environment, [processTreeToken]: token }, @@ -351,10 +439,16 @@ export function processTreeEnvironment(environment = process.env) { } export function trackProcessTree(child, token) { - if (process.platform === 'win32' || token === undefined) return undefined + if (process.platform === 'win32') return undefined if (child === null || typeof child !== 'object') throw new TypeError('A child process is required') - const tracker = new PosixProcessTreeTracker(child, token) + const tracker = + process.platform === 'linux' + ? token === undefined + ? undefined + : new PosixProcessTreeTracker(child, token) + : new PosixProcessGroupTracker(child) + if (tracker === undefined) return undefined processTreeTrackers.set(child, tracker) return tracker } From e950020e9369bf7974316cd6a465a7ebd7b66126 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 02:37:18 -0600 Subject: [PATCH 054/136] chore(deps): update direct dependencies --- biome.json | 2 +- package.json | 6 +- pnpm-lock.yaml | 215 ++++++++++++++++++++++++------------------------- 3 files changed, 111 insertions(+), 112 deletions(-) diff --git a/biome.json b/biome.json index 635b8d0f..05ae5d3e 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.5.7/schema.json", + "$schema": "https://biomejs.dev/schemas/2.5.11/schema.json", "vcs": { "enabled": true, "clientKind": "git", diff --git a/package.json b/package.json index 8a0aa89e..9c2901ff 100644 --- a/package.json +++ b/package.json @@ -111,11 +111,11 @@ "@tangle-network/tcloud-attestation": "0.1.1", "better-sqlite3-multiple-ciphers": "13.0.3", "chalk": "6.0.0", - "koffi": "3.1.4" + "koffi": "3.1.6" }, "devDependencies": { - "@biomejs/biome": "2.5.7", - "@types/node": "26.2.0", + "@biomejs/biome": "2.5.11", + "@types/node": "26.4.0", "@xterm/headless": "6.0.0", "esbuild": "0.28.2", "node-pty": "1.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ce8fb49..d47bb8a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,15 +51,15 @@ importers: specifier: 6.0.0 version: 6.0.0 koffi: - specifier: 3.1.4 - version: 3.1.4 + specifier: 3.1.6 + version: 3.1.6 devDependencies: '@biomejs/biome': - specifier: 2.5.7 - version: 2.5.7 + specifier: 2.5.11 + version: 2.5.11 '@types/node': - specifier: 26.2.0 - version: 26.2.0 + specifier: 26.4.0 + version: 26.4.0 '@xterm/headless': specifier: 6.0.0 version: 6.0.0 @@ -80,59 +80,59 @@ packages: peerDependencies: zod: ^4.0.0 - '@biomejs/biome@2.5.7': - resolution: {integrity: sha512-zr8K/DcY5tYsQOQwqMJ0AWElo6QgmgNI7idXgXLhevVszlt8RGVpesEJPqx3ThazLaOwjJ5Y8fz3BtH5fGZNsw==} + '@biomejs/biome@2.5.11': + resolution: {integrity: sha512-Tj0dnkLPdW0ASjHfj2D/ZkkvPU2wrFmnE1jWTD2xzV1ycapV1DutbYXk4NDnR3rYTi1ZCbNFD4G2gRMEY65WaA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.5.7': - resolution: {integrity: sha512-vxo/Ls3/PYdQWyLhYYcgMOCzQypAjcY+iihS8M0wW03l16TCLW4zqZzGo75gm1VdCMj38hTVZ31KBWrZ4G9dJw==} + '@biomejs/cli-darwin-arm64@2.5.11': + resolution: {integrity: sha512-6SGZxoKbXvUjMn1t6A98HqWISPnGNbYs0R/Rt2JarmXBSev+lva4QxUMWEBX9lX1Wo1XTJ78uk5xVDtG58SRZg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.5.7': - resolution: {integrity: sha512-Cd3Ga61amT/Yl/0x8elP5hhGYaFy4bw6WuysTgf7oo8TA5tJ5A1k+DkVoJ2BHbTVil51gTX9VPzArnrlLJ3Kyg==} + '@biomejs/cli-darwin-x64@2.5.11': + resolution: {integrity: sha512-nYkXY7tLBEgnGbYapDKAyKzgt44ZEyG+AKalvTXtCWKYgepI9dw327q+cVgedxm+Udi1ZzHKUyZrIusHi/KQbw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.5.7': - resolution: {integrity: sha512-xPI5yB6XlpDbNkS+bm1t42olw5c4l3UrlOmLg7KtLJvjvkNF/1V4tnUgfkylGIeb3u/T+BzMGYqgQhzjAoJzuQ==} + '@biomejs/cli-linux-arm64-musl@2.5.11': + resolution: {integrity: sha512-qhyZUMyCbWYFV2bAwRNVvfMVZ+hv7WYl6mossGrxC+uiQQXhvsuWWU8zz6jYX0mChZd9MgQZbm4vozTmG/5iGw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.5.7': - resolution: {integrity: sha512-rR2QE0yF2GYSuYuKIa7pKvODGJqnOH+2eDREAM8wV+mWKSkMQKdAp4zXEZfTaxY8PMoNONnpgSWcBCyLDPDOKg==} + '@biomejs/cli-linux-arm64@2.5.11': + resolution: {integrity: sha512-3PVLSTD9RR73rvVPt5G3T1gc+ycggWEGfTD7RvzzbtcDPD27NxgxBbAFfpm7DXJKW6VLHWE1lLMGvFt2Qxjcow==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.5.7': - resolution: {integrity: sha512-rE5VZi+qtmPgQH+l7jVxYoZ18b/TiHEhulhMpjmCZH1PltSbjRcxNWywC3HZ9tYottG7ORkeTtoscBilKSBm0g==} + '@biomejs/cli-linux-x64-musl@2.5.11': + resolution: {integrity: sha512-oRRlrchG5EfrEL/EmtT1qUjSNHk3/5LGeZhQqADBBAJF1b1ET6964xEKe7aGlGARzDfza8H/seEsFJl7S6Ql9w==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.5.7': - resolution: {integrity: sha512-FQgqJhscrqJUFptGaRSUJWlXAExwWcDwLuK49dvKfkQ1bB5SEEyFssnsxQY83Xm6jR0EbbX3+8+D5bfvYqUG2Q==} + '@biomejs/cli-linux-x64@2.5.11': + resolution: {integrity: sha512-JOytptlsgM33B2MMFUg8iBrb4IKpbD5JnJrSeYiaFEeAj4vuXx0iQSQZ4qK7sqyMtfjZxxPdNdMZZVL4y/mFyA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.5.7': - resolution: {integrity: sha512-Oq4x0CCwP4jirrcTywXs5kOGZ4v5vuEP+gWrbtjApOA2CL9F3F9GlIdQIci8AKSCa/zURanMRpX/4wQ7Am6hHg==} + '@biomejs/cli-win32-arm64@2.5.11': + resolution: {integrity: sha512-e49E6K9hzH/ohJNx8Y26mY8HaV4I4ZViIeoqhKsmoXLKHhQnMeBAVqCgsGf2Wa3lXlS7RkporDXMHHWkzvZzFw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.5.7': - resolution: {integrity: sha512-V+0wu/nrj2S+MhP4EQ0uHNolP0IALEsz45pg0WoKkHfDeh0+ItHwP/p7bX5RPoMOl9NkpHYWdYPhIcy2mACHvQ==} + '@biomejs/cli-win32-x64@2.5.11': + resolution: {integrity: sha512-QSQr/KjOgXA7OzXJUWS+oguKyAZ3Q0l/lnlDGbu397eKo83atuWUjBPJrsqbKNF6CARGw8XXJLGzpHC8Ryhd4Q==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -349,78 +349,78 @@ packages: peerDependencies: hono: 4.13.0 - '@koromix/koffi-darwin-arm64@3.1.4': - resolution: {integrity: sha512-/9o0uahf25sNXz7CczfMAsgdHrrrkDK3/d1W5ygJUC7QnpWo80103yTYpYahWP3vTABK5yjzKtURgssv1paskA==} + '@koromix/koffi-darwin-arm64@3.1.6': + resolution: {integrity: sha512-8FHyXGCZN7/iQf4f7W5BRysmtdlAFvSx6FpmX4u6wmkZiX/2e9hIRdGLiZYlHGudlcA18UmXB/cMiyhJ7fJkzA==} cpu: [arm64] os: [darwin] - '@koromix/koffi-darwin-x64@3.1.4': - resolution: {integrity: sha512-6IOhfAHbrySr6lYRU720Hg+IMQvtMpN08k9Ppf9WF8NxYRdHLnW1FJm7zCbClfrwudtjhS/piwDYwgAkO5u8cg==} + '@koromix/koffi-darwin-x64@3.1.6': + resolution: {integrity: sha512-uzx/jqFQuSHqgg1zaRidTBTCfj8Y9M0SDTO8HeoI9s9fJhiJ1mbB9TTwJO5c2hiMnuWg2m1byczC8BaIH6cG/w==} cpu: [x64] os: [darwin] - '@koromix/koffi-freebsd-arm64@3.1.4': - resolution: {integrity: sha512-JKCWC0awdVvq7Nd/etn4PXFTa7uvyHn7IzqtaOZ3r4dJRdwQVby7Ai/wsQo8UUrJfAYlALkLYgFgU8wgsnAE/A==} + '@koromix/koffi-freebsd-arm64@3.1.6': + resolution: {integrity: sha512-PjpTVrsCK5YTtixOw7VsseYXJOyoY6k0qBt+bf0T9h3wyV06y73rALsorFDDEoYpLUBZO7R6EIMs6CpUrEkNTQ==} cpu: [arm64] os: [freebsd] - '@koromix/koffi-freebsd-ia32@3.1.4': - resolution: {integrity: sha512-gU9pShDRLMZzftdGW+mTzyL8Cpa/7nzHPHe5vFakjGgtIzVFzdFBqwli4oB+tFsx44W1VqMMlvMMVlnz54ERiQ==} + '@koromix/koffi-freebsd-ia32@3.1.6': + resolution: {integrity: sha512-ETYwL820HtFwYoOVzgyvmFmzTHRo9DJtGYTxa5Nb7ajaa5ldCum0jbmUJ3PMECxFTLxD5Q6PYZ8Xbp101bGeSg==} cpu: [ia32] os: [freebsd] - '@koromix/koffi-freebsd-x64@3.1.4': - resolution: {integrity: sha512-2kppLX97xBM3WoQET6noN4W02zT2fkFRXHYluAwcCcmkEax8AVJ1CYs6hxcZ3kaNPc+5P7yMw3V/b1lg2v3aMw==} + '@koromix/koffi-freebsd-x64@3.1.6': + resolution: {integrity: sha512-BkqxkNXhAAT9toU2stvLwx1iKHPDx7h08NCICyBbjYEXkCAEr84igTkpE5V3XJ9xZZ2gKll7VvdhxorHtHUqZw==} cpu: [x64] os: [freebsd] - '@koromix/koffi-linux-arm64@3.1.4': - resolution: {integrity: sha512-yYbypuGVGqrNchkAMY59kj+7TZ1c1u9lXRG1+74X9T8G4rOaushoVONNYLuu+ygpbwsKzz/NvEDtRioRU/dQlQ==} + '@koromix/koffi-linux-arm64@3.1.6': + resolution: {integrity: sha512-cM4XPm9ljbCrcPgXjzFYjDNxDUvvuR7TCYaEoo1AKjwZT/vmWhu2xN3pomfbsHh6aVn80SFA3enufQnaETW1rQ==} cpu: [arm64] os: [linux] - '@koromix/koffi-linux-ia32@3.1.4': - resolution: {integrity: sha512-IoA/8Qfc6ZEmwMw2Nf4aSp9RfJnxh0UHhdqD4FsVXm0vC797kLMuzj744vv5tll+waVfjrU10jREqjtnMVFoQw==} + '@koromix/koffi-linux-ia32@3.1.6': + resolution: {integrity: sha512-l1SVTpO10iaQt8slbowJpzK4fbwQZ7ufj9tmCyAcIwWUpyAbPS83mJMctU72If6N9/gCS2wuRqwnYB2uPLLhLg==} cpu: [ia32] os: [linux] - '@koromix/koffi-linux-loong64@3.1.4': - resolution: {integrity: sha512-ZUTdea+9dg6CV9J9CIGbhTh0FtSBgvcGKqDrlp9BVQF71jEDKOri1by/TrDe8yQUyC5kzWN8vWnkzES5wT0xDg==} + '@koromix/koffi-linux-loong64@3.1.6': + resolution: {integrity: sha512-KpTJpMSbIdCVFU26ynt0xy4x15h+y6AwPJxj2+iVxJhCzJf4oisCPc0YH2VnutuLV2nVzSrFm7sL/WSOqPgkXw==} cpu: [loong64] os: [linux] - '@koromix/koffi-linux-riscv64@3.1.4': - resolution: {integrity: sha512-CINyyhNYV/8MX52MGhYcik2G6PXH+KEU2JEO7dOONlsGol4lSGyW40RvYA4RQgNYk8q8imGSEScL08X8eOXnaA==} + '@koromix/koffi-linux-riscv64@3.1.6': + resolution: {integrity: sha512-YdFNpsywnXiYOYQlDAatf7TJLnspbGXdmfwIZhf82kbKSflYUsq4tI6NmoUOzM89oIWDGpYqd4Hz3xL7tsyXsw==} cpu: [riscv64] os: [linux] - '@koromix/koffi-linux-x64@3.1.4': - resolution: {integrity: sha512-x3XnAy/tUTTCX/gMpV7VJNpOQIVQvzNhNYDrpyIeS9Q8/f1qLsE0vp0tj7A/YEDIfMVLqoJtyamfRJc04+vk4w==} + '@koromix/koffi-linux-x64@3.1.6': + resolution: {integrity: sha512-Xx5mpr9VcaMCXfvbqIiLIWIL9Iuu6F4r3iMXg7+zZCqYUFZPFwJgiDQBLxctHv2OYgIfAoaaHMW0GC1cJkHfbA==} cpu: [x64] os: [linux] - '@koromix/koffi-openbsd-ia32@3.1.4': - resolution: {integrity: sha512-r9p/fffvmBm7+iT5BZ+c17gZJ280jvmbinrPZqjG14rF9I4lk7xrlV79YfsexkeN4mcPjF2hSPtbMNFBoQU3Dw==} + '@koromix/koffi-openbsd-ia32@3.1.6': + resolution: {integrity: sha512-39Np4QTxhTlTT6RRveIeP+TnbzrwuDJ0UMyHxEZ+oGtzmb9GqWhl9T1oyehG6v/O+c4BffafG2NwLkCZ7tDKWw==} cpu: [ia32] os: [openbsd] - '@koromix/koffi-openbsd-x64@3.1.4': - resolution: {integrity: sha512-SNp5AxOzheC2YaWPu3Y86wxRHHWf6V9NMl5Ot5nu9OpnP61Yinzug7JwsCeXtcZZTbKLsfsWoT7y4n17UYpOVA==} + '@koromix/koffi-openbsd-x64@3.1.6': + resolution: {integrity: sha512-3EynGn3ycQRqaMWGmUJ0tdtuQdStByqSy/tJ0ZGKWizbMGdFAE73YpgLsyd8BDvwnKWytVG/OLNb5nDHpfd9Dg==} cpu: [x64] os: [openbsd] - '@koromix/koffi-win32-arm64@3.1.4': - resolution: {integrity: sha512-oS8ETU35AelOD6DY7xmmz9qq26Xl38upXWiZbsdxbtH9UEIY0QpenQOuCK/0+q4CtfiLorRUlglGkO9YgPAIeA==} + '@koromix/koffi-win32-arm64@3.1.6': + resolution: {integrity: sha512-27FdPPRtT4xbO9bsd2OZa95M5YQ7bcJ8QjCRO57UUMI21REfkDegjqKwqo/CFlugxXlJf5IYtG2rq4BEYIrvxg==} cpu: [arm64] os: [win32] - '@koromix/koffi-win32-ia32@3.1.4': - resolution: {integrity: sha512-zd7Qh8s4fzblD9zzuDf44XCbujYg3QrffhgcNJg79/YC6ABT2m0CUtX4yFic9EWm2ps8NPAM25kCTCXPpt3eaw==} + '@koromix/koffi-win32-ia32@3.1.6': + resolution: {integrity: sha512-5mVelLKVDup4eoxZOpCzCyMPxoctsg+Qe4J9O5BP4KbBEdqoOEqaNEBBRgNzXcdr2g+GGfmIUo+oVR1NvIdiJw==} cpu: [ia32] os: [win32] - '@koromix/koffi-win32-x64@3.1.4': - resolution: {integrity: sha512-BPeQXc1bRd0QBOklvsP+AjoRnUzKbPNE6rfx7VNxrebhh09MKld2ibstgKWn6ejQLEcfKEoUJ+WAWIhX4AOsIg==} + '@koromix/koffi-win32-x64@3.1.6': + resolution: {integrity: sha512-lPKjAaHz0aoiZXT/wDVqH+joR5y3lCZj1s9Bk5qx/DGRq+0MK8Ib8VoqiBOrJ69NG5AsJSvn0tQDcSqfRgLmBQ==} cpu: [x64] os: [win32] @@ -585,8 +585,8 @@ packages: resolution: {integrity: sha512-+TAF9s5t1jOWGyGHvKhIWe2FYmG7puVaxmmg0Et67ylAjGa7GqUAvISXGjG/6dzld7A170V0kQHK0WVdh2Wh0Q==} engines: {node: '>=18'} - '@types/node@26.2.0': - resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} + '@types/node@26.4.0': + resolution: {integrity: sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==} '@types/proper-lockfile@4.1.4': resolution: {integrity: sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ==} @@ -804,9 +804,8 @@ packages: is-any-array@3.0.0: resolution: {integrity: sha512-o4h+tylWykC4BD1vaejp6gDxoM13bwW8FGuNs4yIKpj8xbBJcRxJx8vZpq0dCr7ZDEfeKjmsi/euolKhX6f/ww==} - koffi@3.1.4: - resolution: {integrity: sha512-KHX39XIg7afe8ds+0MHPoLiKR9dCzsVK4oAmBUSaeJlcX0xur22f15C2DILbZ6GJ9eyqC+e6Sb1cTG7M17z+Tg==} - deprecated: Unstable Windows builds + koffi@3.1.6: + resolution: {integrity: sha512-ln60chEb3o7Du1ayjwl6BFiNN1wZK+3cTM2wWGiHLEzCY/FdTIN1ER5VWDwHq7J/j4tSnnrHaH5ABS1EO6+6ag==} linear-sum-assignment@1.0.9: resolution: {integrity: sha512-1T2Ek3sxpt2mBHeBFMRJEikiIK/yIOwf+mrxv/DkAU/5ddnCMndZL//hFH7QuHa1tbaQADzsf9t7rkGZKqoFfQ==} @@ -909,39 +908,39 @@ snapshots: openapi3-ts: 4.6.1 zod: 4.4.3 - '@biomejs/biome@2.5.7': + '@biomejs/biome@2.5.11': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.5.7 - '@biomejs/cli-darwin-x64': 2.5.7 - '@biomejs/cli-linux-arm64': 2.5.7 - '@biomejs/cli-linux-arm64-musl': 2.5.7 - '@biomejs/cli-linux-x64': 2.5.7 - '@biomejs/cli-linux-x64-musl': 2.5.7 - '@biomejs/cli-win32-arm64': 2.5.7 - '@biomejs/cli-win32-x64': 2.5.7 + '@biomejs/cli-darwin-arm64': 2.5.11 + '@biomejs/cli-darwin-x64': 2.5.11 + '@biomejs/cli-linux-arm64': 2.5.11 + '@biomejs/cli-linux-arm64-musl': 2.5.11 + '@biomejs/cli-linux-x64': 2.5.11 + '@biomejs/cli-linux-x64-musl': 2.5.11 + '@biomejs/cli-win32-arm64': 2.5.11 + '@biomejs/cli-win32-x64': 2.5.11 - '@biomejs/cli-darwin-arm64@2.5.7': + '@biomejs/cli-darwin-arm64@2.5.11': optional: true - '@biomejs/cli-darwin-x64@2.5.7': + '@biomejs/cli-darwin-x64@2.5.11': optional: true - '@biomejs/cli-linux-arm64-musl@2.5.7': + '@biomejs/cli-linux-arm64-musl@2.5.11': optional: true - '@biomejs/cli-linux-arm64@2.5.7': + '@biomejs/cli-linux-arm64@2.5.11': optional: true - '@biomejs/cli-linux-x64-musl@2.5.7': + '@biomejs/cli-linux-x64-musl@2.5.11': optional: true - '@biomejs/cli-linux-x64@2.5.7': + '@biomejs/cli-linux-x64@2.5.11': optional: true - '@biomejs/cli-win32-arm64@2.5.7': + '@biomejs/cli-win32-arm64@2.5.11': optional: true - '@biomejs/cli-win32-x64@2.5.7': + '@biomejs/cli-win32-x64@2.5.11': optional: true '@dataiku/uv-darwin-arm64@0.12.0': @@ -1062,49 +1061,49 @@ snapshots: dependencies: hono: 4.13.0 - '@koromix/koffi-darwin-arm64@3.1.4': + '@koromix/koffi-darwin-arm64@3.1.6': optional: true - '@koromix/koffi-darwin-x64@3.1.4': + '@koromix/koffi-darwin-x64@3.1.6': optional: true - '@koromix/koffi-freebsd-arm64@3.1.4': + '@koromix/koffi-freebsd-arm64@3.1.6': optional: true - '@koromix/koffi-freebsd-ia32@3.1.4': + '@koromix/koffi-freebsd-ia32@3.1.6': optional: true - '@koromix/koffi-freebsd-x64@3.1.4': + '@koromix/koffi-freebsd-x64@3.1.6': optional: true - '@koromix/koffi-linux-arm64@3.1.4': + '@koromix/koffi-linux-arm64@3.1.6': optional: true - '@koromix/koffi-linux-ia32@3.1.4': + '@koromix/koffi-linux-ia32@3.1.6': optional: true - '@koromix/koffi-linux-loong64@3.1.4': + '@koromix/koffi-linux-loong64@3.1.6': optional: true - '@koromix/koffi-linux-riscv64@3.1.4': + '@koromix/koffi-linux-riscv64@3.1.6': optional: true - '@koromix/koffi-linux-x64@3.1.4': + '@koromix/koffi-linux-x64@3.1.6': optional: true - '@koromix/koffi-openbsd-ia32@3.1.4': + '@koromix/koffi-openbsd-ia32@3.1.6': optional: true - '@koromix/koffi-openbsd-x64@3.1.4': + '@koromix/koffi-openbsd-x64@3.1.6': optional: true - '@koromix/koffi-win32-arm64@3.1.4': + '@koromix/koffi-win32-arm64@3.1.6': optional: true - '@koromix/koffi-win32-ia32@3.1.4': + '@koromix/koffi-win32-ia32@3.1.6': optional: true - '@koromix/koffi-win32-x64@3.1.4': + '@koromix/koffi-win32-x64@3.1.6': optional: true '@napi-rs/keyring-darwin-arm64@1.3.0': @@ -1234,7 +1233,7 @@ snapshots: '@tangle-network/tcloud-attestation@0.1.1': {} - '@types/node@26.2.0': + '@types/node@26.4.0': dependencies: undici-types: 8.3.0 @@ -1394,23 +1393,23 @@ snapshots: is-any-array@3.0.0: {} - koffi@3.1.4: + koffi@3.1.6: optionalDependencies: - '@koromix/koffi-darwin-arm64': 3.1.4 - '@koromix/koffi-darwin-x64': 3.1.4 - '@koromix/koffi-freebsd-arm64': 3.1.4 - '@koromix/koffi-freebsd-ia32': 3.1.4 - '@koromix/koffi-freebsd-x64': 3.1.4 - '@koromix/koffi-linux-arm64': 3.1.4 - '@koromix/koffi-linux-ia32': 3.1.4 - '@koromix/koffi-linux-loong64': 3.1.4 - '@koromix/koffi-linux-riscv64': 3.1.4 - '@koromix/koffi-linux-x64': 3.1.4 - '@koromix/koffi-openbsd-ia32': 3.1.4 - '@koromix/koffi-openbsd-x64': 3.1.4 - '@koromix/koffi-win32-arm64': 3.1.4 - '@koromix/koffi-win32-ia32': 3.1.4 - '@koromix/koffi-win32-x64': 3.1.4 + '@koromix/koffi-darwin-arm64': 3.1.6 + '@koromix/koffi-darwin-x64': 3.1.6 + '@koromix/koffi-freebsd-arm64': 3.1.6 + '@koromix/koffi-freebsd-ia32': 3.1.6 + '@koromix/koffi-freebsd-x64': 3.1.6 + '@koromix/koffi-linux-arm64': 3.1.6 + '@koromix/koffi-linux-ia32': 3.1.6 + '@koromix/koffi-linux-loong64': 3.1.6 + '@koromix/koffi-linux-riscv64': 3.1.6 + '@koromix/koffi-linux-x64': 3.1.6 + '@koromix/koffi-openbsd-ia32': 3.1.6 + '@koromix/koffi-openbsd-x64': 3.1.6 + '@koromix/koffi-win32-arm64': 3.1.6 + '@koromix/koffi-win32-ia32': 3.1.6 + '@koromix/koffi-win32-x64': 3.1.6 linear-sum-assignment@1.0.9: dependencies: From 3cda69714970c92ea8d39ed9bd6bb4acd6a7ebc3 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 02:39:37 -0600 Subject: [PATCH 055/136] chore(deps): update terminal toolchain --- package.json | 4 ++-- pnpm-lock.yaml | 10 +++++----- pnpm-workspace.yaml | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 9c2901ff..11254e43 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "darwin", "linux" ], - "packageManager": "pnpm@11.18.0", + "packageManager": "pnpm@11.24.0", "license": "MIT", "repository": { "type": "git", @@ -100,7 +100,7 @@ }, "dependencies": { "@dataiku/uv": "0.12.0", - "@earendil-works/pi-tui": "0.84.3", + "@earendil-works/pi-tui": "0.84.4", "@napi-rs/keyring": "1.3.0", "@tangle-network/agent-eval": "0.170.0", "@tangle-network/agent-interface": "1.8.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d47bb8a1..8db1e274 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: 0.12.0 version: 0.12.0 '@earendil-works/pi-tui': - specifier: 0.84.3 - version: 0.84.3 + specifier: 0.84.4 + version: 0.84.4 '@napi-rs/keyring': specifier: 1.3.0 version: 1.3.0 @@ -183,8 +183,8 @@ packages: resolution: {integrity: sha512-GDjOPA1l3IBxRml8/3j/v4HD4mDbEOHYqYMfjMW8pISpOrq73o1QLGVWw6PC0gYV7ovO5MVAq1Brab56MS5WFQ==} hasBin: true - '@earendil-works/pi-tui@0.84.3': - resolution: {integrity: sha512-fS6OEQKEEALnKa6Uw8LcgZZ+9CWck7f3MQSCETQp6leUgIFwMEDtKmOUnL9nsYm+RIPmy7OmplVxYRbV6hiaFg==} + '@earendil-works/pi-tui@0.84.4': + resolution: {integrity: sha512-nPUnwDkLtupPXnZQYrCwPFcuTydCDqTY6ZbFqhsL4S4kVq0AT418kPa/6uXwtaCD+MjBNBltb7ScTYX65yeE1w==} engines: {node: '>=22.19.0'} '@esbuild/aix-ppc64@0.28.2': @@ -974,7 +974,7 @@ snapshots: '@dataiku/uv-win32-ia32': 0.12.0 '@dataiku/uv-win32-x64': 0.12.0 - '@earendil-works/pi-tui@0.84.3': + '@earendil-works/pi-tui@0.84.4': dependencies: get-east-asian-width: 1.6.0 marked: 18.0.5 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 96753b1d..831ffb38 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -48,4 +48,4 @@ minimumReleaseAgeExclude: - '@esbuild/win32-x64@0.28.2' - esbuild@0.28.2 - '@tangle-network/agent-core@0.5.4 || 0.6.0 || 0.6.1 || 0.7.1 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.4' - - '@earendil-works/pi-tui@0.84.2 || 0.84.3' + - '@earendil-works/pi-tui@0.84.2 || 0.84.3 || 0.84.4' From d36fe4f6d1ddf9407e46f778eee37cc023c2bb42 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 02:41:30 -0600 Subject: [PATCH 056/136] docs(deps): align dependency evidence --- THIRD_PARTY_NOTICES.md | 4 ++-- docs/08-verification.md | 2 +- docs/10-upstream-strategy.md | 4 +++- docs/patches/pi-tui.md | 8 ++++++++ scripts/release/release-collector.test.mjs | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index ad152a4d..ba9b26c1 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -14,7 +14,7 @@ The implementation is expected to depend on and adapt behavior from the followin | [Microsoft Aspire](https://github.com/dotnet/aspire) | Windows Job Object creation and cleanup pattern for portable release proof | `dotnet/aspire@be77aa36daf995fae0e72091141410c7082fcba3` | MIT | | [`better-sqlite3-multiple-ciphers`](https://github.com/m4heshd/better-sqlite3-multiple-ciphers) | Pinned production SQLite binding with SQLCipher-compatible encryption | `better-sqlite3-multiple-ciphers@13.0.3` | MIT | | [`@napi-rs/keyring`](https://github.com/Brooooooklyn/keyring-node) | Native macOS Keychain, Linux Secret Service, and Windows Credential Manager access without passing secrets through command arguments | `@napi-rs/keyring@1.3.0` | MIT | -| [Koffi](https://github.com/Koromix/koffi) | Prebuilt Node FFI for operating system `openat`, `mkdirat`, `linkat`, `renameat`, and `unlinkat` calls | `koffi@3.1.4` | MIT | +| [Koffi](https://github.com/Koromix/koffi) | Prebuilt Node FFI for operating system `openat`, `mkdirat`, `linkat`, `renameat`, and `unlinkat` calls | `koffi@3.1.6` | MIT | ## Attribution rule @@ -31,7 +31,7 @@ The original copyright and license notice must remain with every substantial cop A dependency declared in `package.json` does not require a file-level source header, but its license must remain represented in the generated release license inventory. -W5 adds the pinned `better-sqlite3-multiple-ciphers@13.0.3`, `@napi-rs/keyring@1.3.0`, and `koffi@3.1.4` production dependencies. +W5 adds the pinned `better-sqlite3-multiple-ciphers@13.0.3`, `@napi-rs/keyring@1.3.0`, and `koffi@3.1.6` production dependencies. It contains no copied source from these packages. diff --git a/docs/08-verification.md b/docs/08-verification.md index 1d817959..4dba47a8 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -261,7 +261,7 @@ No test imports an internal controller to claim headless protocol proof. Braid's test-only implementation of Pi TUI's public `Terminal` interface renders the real root component and application core at 40×12, 80×24, 120×40, and 200×60. -The adapter is derived from Pi's test helper with immutable source and license attribution because `@earendil-works/pi-tui@0.84.1` does not publish that helper. +The adapter is derived from Pi's test helper with immutable source and license attribution because `@earendil-works/pi-tui@0.84.4` does not publish that helper. The output assertion includes cell character, width, semantic style, cursor, focus, overlay bounds, clipped rows, and hidden content. diff --git a/docs/10-upstream-strategy.md b/docs/10-upstream-strategy.md index 17bf8dd0..f68a59b8 100644 --- a/docs/10-upstream-strategy.md +++ b/docs/10-upstream-strategy.md @@ -14,6 +14,8 @@ The initial comparison used source, package metadata, licenses, application inst The core terminal references were refreshed from their live default branches on 2026-08-10 before and during the production UX pass. +The Pi TUI runtime dependency was revalidated at npm `0.84.4` and source commit `b79e4cc834970cca69daebffab7df1da7d1e52c4` on 2026-08-29. + DeepSeek Harness and Cordis were inspected at their live default branches on 2026-08-13. The Pi repository head was `cd6852a`, with no newer change below `packages/tui` after `87142a8`. @@ -53,7 +55,7 @@ The Kimi SDK coupling count selected terminal files that directly import `@moons Pi TUI provides main-screen and alternate-screen rendering, differential frame output, cell-width calculation, viewport and scrolling, containers, overlays, focus, editor input, autocomplete, history, undo, kill ring behavior, selection lists, settings lists, markdown, images, IME handling, keyboard decoding, and a public terminal interface. -The Pi repository includes a useful `packages/tui/test/virtual-terminal.ts` helper, but `@earendil-works/pi-tui@0.84.1` does not publish or export it. +The Pi repository includes a useful `packages/tui/test/virtual-terminal.ts` helper, but `@earendil-works/pi-tui@0.84.4` does not publish or export it. Braid will adapt that test-only helper with attribution unless Pi first publishes a supported testing export. diff --git a/docs/patches/pi-tui.md b/docs/patches/pi-tui.md index 6a221398..810f4d83 100644 --- a/docs/patches/pi-tui.md +++ b/docs/patches/pi-tui.md @@ -19,3 +19,11 @@ The adapter contains no renderer, viewport, input handler, or application state. Removal condition: replace the adapter with `TuiAltScreen` only if Braid moves transcript history into Pi's `ScrollView` without losing the current keyboard, restart, visual, and full-history checks. Revalidation required on every Pi TUI update. + +Revalidated: 2026-08-29 against `@earendil-works/pi-tui@0.84.4` from source commit `b79e4cc834970cca69daebffab7df1da7d1e52c4`. + +The published package still omits the virtual-terminal helper and still reserves alternate-screen viewport actions. + +The current adapter remains necessary. + +Proof: 156 virtual-terminal checks passed, and packed PTY checks passed at 40×12, 80×24, 120×40, and 200×60. diff --git a/scripts/release/release-collector.test.mjs b/scripts/release/release-collector.test.mjs index 88db86fa..f6293f8c 100644 --- a/scripts/release/release-collector.test.mjs +++ b/scripts/release/release-collector.test.mjs @@ -71,7 +71,7 @@ async function makeRepo({ `${JSON.stringify({ name: '@example/braid', version: '1.0.0', - packageManager: 'pnpm@11.18.0', + packageManager: 'pnpm@11.24.0', dependencies: {}, })}\n`, ) From e0e7489c801919b6b49960c5fcf2488a6ffea1bc Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 04:27:42 -0600 Subject: [PATCH 057/136] chore(deps): adopt sandbox 0.34.3 --- package.json | 2 +- pnpm-lock.yaml | 22 +++++++++++----------- pnpm-workspace.yaml | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 11254e43..e1f624d6 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "@tangle-network/agent-provider-cli-bridge": "0.10.0", "@tangle-network/agent-provider-tangle": "0.14.1", "@tangle-network/agent-runtime": "0.178.0", - "@tangle-network/sandbox": "0.34.0", + "@tangle-network/sandbox": "0.34.3", "@tangle-network/tcloud-attestation": "0.1.1", "better-sqlite3-multiple-ciphers": "13.0.3", "chalk": "6.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8db1e274..40b99182 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,13 +34,13 @@ importers: version: 0.10.0 '@tangle-network/agent-provider-tangle': specifier: 0.14.1 - version: 0.14.1(@tangle-network/sandbox@0.34.0) + version: 0.14.1(@tangle-network/sandbox@0.34.3) '@tangle-network/agent-runtime': specifier: 0.178.0 - version: 0.178.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)(@tangle-network/sandbox@0.34.0) + version: 0.178.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)(@tangle-network/sandbox@0.34.3) '@tangle-network/sandbox': - specifier: 0.34.0 - version: 0.34.0 + specifier: 0.34.3 + version: 0.34.3 '@tangle-network/tcloud-attestation': specifier: 0.1.1 version: 0.1.1 @@ -561,8 +561,8 @@ packages: '@tangle-network/agent-trace-contract@1.0.2': resolution: {integrity: sha512-v7uMh56jkEp4vckevEU9xKsIatbs5dqzGPp69dFLSSXUVit0RP6VD6EANMXVlTCUk+6wVKBLHJx23XspVCEiIA==} - '@tangle-network/sandbox@0.34.0': - resolution: {integrity: sha512-jzP1JS6WPP/nMOtlkJtor1GgkdEKs3L+A8TV0VLkxtuZn70FqB/4/FZOPBFtQJX8nNWfhD8DHm9LneU3gsS9Cg==} + '@tangle-network/sandbox@0.34.3': + resolution: {integrity: sha512-Zy+DsmQD6qG+2yf8Zox3TCLVAcMOUwQsiVs9uz6OTb1rrz3yDemdoT3dGNUrpbV/wmt/62K+e/5nb7E0F2xNfg==} peerDependencies: '@mastra/core': ^1.36.0 '@modelcontextprotocol/sdk': ^1.30.0 @@ -1201,12 +1201,12 @@ snapshots: '@tangle-network/agent-interface': 1.8.0 undici: 7.29.0 - '@tangle-network/agent-provider-tangle@0.14.1(@tangle-network/sandbox@0.34.0)': + '@tangle-network/agent-provider-tangle@0.14.1(@tangle-network/sandbox@0.34.3)': dependencies: '@tangle-network/agent-interface': 1.8.0 - '@tangle-network/sandbox': 0.34.0 + '@tangle-network/sandbox': 0.34.3 - '@tangle-network/agent-runtime@0.178.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)(@tangle-network/sandbox@0.34.0)': + '@tangle-network/agent-runtime@0.178.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)(@tangle-network/sandbox@0.34.3)': dependencies: '@tangle-network/agent-core': 0.9.5 '@tangle-network/agent-eval': 0.170.0 @@ -1216,7 +1216,7 @@ snapshots: '@tangle-network/agent-trace-contract': 1.0.2 tar-stream: 3.2.0 optionalDependencies: - '@tangle-network/sandbox': 0.34.0 + '@tangle-network/sandbox': 0.34.3 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bare-abort-controller @@ -1225,7 +1225,7 @@ snapshots: '@tangle-network/agent-trace-contract@1.0.2': {} - '@tangle-network/sandbox@0.34.0': + '@tangle-network/sandbox@0.34.3': dependencies: '@tangle-network/agent-core': 0.9.5 '@tangle-network/agent-interface': 1.8.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 831ffb38..d4d69dc0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -18,7 +18,7 @@ minimumReleaseAgeExclude: - '@tangle-network/agent-profile-materialize@0.10.2 || 0.13.1 || 0.14.0 || 0.14.2 || 0.15.1 || 0.15.2 || 0.17.1' - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0' - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1' - - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0' + - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0 || 0.34.3' - hono@4.13.0 - '@esbuild/aix-ppc64@0.28.2' - '@esbuild/android-arm64@0.28.2' From 6fd90c5b43220256ddcc2fd0b9c8fe1df1851fbe Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 04:38:39 -0600 Subject: [PATCH 058/136] chore(deps): adopt Tangle provider 0.14.2 --- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ pnpm-workspace.yaml | 2 +- test/production-composition.test.ts | 15 ++++++++------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index e1f624d6..2648f86c 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@tangle-network/agent-eval": "0.170.0", "@tangle-network/agent-interface": "1.8.0", "@tangle-network/agent-provider-cli-bridge": "0.10.0", - "@tangle-network/agent-provider-tangle": "0.14.1", + "@tangle-network/agent-provider-tangle": "0.14.2", "@tangle-network/agent-runtime": "0.178.0", "@tangle-network/sandbox": "0.34.3", "@tangle-network/tcloud-attestation": "0.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40b99182..c2625db0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,8 +33,8 @@ importers: specifier: 0.10.0 version: 0.10.0 '@tangle-network/agent-provider-tangle': - specifier: 0.14.1 - version: 0.14.1(@tangle-network/sandbox@0.34.3) + specifier: 0.14.2 + version: 0.14.2(@tangle-network/sandbox@0.34.3) '@tangle-network/agent-runtime': specifier: 0.178.0 version: 0.178.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)(@tangle-network/sandbox@0.34.3) @@ -541,10 +541,10 @@ packages: '@tangle-network/agent-provider-cli-bridge@0.10.0': resolution: {integrity: sha512-G4EzQ8UErCFYVU/R0LHc9kjVOadIrrZYecqCX6Az8dlGzKPDRup8niu50EYKjR/VuaUNdmyNxNuWhcRExuPWyg==} - '@tangle-network/agent-provider-tangle@0.14.1': - resolution: {integrity: sha512-tTv0y+OSSZtiIGjOtgJ3XL7N8dvl8lOGlZfK5CG+iHc2RNlcfp/gjjCz8X9VOUoJsNAWX1Lw8MIxy/C2JN9fHg==} + '@tangle-network/agent-provider-tangle@0.14.2': + resolution: {integrity: sha512-46cfQZKbDkhhVNfRdrKsnLDY9K4DIQ/bkNIUGlMtujBy0miLCWYxX2UUDD8GrRrNUs/b800XzcXKtcJURJIghg==} peerDependencies: - '@tangle-network/sandbox': '>=0.33.1 <1.0.0' + '@tangle-network/sandbox': '>=0.34.0 <1.0.0' '@tangle-network/agent-runtime@0.178.0': resolution: {integrity: sha512-CltB1+dhcIOVKj+t2jpW4cM7qn8aLuY039RlfssZ+VTID0tBeXJZUa+G9dQIMTMLJA3qn2hxuh2u+dRgwhmnUQ==} @@ -1201,7 +1201,7 @@ snapshots: '@tangle-network/agent-interface': 1.8.0 undici: 7.29.0 - '@tangle-network/agent-provider-tangle@0.14.1(@tangle-network/sandbox@0.34.3)': + '@tangle-network/agent-provider-tangle@0.14.2(@tangle-network/sandbox@0.34.3)': dependencies: '@tangle-network/agent-interface': 1.8.0 '@tangle-network/sandbox': 0.34.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d4d69dc0..fcd1bb99 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,7 +17,7 @@ minimumReleaseAgeExclude: - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0 || 10.8.0' - '@tangle-network/agent-profile-materialize@0.10.2 || 0.13.1 || 0.14.0 || 0.14.2 || 0.15.1 || 0.15.2 || 0.17.1' - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0' - - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1' + - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2' - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0 || 0.34.3' - hono@4.13.0 - '@esbuild/aix-ppc64@0.28.2' diff --git a/test/production-composition.test.ts b/test/production-composition.test.ts index dc6ad0bd..e5f299de 100644 --- a/test/production-composition.test.ts +++ b/test/production-composition.test.ts @@ -501,13 +501,14 @@ test('retained Tangle composition routes interactive admission without creating connectionId: record.id, signal: new AbortController().signal, } - // Sandbox 0.30.1 exposes no claimControl or validateControl, so the provider - // proves no exact interactive agent and the interactive route refuses before - // any billable environment exists. Sandbox 0.31 turns this into an admission. - await assert.rejects( - async () => composed.execution.admit?.({ ...interactiveTurn, mode: 'interactive' }), - /does not support exact interactive agents/u, - ) + const interactive = await composed.execution.admit?.({ + ...interactiveTurn, + mode: 'interactive', + }) + assert.equal(interactive?.provider, 'tangle-sandbox') + assert.equal(interactive?.materializationReceipt?.surface, 'interactive-agent') + assert.equal(interactive?.capabilities?.environment?.interactiveAgent?.start, true) + assert.equal(sandbox.createCalls.length, 0) const headless = await composed.execution.admit?.({ ...interactiveTurn, operationId: 'operation-headless-routing', From 4fe051658cebee3b71c9a6dc8fa0c594e40ecc0b Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 04:47:59 -0600 Subject: [PATCH 059/136] docs(runtime): record current provider cohort --- docs/04-runtime-contracts.md | 115 +++++++++++++++++++++-------------- docs/08-verification.md | 12 ++-- 2 files changed, 77 insertions(+), 50 deletions(-) diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index 9b71a6a4..cb9e4fe2 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -2,7 +2,7 @@ ## Purpose -This document separates capabilities available in Braid's installed packages from capabilities that must remain disabled. +This document separates capabilities available in Braid's installed packages from actions that remain unavailable. Braid must not turn a type declaration, capability flag, or planned method into a product claim without a real Braid flow proving it. @@ -10,26 +10,32 @@ When a current package blocks a real Braid flow, Braid records the unavailable a ## Evidence baseline -The following published versions were queried from npm and their installed declarations and implementations were inspected directly on 2026-08-15. +The following published versions were resolved in this worktree, and their installed manifests, declarations, and implementations were inspected directly on 2026-08-29. | Package | Installed version | Braid boundary | | --- | ---: | --- | -| [`@tangle-network/agent-interface`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) | `1.3.0` | Canonical profile, capabilities, environment, stream, portable context, and interaction contracts | -| [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.143.0` | Sole execution layer; exact executor, retained-run, environment-provider, and terminal-monitor exports | -| [`@tangle-network/agent-eval`](https://github.com/tangle-network/agent-eval) | `0.149.0` | Run records, judges, trace analysts, comparisons, and feedback trajectories | -| `@tangle-network/agent-provider-cli-bridge` | `0.9.4` | CLI Bridge environment adapter with capability discovery, native retained sessions, live streaming, replay, retry-safe turns, retained control, durable interaction response, and explicit cancel | -| `@tangle-network/agent-provider-tangle` | `0.13.0` | Tangle environment adapter over the sandbox client | -| `@tangle-network/sandbox` | `0.31.0` | Tangle cloud client used by the provider | +| [`@tangle-network/agent-interface`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) | `1.8.0` | Canonical profile, capabilities, environment, stream, portable context, native continuation, and interaction contracts | +| [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.178.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | +| [`@tangle-network/agent-eval`](https://github.com/tangle-network/agent-eval) | `0.170.0` | Run records, judges, trace analysts, comparisons, and feedback trajectories | +| `@tangle-network/agent-provider-cli-bridge` | `0.10.0` | CLI Bridge environment adapter with capability discovery, native retained sessions, live streaming, replay, retry-safe turns, retained control, durable interaction response, and explicit cancel | +| `@tangle-network/agent-provider-tangle` | `0.14.2` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations | +| `@tangle-network/sandbox` | `0.34.3` | Tangle cloud client used by the provider, including keyed checkpoint/fork and interactive-agent operations | -The installed runtime publishes `agent-eval >=0.149.0 <0.150.0`, `agent-interface ^1.3.0`, and `sandbox >=0.31.0 <0.32.0` as peer ranges. +The installed runtime publishes `agent-eval >=0.163.2 <0.171.0`, `agent-interface ^1.8.0`, and `sandbox >=0.34.0 <0.35.0` as peer ranges. -Braid exercises runtime `0.143.0` with interface `1.3.0`, eval `0.149.0`, CLI Bridge adapter `0.9.4`, Tangle adapter `0.13.0`, and sandbox `0.31.0`. +The installed Tangle provider publishes `sandbox >=0.34.0 <1.0.0` as a peer range. + +Sandbox `0.34.3` publishes peers `@mastra/core ^1.36.0`, `@modelcontextprotocol/sdk ^1.30.0`, `ai ^6.0.175`, `openai ^6.36.0`, and `viem ^2.0.0`. + +Braid exercises Runtime `0.178.0` with interface `1.8.0`, eval `0.170.0`, CLI Bridge adapter `0.10.0`, Tangle adapter `0.14.2`, and Sandbox `0.34.3`. The lockfile pins the registry integrity for every installed package. `pnpm peers check` reports no peer dependency issues for this installed set. -The Braid root and Runtime peer cohort resolve `agent-interface` `1.3.0` without a workspace override. +`pnpm outdated --format json` returns `{}` for this worktree. + +The Braid root and Runtime peer cohort resolve `agent-interface` `1.8.0` without a workspace override. Historical snapshot: [Agent-runtime issue 803](https://github.com/tangle-network/agent-runtime/issues/803) records the interface peer mismatch fixed in Runtime `0.132.11`. @@ -47,17 +53,17 @@ Braid composes the current provider packages through `agent-runtime` and keeps a The CLI Bridge and Tangle providers remain transport implementations rather than alternate application shells. -Interface `1.3.0` carries the requested interaction map on `AgentTurnInput` and the retained environment input. +Interface `1.8.0` carries requested interactions, portable context transfer, and native continuation on `AgentTurnInput`. The map is not a capability declaration. Braid derives it only after exact per-run environment capabilities are admitted, and sends an explicit empty map when response idempotency is absent or unknown. -The current runtime and installed provider implementations do not preserve that field through the retained dispatch boundary. +Runtime `0.178.0` projects the interaction map into the Sandbox prompt options, and Tangle provider `0.14.2` preserves it through retained dispatch. -Braid therefore keeps the retained interactive path unverified until Runtime and the provider adapters forward the field end to end. +The Tangle provider exposes response operations only when the deployment reports `interactions.responseDedupe`; Braid still requires that per-run capability and a real deployment check. -At implementation start and before every release, rerun `npm view @tangle-network/ version` and inspect the installed declarations because these packages change frequently. +At implementation start and before every release, rerun `pnpm outdated --format json` and inspect the installed manifests and declarations because these packages change frequently. ## Existing canonical profile contract @@ -102,11 +108,9 @@ Permission responses support once, session, persistent allow, and deny outcomes The canonical stream includes `interaction`, `interaction.cancel`, and `plan.submitted` events in addition to message-part, status, warning, raw, and session updates. -`SdkProviderAdapter` has an optional `respondToInteraction(response)` method. - -The higher-level `AgentEnvironmentProvider` and `AgentSession` path does not currently expose an equivalent response method. +`SdkProviderAdapter`, `AgentEnvironment`, and `AgentSession` have optional typed interaction-response methods. -Therefore the existence of interaction types does not prove that a Braid user can answer a waiting CLI Bridge or Tangle run. +Therefore the existence of interaction types or methods does not prove that a Braid user can answer a waiting run; the effective capability and a real flow remain required. ## Existing environment-provider contract @@ -170,7 +174,9 @@ The provider and remote environment remain lazy until execution starts after dur ### Current Braid cancellation path -`PreparedExecution.cancellation` is the only capability that enables Braid cancellation for a production run. +`PreparedExecution.cancellation` enables Braid cancellation for the ephemeral Runtime executor path. + +Retained CLI Bridge, retained Tangle, and native interactive-agent runs use their exact retained control handle when the effective run capabilities advertise cancellation. The capability is a typed Runtime-executor tag, not a provider-specific callback or a UI branch. @@ -184,15 +190,15 @@ Historical snapshot: the installed Runtime `0.132.12` bridge executor implemente Braid may abort its local iterator after an accepted or unknown result to release local resources, but local abort never proves provider cancellation. -The CLI Bridge production adapter is the only current production adapter that supplies this capability. +The CLI Bridge and retained Tangle production adapters supply cancellation through their exact retained control paths. -The Tangle sandbox adapter and direct Tangle inference adapter omit it. +The ephemeral Tangle sandbox path and direct Tangle inference adapter omit it. The installed Runtime sandbox executor returns `destroyed: true` after aborting its local controller, while the Tangle session cancel method requires an exact `executionId` in a retained control reference. -The current sandbox turn path passes only an `AbortSignal` to `streamPrompt`, and the published Tangle capability surface does not provide that exact control reference for this path. +The ephemeral sandbox turn path passes only an `AbortSignal` to `streamPrompt`, and its published capability surface does not provide that exact control reference for this path. -Braid therefore reports sandbox cancellation as unsupported or unknown instead of treating environment destruction or local stream closure as provider cancellation. +Braid therefore reports ephemeral sandbox cancellation as unsupported or unknown instead of treating environment destruction or local stream closure as provider cancellation. The upstream Runtime change required to expand this support is recorded below with the exact installed source and type evidence. @@ -331,7 +337,7 @@ These behaviors may be suitable for isolated benchmark automation under an expli ## Existing CLI Bridge provider contract -The published `@tangle-network/agent-provider-cli-bridge@0.9.4` resolves the bridge model from a turn override, provider default, or profile harness and model. +The published `@tangle-network/agent-provider-cli-bridge@0.10.0` resolves the bridge model from a turn override, provider default, or profile harness and model. It sends stable `executionId` values as bridge run identifiers when they satisfy the bridge identifier rules. @@ -347,7 +353,7 @@ Stopping a retained stream reader detaches the reader without cancelling the bri Explicit exact cancellation remains separate from reader detach and binds to the server-issued request digest. -Its public turn type accepts requested interactions through Interface `1.3.0`, and its retained turn body carries them to the Bridge. +Its public turn type accepts requested interactions through Interface `1.8.0`, and its retained turn body carries them to the Bridge. It reads the exact capability document for one model route from `GET /v1/capabilities?model=…` before it admits a run. @@ -359,21 +365,21 @@ The Braid retained CLI Bridge boundary test catches an interaction posture the r ## Existing Tangle provider contract -The published `@tangle-network/agent-provider-tangle@0.13.0` wraps `@tangle-network/sandbox` as an `AgentEnvironmentProvider`. +The published `@tangle-network/agent-provider-tangle@0.14.2` wraps `@tangle-network/sandbox@0.34.3` as an `AgentEnvironmentProvider`. Its default document is an upper bound, not a claim about one client or deployment. -Its default capability document reports canonical profile dimensions, live and replay streaming, detach, turn idempotency, workspace read/write/exec/upload/download, and optional placement. +Its provider-level surface includes deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations. -Its default document reports native continuation, session listing, session messages, workspace git, checkpoint, fork, usage, and confidentiality as unavailable. +The composed environment narrows those claims against the concrete Sandbox client and deployment capability document. -Version `0.6.3` accepts an explicit capability declaration and narrows it against the concrete client and environment methods. +The provider accepts an explicit capability declaration and narrows it against the concrete client and environment methods. Braid does not inject positive retained capabilities into the provider. It requires client `get`, exact control, replay, detach, turn idempotency, retry-safe cancellation, and provider-backed dispatch lookup. -The current default provider report and methods do not satisfy that requirement. +The provider-level report alone does not satisfy that requirement; Braid also requires per-environment capability evidence and live deployment proof. The adapter exposes environment stream and dispatch, provider sessions, workspace methods, refresh, and destroy only when the sandbox instance implements them. @@ -383,6 +389,14 @@ It narrows its declared interaction kinds to the backend catalog the Sandbox cli The Braid retained Tangle adapter supplies the requested map to Runtime's retained turn input. +The provider exposes workspace branching only when Sandbox supplies keyed checkpoint and fork operations, operation lookup, inventory recovery, and explicit cleanup. + +The provider exposes an interactive agent only when the deployment reports the exact native-TUI fact and the linked SDK supplies all required start, status, attach, reattach, control, prompt, input, resize, and stop operations. + +Braid maps that surface to Runtime's retained interactive handle and records `surface: interactive-agent` without creating a second Sandbox during admission. + +The provider rejects `contextTransfer` and `nativeContinuation` until Sandbox supplies native support for those operations. + Historical snapshot: Runtime `0.135.0` dropped that field in its retained-turn copier before the Tangle provider received it. Runtime `0.143.0` preserves it. The Braid retained Tangle boundary test catches this loss at the provider dispatch boundary. @@ -429,15 +443,21 @@ Its saved control reference contains provider, environment, session, execution, Headless run state exposes that secret-free reference so a fresh controller can inspect the exact recovered execution without replaying old events. -Native follow-up turns remain disabled because the current provider does not prove a matching context boundary. +Headless native-context follow-up turns remain disabled because the current provider rejects `nativeContinuation` until Sandbox supplies a matching context boundary. + +Native interactive-agent turns support follow-up prompts through the retained TUI session when the exact interactive-agent capability is present. An ambiguous retained start failure does not destroy its environment because an idempotent create can return a pre-existing workspace. Safe compensation requires a provider-issued receipt that distinguishes a new create from an idempotent replay. -If either Tangle path requests approval, an answer, or a plan decision, Braid fails the turn with an unsupported-interaction explanation. +Retained headless Tangle runs may request an answer when the effective environment advertises the interaction kind and response operation. -Braid does not display a resumable interaction until the provider exposes a durable response operation. +Braid binds that response to the exact runtime run, provider session, interaction, and operation identifiers. + +The ephemeral Tangle path and the native interactive-agent path do not expose the generic Braid interaction-response operation, so Braid reports it as unsupported instead of auto-answering. + +Braid displays a resumable interaction only after the provider exposes a durable response operation and the deployment reports response deduplication. Braid does not admit retained Tangle execution without lookup for the crash window before its exact reference commits. @@ -445,7 +465,7 @@ The local retained test proves that lookup recovers and cancels a run after a si The observation record never contains API keys, bearer tokens, SSH credentials, secret values, credential-bearing URLs, Docker host strings, or internal listener addresses. -The following upstream issues own missing shared contracts: +The following historical upstream issues motivated these shared contracts; current package support does not replace live deployment proof: - [Runtime issue 799](https://github.com/tangle-network/agent-runtime/issues/799) requires a creation receipt and exact cleanup when retained dispatch fails. - [Runtime issue 800](https://github.com/tangle-network/agent-runtime/issues/800) requires crash-safe exact run admission or deterministic discovery. @@ -460,11 +480,12 @@ The following upstream issues own missing shared contracts: - [Agent SDK issue 136](https://github.com/tangle-network/agent-sdk/issues/136) requests normalized provider observations and account usage. - [Sandbox issue 5076](https://github.com/tangle-network/agent-dev-container/issues/5076) requests resolved placement, effective resources, and per-sandbox billing. -The published cohort now carries the interaction contract end to end. +The current published cohort carries the interaction response contract through the shared types and provider adapters, while Braid still gates each action on effective deployment capabilities. -- Runtime `0.143.0` preserves `AgentTurnInput.interactions` and gates a response on `interactions.responseIdempotency`. -- CLI Bridge `0.9.4` forwards the requested map and implements the durable response operation ([Agent SDK issue 204](https://github.com/tangle-network/agent-sdk/issues/204)). -- Tangle provider `0.13.0` narrows interaction kinds to the backend catalog the deployment serves. +- Interface `1.8.0` publishes the interaction, checkpoint/fork, and interactive-agent contracts. +- Runtime `0.178.0` preserves `AgentTurnInput.interactions` and projects it into Sandbox prompt options. +- CLI Bridge `0.10.0` forwards the requested map and implements the durable response operation ([Agent SDK issue 204](https://github.com/tangle-network/agent-sdk/issues/204)). +- Tangle provider `0.14.2` narrows interaction kinds to the deployment catalog and exposes keyed workspace branching and interactive-agent operations when their deployment flags and methods are present. Braid does not cast around these gaps or duplicate provider dispatch. @@ -550,7 +571,7 @@ A provider without a native event identifier receives a stable identifier from t ### Environment and session interaction response -`AgentEnvironment` and `AgentSession` need optional typed interaction-response operations bound to a stable execution or session reference. +`AgentEnvironment` and `AgentSession` expose optional typed interaction-response operations bound to a stable execution or session reference. The operation accepts canonical `InteractionResponse`, caller operation identifier, and cancellation signal. @@ -564,9 +585,9 @@ An interaction capability object must report supported kinds, answer specificati ### Portable conversation context -The current environment turn input can name a native session but cannot carry canonical prior messages into a fresh provider session. +The installed environment turn input carries explicit `contextTransfer` and `nativeContinuation` requests in addition to a native session identifier. -The shared interface must add a portable conversation context built from existing canonical message and part types, with source boundary, completeness, digest, and selected attachments. +The shared interface defines portable conversation context built from existing canonical message and part types, with source boundary, completeness, digest, and selected attachments. Runtime start or resume must distinguish native same-session continuation from fresh-session context transfer. @@ -616,7 +637,9 @@ Runtime exposes retained interactive handles for Braid runs and exact supervised Braid owns only terminal presentation and restores its screen after detach or remote exit. -The sandbox platform already provides authenticated PTY transport, while CLI Bridge currently provides logical session continuity without a retained terminal process. +The Sandbox platform provides authenticated PTY transport and the current Tangle provider also exposes a deployment-gated native interactive-agent surface. + +CLI Bridge currently provides logical session continuity without a retained terminal process. [Agent SDK issue 138](https://github.com/tangle-network/agent-sdk/issues/138) owns the portable terminal-session contract. @@ -648,13 +671,13 @@ The provider package maps the bridge surface into the shared environment and run ## Tangle target transport -The sandbox session API must carry canonical interaction requests in its replayable event stream and accept canonical responses bound to session, interaction, and operation identifiers. +Sandbox `0.34.3` carries canonical interaction requests in its replayable event stream and accepts canonical responses bound to session, interaction, and operation identifiers when the deployment reports response deduplication. -The Tangle provider maps that operation into `AgentSession` and runtime run control. +Tangle provider `0.14.2` maps that operation into `AgentEnvironment`, `AgentSession`, and Runtime retained run control. Cloud interaction responses must remain valid after Braid reconnect when the sandbox session is still waiting. -Checkpoint and fork requests require caller idempotency keys bound to canonical request digests. +Tangle provider `0.14.2` exposes checkpoint and fork requests with caller idempotency keys bound to canonical request digests when the linked Sandbox surface is complete. Retrying the same key and digest returns the original checkpoint or destination environment, while reusing a key with changed input returns a conflict. diff --git a/docs/08-verification.md b/docs/08-verification.md index 4dba47a8..89fadd9f 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -536,13 +536,17 @@ This cohort satisfies the retained create, process-loss recovery, replay, cancel The August 12 failure artifacts remain diagnostic history and are superseded by this passing cohort. -On 2026-08-21, this branch upgraded the provider cohort to interface `1.3.0`, runtime `0.143.0`, eval `0.149.0`, CLI Bridge adapter `0.9.4`, Tangle adapter `0.13.0`, and sandbox `0.31.0`. +Historical verification snapshot (2026-08-21): this branch used interface `1.3.0`, runtime `0.143.0`, eval `0.149.0`, CLI Bridge adapter `0.9.4`, Tangle adapter `0.13.0`, and sandbox `0.31.0`. -The automated suite passed 782 of 782 tests on Linux, and the release self-check passed 32 of 32 tests, both with the deleted second sandbox parser and the published Sandbox run outcome as the only terminal result source. +Historical result for that cohort: the automated suite passed 782 of 782 tests on Linux, and the release self-check passed 32 of 32 tests, both with the deleted second sandbox parser and the published Sandbox run outcome as the only terminal result source. -`LIVE-03` and `LIVE-08` were attempted through their built-in checks: both emit `unavailable` because this environment holds no CLI Bridge interaction credential and no Tangle Sandbox credential, and the built-in check refuses to claim a row it cannot execute. +In that snapshot, `LIVE-03` and `LIVE-08` were attempted through their built-in checks: both emitted `unavailable` because the environment held no CLI Bridge interaction credential and no Tangle Sandbox credential, and the built-in check refused to claim a row it could not execute. -`LIVE-06`, `LIVE-07`, `LIVE-09`, and `LIVE-10` remain unavailable in this environment for the same reason, and no live claim in this record comes from a simulated provider. +In that snapshot, `LIVE-06`, `LIVE-07`, `LIVE-09`, and `LIVE-10` were also unavailable for the same reason, and no live claim in that record came from a simulated provider. + +Current dependency evidence (2026-08-29) is documented in [Runtime contracts](04-runtime-contracts.md): interface `1.8.0`, Runtime `0.178.0`, eval `0.170.0`, CLI Bridge adapter `0.10.0`, Tangle adapter `0.14.2`, and Sandbox `0.34.3`. + +The historical test counts above do not represent verification of this current cohort. ## Runner conformance From 4baf28fb12581f85a79dec83f9e570ad9bfa03b8 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 05:13:06 -0600 Subject: [PATCH 060/136] fix(runtime): preserve provider-owned session identities --- src/domain/invariants-retained-admission.ts | 16 ++++- src/domain/invariants-run.ts | 7 +- test/domain-reducer.test.ts | 77 +++++++++++++++++++++ test/production-composition.test.ts | 5 ++ 4 files changed, 102 insertions(+), 3 deletions(-) diff --git a/src/domain/invariants-retained-admission.ts b/src/domain/invariants-retained-admission.ts index aabca83a..724033c8 100644 --- a/src/domain/invariants-retained-admission.ts +++ b/src/domain/invariants-retained-admission.ts @@ -5,13 +5,27 @@ import { } from '@tangle-network/agent-interface' import { canonicalDigest } from './canonical.js' import type { RunRecord } from './entities.js' -import { fail, nonEmpty } from './invariants-base.js' +import { assertPublicReference, fail, nonEmpty } from './invariants-base.js' +import { containsUnsafeControlCharacter } from './text.js' function assertControlRef(value: unknown, label: string): void { if (!AgentExactRunControlRefSchema.safeParse(value).success) fail(`${label} is invalid`) } +export function assertProviderSessionIdentifier( + value: unknown, + label: string, +): asserts value is string { + const parsed = AgentExactRunControlRefSchema.shape.sessionId.safeParse(value) + if (!parsed.success) fail(`${label} is not a valid provider session identifier`) + if (containsUnsafeControlCharacter(parsed.data)) { + fail(`${label} cannot contain terminal control characters`) + } + assertPublicReference(parsed.data, label) +} + function assertProviderSession(record: RunRecord, sessionId: string): void { + assertProviderSessionIdentifier(sessionId, 'run.retainedAdmission session') if (record.providerSessionId !== undefined && sessionId !== record.providerSessionId) { fail('run.retainedAdmission session must match run.providerSessionId') } diff --git a/src/domain/invariants-run.ts b/src/domain/invariants-run.ts index 79d50233..60bdc5fa 100644 --- a/src/domain/invariants-run.ts +++ b/src/domain/invariants-run.ts @@ -26,7 +26,10 @@ import { nonEmpty, objectValue, } from './invariants-base.js' -import { assertRetainedRunAdmission } from './invariants-retained-admission.js' +import { + assertProviderSessionIdentifier, + assertRetainedRunAdmission, +} from './invariants-retained-admission.js' import { assertAutomationRuleRecord } from './invariants-runtime.js' import { safePublicIdentifier } from './provider-values.js' @@ -56,7 +59,7 @@ export function assertRunRecord(record: RunRecord): void { if (record.connectionId !== undefined) assertEntityId('connection', record.connectionId, 'run.connectionId') if (record.providerSessionId !== undefined) - assertEntityId('providerSession', record.providerSessionId, 'run.providerSessionId') + assertProviderSessionIdentifier(record.providerSessionId, 'run.providerSessionId') if (record.harnessSessionId !== undefined) { nonEmpty(record.harnessSessionId, 'run.harnessSessionId') assertPublicReference(record.harnessSessionId, 'run.harnessSessionId') diff --git a/test/domain-reducer.test.ts b/test/domain-reducer.test.ts index 29a98f09..6b9d1748 100644 --- a/test/domain-reducer.test.ts +++ b/test/domain-reducer.test.ts @@ -622,6 +622,83 @@ test('retained admission survives the pre-dispatch crash window and binds one ex ) }) +test('retained interactive intent preserves Runtime-owned session identity across restart', () => { + const sessionId = 'retained-session:env-braid-run-interactive:interactive-braid-run-interactive' + const intent = { + phase: 'interactive_intent' as const, + provider: 'tangle-sandbox', + idempotencyKey: 'env-braid-run-interactive', + interactiveIdempotencyKey: 'interactive-braid-run-interactive', + sessionId, + executionId: 'retained-execution:env-braid-run-interactive:interactive-braid-run-interactive', + runId: 'interactive-intent-run:runtime-owned-identity', + requestedProfileDigest: `sha256:${'a'.repeat(64)}` as const, + requestDigest: `sha256:${'b'.repeat(64)}` as const, + } + const journal = [ + envelope({ kind: 'workspace.opened', workspace: '/workspace' }, 1), + envelope( + { + kind: 'run.requested', + operationId: 'op-runtime-interactive-identity', + runId: 'run-runtime-interactive-identity', + turnId: 'turn-runtime-interactive-identity', + userMessageId: 'message-user-runtime-interactive-identity', + assistantMessageId: 'message-assistant-runtime-interactive-identity', + text: 'retain this interactive run', + }, + 2, + ), + envelope( + { + kind: 'run.retained.admitted', + runId: 'run-runtime-interactive-identity', + admission: intent, + }, + 3, + ), + ] as const + + const restored = replayEvents(initialState(STARTER_PROFILE), journal) + assert.equal(restored.runs[0]?.providerSessionId, sessionId) + assert.deepEqual(restored.runs[0]?.retainedAdmission, intent) + assert.deepEqual(replayEvents(initialState(STARTER_PROFILE), journal), restored) + + assert.throws( + () => + reduceEvent( + replayEvents(initialState(STARTER_PROFILE), journal.slice(0, 2)), + envelope( + { + kind: 'run.retained.admitted', + runId: 'run-runtime-interactive-identity', + admission: { + ...intent, + sessionId: 'retained-session:credential=not-public', + }, + }, + 3, + ), + ), + /cannot contain credential material/u, + ) + assert.throws( + () => + reduceEvent( + replayEvents(initialState(STARTER_PROFILE), journal.slice(0, 2)), + envelope( + { + kind: 'run.retained.admitted', + runId: 'run-runtime-interactive-identity', + admission: { ...intent, sessionId: 'retained-session:unsafe\u001b' }, + }, + 3, + ), + ), + /cannot contain terminal control characters/u, + ) +}) + test('a cancellation request that loses the terminal race preserves the proven result', () => { const completed = replayEvents(initialState(STARTER_PROFILE), verticalSliceEvents()) const operationId = 'op-cancel-after-terminal' diff --git a/test/production-composition.test.ts b/test/production-composition.test.ts index e5f299de..a35bc1bf 100644 --- a/test/production-composition.test.ts +++ b/test/production-composition.test.ts @@ -506,6 +506,11 @@ test('retained Tangle composition routes interactive admission without creating mode: 'interactive', }) assert.equal(interactive?.provider, 'tangle-sandbox') + assert.equal( + interactive?.providerSessionId, + undefined, + 'interactive admission must leave session identity to agent-runtime', + ) assert.equal(interactive?.materializationReceipt?.surface, 'interactive-agent') assert.equal(interactive?.capabilities?.environment?.interactiveAgent?.start, true) assert.equal(sandbox.createCalls.length, 0) From f06a8bbc36202b3829bae4ac51f31c6b4f448a98 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 05:26:45 -0600 Subject: [PATCH 061/136] fix(live): clean partial interactive starts safely --- .../tangle-sandbox-braid-interactive.mjs | 182 ++++++++++- test/tangle-live07-wiring.test.mjs | 286 ++++++++++++++++++ 2 files changed, 466 insertions(+), 2 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index d1007a82..23f13569 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -60,6 +60,7 @@ const repository = resolve(dirname(scriptPath), '../..') const DEFAULT_TIMEOUT_MS = 180_000 const DEFAULT_IDLE_TTL_SECONDS = 1_800 const DEFAULT_PROCESS_EXIT_TIMEOUT_MS = 10_000 +const SANDBOX_LIST_PAGE_SIZE = 100 const DETACH = '\u001d' const RUN_STATUS_AFTER_STOP = new Set(['aborted', 'cancelled']) const CONTROL_REF_FIELDS = Object.freeze([ @@ -316,6 +317,146 @@ function stateDiagnostic(frame) { })) } +export function interactiveMaterializationEvidence(record) { + const runs = Array.isArray(record?.state?.runs) ? record.state.runs : [] + if (runs.length !== 1) return undefined + const run = runs[0] + const phase = + typeof run?.retainedAdmission?.phase === 'string' ? run.retainedAdmission.phase : null + const runId = typeof run?.id === 'string' && run.id.length > 0 ? run.id : undefined + const materialized = + phase === 'interactive_environment' || + phase === 'interactive_started' || + typeof run?.environmentId === 'string' || + typeof run?.controlRef?.environmentId === 'string' + return { + ...(runId === undefined ? {} : { runId }), + phase, + materialized, + boundary: materialized + ? 'provider-environment-identity' + : phase === 'interactive_intent' + ? 'before-interactive_environment' + : 'unknown', + } +} + +function interactiveResourceName(runId) { + if (typeof runId !== 'string' || !/^[A-Za-z0-9._:-]{1,95}$/u.test(runId)) { + throw new Error('Interactive pre-environment cleanup requires a bounded Braid run identity') + } + return `braid-interactive-${runId}` +} + +function isOwnedInteractiveResource(box, expectedName) { + return ( + typeof box?.id === 'string' && + box.name === expectedName && + box.metadata?.owner === 'braid' && + box.metadata?.lifecycle === 'retained' && + box.metadata?.surface === 'interactive-agent' + ) +} + +function sameNameInteractiveResources(resources, expectedName, predicate) { + const matches = resources.filter((resource) => resource?.name === expectedName) + if (matches.length > 1) { + throw new Error( + `Interactive pre-environment cleanup found ${String(matches.length)} same-name Sandbox resources; cleanup refused`, + ) + } + if (matches.length === 1 && !predicate(matches[0])) { + throw new Error( + `Interactive pre-environment resource ${String(matches[0]?.id ?? 'without-id')} failed exact ownership validation`, + ) + } + return matches +} + +async function listAllSandboxResources(client) { + const resources = [] + const seenIds = new Set() + let offset = 0 + for (;;) { + const page = await client.list({ limit: SANDBOX_LIST_PAGE_SIZE, offset }) + if (!Array.isArray(page)) throw new Error('Sandbox list returned an invalid page') + for (const resource of page) { + if (typeof resource?.id === 'string') { + if (seenIds.has(resource.id)) throw new Error(`Sandbox list repeated ${resource.id}`) + seenIds.add(resource.id) + } + resources.push(resource) + } + if (page.length < SANDBOX_LIST_PAGE_SIZE) return resources + offset += page.length + } +} + +async function cleanupInteractiveBeforeEnvironment(client, materialization) { + const runId = materialization?.runId + const expectedName = interactiveResourceName(runId) + const predicate = (resource) => isOwnedInteractiveResource(resource, expectedName) + const listed = sameNameInteractiveResources( + await listAllSandboxResources(client), + expectedName, + predicate, + ) + const deletions = [] + const removedIds = [] + for (const resource of listed) { + const exact = await client.get(resource.id) + if (exact === null) { + deletions.push({ + id: resource.id, + observed: true, + resolved: true, + deleted: false, + confirmed: true, + }) + continue + } + if (!predicate(exact)) { + throw new Error( + `Interactive pre-environment resource ${resource.id} failed exact ownership validation`, + ) + } + await exact.delete() + if ((await client.get(resource.id)) !== null) { + throw new Error(`Interactive pre-environment resource ${resource.id} remained after delete`) + } + removedIds.push(resource.id) + deletions.push({ + id: resource.id, + observed: true, + resolved: true, + deleted: true, + confirmed: true, + }) + } + const remaining = sameNameInteractiveResources( + await listAllSandboxResources(client), + expectedName, + predicate, + ) + if (remaining.length > 0) { + throw new Error( + `Interactive pre-environment cleanup left ${String(remaining.length)} same-name Sandbox resources`, + ) + } + return { + confirmed: true, + mode: listed.length === 0 ? 'pre-environment-absence' : 'pre-environment-owned-resource-set', + phase: materialization.phase, + runId, + expectedName, + matchedCount: listed.length, + observedIds: listed.map((resource) => resource.id), + removedIds, + deletions, + remainingIds: [], + } +} + async function waitFor(label, predicate, timeoutMs) { const deadline = performance.now() + timeoutMs for (;;) { @@ -682,6 +823,7 @@ export async function finalizeInteractiveProof({ runtime, recordPath, identity, + materialization, client, timeoutMs = DEFAULT_TIMEOUT_MS, exitTimeoutMs = DEFAULT_PROCESS_EXIT_TIMEOUT_MS, @@ -726,8 +868,29 @@ export async function finalizeInteractiveProof({ }) if (recovered.ok) resolvedIdentity = recovered.value } + let providerMaterialization if (executionStarted && resolvedIdentity === undefined) { - errors.push(new Error('Braid run identity was unavailable; exact cloud cleanup was refused')) + if ( + materialization !== undefined && + materialization.materialized === false && + (materialization.phase === 'interactive_intent' || materialization.phase === null) && + materialization.runId !== undefined + ) { + if (client === undefined) { + errors.push( + new Error( + 'Sandbox observation client was unavailable; pre-environment absence could not be confirmed', + ), + ) + } else { + const observed = await attemptCleanup(errors, 'pre-environment Sandbox absence', () => + cleanupInteractiveBeforeEnvironment(client, materialization), + ) + if (observed.ok) providerMaterialization = observed.value + } + } else { + errors.push(new Error('Braid run identity was unavailable; exact cloud cleanup was refused')) + } } let resolvedStop = stopResult @@ -834,6 +997,7 @@ export async function finalizeInteractiveProof({ processGroupExited, processCleanup: runtime?.processCleanup, identity: resolvedIdentity, + ...(providerMaterialization === undefined ? {} : { providerMaterialization }), stop: resolvedStop, afterStop, cleanup, @@ -924,6 +1088,7 @@ async function runProof({ let runtime let recordPath let identity + let materialization let client let proofData let proofError @@ -1100,7 +1265,8 @@ async function runProof({ if (runtime !== undefined && !runtime.exited && recordPath !== undefined) { try { const failureFrame = await captureStateFrame(runtime, recordPath, exitTimeoutMs) - runObserved ||= stateDiagnostic(failureFrame).length > 0 + materialization = interactiveMaterializationEvidence(failureFrame) + runObserved ||= materialization?.runId !== undefined identity ??= recoverInteractiveIdentity(failureFrame) failures.push( new Error(`failure Braid state: ${JSON.stringify(stateDiagnostic(failureFrame))}`), @@ -1126,6 +1292,7 @@ async function runProof({ runtime, recordPath, identity, + materialization, client, timeoutMs, exitTimeoutMs, @@ -1206,6 +1373,17 @@ async function runProof({ } } + if (proofError !== undefined && cleanup?.providerMaterialization !== undefined) { + const prior = proofError instanceof AggregateError ? [...proofError.errors] : [proofError] + const materialization = cleanup.providerMaterialization + const phase = materialization.phase ?? 'no-retained-phase' + const cleanupMessage = + materialization.matchedCount === 0 + ? `Sandbox interactive resource absence confirmed before ${phase} for ${materialization.runId}` + : `Sandbox interactive resource cleanup confirmed after ${phase} for ${materialization.runId}; removed ${materialization.matchedCount}` + proofError = new AggregateError([...prior, new Error(cleanupMessage)], proofError.message) + } + if (proofError !== undefined && cleanupError !== undefined) throw new AggregateError( [proofError, cleanupError], diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index e6a49a5d..22edd2d9 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -10,6 +10,7 @@ import { assertProviderBoundEvidence, finalizeInteractiveProof, interactiveFailureMessages, + interactiveMaterializationEvidence, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' import { assertSingleExecutionAttemptLedger, @@ -514,6 +515,291 @@ test('LIVE-08 cleans local resources without inventing a cloud leak before admis assert.equal(packedCleanup, 1) }) +test('LIVE-08 confirms Sandbox absence for a provider rejection before interactive_environment', async () => { + let listCalls = 0 + let workspaceCleanup = 0 + let packedCleanup = 0 + const materialization = interactiveMaterializationEvidence({ + state: { + runs: [ + { + id: 'run-pre-environment', + status: 'streaming', + retainedAdmission: { phase: 'interactive_intent' }, + }, + ], + }, + }) + assert.deepEqual(materialization, { + runId: 'run-pre-environment', + phase: 'interactive_intent', + materialized: false, + boundary: 'before-interactive_environment', + }) + const result = await finalizeInteractiveProof({ + packed: { + binary: '/tmp/braid', + cleanup: async () => { + packedCleanup += 1 + }, + }, + config: { + cleanup: async () => { + workspaceCleanup += 1 + return { credentialRemoved: true, temporaryRootRemoved: true } + }, + }, + client: { + async list() { + listCalls += 1 + return [] + }, + }, + executionStarted: true, + materialization, + }) + assert.equal(listCalls, 2) + assert.deepEqual(result.providerMaterialization, { + confirmed: true, + mode: 'pre-environment-absence', + phase: 'interactive_intent', + runId: 'run-pre-environment', + expectedName: 'braid-interactive-run-pre-environment', + matchedCount: 0, + observedIds: [], + removedIds: [], + deletions: [], + remainingIds: [], + }) + assert.equal(workspaceCleanup, 1) + assert.equal(packedCleanup, 1) +}) + +test('LIVE-08 deletes and confirms one exact resource when the Runtime phase is unavailable', async () => { + const resource = { + id: 'sandbox-pre-environment', + name: 'braid-interactive-run-pre-environment', + metadata: { owner: 'braid', lifecycle: 'retained', surface: 'interactive-agent' }, + deleted: false, + async delete() { + this.deleted = true + }, + } + const client = { + async list() { + return resource.deleted ? [] : [resource] + }, + async get(id) { + return id === resource.id && !resource.deleted ? resource : null + }, + } + const result = await finalizeInteractiveProof({ + client, + executionStarted: true, + materialization: { + runId: 'run-pre-environment', + phase: null, + materialized: false, + boundary: 'unknown', + }, + }) + assert.equal(resource.deleted, true) + assert.deepEqual(result.providerMaterialization, { + confirmed: true, + mode: 'pre-environment-owned-resource-set', + phase: null, + runId: 'run-pre-environment', + expectedName: 'braid-interactive-run-pre-environment', + matchedCount: 1, + observedIds: ['sandbox-pre-environment'], + removedIds: ['sandbox-pre-environment'], + deletions: [ + { + id: 'sandbox-pre-environment', + observed: true, + resolved: true, + deleted: true, + confirmed: true, + }, + ], + remainingIds: [], + }) +}) + +test('LIVE-08 confirms absence when the observed resource races away before deletion', async () => { + let listCalls = 0 + const resource = { + id: 'sandbox-pre-environment', + name: 'braid-interactive-run-pre-environment', + metadata: { owner: 'braid', lifecycle: 'retained', surface: 'interactive-agent' }, + } + const result = await finalizeInteractiveProof({ + client: { + async list() { + listCalls += 1 + return listCalls === 1 ? [resource] : [] + }, + async get() { + return null + }, + }, + executionStarted: true, + materialization: { + runId: 'run-pre-environment', + phase: null, + materialized: false, + boundary: 'unknown', + }, + }) + assert.deepEqual(result.providerMaterialization, { + confirmed: true, + mode: 'pre-environment-owned-resource-set', + phase: null, + runId: 'run-pre-environment', + expectedName: 'braid-interactive-run-pre-environment', + matchedCount: 1, + observedIds: ['sandbox-pre-environment'], + removedIds: [], + deletions: [ + { + id: 'sandbox-pre-environment', + observed: true, + resolved: true, + deleted: false, + confirmed: true, + }, + ], + remainingIds: [], + }) +}) + +test('LIVE-08 refuses cleanup when more than one exact pre-environment resource matches', async () => { + let deleteCalls = 0 + const resources = ['sandbox-pre-environment-a', 'sandbox-pre-environment-b'].map((id) => ({ + id, + name: 'braid-interactive-run-pre-environment', + metadata: { owner: 'braid', lifecycle: 'retained', surface: 'interactive-agent' }, + async delete() { + deleteCalls += 1 + }, + })) + await assert.rejects( + () => + finalizeInteractiveProof({ + client: { + async list() { + return resources + }, + }, + executionStarted: true, + materialization: { + runId: 'run-pre-environment', + phase: null, + materialized: false, + boundary: 'unknown', + }, + }), + (error) => { + assert.ok( + interactiveFailureMessages(error).some((message) => + /same-name Sandbox resources; cleanup refused/u.test(message), + ), + ) + return true + }, + ) + assert.equal(deleteCalls, 0) +}) + +test('LIVE-08 refuses a same-name resource with non-Braid ownership', async () => { + let getCalls = 0 + let deleteCalls = 0 + const resource = { + id: 'sandbox-pre-environment-collision', + name: 'braid-interactive-run-pre-environment', + metadata: { owner: 'other', lifecycle: 'retained', surface: 'interactive-agent' }, + async delete() { + deleteCalls += 1 + }, + } + await assert.rejects( + () => + finalizeInteractiveProof({ + client: { + async list() { + return [resource] + }, + async get() { + getCalls += 1 + return resource + }, + }, + executionStarted: true, + materialization: { + runId: 'run-pre-environment', + phase: null, + materialized: false, + boundary: 'unknown', + }, + }), + (error) => { + assert.ok( + interactiveFailureMessages(error).some((message) => + /failed exact ownership validation/u.test(message), + ), + ) + return true + }, + ) + assert.equal(getCalls, 0) + assert.equal(deleteCalls, 0) +}) + +test('LIVE-08 leaves a resource untouched when its ownership changes before deletion', async () => { + let deleteCalls = 0 + const listed = { + id: 'sandbox-pre-environment', + name: 'braid-interactive-run-pre-environment', + metadata: { owner: 'braid', lifecycle: 'retained', surface: 'interactive-agent' }, + } + const changed = { + ...listed, + metadata: { owner: 'other', lifecycle: 'retained', surface: 'interactive-agent' }, + async delete() { + deleteCalls += 1 + }, + } + await assert.rejects( + () => + finalizeInteractiveProof({ + client: { + async list() { + return [listed] + }, + async get() { + return changed + }, + }, + executionStarted: true, + materialization: { + runId: 'run-pre-environment', + phase: null, + materialized: false, + boundary: 'unknown', + }, + }), + (error) => { + assert.ok( + interactiveFailureMessages(error).some((message) => + /failed exact ownership validation/u.test(message), + ), + ) + return true + }, + ) + assert.equal(deleteCalls, 0) +}) + test('LIVE-08 refuses cloud cleanup when a run existed without exact identity', async () => { await assert.rejects( () => finalizeInteractiveProof({ executionStarted: true }), From a4d6e1c8ed11722228bc8a0698fc65836f56bbff Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 05:36:21 -0600 Subject: [PATCH 062/136] fix(process): verify tracked PTY termination --- scripts/live-bridge/process-tree.mjs | 99 +++++++++++++++++-- scripts/live-bridge/process.test.mjs | 50 +++++++++- .../tangle-sandbox-braid-interactive.mjs | 24 +++-- .../tangle-sandbox-braid-multirun.mjs | 13 ++- 4 files changed, 162 insertions(+), 24 deletions(-) diff --git a/scripts/live-bridge/process-tree.mjs b/scripts/live-bridge/process-tree.mjs index 44162782..28fee222 100644 --- a/scripts/live-bridge/process-tree.mjs +++ b/scripts/live-bridge/process-tree.mjs @@ -7,6 +7,9 @@ const pollMs = 25 const procRoot = '/proc' const processTreeToken = 'BRAID_PROCESS_TREE_TOKEN' const processTreeTrackers = new WeakMap() +const ownershipObservationTimeoutMs = 1_000 +const defaultTermTimeoutMs = 2_000 +const defaultKillTimeoutMs = 2_000 function childHasExited(child) { return child.exitCode !== null || child.signalCode !== null @@ -25,6 +28,16 @@ function unsupported(reason) { } } +function pendingOwnership(reason) { + return { + ...unsupported(reason), + pending: true, + mechanism: 'posix-descendant-tracker', + ownership: 'pid-start-time-and-descendant-lineage', + observed: false, + } +} + function numericPid(value) { return Number.isInteger(value) && value > 0 ? value : undefined } @@ -201,6 +214,7 @@ class PosixProcessTreeTracker { this.rootPid = numericPid(child.pid) this.rootObserved = false this.rootStartTime = undefined + this.ownershipDeadline = Date.now() + ownershipObservationTimeoutMs this.released = false this.failure = undefined this.observeRoot() @@ -227,13 +241,9 @@ class PosixProcessTreeTracker { this.failure = 'The POSIX process exited before ownership was observed' return } - if (marker !== true) { - this.failure = 'The POSIX process did not retain its ownership marker' - return - } - this.rootObserved = true this.rootStartTime = root.startTime this.entries.set(root.pid, { ...root, depth: 0 }) + if (marker === true) this.rootObserved = true } refresh() { @@ -262,7 +272,9 @@ class PosixProcessTreeTracker { return } if (marker !== true) { - this.failure = 'The POSIX process did not retain its ownership marker' + if (Date.now() >= this.ownershipDeadline) { + this.failure = 'The POSIX process did not retain its ownership marker' + } return } this.rootObserved = true @@ -315,6 +327,9 @@ class PosixProcessTreeTracker { status() { this.refresh() if (this.failure !== undefined) return unsupported(this.failure) + if (!this.rootObserved) { + return pendingOwnership('The POSIX process ownership marker is not observable yet') + } const active = [] for (const entry of this.entries.values()) { const current = currentIdentity(entry.pid, entry.startTime) @@ -472,13 +487,23 @@ export async function waitForTreeGone(child, timeoutMs) { const deadline = Date.now() + boundedTimeout while (true) { const status = processTreeStatus(child) - if (!status.supported) return status + if (!status.supported && status.pending !== true) return status if (status.gone) return status if (Date.now() >= deadline) return status await new Promise((resolve) => setTimeout(resolve, Math.min(pollMs, deadline - Date.now()))) } } +async function waitForTreeOwnership(child, timeoutMs) { + const boundedTimeout = Number.isFinite(timeoutMs) ? Math.max(0, timeoutMs) : 0 + const deadline = Date.now() + boundedTimeout + while (true) { + const status = processTreeStatus(child) + if (status.pending !== true || Date.now() >= deadline) return status + await new Promise((resolve) => setTimeout(resolve, Math.min(pollMs, deadline - Date.now()))) + } +} + export async function sendTreeSignal(child, signal) { if (process.platform === 'win32') return await terminateWindowsJob(child) const tracker = processTreeTrackers.get(child) @@ -490,3 +515,63 @@ export async function sendTreeSignal(child, signal) { } return tracker.signal(signal) } + +export async function terminateTrackedProcessTree( + child, + { termTimeoutMs = defaultTermTimeoutMs, killTimeoutMs = defaultKillTimeoutMs } = {}, +) { + const initialTree = await waitForTreeOwnership(child, termTimeoutMs) + let tree = initialTree + let termSignal + let killSignal + const usesWindowsJob = tree.mechanism === 'windows-job-object' + + if (usesWindowsJob && !tree.gone) { + killSignal = await sendTreeSignal(child, 'SIGKILL') + tree = await waitForTreeGone(child, killTimeoutMs) + } + if (!usesWindowsJob && (!tree.supported || !tree.gone)) { + termSignal = await sendTreeSignal(child, 'SIGTERM') + tree = await waitForTreeGone(child, termTimeoutMs) + } + if (!usesWindowsJob && (!tree.supported || !tree.gone)) { + killSignal = await sendTreeSignal(child, 'SIGKILL') + tree = await waitForTreeGone(child, killTimeoutMs) + } + + const termSent = termSignal?.sent === true + const killSent = killSignal?.sent === true + const cleanupStatus = !tree.supported + ? 'unsupported' + : tree.gone && !termSent && !killSent + ? 'already-exited' + : tree.gone && !killSent + ? 'term' + : tree.gone + ? 'kill' + : 'descendants-still-running' + const strategy = killSent + ? killSignal.method + : termSent + ? termSignal.method + : (killSignal?.method ?? + termSignal?.method ?? + (initialTree.supported ? 'already-exited' : 'unsupported')) + + releaseProcessTree(child) + return { + strategy, + termTimeoutMs, + killTimeoutMs, + termSent, + killSent, + forcedKill: killSent, + initialTree, + tree, + descendantsExited: tree.supported && tree.gone, + descendantsVerified: tree.supported && tree.gone, + cleanupStatus, + termSignal, + killSignal, + } +} diff --git a/scripts/live-bridge/process.test.mjs b/scripts/live-bridge/process.test.mjs index 9b77daa8..a14397d8 100644 --- a/scripts/live-bridge/process.test.mjs +++ b/scripts/live-bridge/process.test.mjs @@ -3,9 +3,17 @@ import { mkdtemp, readFile, rm } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import test from 'node:test' +import * as pty from 'node-pty' import { runCommand } from './command.mjs' import { managedSpawn, terminateProcess } from './process.mjs' -import { processTreeStatus, sendTreeSignal, waitForTreeGone } from './process-tree.mjs' +import { + processTreeEnvironment, + processTreeStatus, + sendTreeSignal, + terminateTrackedProcessTree, + trackProcessTree, + waitForTreeGone, +} from './process-tree.mjs' function waitForClose(child) { if (child.exitCode !== null || child.signalCode !== null) return Promise.resolve() @@ -56,6 +64,46 @@ test('termination evidence records signal-driven process-tree cleanup', async () assert.notEqual(result.cleanupStatus, 'already-exited') }) +test('tracked process-tree termination verifies absence without a child close event', async () => { + const child = await managedSpawn(process.execPath, ['-e', 'setInterval(() => {}, 1000)'], { + stdio: 'ignore', + }) + + const result = await terminateTrackedProcessTree(child, { + termTimeoutMs: 1_000, + killTimeoutMs: 1_000, + }) + + assert.equal(result.termSent || result.killSent, true) + assert.equal(result.descendantsExited, true, JSON.stringify(result)) + assert.equal(result.descendantsVerified, true, JSON.stringify(result)) + assert.equal(result.tree.gone, true, JSON.stringify(result)) +}) + +test('tracked PTY termination verifies the exact process group used by live proofs', { + skip: process.platform === 'win32', +}, async () => { + const tracked = processTreeEnvironment(process.env) + const child = pty.spawn(process.execPath, ['-e', 'setInterval(() => {}, 1000)'], { + cwd: process.cwd(), + env: tracked.environment, + name: 'xterm-256color', + cols: 80, + rows: 24, + }) + trackProcessTree(child, tracked.token) + + const result = await terminateTrackedProcessTree(child, { + termTimeoutMs: 1_000, + killTimeoutMs: 1_000, + }) + + assert.equal(result.termSent || result.killSent, true) + assert.equal(result.descendantsExited, true, JSON.stringify(result)) + assert.equal(result.descendantsVerified, true, JSON.stringify(result)) + assert.equal(result.tree.gone, true, JSON.stringify(result)) +}) + test('timeout cleanup terminates a tracked descendant set', async () => { const result = await runCommand(process.execPath, ['-e', 'setInterval(() => {}, 1000)'], { cwd: process.cwd(), diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 23f13569..dd7c03c5 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -13,7 +13,7 @@ import * as pty from 'node-pty' import { sleep } from '../live-bridge/process.mjs' import { processTreeEnvironment, - sendTreeSignal, + terminateTrackedProcessTree, trackProcessTree, waitForTreeGone, } from '../live-bridge/process-tree.mjs' @@ -509,7 +509,7 @@ function createPty(binary, config, statePath, exitTimeoutMs) { return terminalText(terminal) }, get exited() { - return exited + return exited || (processCleanup?.supported === true && processCleanup.gone === true) }, get processCleanup() { return processCleanup @@ -536,13 +536,19 @@ function createPty(binary, config, statePath, exitTimeoutMs) { return { ...result, processCleanup: await waitForProcessCleanup() } }, async forceClose() { - if (!exited) await sendTreeSignal(child, 'SIGKILL') - const result = await waitFor( - 'forced Braid terminal exit', - () => exited && exitResult, - exitTimeoutMs, - ) - return { ...result, processCleanup: await waitForProcessCleanup() } + if (exited) return { ...exitResult, processCleanup: await waitForProcessCleanup() } + const termTimeoutMs = Math.min(1_000, exitTimeoutMs) + const termination = await terminateTrackedProcessTree(child, { + termTimeoutMs, + killTimeoutMs: Math.max(0, exitTimeoutMs - termTimeoutMs), + }) + processCleanup = termination.tree + if (!termination.descendantsVerified) { + throw new Error( + `forced Braid terminal cleanup did not remove the tracked process tree (${termination.cleanupStatus})`, + ) + } + return { ...exitResult, processCleanup, termination } }, dispose() { terminal.dispose() diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 60a17e39..9ac5e451 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -11,7 +11,7 @@ import * as pty from 'node-pty' import { processTreeEnvironment, - sendTreeSignal, + terminateTrackedProcessTree, trackProcessTree, waitForTreeGone, } from '../live-bridge/process-tree.mjs' @@ -256,12 +256,11 @@ function createTerminal( } const dispose = async () => { if (!exited) { - await sendTreeSignal(child, 'SIGTERM') - await Promise.race([exitPromise, pause(1_000)]) - if (!exited) { - await sendTreeSignal(child, 'SIGKILL') - await Promise.race([exitPromise, pause(5_000)]) - } + const termination = await terminateTrackedProcessTree(child, { + termTimeoutMs: 1_000, + killTimeoutMs: 5_000, + }) + processCleanup = termination.tree } processCleanup ??= await waitForTreeGone(child, 10_000) terminal.dispose() From e43f8f38ae8203e0700f95f03ef114f369756e11 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 05:41:53 -0600 Subject: [PATCH 063/136] fix(runtime): keep local paths out of remote starts --- .../tangle-retained-interactive-execution.ts | 3 +-- test/interactive-execution-adapters.test.ts | 21 +++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/adapters/runtime/tangle-retained-interactive-execution.ts b/src/adapters/runtime/tangle-retained-interactive-execution.ts index 3cc03e89..239f8d1e 100644 --- a/src/adapters/runtime/tangle-retained-interactive-execution.ts +++ b/src/adapters/runtime/tangle-retained-interactive-execution.ts @@ -419,7 +419,7 @@ export class TangleRetainedInteractiveExecutionPort implements ExecutionPort { environment: interactiveEnvironment(prepared, input.runId), interactiveIdempotencyKey: interactiveIdempotencyKey(input.runId), ...(input.text.trim() === '' ? {} : { initialPrompt: input.text }), - ...(input.workspaceRoot === undefined ? {} : { cwd: input.workspaceRoot }), + // workspaceRoot identifies Braid's local checkout. The provider owns its remote cwd. onAdmission, signal: input.signal, }) @@ -495,7 +495,6 @@ export class TangleRetainedInteractiveExecutionPort implements ExecutionPort { ), interactiveIdempotencyKey: admission.interactiveIdempotencyKey, ...(receipt.requested.text.trim() === '' ? {} : { initialPrompt: receipt.requested.text }), - ...(input.workspaceRoot === undefined ? {} : { cwd: input.workspaceRoot }), }, onAdmission, ...(input.signal === undefined ? {} : { signal: input.signal }), diff --git a/test/interactive-execution-adapters.test.ts b/test/interactive-execution-adapters.test.ts index d8a2c3dc..2ac724ce 100644 --- a/test/interactive-execution-adapters.test.ts +++ b/test/interactive-execution-adapters.test.ts @@ -1,6 +1,10 @@ import assert from 'node:assert/strict' import test from 'node:test' -import type { AgentInteractiveSessionRef, AgentProfile } from '@tangle-network/agent-interface' +import type { + AgentInteractiveSessionRef, + AgentInteractiveSessionStart, + AgentProfile, +} from '@tangle-network/agent-interface' import { AgentInteractiveSessionRefSchema, canonicalCandidateDigest, @@ -84,9 +88,12 @@ test('starts one native process, records Runtime identity, and emits replayable const broker = new NativeInteractiveRunBroker() const port = interactivePort(fixture, broker) const admissions: RetainedInteractiveAdmission[] = [] - const input = executionInput('run/start', async (admission) => { - admissions.push(admission) - }) + const input = { + ...executionInput('run/start', async (admission) => { + admissions.push(admission) + }), + workspaceRoot: '/client-only/braid-workspace', + } const admission = await port.admit(input) assert.equal(admission.providerSessionId, undefined) @@ -105,6 +112,7 @@ test('starts one native process, records Runtime identity, and emits replayable assert.equal(admission.capabilities?.events.cursor, true) assert.equal(observed.cursor, `${input.runId}:interactive:${handle.ref.incarnationId}:1`) assert.equal(observed.eventId, `${input.runId}:interactive:${handle.ref.incarnationId}:observed`) + assert.equal(fixture.stats.startRequests[0]?.cwd, undefined) assert.equal(fixture.lastCreateMetadata?.providerSessionId, undefined) assert.equal(fixture.lastCreateMetadata?.surface, 'interactive-agent') @@ -256,6 +264,7 @@ test('reconnect recovers a persisted interactive intent exactly once', async () retainedAdmission: intent, receipt: receiptFor(input), onRetainedAdmission: input.onRetainedAdmission, + workspaceRoot: '/client-only/restarted-braid-workspace', signal: input.signal, } as Parameters[0]) [Symbol.asyncIterator]() @@ -264,6 +273,7 @@ test('reconnect recovers a persisted interactive intent exactly once', async () assert.equal(handle.ref.run.sessionId, intent.sessionId) assert.equal(fixture.stats.createCalls, 1) assert.equal(fixture.stats.processStarts, 1) + assert.equal(fixture.stats.startRequests[0]?.cwd, undefined) assert.equal(fixture.stats.dispatchCalls, 0) assert.equal(fixture.resolveInputs.at(-1)?.sessionId, undefined) await finish(reconnectIterator, broker, input.runId) @@ -549,6 +559,7 @@ interface InteractiveFixture { getCalls: number startCalls: number processStarts: number + startRequests: AgentInteractiveSessionStart[] dispatchCalls: number stopCalls: number stopSignals: (AbortSignal | undefined)[] @@ -564,6 +575,7 @@ function interactiveFixture(): InteractiveFixture { getCalls: 0, startCalls: 0, processStarts: 0, + startRequests: [] as AgentInteractiveSessionStart[], dispatchCalls: 0, stopCalls: 0, stopSignals: [], @@ -584,6 +596,7 @@ function interactiveFixture(): InteractiveFixture { }, startInteractive: async (request) => { stats.startCalls += 1 + stats.startRequests.push(request) if (state.ref === undefined) { stats.processStarts += 1 state.ref = interactiveRef(request) From a8e297b31ed4f4ed54f55da2d94ecdbb9d6b5f16 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 05:46:53 -0600 Subject: [PATCH 064/136] fix(live): accept proven fallback cleanup --- .../tangle-sandbox-braid-interactive.mjs | 22 +++++++++++++------ test/tangle-live07-wiring.test.mjs | 8 ++++--- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index dd7c03c5..4860be50 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -864,14 +864,19 @@ export async function finalizeInteractiveProof({ } let resolvedIdentity = identity + const identityRecoveryErrors = [] if (resolvedIdentity === undefined && executionStarted && recordPath !== undefined) { - const recovered = await attemptCleanup(errors, 'recorded Braid identity recovery', async () => { - const record = JSON.parse(await readFile(recordPath, 'utf8')) - const recoveredIdentity = recoverInteractiveIdentity(record) - if (recoveredIdentity === undefined) - throw new Error('recorded state did not contain one exact Braid run identity') - return recoveredIdentity - }) + const recovered = await attemptCleanup( + identityRecoveryErrors, + 'recorded Braid identity recovery', + async () => { + const record = JSON.parse(await readFile(recordPath, 'utf8')) + const recoveredIdentity = recoverInteractiveIdentity(record) + if (recoveredIdentity === undefined) + throw new Error('recorded state did not contain one exact Braid run identity') + return recoveredIdentity + }, + ) if (recovered.ok) resolvedIdentity = recovered.value } let providerMaterialization @@ -898,6 +903,9 @@ export async function finalizeInteractiveProof({ errors.push(new Error('Braid run identity was unavailable; exact cloud cleanup was refused')) } } + if (resolvedIdentity === undefined && providerMaterialization === undefined) { + errors.unshift(...identityRecoveryErrors) + } let resolvedStop = stopResult let didStop = false diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 22edd2d9..84eda784 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -556,6 +556,7 @@ test('LIVE-08 confirms Sandbox absence for a provider rejection before interacti }, }, executionStarted: true, + recordPath: '/does/not/exist/without-an-exact-run-identity.json', materialization, }) assert.equal(listCalls, 2) @@ -692,6 +693,7 @@ test('LIVE-08 refuses cleanup when more than one exact pre-environment resource }, }, executionStarted: true, + recordPath: '/does/not/exist/without-an-exact-run-identity.json', materialization: { runId: 'run-pre-environment', phase: null, @@ -700,10 +702,10 @@ test('LIVE-08 refuses cleanup when more than one exact pre-environment resource }, }), (error) => { + const messages = interactiveFailureMessages(error) + assert.ok(messages.some((message) => /identity recovery/u.test(message))) assert.ok( - interactiveFailureMessages(error).some((message) => - /same-name Sandbox resources; cleanup refused/u.test(message), - ), + messages.some((message) => /same-name Sandbox resources; cleanup refused/u.test(message)), ) return true }, From 3e51a4b68f331df8d00a55e0e8248a25ea55ce96 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 06:05:12 -0600 Subject: [PATCH 065/136] chore(deps): adopt Tangle provider 0.14.3 --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- pnpm-workspace.yaml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 2648f86c..a6ae7616 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@tangle-network/agent-eval": "0.170.0", "@tangle-network/agent-interface": "1.8.0", "@tangle-network/agent-provider-cli-bridge": "0.10.0", - "@tangle-network/agent-provider-tangle": "0.14.2", + "@tangle-network/agent-provider-tangle": "0.14.3", "@tangle-network/agent-runtime": "0.178.0", "@tangle-network/sandbox": "0.34.3", "@tangle-network/tcloud-attestation": "0.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2625db0..ef902641 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,8 +33,8 @@ importers: specifier: 0.10.0 version: 0.10.0 '@tangle-network/agent-provider-tangle': - specifier: 0.14.2 - version: 0.14.2(@tangle-network/sandbox@0.34.3) + specifier: 0.14.3 + version: 0.14.3(@tangle-network/sandbox@0.34.3) '@tangle-network/agent-runtime': specifier: 0.178.0 version: 0.178.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)(@tangle-network/sandbox@0.34.3) @@ -541,8 +541,8 @@ packages: '@tangle-network/agent-provider-cli-bridge@0.10.0': resolution: {integrity: sha512-G4EzQ8UErCFYVU/R0LHc9kjVOadIrrZYecqCX6Az8dlGzKPDRup8niu50EYKjR/VuaUNdmyNxNuWhcRExuPWyg==} - '@tangle-network/agent-provider-tangle@0.14.2': - resolution: {integrity: sha512-46cfQZKbDkhhVNfRdrKsnLDY9K4DIQ/bkNIUGlMtujBy0miLCWYxX2UUDD8GrRrNUs/b800XzcXKtcJURJIghg==} + '@tangle-network/agent-provider-tangle@0.14.3': + resolution: {integrity: sha512-4EAfWp+8F3U0UKq/Bu+UIcRbDt2EGf2nY3drtgho37UsAj0KpOh+DykoKNFevlyM179jPutw9CEuvIqSztDTeg==} peerDependencies: '@tangle-network/sandbox': '>=0.34.0 <1.0.0' @@ -1201,7 +1201,7 @@ snapshots: '@tangle-network/agent-interface': 1.8.0 undici: 7.29.0 - '@tangle-network/agent-provider-tangle@0.14.2(@tangle-network/sandbox@0.34.3)': + '@tangle-network/agent-provider-tangle@0.14.3(@tangle-network/sandbox@0.34.3)': dependencies: '@tangle-network/agent-interface': 1.8.0 '@tangle-network/sandbox': 0.34.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index fcd1bb99..bccfafbf 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,7 +17,7 @@ minimumReleaseAgeExclude: - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0 || 10.8.0' - '@tangle-network/agent-profile-materialize@0.10.2 || 0.13.1 || 0.14.0 || 0.14.2 || 0.15.1 || 0.15.2 || 0.17.1' - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0' - - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2' + - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2 || 0.14.3' - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0 || 0.34.3' - hono@4.13.0 - '@esbuild/aix-ppc64@0.28.2' From 2b2e68441c1a88ae2b19271f007237428cc74c41 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 06:07:33 -0600 Subject: [PATCH 066/136] docs(deps): record Tangle provider 0.14.3 --- docs/04-runtime-contracts.md | 14 +++++++------- docs/08-verification.md | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index cb9e4fe2..0bc8cce1 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -18,7 +18,7 @@ The following published versions were resolved in this worktree, and their insta | [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.178.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | | [`@tangle-network/agent-eval`](https://github.com/tangle-network/agent-eval) | `0.170.0` | Run records, judges, trace analysts, comparisons, and feedback trajectories | | `@tangle-network/agent-provider-cli-bridge` | `0.10.0` | CLI Bridge environment adapter with capability discovery, native retained sessions, live streaming, replay, retry-safe turns, retained control, durable interaction response, and explicit cancel | -| `@tangle-network/agent-provider-tangle` | `0.14.2` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations | +| `@tangle-network/agent-provider-tangle` | `0.14.3` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations | | `@tangle-network/sandbox` | `0.34.3` | Tangle cloud client used by the provider, including keyed checkpoint/fork and interactive-agent operations | The installed runtime publishes `agent-eval >=0.163.2 <0.171.0`, `agent-interface ^1.8.0`, and `sandbox >=0.34.0 <0.35.0` as peer ranges. @@ -27,7 +27,7 @@ The installed Tangle provider publishes `sandbox >=0.34.0 <1.0.0` as a peer rang Sandbox `0.34.3` publishes peers `@mastra/core ^1.36.0`, `@modelcontextprotocol/sdk ^1.30.0`, `ai ^6.0.175`, `openai ^6.36.0`, and `viem ^2.0.0`. -Braid exercises Runtime `0.178.0` with interface `1.8.0`, eval `0.170.0`, CLI Bridge adapter `0.10.0`, Tangle adapter `0.14.2`, and Sandbox `0.34.3`. +Braid exercises Runtime `0.178.0` with interface `1.8.0`, eval `0.170.0`, CLI Bridge adapter `0.10.0`, Tangle adapter `0.14.3`, and Sandbox `0.34.3`. The lockfile pins the registry integrity for every installed package. @@ -59,7 +59,7 @@ The map is not a capability declaration. Braid derives it only after exact per-run environment capabilities are admitted, and sends an explicit empty map when response idempotency is absent or unknown. -Runtime `0.178.0` projects the interaction map into the Sandbox prompt options, and Tangle provider `0.14.2` preserves it through retained dispatch. +Runtime `0.178.0` projects the interaction map into the Sandbox prompt options, and Tangle provider `0.14.3` preserves it through retained dispatch. The Tangle provider exposes response operations only when the deployment reports `interactions.responseDedupe`; Braid still requires that per-run capability and a real deployment check. @@ -365,7 +365,7 @@ The Braid retained CLI Bridge boundary test catches an interaction posture the r ## Existing Tangle provider contract -The published `@tangle-network/agent-provider-tangle@0.14.2` wraps `@tangle-network/sandbox@0.34.3` as an `AgentEnvironmentProvider`. +The published `@tangle-network/agent-provider-tangle@0.14.3` wraps `@tangle-network/sandbox@0.34.3` as an `AgentEnvironmentProvider`. Its default document is an upper bound, not a claim about one client or deployment. @@ -485,7 +485,7 @@ The current published cohort carries the interaction response contract through t - Interface `1.8.0` publishes the interaction, checkpoint/fork, and interactive-agent contracts. - Runtime `0.178.0` preserves `AgentTurnInput.interactions` and projects it into Sandbox prompt options. - CLI Bridge `0.10.0` forwards the requested map and implements the durable response operation ([Agent SDK issue 204](https://github.com/tangle-network/agent-sdk/issues/204)). -- Tangle provider `0.14.2` narrows interaction kinds to the deployment catalog and exposes keyed workspace branching and interactive-agent operations when their deployment flags and methods are present. +- Tangle provider `0.14.3` narrows interaction kinds to the deployment catalog and exposes keyed workspace branching and interactive-agent operations when their deployment flags and methods are present. Braid does not cast around these gaps or duplicate provider dispatch. @@ -673,11 +673,11 @@ The provider package maps the bridge surface into the shared environment and run Sandbox `0.34.3` carries canonical interaction requests in its replayable event stream and accepts canonical responses bound to session, interaction, and operation identifiers when the deployment reports response deduplication. -Tangle provider `0.14.2` maps that operation into `AgentEnvironment`, `AgentSession`, and Runtime retained run control. +Tangle provider `0.14.3` maps that operation into `AgentEnvironment`, `AgentSession`, and Runtime retained run control. Cloud interaction responses must remain valid after Braid reconnect when the sandbox session is still waiting. -Tangle provider `0.14.2` exposes checkpoint and fork requests with caller idempotency keys bound to canonical request digests when the linked Sandbox surface is complete. +Tangle provider `0.14.3` exposes checkpoint and fork requests with caller idempotency keys bound to canonical request digests when the linked Sandbox surface is complete. Retrying the same key and digest returns the original checkpoint or destination environment, while reusing a key with changed input returns a conflict. diff --git a/docs/08-verification.md b/docs/08-verification.md index 89fadd9f..30001480 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -544,7 +544,7 @@ In that snapshot, `LIVE-03` and `LIVE-08` were attempted through their built-in In that snapshot, `LIVE-06`, `LIVE-07`, `LIVE-09`, and `LIVE-10` were also unavailable for the same reason, and no live claim in that record came from a simulated provider. -Current dependency evidence (2026-08-29) is documented in [Runtime contracts](04-runtime-contracts.md): interface `1.8.0`, Runtime `0.178.0`, eval `0.170.0`, CLI Bridge adapter `0.10.0`, Tangle adapter `0.14.2`, and Sandbox `0.34.3`. +Current dependency evidence (2026-08-29) is documented in [Runtime contracts](04-runtime-contracts.md): interface `1.8.0`, Runtime `0.178.0`, eval `0.170.0`, CLI Bridge adapter `0.10.0`, Tangle adapter `0.14.3`, and Sandbox `0.34.3`. The historical test counts above do not represent verification of this current cohort. From 4f97573380bedf01943604813447588d0cfc8016 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 06:55:15 -0600 Subject: [PATCH 067/136] fix(proof): follow visible connection workflow state --- artifacts/verification/connections/120x40.png | Bin 33123 -> 5398 bytes artifacts/verification/connections/120x40.txt | 22 +-- artifacts/verification/connections/200x60.png | Bin 14954 -> 6640 bytes artifacts/verification/connections/200x60.txt | 32 +--- artifacts/verification/connections/40x12.png | Bin 14619 -> 4534 bytes artifacts/verification/connections/40x12.txt | 7 - .../connections/80x24-connection-keyboard.gif | Bin 74541 -> 79179 bytes artifacts/verification/connections/80x24.png | Bin 29390 -> 5104 bytes artifacts/verification/connections/80x24.txt | 14 +- .../connections/capture-manifest.json | 30 ++-- artifacts/verification/w6/120x40-plain.txt | 2 +- artifacts/verification/w6/120x40.png | Bin 22649 -> 22649 bytes artifacts/verification/w6/200x60-plain.txt | 2 +- artifacts/verification/w6/200x60.png | Bin 10379 -> 10379 bytes artifacts/verification/w6/40x12-plain.txt | 2 +- artifacts/verification/w6/40x12.png | Bin 14275 -> 14275 bytes .../verification/w6/80x24-automation.gif | Bin 22889 -> 16245 bytes artifacts/verification/w6/80x24-plain.txt | 2 +- .../w6/80x24-transcript-keyboard.gif | Bin 357540 -> 356241 bytes artifacts/verification/w6/80x24.png | Bin 18510 -> 18510 bytes .../verification/w6/capture-manifest.json | 136 ++++++++-------- .../w6/raw/transcript-keyboard.cast | 148 +++++++++--------- .../w6/states/active-streaming.json | 36 ++--- .../w6/states/active-streaming.png | Bin 15091 -> 15091 bytes .../verification/w6/states/analysis.json | 4 +- artifacts/verification/w6/states/analysis.png | Bin 58389 -> 58389 bytes .../verification/w6/states/automation.json | 4 +- .../verification/w6/states/automation.png | Bin 4156 -> 4156 bytes .../w6/states/command-palette-120.json | 4 +- .../w6/states/command-palette-120.png | Bin 36822 -> 36822 bytes .../w6/states/command-palette-40.json | 4 +- .../w6/states/command-palette-40.png | Bin 9482 -> 9482 bytes .../w6/states/command-palette-80.json | 4 +- .../w6/states/command-palette-80.png | Bin 35276 -> 35276 bytes .../verification/w6/states/comparison.json | 4 +- .../verification/w6/states/comparison.png | Bin 64782 -> 64782 bytes artifacts/verification/w6/states/empty.json | 4 +- artifacts/verification/w6/states/empty.png | Bin 5782 -> 5782 bytes .../w6/states/failure-or-reconnect.json | 42 ++--- .../w6/states/failure-or-reconnect.png | Bin 18786 -> 18786 bytes .../verification/w6/states/fork-preview.json | 4 +- .../verification/w6/states/fork-preview.png | Bin 9878 -> 9878 bytes .../w6/states/graph-or-analysis.json | 4 +- .../w6/states/graph-or-analysis.png | Bin 20641 -> 20641 bytes .../verification/w6/states/interaction.json | 4 +- .../verification/w6/states/interaction.png | Bin 28820 -> 28820 bytes .../verification/w6/states/multi-run.json | 64 ++++---- .../verification/w6/states/multi-run.png | Bin 24549 -> 24549 bytes artifacts/verification/w6/states/narrow.json | 4 +- artifacts/verification/w6/states/narrow.png | Bin 9639 -> 9639 bytes artifacts/verification/w6/states/profile.json | 4 +- artifacts/verification/w6/states/profile.png | Bin 6355 -> 6355 bytes .../verification/w6/states/supervision.json | 4 +- .../verification/w6/states/supervision.png | Bin 24507 -> 24507 bytes scripts/capture-connections.mjs | 92 +++++++---- 55 files changed, 330 insertions(+), 353 deletions(-) diff --git a/artifacts/verification/connections/120x40.png b/artifacts/verification/connections/120x40.png index 44e140d63567a99878ea7c4147e367e2e8f52acd..e7943fd3e5b192f0971a06a1cbc16a743bee66da 100644 GIT binary patch literal 5398 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 O+{(h{68YlId;b9Xt1@i> literal 33123 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

    iYq*F?_U(P#5=$<;$G@z9p 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 ••••••••••••••••••••••••••••••••••••••••••••••••••••••• enter continue · esc back - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -ready for a message openai/gpt-5 -Connection workflow proof · runner pi · Local CLI Bridge Ctrl+P commands diff --git a/artifacts/verification/connections/200x60.png b/artifacts/verification/connections/200x60.png index 1656ac162b0c0fe5e419a9c0d7cd34be2cf10ee2..670ec07eb4321234e0d581a414c8ace49180ecdf 100644 GIT binary patch literal 6640 zcmeH}=~q)(*2XVwD^(6)7a{@?%BqqeBB&5%f|dkCC5Q!t1Oa6xVU(FLSq`X7rHIIt zfHH^#5@d`5AtEJ+5HMhX00F`fri1{&Fo%wI)tC3}f1ua$emU#zv({eE^V|FEbM9V5 zTJG7Yv=ab;JyvJUF9Cow2msq1zS|~=;J-t3NR}Vn&t9?yfM_)UNVo|AYm!jH6aa)B z2Y{I?0ATbO02G3HP%N);G1Xal4^*R7YFy z)Ja2x@#za1Cye(i{ivm5iVeA$a5o!&GtjR;0JhJDGF-JZ4qOtzOqaJsR8(Soy8i42<^|hegki=dD_+|3C*e zvK{VljRI*ZboBd=l#*mlV>7ltk`=>noP)|lv<>U)#l`FRE)V3rHmby$wZ#qe z#h{aq_?If7t(6zrWxMYeHl-?1Vh&G3K7|9o>{7#;$x3X94#X>-pf;f0os6$jJW1BT z!-}gI

    N=)i(-dC&Gg+?z)MXDe?BUcRIFEa*sh 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 diff --git a/artifacts/verification/connections/80x24.txt b/artifacts/verification/connections/80x24.txt index 3d56ccdf..8aea238b 100644 --- a/artifacts/verification/connections/80x24.txt +++ b/artifacts/verification/connections/80x24.txt @@ -1,6 +1,6 @@ -braid cwd workspace · session New conversation - Write a message, or press Ctrl+P for commands. + + @@ -12,13 +12,3 @@ braid cwd workspace · session New conversation only a reference. > •••••••••••••••••••••••••••••••••••••••••••••••••••••• enter continue · esc back - - - - - -──────────────────────────────────────────────────────────────────────────────── - -──────────────────────────────────────────────────────────────────────────────── -ready for a message openai/gpt-5 -Connection workflow proof · runner pi · Local CLI Bridge Ctrl+P commands diff --git a/artifacts/verification/connections/capture-manifest.json b/artifacts/verification/connections/capture-manifest.json index 4eabeb47..27e81ce2 100644 --- a/artifacts/verification/connections/capture-manifest.json +++ b/artifacts/verification/connections/capture-manifest.json @@ -1,18 +1,18 @@ { "schemaVersion": 1, - "generatedAt": "2026-08-09T13:48:23.197Z", + "generatedAt": "2026-08-29T12:53:28.474Z", "command": "pnpm capture:connections", "binary": "clean npm install from generated tarball", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.1.0.tgz", - "tarballSha256": "edc58f6bd72ffde9ad3e4bb61f758963ccb03ecbdf244cb0b3388e9861ebf116", + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb", "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.1", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", - "node": "v24.13.0", + "node": "v24.18.0", "terminal": "xterm-256color" }, "raster": { @@ -34,70 +34,70 @@ "artifacts": [ { "path": "40x12.txt", - "sha256": "b624b3555f14bea70560c8fbada112860c47af93566918c86ee4cada62f50567", + "sha256": "d96c507b55d1acf6095b32a38e8bf155b6cea664e30b996314907da40393edbb", "kind": "terminal-frame", "columns": 40, "rows": 12 }, { "path": "40x12.png", - "sha256": "27d6babd46ca5fce919925ea7f048ab45e06a28ab91de4719071cedef6db56f2", + "sha256": "a0c88820e002dd78c4f536ac350e622469065bf2048e1a259373b8d855ba2640", "kind": "png", "columns": 40, "rows": 12 }, { "path": "80x24.txt", - "sha256": "f92d5611afdaaa0bc63e56c26c29b32cf6b1887b2540ff8a38f0f52ad54c7151", + "sha256": "609b7359eb3e8ac1b8bc64b1da667f7c5d25e8b8a958ad28b79829feefe4106d", "kind": "terminal-frame", "columns": 80, "rows": 24 }, { "path": "80x24.png", - "sha256": "4042bf8a68980111c3f4a4862ad4d6fffb92dd54c4b310bbbb4607fbefee5cf7", + "sha256": "db50abc7bd612e19e8809883083a87370c7eecd97d75262503758f425a409ad3", "kind": "png", "columns": 80, "rows": 24 }, { "path": "120x40.txt", - "sha256": "0ac8a6430176c30c6e28e3e090bbb785a50e7fa0e56ea473b0d456566d6aaa1e", + "sha256": "e966d916c4134c494fab2ec1eaef1788988d5142d1f73d87d5eeead9d079c0ab", "kind": "terminal-frame", "columns": 120, "rows": 40 }, { "path": "120x40.png", - "sha256": "df736d4f7c8a775d003edaf5ee2e037ee5c6a4241beedd57b0e392ab00aed0ba", + "sha256": "b9b126021a16259aae2d66949562bd66f41baad318c3800b117b1117964cdee2", "kind": "png", "columns": 120, "rows": 40 }, { "path": "200x60.txt", - "sha256": "8067b62ec11ff438b429d121c85fa3cb5d5814e322fd644355eb5ee090020754", + "sha256": "8ca3b0f366b7ea7f1cafe552c29c70f17c37dd78b2f7fd3277b15c839655a5d9", "kind": "terminal-frame", "columns": 200, "rows": 60 }, { "path": "200x60.png", - "sha256": "745d261f5ff8c7f2121e0424c8713b059c4a246a2fb821b1309e97d013126c91", + "sha256": "56f29ce88c0219786dfa8b7409a72727a464c462ea08b13c5990aaef87211938", "kind": "png", "columns": 200, "rows": 60 }, { "path": "raw/connection-keyboard.cast", - "sha256": "98e157217351bb9e4a3d1913f23ae492868a8c4116277632e8eb29bb61c42d93", + "sha256": "810a36040ff4b6db33b2d31419357427aceef960bbb809aa45985031f5774eeb", "kind": "keyboard-asciicast", "columns": 80, "rows": 24 }, { "path": "80x24-connection-keyboard.gif", - "sha256": "fe012591871b19260db3e25a727bd08425fcea00eca2fb3db42eeb415bac83e5", + "sha256": "aca997424c72f902ff30e6dc1f6ed4b870d1640e9f1c6592969d9e4257559448", "kind": "keyboard-flow", "columns": 80, "rows": 24 diff --git a/artifacts/verification/w6/120x40-plain.txt b/artifacts/verification/w6/120x40-plain.txt index 5b8f928d..6dc1bbf3 100644 --- a/artifacts/verification/w6/120x40-plain.txt +++ b/artifacts/verification/w6/120x40-plain.txt @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-bdd8f87d-4114-498b-ade0-c03c06d9748a","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"0435fb92-96a3-4b83-ae59-50ddf5aad260","backend":"executor","status":"active","createdAt":"2026-08-29T04:15:02.043Z","updatedAt":"2026-08-29T04:15:02.043Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-e6424847-fab9-48b2-a1fe-ba1dd310511d","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"d4095431-2c2b-450c-80de-59bc232a8c5a","backend":"executor","status":"active","createdAt":"2026-08-29T12:48:10.393Z","updatedAt":"2026-08-29T12:48:10.393Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/120x40.png b/artifacts/verification/w6/120x40.png index f8cadc3cb9d5558d1484517b25f80ac816685930..87dd6484e40364ac02b3f9ff121a6c2633e691f9 100644 GIT binary patch delta 20 ccmeylf$`@C#tGT%JO;wMU)|{2Si~Ly0A+{?GXMYp delta 20 ccmeylf$`@C#tGT%Ec{%ZKHR4^7O_VF09p|Tpa1{> diff --git a/artifacts/verification/w6/200x60-plain.txt b/artifacts/verification/w6/200x60-plain.txt index 5b8f928d..6dc1bbf3 100644 --- a/artifacts/verification/w6/200x60-plain.txt +++ b/artifacts/verification/w6/200x60-plain.txt @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-bdd8f87d-4114-498b-ade0-c03c06d9748a","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"0435fb92-96a3-4b83-ae59-50ddf5aad260","backend":"executor","status":"active","createdAt":"2026-08-29T04:15:02.043Z","updatedAt":"2026-08-29T04:15:02.043Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-e6424847-fab9-48b2-a1fe-ba1dd310511d","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"d4095431-2c2b-450c-80de-59bc232a8c5a","backend":"executor","status":"active","createdAt":"2026-08-29T12:48:10.393Z","updatedAt":"2026-08-29T12:48:10.393Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/200x60.png b/artifacts/verification/w6/200x60.png index a46d42558aa8df6ec2b4d5db7bb8ec22b3ca3b55..6f948aba51ad6f90c55bba86580904667151ce5f 100644 GIT binary patch delta 20 bcmeAU><-+pn~9yrKt#3AS9kLvrjx1wOBe?a delta 20 ccmeAU><-+pn~9x;pC>_o-T%#pm`i_aHam|2|N7T02R9Z4ngak(8wflA delta 18 ZcmX?{e>i_aHaiPH`}e=)hp@2o3-M diff --git a/artifacts/verification/w6/80x24-automation.gif b/artifacts/verification/w6/80x24-automation.gif index a39f5cf845c1cac9e36721c4b59ba32a170f9ad6..cce4d39914df783349a40487cacef54eeda2d310 100644 GIT binary patch delta 14160 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 delta 20571 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%0A7(7~PXN(O3ycH? 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⋙lnN)c^;2m{(bJnZXtS4^X`GI1tQYjZ`h^Ht7 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�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⁡PWe<*Q`{3No8LcR}{_h`zuWrAaCl5kWM#H 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 diff --git a/artifacts/verification/w6/80x24.png b/artifacts/verification/w6/80x24.png index cea629340594564233b8a978336e9ccf5b61a316..9783975e54ccd2f2aa3b8bb68a11a009c8d6dcc8 100644 GIT binary patch delta 20 ccmX>%f$`h~#tGT%JO+ZHPj)WaSaio709eQf=l}o! delta 20 ccmX>%f$`h~#tGT%Ec_hlPFc@37Ts|N08()X8vp7u\u001b[?u\u001b[c\u001b[?1049h"] -[0.336484,"o","\u001b[2J\u001b[H"] -[0.336494,"o","\u001b[?25l"] -[0.345574,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.34561,"o","\u001b[3A\u001b[2G\u001b[?25l"] -[0.361923,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] -[0.364416,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.364425,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.381826,"i","keyboard-flow-01"] -[0.381903,"i","\r"] -[0.386823,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-01\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.396383,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.420324,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.485552,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.562383,"i","keyboard-flow-02"] -[0.562478,"i","\r"] -[0.566174,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.567498,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.567518,"o","\u001b[15G\u001b[?25l"] -[0.583392,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.583419,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[0.634631,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.723599,"i","keyboard-flow-03"] -[0.723671,"i","\r"] -[0.725579,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.727043,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.727053,"o","\u001b[15G\u001b[?25l"] -[0.742938,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.797576,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.797616,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.884302,"i","keyboard-flow-04"] -[0.884388,"i","\r"] -[0.888006,"o","\u001b[15G\u001b[?25l"] -[0.903903,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.957937,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.04468,"i","keyboard-flow-05"] -[1.044755,"i","\r"] -[1.046508,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-05\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.048203,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.064658,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.12084,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.206673,"i","keyboard-flow-06"] -[1.206746,"i","\r"] -[1.208552,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.210413,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.210423,"o","\u001b[15G\u001b[?25l"] -[1.226899,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.285617,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.368618,"i","keyboard-flow-07"] -[1.368719,"i","\r"] -[1.372884,"o","\u001b[15G"] -[1.372933,"o","\u001b[?25l"] -[1.392959,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.456956,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.548916,"i","keyboard-flow-08"] -[1.549012,"i","\r"] -[1.551159,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.553914,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.55393,"o","\u001b[15G\u001b[?25l"] -[1.57056,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.570586,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[1.633073,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.71075,"i","\u001b[5~"] -[1.710848,"i","\u001b[1;3H"] -[1.713959,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.790684,"i","\u001b[6~"] -[1.790767,"i","\u001b[1;3F"] -[1.793863,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.793897,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[1.803897,"o","\u001b[0m"] +{"version":2,"width":80,"height":24,"timestamp":1788007730,"duration":1.860069,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} +[0.377688,"o","\u001b[?2004h"] +[0.37783,"o","\u001b[>7u\u001b[?u\u001b[c"] +[0.377957,"o","\u001b[?1049h\u001b[2J\u001b[H\u001b[?25l"] +[0.386075,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.386116,"o","\u001b[3A\u001b[2G\u001b[?25l"] +[0.402891,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] +[0.406509,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.406541,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.421933,"i","keyboard-flow-01"] +[0.422003,"i","\r"] +[0.428157,"o","\u001b[15G\u001b[?25l"] +[0.469989,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.528586,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.528636,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.622456,"i","keyboard-flow-02"] +[0.622518,"i","\r"] +[0.627316,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] +[0.627361,"o","\u001b[?25l"] +[0.629265,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G"] +[0.629285,"o","\u001b[?25l"] +[0.645228,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.645273,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[0.699926,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.782789,"i","keyboard-flow-03"] +[0.782843,"i","\r"] +[0.785061,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] +[0.785097,"o","\u001b[?25l"] +[0.787472,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.787484,"o","\u001b[15G\u001b[?25l"] +[0.802793,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.861766,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.943626,"i","keyboard-flow-04"] +[0.943681,"i","\r"] +[0.945643,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.9481,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.948133,"o","\u001b[15G\u001b[?25l"] +[0.96605,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.026643,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.103552,"i","keyboard-flow-05"] +[1.103605,"i","\r"] +[1.107729,"o","\u001b[15G\u001b[?25l"] +[1.124322,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G"] +[1.124384,"o","\u001b[?25l"] +[1.185041,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.264867,"i","keyboard-flow-06"] +[1.26493,"i","\r"] +[1.266737,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.269223,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.288585,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.288634,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[1.349751,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.349941,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[1.425542,"i","keyboard-flow-07"] +[1.425598,"i","\r"] +[1.427694,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-07\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.430478,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.449844,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n"] +[1.4499,"o","\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.514917,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.605856,"i","keyboard-flow-08"] +[1.605908,"i","\r"] +[1.607996,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.610381,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.626771,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.689973,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.690024,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[1.76682,"i","\u001b[5~"] +[1.766874,"i","\u001b[1;3H"] +[1.769673,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.769718,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[1.847511,"i","\u001b[6~"] +[1.847564,"i","\u001b[1;3F"] +[1.850033,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.850069,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[1.860069,"o","\u001b[0m"] diff --git a/artifacts/verification/w6/states/active-streaming.json b/artifacts/verification/w6/states/active-streaming.json index bd9e7ad1..c21b2c26 100644 --- a/artifacts/verification/w6/states/active-streaming.json +++ b/artifacts/verification/w6/states/active-streaming.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -320,7 +320,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-29T04:15:19.660Z", + "occurredAt": "2026-08-29T12:48:28.135Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -561,12 +561,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "Detach the active run before reconnecting it" + "reason": "There is no recoverable run to reconnect while another run is active" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "Detach the active run before reconciling it" + "reason": "There is no recoverable run to reconcile while another run is active" } }, "draft": "", @@ -697,10 +697,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-45de610136272ea261191af6", + "id": "effect-op-terminal-000002-18fb4f2ea4315b9485e2f7aa", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "45de610136272ea261191af643c9dd3b12914e873e83e8b680df5b1fe3e76aea", + "requestDigest": "18fb4f2ea4315b9485e2f7aa740a443a630558f65d1a8e4c4e8c4f5142b786bc", "kind": "send", "status": "pending", "attempt": 1, @@ -719,13 +719,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T04:15:19.660Z", + "occurredAt": "2026-08-29T12:48:28.135Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-d8490564-4935-4979-ba99-140f6bdcf903", + "id": "turn-aa7ce0df-ffda-4546-a4ba-1dddcb8d605a", "intent": "W6 active streaming", "metadata": { "identity": { @@ -735,11 +735,11 @@ } }, "session": { - "id": "3a6fd1ce-c86b-465e-88ad-c030ddbec98d", + "id": "5d959641-1813-4738-a7cf-77a3e1e049c4", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T04:15:19.660Z", - "updatedAt": "2026-08-29T04:15:19.660Z", + "createdAt": "2026-08-29T12:48:28.135Z", + "updatedAt": "2026-08-29T12:48:28.135Z", "metadata": "[unavailable]" }, "backend": "router", @@ -761,16 +761,16 @@ }, "execution": { "kind": "request", - "id": "turn-d8490564-4935-4979-ba99-140f6bdcf903" + "id": "turn-aa7ce0df-ffda-4546-a4ba-1dddcb8d605a" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-d8490564-4935-4979-ba99-140f6bdcf903:attempt:74db3162-d771-425f-870f-e3ff90ccde34", - "materializationReceiptDigest": "sha256:195e92e6febf86c70504edfb0327cf82a9a9be8bb902113992f254a48deaa9c0", - "bindingDigest": "sha256:c2c0fcc9d684c3d83693ed84679af33065bbdda1bd8fa5f81327f9329b89a784", + "attemptId": "turn-aa7ce0df-ffda-4546-a4ba-1dddcb8d605a:attempt:6d56bf67-7908-4ef3-b21b-f44f348d03cc", + "materializationReceiptDigest": "sha256:f350a414fb447652a42c8a9c041fe052fd82cb32b3505571d711202ecc9c934a", + "bindingDigest": "sha256:ad029068d16f85a3e8f5265c2c35413d96b3f0bbbc681ee3fbf937fcc92f2956", "descriptor": { "kind": "router-request", "transport": "http", @@ -782,10 +782,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T04:15:19.657Z" + "startedAt": "2026-08-29T12:48:28.133Z" } }, - "timestamp": "2026-08-29T04:15:19.660Z" + "timestamp": "2026-08-29T12:48:28.135Z" } } } diff --git a/artifacts/verification/w6/states/active-streaming.png b/artifacts/verification/w6/states/active-streaming.png index 70a692d754d995e1c633d3906c6735aa6df78af4..e33c5ef332db8149676e923ad12dc8df3e48e4f4 100644 GIT binary patch delta 18 Zcmexd`nhyMHam}jY)sJC&W%NlRsd4t2sQu! delta 18 Zcmexd`nhyMHaiQyNU^io%8f;hRsc<92Wh($ diff --git a/artifacts/verification/w6/states/command-palette-120.json b/artifacts/verification/w6/states/command-palette-120.json index 333b765a..813c08f2 100644 --- a/artifacts/verification/w6/states/command-palette-120.json +++ b/artifacts/verification/w6/states/command-palette-120.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 120, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", diff --git a/artifacts/verification/w6/states/command-palette-120.png b/artifacts/verification/w6/states/command-palette-120.png index 434e76685cecaa6b50542d47c12ec5fccd4d5814..2167c3f3766a649a2476c553b8cf38754efcaf51 100644 GIT binary patch delta 20 ccmcaMpXu6srU}{XJO)yS%o4OV7Nzt909F47-v9sr delta 20 ccmcaMpXu6srU}{XEc}AZnupXj7Nzt908jA;KL7v# diff --git a/artifacts/verification/w6/states/command-palette-40.json b/artifacts/verification/w6/states/command-palette-40.json index d610216e..7a5acee8 100644 --- a/artifacts/verification/w6/states/command-palette-40.json +++ b/artifacts/verification/w6/states/command-palette-40.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 40, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", diff --git a/artifacts/verification/w6/states/command-palette-40.png b/artifacts/verification/w6/states/command-palette-40.png index 911b2aeffd3842762a6968a809b8cf846a213d4b..62f752477a9913eda4ae9ef71f018f9c7a4bb10f 100644 GIT binary patch delta 18 ZcmeD3>hhY9&CX*WcDg}_abwX86#zWO22=n5 delta 18 ZcmeD3>hhY9&CbHl*Qa>?^2VYWDgZu52K)d3 diff --git a/artifacts/verification/w6/states/command-palette-80.json b/artifacts/verification/w6/states/command-palette-80.json index 0f1df50e..43282b57 100644 --- a/artifacts/verification/w6/states/command-palette-80.json +++ b/artifacts/verification/w6/states/command-palette-80.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", diff --git a/artifacts/verification/w6/states/command-palette-80.png b/artifacts/verification/w6/states/command-palette-80.png index aaedb28c639839a60f8da2a671df34eeb81edc4f..51318838e33aeae20b2ade287f2b9dab9758c40b 100644 GIT binary patch delta 20 bcmX>znd!`ArU}{XJO&av7L05gi=sLKODzV9 delta 20 ccmX>znd!`ArU}{XEd2aG)&9F~EQ;y`09I27Pyhe` diff --git a/artifacts/verification/w6/states/comparison.json b/artifacts/verification/w6/states/comparison.json index 24ab1c54..e183ad07 100644 --- a/artifacts/verification/w6/states/comparison.json +++ b/artifacts/verification/w6/states/comparison.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", diff --git a/artifacts/verification/w6/states/comparison.png b/artifacts/verification/w6/states/comparison.png index 0893ada1b42752b0ab311eaa43ba42bdffd32c4c..736b376f05b29406162f29cb472730b1a96b3e3d 100644 GIT binary patch delta 20 ccmeDC#oYIcc|tZjkAe2&7YPCzi{|_R09=C!CIA2c delta 20 ccmeDC#oYIcc|tZj3%}BypNkDP7R~ts0A7I!kpKVy diff --git a/artifacts/verification/w6/states/empty.json b/artifacts/verification/w6/states/empty.json index 2839d614..9923c091 100644 --- a/artifacts/verification/w6/states/empty.json +++ b/artifacts/verification/w6/states/empty.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", diff --git a/artifacts/verification/w6/states/empty.png b/artifacts/verification/w6/states/empty.png index 30198012785176a92ef6f63efad12ea4f85fa2e6..b802da4df9f0882531ac8333966e73951a4ce155 100644 GIT binary patch delta 20 bcmbQHJ56^(5i>iFf%I0xfIXWlnPr6mM#BbM delta 20 bcmbQHJ56^(5i>grzwlf2#ax>!nPr6mL}>;2 diff --git a/artifacts/verification/w6/states/failure-or-reconnect.json b/artifacts/verification/w6/states/failure-or-reconnect.json index 48a0e486..6b3128b0 100644 --- a/artifacts/verification/w6/states/failure-or-reconnect.json +++ b/artifacts/verification/w6/states/failure-or-reconnect.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -336,7 +336,7 @@ "title": "event backend_start", "status": "failed", "detail": "sequence 1", - "occurredAt": "2026-08-29T04:15:38.014Z", + "occurredAt": "2026-08-29T12:48:46.951Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -348,7 +348,7 @@ "title": "error", "status": "failed", "detail": "RUNTIME_BACKEND_ERROR", - "occurredAt": "2026-08-29T04:15:38.019Z", + "occurredAt": "2026-08-29T12:48:46.956Z", "sourceEventId": "run-000001:runtime:2", "runId": "run-000001", "entityType": "run", @@ -725,10 +725,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-fba170922d6cd2f9b6496912", + "id": "effect-op-terminal-000002-462ac802b00ea30a3ed5d4cb", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "fba170922d6cd2f9b6496912e7ad24d1c69c1b92ac671f88f8d2487e01e721d8", + "requestDigest": "462ac802b00ea30a3ed5d4cb107f6dc44ccd942357d5ba04b4f203fa0ac2f44e", "kind": "send", "status": "pending", "attempt": 1, @@ -747,13 +747,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T04:15:38.014Z", + "occurredAt": "2026-08-29T12:48:46.951Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-6a468be9-cb03-47de-b96b-41b1151e2889", + "id": "turn-d61d6cea-2adf-4b9e-a66d-70020a24faa2", "intent": "W6 failure state", "metadata": { "identity": { @@ -763,11 +763,11 @@ } }, "session": { - "id": "55a133d5-b560-4442-a1c2-6b9946fe482a", + "id": "d978c420-6d42-47cd-8bed-95af6eecec90", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T04:15:38.014Z", - "updatedAt": "2026-08-29T04:15:38.014Z", + "createdAt": "2026-08-29T12:48:46.951Z", + "updatedAt": "2026-08-29T12:48:46.951Z", "metadata": "[unavailable]" }, "backend": "router", @@ -789,16 +789,16 @@ }, "execution": { "kind": "request", - "id": "turn-6a468be9-cb03-47de-b96b-41b1151e2889" + "id": "turn-d61d6cea-2adf-4b9e-a66d-70020a24faa2" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-6a468be9-cb03-47de-b96b-41b1151e2889:attempt:772a55da-87d6-4d00-bd33-d6ea72398ec4", - "materializationReceiptDigest": "sha256:be162e6f7e446df440f167a30d05cdfce67d6f4b476ccb912e48265a474404e3", - "bindingDigest": "sha256:68e0b31252f2fc9e6a9103f34f9486c9ceecae1b411386be5e3fecbcf47dfe72", + "attemptId": "turn-d61d6cea-2adf-4b9e-a66d-70020a24faa2:attempt:599f7801-00f8-4dfc-80cd-2ce3529f8178", + "materializationReceiptDigest": "sha256:4013c3b1e71de4b39d338e69e123a73ce3d46b5e9ca8754f88da8589518a1f18", + "bindingDigest": "sha256:f7147209e049cf0a7eb7c75ff446acbe1c1da1d544058bcea79c5531328b3a4d", "descriptor": { "kind": "router-request", "transport": "http", @@ -810,10 +810,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T04:15:38.012Z" + "startedAt": "2026-08-29T12:48:46.949Z" } }, - "timestamp": "2026-08-29T04:15:38.014Z" + "timestamp": "2026-08-29T12:48:46.951Z" } } }, @@ -826,7 +826,7 @@ "source": { "eventId": "run-000001:runtime:2", "providerSequence": 2, - "occurredAt": "2026-08-29T04:15:38.019Z", + "occurredAt": "2026-08-29T12:48:46.956Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "error": { @@ -845,7 +845,7 @@ "source": { "eventId": "run-000001:runtime:3", "providerSequence": 3, - "occurredAt": "2026-08-29T04:15:38.022Z", + "occurredAt": "2026-08-29T12:48:46.960Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "status": "failed", @@ -869,10 +869,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-fba170922d6cd2f9b6496912", + "id": "effect-op-terminal-000002-462ac802b00ea30a3ed5d4cb", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "fba170922d6cd2f9b6496912e7ad24d1c69c1b92ac671f88f8d2487e01e721d8", + "requestDigest": "462ac802b00ea30a3ed5d4cb107f6dc44ccd942357d5ba04b4f203fa0ac2f44e", "kind": "send", "status": "failed", "attempt": 1, diff --git a/artifacts/verification/w6/states/failure-or-reconnect.png b/artifacts/verification/w6/states/failure-or-reconnect.png index 8242e9ec36dac70d461033c73b4ba8ff55ffb1ab..0c73907489317eb920e60a7555c8370138d79eea 100644 GIT binary patch delta 20 ccmaDfiSf}S#tGT%JO=txT9n+a delta 20 ccmaDfiSf}S#tGT%Ec|M_r=)9cEc)O909Wk@U;qFB diff --git a/artifacts/verification/w6/states/fork-preview.json b/artifacts/verification/w6/states/fork-preview.json index 2e01734f..4c84f7ff 100644 --- a/artifacts/verification/w6/states/fork-preview.json +++ b/artifacts/verification/w6/states/fork-preview.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", diff --git a/artifacts/verification/w6/states/fork-preview.png b/artifacts/verification/w6/states/fork-preview.png index 9ea6d59cbb9d05636db1a2cfc8df587a352cacf2..04ed8605b9d1615f750409d5fcba62d97d050ee9 100644 GIT binary patch delta 20 bcmbQ{JI!~4F*7@lfoe&BulQyw<``uFLPQ0u delta 20 bcmbQ{JI!~4F*7?0zbx1MKHkk%%rVLUKyn3_ diff --git a/artifacts/verification/w6/states/graph-or-analysis.json b/artifacts/verification/w6/states/graph-or-analysis.json index 9958b9de..129a0219 100644 --- a/artifacts/verification/w6/states/graph-or-analysis.json +++ b/artifacts/verification/w6/states/graph-or-analysis.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", diff --git a/artifacts/verification/w6/states/graph-or-analysis.png b/artifacts/verification/w6/states/graph-or-analysis.png index d057555ad332a6f88da14aa75236629e65e4f54d..14dea5350d3eff2ae4979d54685ccdca630ddd46 100644 GIT binary patch delta 20 ccmZ3uka6Kc#tGT%JO=8s;&iMx7U>5708Kmw?EnA( delta 20 ccmZ3uka6Kc#tGT%Ed26MCcanPSfn2S0809%^~F#rGn diff --git a/artifacts/verification/w6/states/narrow.json b/artifacts/verification/w6/states/narrow.json index 864dd4ae..608e2b3e 100644 --- a/artifacts/verification/w6/states/narrow.json +++ b/artifacts/verification/w6/states/narrow.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "69273283b2c48e3fc57e32ba3cc7cfb8f2808c5a879744e190e6df9378d521e5" + "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" }, "dimensions": { "columns": 40, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.3", + "package": "@earendil-works/pi-tui@0.84.4", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", diff --git a/artifacts/verification/w6/states/narrow.png b/artifacts/verification/w6/states/narrow.png index 8aa55f0986f931f33377e6bab261228d5a581dfe..8bc58581dae1640220934690b1515acdfd4a12f7 100644 GIT binary patch delta 18 acmZ4Pz1(|3Ham}j-s7ez^EVcmssaE setTimeout(resolve, milliseconds)) } -async function waitFor(predicate, label, timeoutMs = 10_000) { +async function waitFor(predicate, label, diagnostic, timeoutMs = 10_000) { const deadline = Date.now() + timeoutMs while (!predicate()) { - if (Date.now() >= deadline) throw new Error(`Timed out waiting for ${label}`) + if (Date.now() >= deadline) { + const detail = diagnostic?.() + throw new Error(`Timed out waiting for ${label}${detail ? `\n${detail}` : ''}`) + } await sleep(20) } } @@ -40,6 +44,10 @@ function normalized(value) { return value.replace(/\s+/gu, ' ').trim() } +function conversationShellReady(screen) { + return screen.includes(captureProfileName) && screen.includes('new message') +} + function screenFrom(emulator, rows) { const buffer = emulator.buffer.active return Array.from( @@ -88,7 +96,7 @@ async function createProductionFixture(root) { format: 'braid-startup-config', schemaVersion: 2, profile: { - name: 'Connection workflow proof', + name: captureProfileName, description: 'Packed terminal connection workflow proof', harness: 'pi', model: { default: 'openai/gpt-5' }, @@ -186,15 +194,31 @@ async function spawnTerminal(binary, columns, rows, root) { waitFor( () => pendingWrites === 0 && performance.now() - lastOutputAt >= 75, `${columns}x${rows} ${label}`, + () => screen, ) const close = async () => { if (exited) return - for (let index = 0; index < 3; index += 1) { + for (let index = 0; index < 8; index += 1) { + const before = normalized(screen) + if (conversationShellReady(before)) break input('\u001b') - await sleep(50) + await waitFor( + () => conversationShellReady(normalized(screen)) || normalized(screen) !== before, + 'overlay close', + () => screen, + 1_000, + ) } + if (!conversationShellReady(normalized(screen))) + throw new Error( + `Packed connection capture could not return to the conversation shell\n${screen}`, + ) input('\u0003') - await waitFor(() => normalized(screen).includes('ctrl+c again to quit'), 'safe exit') + await waitFor( + () => normalized(screen).toLowerCase().includes('ctrl+c again to quit'), + 'safe exit', + () => screen, + ) input('\u0003') const result = await Promise.race([ exit, @@ -223,31 +247,39 @@ async function spawnTerminal(binary, columns, rows, root) { } } -async function reachCredentialPrompt(terminal) { - await waitFor( - () => normalized(terminal.screen()).includes('Braid starter'), - 'Braid conversation shell', +function waitForScreen(terminal, predicate, label) { + return waitFor( + () => predicate(normalized(terminal.screen())), + label, + () => terminal.screen(), ) +} + +async function reachCredentialPrompt(terminal) { + await waitForScreen(terminal, conversationShellReady, 'Braid conversation shell') terminal.input('/connection create\r') - await waitFor( - () => normalized(terminal.screen()).includes('connection metadata'), + await waitForScreen( + terminal, + (screen) => screen.includes('connection metadata'), 'connection kind editor', ) terminal.input('\u001b[B') terminal.input('\r') - await waitFor( - () => normalized(terminal.screen()).includes('Tangle inference metadata'), + await waitForScreen( + terminal, + (screen) => screen.includes('Tangle inference metadata'), 'connection fields', ) for (let index = 0; index < 4; index += 1) terminal.input('\r') - await waitFor(() => normalized(terminal.screen()).includes('review connection'), 'review') + await waitForScreen(terminal, (screen) => screen.includes('review connection'), 'review') terminal.input('\r') - await waitFor( - () => normalized(terminal.screen()).includes('credential · Tangle Inference'), + await waitForScreen( + terminal, + (screen) => screen.includes('credential · Tangle Inference'), 'credential prompt', ) terminal.sensitiveInput(captureSecret) - await waitFor(() => terminal.screen().includes('••••'), 'masked credential') + await waitForScreen(terminal, (screen) => screen.includes('••••'), 'masked credential') await terminal.stable('masked credential frame') } @@ -286,24 +318,28 @@ async function captureKeyboardFlow(binary) { await reachCredentialPrompt(terminal) await sleep(350) terminal.input('\r') - await waitFor(() => { - const screen = normalized(terminal.screen()) - return screen.includes('connections') && screen.includes('^D remove') - }, 'created connection picker') + await waitForScreen( + terminal, + (screen) => screen.includes('connections') && screen.includes('^D remove'), + 'created connection picker', + ) terminal.input('Tangle') - await waitFor( - () => normalized(terminal.screen()).includes('Tangle Inference'), + await waitForScreen( + terminal, + (screen) => screen.includes('Tangle Inference'), 'created connection filter', ) terminal.input('\u0004') - await waitFor( - () => normalized(terminal.screen()).includes('remove connection'), + await waitForScreen( + terminal, + (screen) => screen.includes('remove connection'), 'removal confirmation', ) await sleep(500) terminal.input('\r') - await waitFor( - () => !normalized(terminal.screen()).includes('remove connection'), + await waitForScreen( + terminal, + (screen) => !screen.includes('remove connection'), 'connection removal', ) await terminal.stable('removed connection picker') From 9a53e1bd09c4bbbdb76576da62b09c48fa2c8dc2 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 06:59:04 -0600 Subject: [PATCH 068/136] test(release): bind visual proof to candidate --- artifacts/verification/connections/120x40.png | Bin 5398 -> 5398 bytes artifacts/verification/connections/200x60.png | Bin 6640 -> 6640 bytes artifacts/verification/connections/40x12.png | Bin 4534 -> 4534 bytes .../connections/80x24-connection-keyboard.gif | Bin 79179 -> 79179 bytes artifacts/verification/connections/80x24.png | Bin 5104 -> 5104 bytes .../connections/capture-manifest.json | 16 +- artifacts/verification/w6/120x40-plain.txt | 2 +- artifacts/verification/w6/120x40.png | Bin 22649 -> 22649 bytes artifacts/verification/w6/200x60-plain.txt | 2 +- artifacts/verification/w6/200x60.png | Bin 10379 -> 10379 bytes artifacts/verification/w6/40x12-plain.txt | 2 +- artifacts/verification/w6/40x12.png | Bin 14275 -> 14275 bytes .../verification/w6/80x24-automation.gif | Bin 16245 -> 14866 bytes artifacts/verification/w6/80x24-plain.txt | 2 +- .../w6/80x24-transcript-keyboard.gif | Bin 356241 -> 362293 bytes artifacts/verification/w6/80x24.png | Bin 18510 -> 18510 bytes .../verification/w6/capture-manifest.json | 124 ++--- artifacts/verification/w6/package-proof.json | 438 ++++++++++-------- .../w6/raw/transcript-keyboard.cast | 141 +++--- .../w6/states/active-streaming.json | 30 +- .../w6/states/active-streaming.png | Bin 15091 -> 15091 bytes .../verification/w6/states/analysis.json | 2 +- artifacts/verification/w6/states/analysis.png | Bin 58389 -> 58389 bytes .../verification/w6/states/automation.json | 2 +- .../verification/w6/states/automation.png | Bin 4156 -> 4156 bytes .../w6/states/command-palette-120.json | 2 +- .../w6/states/command-palette-120.png | Bin 36822 -> 36822 bytes .../w6/states/command-palette-40.json | 2 +- .../w6/states/command-palette-40.png | Bin 9482 -> 9482 bytes .../w6/states/command-palette-80.json | 2 +- .../w6/states/command-palette-80.png | Bin 35276 -> 35276 bytes .../verification/w6/states/comparison.json | 2 +- .../verification/w6/states/comparison.png | Bin 64782 -> 64782 bytes artifacts/verification/w6/states/empty.json | 2 +- artifacts/verification/w6/states/empty.png | Bin 5782 -> 5782 bytes .../w6/states/failure-or-reconnect.json | 40 +- .../w6/states/failure-or-reconnect.png | Bin 18786 -> 18786 bytes .../verification/w6/states/fork-preview.json | 2 +- .../verification/w6/states/fork-preview.png | Bin 9878 -> 9878 bytes .../w6/states/graph-or-analysis.json | 2 +- .../w6/states/graph-or-analysis.png | Bin 20641 -> 20641 bytes .../verification/w6/states/interaction.json | 2 +- .../verification/w6/states/interaction.png | Bin 28820 -> 28820 bytes .../verification/w6/states/multi-run.json | 58 +-- .../verification/w6/states/multi-run.png | Bin 24549 -> 24549 bytes artifacts/verification/w6/states/narrow.json | 2 +- artifacts/verification/w6/states/narrow.png | Bin 9639 -> 9639 bytes artifacts/verification/w6/states/profile.json | 2 +- artifacts/verification/w6/states/profile.png | Bin 6355 -> 6355 bytes .../verification/w6/states/supervision.json | 2 +- .../verification/w6/states/supervision.png | Bin 24507 -> 24507 bytes 51 files changed, 455 insertions(+), 426 deletions(-) diff --git a/artifacts/verification/connections/120x40.png b/artifacts/verification/connections/120x40.png index e7943fd3e5b192f0971a06a1cbc16a743bee66da..2ae09e794e5ff9b5060edad37b38a7a6fa4e5633 100644 GIT binary patch delta 19 bcmbQHHBD>797Z-P<@7rYD>g4;ED;6(M?41k delta 19 bcmbQHHBD>797Z-%Ni~n7S2r(WED;6(Mkxme diff --git a/artifacts/verification/connections/200x60.png b/artifacts/verification/connections/200x60.png index 670ec07eb4321234e0d581a414c8ace49180ecdf..5f02883855a739940f7f7c1a7b5f34be52eb1ea9 100644 GIT binary patch delta 19 bcmexh{K0sGJtLcy%Fi8Bxi`Bqu9g4*Q*Z~U delta 19 bcmexh{K0sGJtLc`)PBb)`I}uCS4#i@Ph1G`qwrVu}1&^R(}V# delta 19 bcmeylf$`@C#tAuW2Ew~v-RRp`#2x_vV6F)# diff --git a/artifacts/verification/w6/200x60-plain.txt b/artifacts/verification/w6/200x60-plain.txt index 6dc1bbf3..69f7b39b 100644 --- a/artifacts/verification/w6/200x60-plain.txt +++ b/artifacts/verification/w6/200x60-plain.txt @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-e6424847-fab9-48b2-a1fe-ba1dd310511d","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"d4095431-2c2b-450c-80de-59bc232a8c5a","backend":"executor","status":"active","createdAt":"2026-08-29T12:48:10.393Z","updatedAt":"2026-08-29T12:48:10.393Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-34a9c7c5-07fd-4589-a4e4-529c21f268df","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"b888b18a-f06f-422e-9b3a-be3168f3c562","backend":"executor","status":"active","createdAt":"2026-08-29T12:57:38.249Z","updatedAt":"2026-08-29T12:57:38.249Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/200x60.png b/artifacts/verification/w6/200x60.png index 6f948aba51ad6f90c55bba86580904667151ce5f..7fda58133ee732454dbf0dd8cff4a8be9757ba11 100644 GIT binary patch delta 19 bcmeAU><-+phl$P7;Do=>*3E~QPO1U`PA&)8 delta 19 acmeAU><-+phl$NVM77UXck>~pld1qmT?YdI diff --git a/artifacts/verification/w6/40x12-plain.txt b/artifacts/verification/w6/40x12-plain.txt index 6dc1bbf3..69f7b39b 100644 --- a/artifacts/verification/w6/40x12-plain.txt +++ b/artifacts/verification/w6/40x12-plain.txt @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-e6424847-fab9-48b2-a1fe-ba1dd310511d","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"d4095431-2c2b-450c-80de-59bc232a8c5a","backend":"executor","status":"active","createdAt":"2026-08-29T12:48:10.393Z","updatedAt":"2026-08-29T12:48:10.393Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-34a9c7c5-07fd-4589-a4e4-529c21f268df","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"b888b18a-f06f-422e-9b3a-be3168f3c562","backend":"executor","status":"active","createdAt":"2026-08-29T12:57:38.249Z","updatedAt":"2026-08-29T12:57:38.249Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/40x12.png b/artifacts/verification/w6/40x12.png index 9628ec231fcf02cadb10a87e1a81e66efa2ff209..81dd124054f1bad8dca7c8fa7cdfb4a2d3e94e89 100644 GIT binary patch delta 17 YcmX?{e>i_a4x6R6lh*CXjYWax07Tjc761SM delta 17 ZcmX?{e>i_a4x0i0`qwQ7Hx>n&0{~1h2rvKu diff --git a/artifacts/verification/w6/80x24-automation.gif b/artifacts/verification/w6/80x24-automation.gif index cce4d39914df783349a40487cacef54eeda2d310..9bc273775d93f6e370f38de8de9917e2ffb448c9 100644 GIT binary patch delta 12697 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�&IQV?u9-o&n(@Te}D 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%0DYmhgW*E;{#c4g>(T!5sfD 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�5Nlt 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𝔦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 delta 338292 zcmYh?c{G&&1ONT^T(gfEu0gWakewJUwx}6oSEEI?7$Qs5NZB(p48}fESz{EkH(HTu zh-}4BiB?LbomOoh_k4f9`#$IX!@)VuoP*1CT#wiDeYrrX==lnP)@EG*fU)!qC?Tm( z`bss;51+p&t7|E%Yp+yaqoS^^Xc@=tl)74^y1BYb;sJ*3D4gyEXK{P z`TXVQ(l4!VPCq>U`wbC{Zyj>ErUmrW)dxj2r_xR+Sywun;rnuw*T1-?zozDPA!Ye= ztBlJ9ZOa1PolSEYhwDa4T6}veT`tz&ttcMgE0$y{pm(fUl`C|7HB`F(z_UA@>jy`w z>~mLnbX|(rjNaBfc_QiZf#a=#7ts(2DlXP08$E4zio6<~;h-nJ%YCAGk0g4^ym$=p z%zxoy94<8-?jWZxM|UV@ELSeg7H>nD7h^?oMmFX`(xH@InS@np=AoA@Oy<}!(Al?R+}uPYxnA(XnSjwPJgxT+_=mh)0i zc5Ytd3rP!MAl$d=9LLG?Xkq^L`8Bsti8#A6V!Y002u%wm7pvqhP(8#$U47#{`~oe%gfU1gH<$PY3HPCN~`GTa`y|YzdgtZD_(w> z6_9w|aD$Vj<31<9G;@bQvrV-0rlm-B+Uf2a!wZXU%xpcXT~bkTO3nNJckd>C{~rDE zgHyLC8lT`c{yg4#p54^cbobjg6Ke+lOx@t8&ucBWnQgH0K3vNP*q71z&tXrBw(%yq zgR|E`;d;8i(FQ9zzQqkY`2T~QTA=5DE{%Dls)s;a6NM>qwA zf>kUsy(u4z%PVgSO z8P%xrbX8JHs=mISXZR^`-_Wi3w@$l#=pH)^H@akI@sEbNo+}K@%P;WWZrfKMHGeB* zt+7Gz`SvqCy-{4AXYl^w_KSAA6QlA*>iTY<iw*Y|@ zW=v>r|H-)P(%X9tPmgcA+jaT{m2S)!8rX`YWT?osV_=C8N`^37oOSw3dAhAz*=CE3hnVTbyF{OneX`e5R| z4lZ54h)?I!S4;w=ox3G4Ts5aut=vP2GXu(YAq7Xf&(a-fF0RLeit!`0Q zI%`~q-(KcqI&VkZyr2zyf4Oem%quG3)oMSmOw&Qx6T2mvfG5l~Ue$+-7HXril% zszTZD2As}Xmpcb^6*RvMhFBex3{`!E$RXl>uz&;WXlqnMIw0G)7}!=f7?t{W-%9q( zGIFXQZ7c%=9SA>dhMbRzqdh7 zmB8T2->(5n`pUwZ{MG(!x>_~!6@aWIX`4|sgwO{1Ar3C4`t z;Y_PWp5~~tEjp3jCfnt9Jh=Wvs~afu%)68Krnfw#d<;FPNbY&oe*086=-7JXknYUK zNjfoW#SCFq_%#al^11kPQ7_}z3g2`$ zU!)t3_*VL?88CO`!=*64F>M8)c`RgP6F>~=d+wUe&Q!}7fo#3XGT469Qjx|jcZ>6MWy354Kl8X%f!Pno( zvj!iT{x=;uPSdlyZ{_1?PA5*!pu)a~3sNt{YU*sLQN|Q)zui?%>|yQq_G^`<{y zUoR>kZ$_aJ{)*W%_IvW$f8Rxg*FO};JLx0U$(-UY@_P2of0D7A|NR_W{_oH7GEn9y z?E)xo4yGX)Q_4YeI0SDFaf%~TnhZO0xAYzbLpk3W)|l z1q(|kN+Tgqq#1mg5dV@Rds-la)lAb4Ps4fQ-cWG!G}$Q@Y%`xuOMvaDvgJ%{CXK|t z$$`ZZe2x&GD*<{qVCkKa7s}g9YED;Ho&Jw=?+DG<+3H z7GESw;t(xF!Ce=T9s{Bw4rC!Fwo^cZR0}7KsG&zzlv~zzktx#SBuK z0B(?gz(Lp~JpG4628eJ$O!!iGZbvx$M*`aT@ZF_6k|&PDz+p5=1L1Hf$Qj~$k2GW` zlv>9#ag#W5kUozD(f|cF$AN<+GQASu5svF)Ct$-8vOJVAhTf#pO!&imK_3oG32|>Y zgpQ2@w9j6^AO$UClO*6Z6aJO}i$TtE0{nR%K38geX)q^;Q}Aj@p!G{|AAk;hVg)O6 zLQ=4V1HU^26-;=I!Ev1kxIu{jzRZv-U&yoYkt2zUvF*4x7Ade)29AKgvq82fA#J_O zaaEOqhV{}HgH>_I|C^VSiIKg|!sasNZZdJ=8Q7$>@Q-rwd;ZCz@uUh#A&!oT96AM< za-}Tzx^fYq7GXS#^z?Dz24uAe>&A|p*Gokhdj2bCQn?6@7vh7M_%9L}5)&V6P-x{6_*n$IvXoW1u}L_d=Q0X-dTC~S7m*+Y^R9yl8HMzoma^x zq=B3ZE)`dnvn#gaxhhNL4-(SvGo{yTde&vqcQ{0l2~HOql$rXF_D5vApRRf-U^-0+ zDmeI?OVx3(@aELEIdRnlqeQV2|ItdWUAf}V+p1R)T*Y0a3LkRw5G`Z|pFu%&O7O9X zWVK=1LkagZ3)|#G)^SZb%SAe7oxWAJql?u4Ag!@6(vBsH1(K95Na|DvEe1a za1<731VysUF-Fe8*?Ja1!EgZqF(AS+83Bpl6jyS>J4lJ#7!uTYC#`V<7YVT!

    Hh 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%0AaD@p+KNDsXqxH> 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 delta 19 bcmX>%f$`h~#tAuW27;kab}rgjbjKY4RD=lJ diff --git a/artifacts/verification/w6/capture-manifest.json b/artifacts/verification/w6/capture-manifest.json index d4b21df9..d93703b7 100644 --- a/artifacts/verification/w6/capture-manifest.json +++ b/artifacts/verification/w6/capture-manifest.json @@ -1,11 +1,11 @@ { "schemaVersion": 3, - "generatedAt": "2026-08-29T12:48:50.758Z", + "generatedAt": "2026-08-29T12:58:17.504Z", "command": "pnpm capture:visual", "binary": "clean npm install from generated tarball", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb", + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c", "stateFixture": "deterministic", "liveDemoCommand": "pnpm capture:demo:live", "terminal": "node-pty/xterm-256color", @@ -255,14 +255,14 @@ }, { "path": "40x12-plain.txt", - "sha256": "2f3aa960e6762cced16db295f980d09f4549351c5aab77b39407b601712e2067", + "sha256": "9ccc454ee72a766df3b724611055ff984955356e2151497cf56c0d09bcdb4016", "kind": "plain-frame", "columns": 40, "rows": 12 }, { "path": "40x12.png", - "sha256": "dd52871dab17268f58c208fcf680ba23b36f7e38b660147d4f1383a1621cde35", + "sha256": "79f7bdb3af5a86f5b8bfb28dc87e9391c81f649bf7acfb072eb5042e9b50c61b", "kind": "png", "columns": 40, "rows": 12 @@ -276,14 +276,14 @@ }, { "path": "80x24-plain.txt", - "sha256": "2f3aa960e6762cced16db295f980d09f4549351c5aab77b39407b601712e2067", + "sha256": "9ccc454ee72a766df3b724611055ff984955356e2151497cf56c0d09bcdb4016", "kind": "plain-frame", "columns": 80, "rows": 24 }, { "path": "80x24.png", - "sha256": "c32dd8b9daea77573a31824883f7cbadeaf2882e0893ce41d437821d2ea56363", + "sha256": "2bda8dbe1f17ce28adec1240e2df40d93a98e1c0783c1f8d07a845fe504eac64", "kind": "png", "columns": 80, "rows": 24 @@ -297,14 +297,14 @@ }, { "path": "120x40-plain.txt", - "sha256": "2f3aa960e6762cced16db295f980d09f4549351c5aab77b39407b601712e2067", + "sha256": "9ccc454ee72a766df3b724611055ff984955356e2151497cf56c0d09bcdb4016", "kind": "plain-frame", "columns": 120, "rows": 40 }, { "path": "120x40.png", - "sha256": "081377d226b21c5d89365ae376980153e95f4b05347ca50930a074b35cf03d58", + "sha256": "6966045b257d8064bff7dee586c8ab20389342fb4f313d5d5566d6d312c50b6b", "kind": "png", "columns": 120, "rows": 40 @@ -318,21 +318,21 @@ }, { "path": "200x60-plain.txt", - "sha256": "2f3aa960e6762cced16db295f980d09f4549351c5aab77b39407b601712e2067", + "sha256": "9ccc454ee72a766df3b724611055ff984955356e2151497cf56c0d09bcdb4016", "kind": "plain-frame", "columns": 200, "rows": 60 }, { "path": "200x60.png", - "sha256": "f9067689e1548f4251a1465e87f67cef682a29493f8a0edf77fc848bd22cb424", + "sha256": "e2615abf4c28af164790823cfcf984c23e57ea858dee699f8ccd5988b8f4f64e", "kind": "png", "columns": 200, "rows": 60 }, { "path": "states/command-palette-40.json", - "sha256": "d9ff45563b1965fa8ec250013a085cb0995d5452070f6ddb80a3de27067d325b", + "sha256": "75d4a1d6f7273e876302f37cc0e8a0e46a8a097302447982756b726875d760e9", "kind": "semantic-state", "state": "command-palette-40", "columns": 40, @@ -348,7 +348,7 @@ }, { "path": "raw/command-palette-40.cast", - "sha256": "d94f91a3ec6fd328aab2ac2f83ae4b152c1e035adce9a2af7d820427e3ab11e0", + "sha256": "4a764fb7f0179f0c56cf4d40485dc9a0ba77492358fb7e916c06a8553a992eaf", "kind": "asciicast", "state": "command-palette-40", "columns": 40, @@ -364,7 +364,7 @@ }, { "path": "states/command-palette-40.png", - "sha256": "5e491516b907958a0369a2aed4dfab5e6f66cacccf9733bc0cc0e143e4dbdfdd", + "sha256": "59ee96310e2638dd0edd852f0da92b652b99b669813a0ffa64726d416f9b89d9", "kind": "png", "state": "command-palette-40", "columns": 40, @@ -372,7 +372,7 @@ }, { "path": "states/command-palette-80.json", - "sha256": "8980c13b02feafd446c6d03bca79c22356760c02f417bed2a7f1fe26fd06f72f", + "sha256": "f7697185a6041cea9b6cbbbdd4dabd2aa71ddb00033d35747860b9fba0556a51", "kind": "semantic-state", "state": "command-palette-80", "columns": 80, @@ -388,7 +388,7 @@ }, { "path": "raw/command-palette-80.cast", - "sha256": "74fc17231e0996108f2bb86d12ae69bbe76dc36ea26c581e0a6952c9e246e117", + "sha256": "699b48a83b4b4945a3889f91b6de534193f23ff147733d587e3e3069904d0f62", "kind": "asciicast", "state": "command-palette-80", "columns": 80, @@ -404,7 +404,7 @@ }, { "path": "states/command-palette-80.png", - "sha256": "d3fc03c52a41733daaf15afb70e68681bfeac5aa6f01ffdf6e18e7c9d68e6105", + "sha256": "a78d44cc23cc18771a3d1fff3e169ff11c17215855d3ba2be8963b264307068c", "kind": "png", "state": "command-palette-80", "columns": 80, @@ -412,7 +412,7 @@ }, { "path": "states/command-palette-120.json", - "sha256": "5d19ed1e317895a7df70555ad2cdd07cebf4f1945f7259a7537379df24ad6e57", + "sha256": "d45b27cbca7d324ab8cb861e486d9b8c48a0ff9ceed3961211c1202462dc9992", "kind": "semantic-state", "state": "command-palette-120", "columns": 120, @@ -428,7 +428,7 @@ }, { "path": "raw/command-palette-120.cast", - "sha256": "f987dd6f1334c8535e703b29041898a0451864ef78d0f9e5635e09db290168d0", + "sha256": "68e1c98e8afb4958e9ff1037037d6a9a02b55554136a1c8cda99e7a4f2425ae4", "kind": "asciicast", "state": "command-palette-120", "columns": 120, @@ -444,7 +444,7 @@ }, { "path": "states/command-palette-120.png", - "sha256": "34da107a989203a81014f4804301f1e357e33e212c555a6be20967046b83274c", + "sha256": "a16664b927fffd8e1b53a09490cdc87d92ea0beaf169461c76461af4819f5a28", "kind": "png", "state": "command-palette-120", "columns": 120, @@ -452,7 +452,7 @@ }, { "path": "states/empty.json", - "sha256": "e7239dfa846e43c2413e8f2a393ce3289ed70ef8c4ad1dcf0756890d5af9ce5d", + "sha256": "7dc2d5b49371a26d3a4b5a487977b4044805b8c047002406cfe0589837062528", "kind": "semantic-state", "state": "empty", "columns": 80, @@ -468,7 +468,7 @@ }, { "path": "raw/empty.cast", - "sha256": "50178109a948718e9548ca4d14b4f9eb1425adc998d04a973e6d17b4fa03dbae", + "sha256": "a192782e430b7294ac0494dc8f46564e3b93d175ee95ec272af1c304fc63bc4d", "kind": "asciicast", "state": "empty", "columns": 80, @@ -484,7 +484,7 @@ }, { "path": "states/empty.png", - "sha256": "920a9ead22eaf7764526cb3febc388bb0c7aebd56df9f87e4d2230f9fa41294b", + "sha256": "bcff4e37ecd6f0e3a8a4c22dc39ea7936a35402b7b70e25a28a807d51907bf9b", "kind": "png", "state": "empty", "columns": 80, @@ -492,7 +492,7 @@ }, { "path": "states/active-streaming.json", - "sha256": "a780dc0a4669bd7a5debb3e07ee8beab47e4a7afcdff6ee1df7352cf5a380ad1", + "sha256": "94f786805f9ef3b3cab32ebeee4c47771edc7fa474b348aa28003d90fff27e6c", "kind": "semantic-state", "state": "active-streaming", "columns": 80, @@ -508,7 +508,7 @@ }, { "path": "raw/active-streaming.cast", - "sha256": "413ed744f8d223e7c03e7be77422a123abe3d50b096bc542858080550328d636", + "sha256": "7ee029850699d7467fb3d49fe7fabbc6fc81232dcd2663f91d7cf62ab5c4b473", "kind": "asciicast", "state": "active-streaming", "columns": 80, @@ -524,7 +524,7 @@ }, { "path": "states/active-streaming.png", - "sha256": "02c1d56d935963d7fccbf608ed1a2fba7ba0fb4574a552af5a713ec4a7b7fc42", + "sha256": "6766de806225e410cf79fa35b332a7bdb1bc5038cc32dcc7384f2d1ea9609f82", "kind": "png", "state": "active-streaming", "columns": 80, @@ -532,7 +532,7 @@ }, { "path": "states/multi-run.json", - "sha256": "03b5a69518579eddf09ddd0f5f8b41a76f08394cc139702130ec21239ae77ca4", + "sha256": "3bee00e6ab06e2f493ea310b4e17534a5cf84cb132ce529678beb42aa2c08415", "kind": "semantic-state", "state": "multi-run", "columns": 80, @@ -548,7 +548,7 @@ }, { "path": "raw/multi-run.cast", - "sha256": "c8c627ba73450f293c3ab6b8c02321ee88d5db0ce9a6a073f3c73903f3555c60", + "sha256": "651e77d7be5f0e1555faf9074829a3b7f436367dec92b3004905143f9dc43920", "kind": "asciicast", "state": "multi-run", "columns": 80, @@ -564,7 +564,7 @@ }, { "path": "states/multi-run.png", - "sha256": "a21872ce8e39cf74b5d2b540227c3e49fd84c8ce675c0fd67cfb3e422303dbc6", + "sha256": "f3bad77d3f9ba68e9fd94716510ac794cc57a96f9bdeb21d4de49c16a983a4b6", "kind": "png", "state": "multi-run", "columns": 80, @@ -572,7 +572,7 @@ }, { "path": "states/supervision.json", - "sha256": "5f9e1c224fcd63fefcf708f5102b90c032db0c780262bb21b21c8ef7c1f4f0f3", + "sha256": "cdff563ac75acf430c6d348f5e37264d30ef044555281b329a3d29a0a09bb2a0", "kind": "semantic-state", "state": "supervision", "columns": 80, @@ -588,7 +588,7 @@ }, { "path": "raw/supervision.cast", - "sha256": "be8a7cc81f47c15a28b3a5117910602c8f3fd618922b2ea493d797ac3aef154f", + "sha256": "2e19dc025d477b436bfc007cd63481d0802182264cc6e6763b1a6949c29f6da9", "kind": "asciicast", "state": "supervision", "columns": 80, @@ -604,7 +604,7 @@ }, { "path": "states/supervision.png", - "sha256": "66808d1a48faf21d567c44c5d1878b4aed486c27b98ae6a85776082c2789bfa4", + "sha256": "521ce84bf91369b24d5229cf618ebaf0cc36c7f5f197933f829b915d7d1a5e89", "kind": "png", "state": "supervision", "columns": 80, @@ -612,7 +612,7 @@ }, { "path": "states/interaction.json", - "sha256": "99173acea4e95ad44e2b537952db1ca56d24cba291b899d6b09b308bfbb65f2f", + "sha256": "17fef216654e73bf174c8ee8db5d4d1228b7055025c79ab450af3f907ddaa346", "kind": "semantic-state", "state": "interaction", "columns": 80, @@ -628,7 +628,7 @@ }, { "path": "raw/interaction.cast", - "sha256": "ecdbbbf3e61f2716aa8816c65a2b25f85d3f654cd273203ed0cab13054da65f7", + "sha256": "27228acccc67ad707666ccf53f2fd35f50f4dc958efcd296c1ee8d1629b5af72", "kind": "asciicast", "state": "interaction", "columns": 80, @@ -644,7 +644,7 @@ }, { "path": "states/interaction.png", - "sha256": "fed389da89a510b8036e77565bea9af3f90cff75bab818478c87bbd74cd2bb7c", + "sha256": "5a55826e632960a1b548af0d82514c6d0e820b382a0abdcfc737738e316ec7b2", "kind": "png", "state": "interaction", "columns": 80, @@ -652,7 +652,7 @@ }, { "path": "states/automation.json", - "sha256": "1a6357dd463807fd07291b502b213622dc1fe04edf819ff960e60848efead529", + "sha256": "386bd22196f699272a9fed1e80a3e2f3af316d7899344e307793e2f6bcfe11b0", "kind": "semantic-state", "state": "automation", "columns": 80, @@ -668,7 +668,7 @@ }, { "path": "raw/automation.cast", - "sha256": "fe031054b74609284d6e9992f79e7e6938ab9383265f5e030a8369f7be3f617c", + "sha256": "a1835934b1a73874465cfb922572c8a71fd697f72f43d5852941dc1cd4199bca", "kind": "asciicast", "state": "automation", "columns": 80, @@ -684,7 +684,7 @@ }, { "path": "states/automation.png", - "sha256": "49f264343a0a7a689b335b08b0f67dc5a96c7554ec50868e810dd0c4a47ea5ad", + "sha256": "dc9d1987bc87d9ca8a50c9c2890ddc847b5ab560ad3d3a85e1d584976d0aea88", "kind": "png", "state": "automation", "columns": 80, @@ -692,7 +692,7 @@ }, { "path": "states/fork-preview.json", - "sha256": "88b424ba5213d1e593b5245831fb3ff37d7daea4b2c8433341109f8cdb8bfe3f", + "sha256": "6695b4392cb0196ab8ad03ac15f8f7f29559fb4a8019410856285466b19cd93e", "kind": "semantic-state", "state": "fork-preview", "columns": 80, @@ -708,7 +708,7 @@ }, { "path": "raw/fork-preview.cast", - "sha256": "fb92918d189f18cc9f7fde1b3f73dae2c4760c73f27e001577219492e59acffb", + "sha256": "825bb48cbd39c8c9168f2c17ac9fd94ba503e2814883186adcd2ec6b44f3632d", "kind": "asciicast", "state": "fork-preview", "columns": 80, @@ -724,7 +724,7 @@ }, { "path": "states/fork-preview.png", - "sha256": "da953163ed6b5f466d01245d389267b01809c686870e16cffe521cab8b7f5d32", + "sha256": "9beed4a68a906df03413f039a5e90b4c8c4076ad23ba48217f9cb7181732962a", "kind": "png", "state": "fork-preview", "columns": 80, @@ -732,7 +732,7 @@ }, { "path": "states/graph-or-analysis.json", - "sha256": "022686fd5d592195174b7b1d57725a64aefdb1823ce1aff8127dcea59d2d5f40", + "sha256": "f54468400e2d5f55168570ffce55bd77145f7f9a41c5471d0c093b01ed10e577", "kind": "semantic-state", "state": "graph-or-analysis", "columns": 80, @@ -748,7 +748,7 @@ }, { "path": "raw/graph-or-analysis.cast", - "sha256": "0ef3e98026494d53186fccf844fcebc98ed73787353c2175f479b6840010e37d", + "sha256": "c989791d7c61f7372c4c3577e092981832693dcea6f4bc2de5cb13cffb3c6cb0", "kind": "asciicast", "state": "graph-or-analysis", "columns": 80, @@ -764,7 +764,7 @@ }, { "path": "states/graph-or-analysis.png", - "sha256": "3220277112911f36b7d83626377f03d10030216fc035ef681d60ccebf87433a3", + "sha256": "f072ece9d953675f19af838c3a4d99ad0509ea9fd08dc6b718a5383a2e6e6cf4", "kind": "png", "state": "graph-or-analysis", "columns": 80, @@ -772,7 +772,7 @@ }, { "path": "states/analysis.json", - "sha256": "2eb3c4445d080e6dc11ab0b0935b3207c80c3bcff80903c67f16f3ee24df13d5", + "sha256": "2af19093182cdd20bdf345f99a421f8203967ade78be0c0e00f45146a68e5b6c", "kind": "semantic-state", "state": "analysis", "columns": 80, @@ -788,7 +788,7 @@ }, { "path": "raw/analysis.cast", - "sha256": "a48eb7e8d8472d39cf3a66015c39e9e434565773bf26bb66bbf5274a1e1bb917", + "sha256": "2f16f9722adf101e06aa021e7b8b272c9c59519b0a75414b83543fde3876a4ef", "kind": "asciicast", "state": "analysis", "columns": 80, @@ -804,7 +804,7 @@ }, { "path": "states/analysis.png", - "sha256": "8b98547145472ba4977cb2e378c05d0a7f93f98a6744acc1b8fc994a22b8cd6e", + "sha256": "267017481cca6d1b99b5564dbacb096768667d0d176290d309ef2ca6d3740d1e", "kind": "png", "state": "analysis", "columns": 80, @@ -812,7 +812,7 @@ }, { "path": "states/comparison.json", - "sha256": "4cfffac21a2640c1eafba35fdd6edbb2479f4057c8ada5e24e5f891a52a81f96", + "sha256": "e1adce13bc7569da4c3eb2ddd0d94db714ebaae54f46e4a6bfb452b2cc5a911c", "kind": "semantic-state", "state": "comparison", "columns": 80, @@ -828,7 +828,7 @@ }, { "path": "raw/comparison.cast", - "sha256": "d517cfc47a4fd37254da4f0eb2859f4dd6120913ddb219ec0df52e07398fb0d8", + "sha256": "1319a2d17bcb0d6c450cc1d18048be0b75665694250161c698023359ff081f10", "kind": "asciicast", "state": "comparison", "columns": 80, @@ -844,7 +844,7 @@ }, { "path": "states/comparison.png", - "sha256": "c28fdc0814fba44661c73d40069c73ab30d5f17146965c53ff8019474ac61f5e", + "sha256": "11db8b0a750d51636212dcfe18e6598827f5832c4e591389a59687c35997bb99", "kind": "png", "state": "comparison", "columns": 80, @@ -852,7 +852,7 @@ }, { "path": "states/profile.json", - "sha256": "b162e15ea00221c3eb280e97ec721239e0696d501edf228fe8ecda7b4a475aaf", + "sha256": "6480f34d85aed3f6fd626b0bdada5965935bf77713d7bfe5b237dc1915549765", "kind": "semantic-state", "state": "profile", "columns": 80, @@ -868,7 +868,7 @@ }, { "path": "raw/profile.cast", - "sha256": "9a57551e1d8c58d65c8ea8685b550b1c2da28c30288e45603b7b8ea22376220b", + "sha256": "1e801c13ae975ef398729d9362a859cebbdf232fa0fff74a7ca2e623bd2d71f7", "kind": "asciicast", "state": "profile", "columns": 80, @@ -884,7 +884,7 @@ }, { "path": "states/profile.png", - "sha256": "ad2197992c154db23bf50ccce8e1adb268c75e36d364fc210e6225237fdbeba6", + "sha256": "b91a4d8149e96e9ecd6993d8b8e382ff17c2f871886f00783f77ee55c0ade9e7", "kind": "png", "state": "profile", "columns": 80, @@ -892,7 +892,7 @@ }, { "path": "states/narrow.json", - "sha256": "e043104f0d3bf32d411039d7ddf15c669b2f46ad0e63400d0fd0f2f1b55b05f8", + "sha256": "e5a7a1d1024ac067f6de776191d4360f3ddc62999da25708b9367c17b9262eaa", "kind": "semantic-state", "state": "narrow", "columns": 40, @@ -908,7 +908,7 @@ }, { "path": "raw/narrow.cast", - "sha256": "8c6252e40fb27b64890608a9c766f1246fc7d9d2a2ef253ec74ad221566135ea", + "sha256": "a1d312cc92b04e1333cc030056118a852e8200a10ec224e12e9be7271249f39b", "kind": "asciicast", "state": "narrow", "columns": 40, @@ -924,7 +924,7 @@ }, { "path": "states/narrow.png", - "sha256": "2e2f654c1dddee68b07a288fa0a296a8c20270d74c2c6db095d4358c82fc5fc8", + "sha256": "a00fa36fee1e986871c72bc24a1b678bf6b774115ff67c9334552edb2c681ee7", "kind": "png", "state": "narrow", "columns": 40, @@ -932,7 +932,7 @@ }, { "path": "states/failure-or-reconnect.json", - "sha256": "4c7a3f217634110ceebbaa5e2bf99473a41e8cd0a7672d1dfab6a8d6e44a27de", + "sha256": "cf989dbd93b96d1a295cc3bf2545435165e0cceb23573150174b6f6b4ef495a7", "kind": "semantic-state", "state": "failure-or-reconnect", "columns": 80, @@ -948,7 +948,7 @@ }, { "path": "raw/failure-or-reconnect.cast", - "sha256": "0832c383ed4221d3bf504d48ef95986401384400ac0448479fa2c57fae04deb4", + "sha256": "f6e5afea15d0eb975059d6a6c3557d24bbe5c478267025d6e4346c927898b7a9", "kind": "asciicast", "state": "failure-or-reconnect", "columns": 80, @@ -964,7 +964,7 @@ }, { "path": "states/failure-or-reconnect.png", - "sha256": "23943de914da85b5e298a16c1914e6da13c6a831932187f9b3eeeeb79e2dda69", + "sha256": "77d5c40d0b688f0f1c8ed9ea98ac26b7c27337fa1d8eb472ba4dfea0e768e135", "kind": "png", "state": "failure-or-reconnect", "columns": 80, @@ -979,7 +979,7 @@ }, { "path": "80x24-automation.gif", - "sha256": "454523d1b8ea392bf96cc0bc16851f3f98196a622c7e8811efee839c1f282112", + "sha256": "5ce95b76a7f7450313b78c54702beb85b897b701b5efad1476739ec6ae5af049", "kind": "automation-flow", "state": "automation", "columns": 80, @@ -987,7 +987,7 @@ }, { "path": "80x24-multirun.gif", - "sha256": "3dd5695c76370eae1a1a471e8c5e5cb8d969a4a520897e84d5337badc0dd814d", + "sha256": "799759d72129e8e14e33c94e59cbfba4e76dbf39b8431ce386b4bbf326445da0", "kind": "multi-run-flow", "state": "multi-run", "columns": 80, @@ -995,14 +995,14 @@ }, { "path": "raw/transcript-keyboard.cast", - "sha256": "715bf865a2320a9f7deb68bf3ee8c929f6845b80ad65955a7018ad54f9933838", + "sha256": "752a2e6948ab2dcdef4e47eed351cf0c613ad9d8c8f51a5e39254092229e8353", "kind": "keyboard-asciicast", "columns": 80, "rows": 24 }, { "path": "80x24-transcript-keyboard.gif", - "sha256": "fa64aec50517425a36d69270659f2ca127329ce55712163b4cf85e113838388f", + "sha256": "07eca21de075863c291f421842734a781ba8d471a2441c850bb0b7eb492832c1", "kind": "keyboard-flow", "columns": 80, "rows": 24 diff --git a/artifacts/verification/w6/package-proof.json b/artifacts/verification/w6/package-proof.json index 3a3e147c..1fead57c 100644 --- a/artifacts/verification/w6/package-proof.json +++ b/artifacts/verification/w6/package-proof.json @@ -1,10 +1,10 @@ { "tarball": "tangle-network-braid-0.3.0.tgz", - "sha256": "445dc7cdcf2700e1f13d9393309e24ef074ee956c03f21f385793b15de63f6d7", + "sha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c", "version": "0.3.0", - "gitCommit": "da27d22d647d862fdbd0425d27657fd5ffd47cda", - "treeSha256": "7385a695c5c5e2f11751a19eaa332fe0e4dce729", - "sourceDigest": "b04f7c9e97b49bee808acfb3ac87661937bf5d9a224c64fe970af7fc9022b1f7", + "gitCommit": "4f97573380bedf01943604813447588d0cfc8016", + "treeSha256": "d3dd69e95958f6ffef72ca37c2beed4487569a52", + "sourceDigest": "c893a730eb2e5f35cb231bd4e8264dced4b86570ea3799aeef0c45b114ee8b49", "isolatedBuild": true, "sourceCheckout": "isolated-copy-of-worktree", "packageFileManifest": { @@ -28,7 +28,7 @@ { "path": "package/THIRD_PARTY_NOTICES.md", "size": 5481, - "sha256": "b22ea17d1a9f967e462e4a1b0ba7b93dc53f8e23920ea41f00f3bf81080b47b4" + "sha256": "478bde66b638361b9c53599b926d4bea8f5e3bc0561a5bf7235cabe24f88984d" }, { "path": "package/dist/adapters/agent-interface/harness-runtime.d.ts", @@ -778,7 +778,7 @@ { "path": "package/dist/adapters/runtime/agent-runtime-execution.d.ts.map", "size": 1442, - "sha256": "0921273732306f23d59a232e3d2e173404bd9d504ed1e67e04d288dc057e659f" + "sha256": "36274335b0fd8824015637f24f236bc8c79a845f6f1a91e7de6fc6299e9d4729" }, { "path": "package/dist/adapters/runtime/agent-runtime-execution.js", @@ -872,23 +872,23 @@ }, { "path": "package/dist/adapters/runtime/lazy-execution.d.ts", - "size": 2680, - "sha256": "e9213b9b6757b00e79fc8bb8796df0b53e0896d95b662731496529056f7e5269" + "size": 3076, + "sha256": "0a70337bbc7a2db0c7f09b71f45e69904d709ac7c46c5043fcb41d2ab998b724" }, { "path": "package/dist/adapters/runtime/lazy-execution.d.ts.map", - "size": 2226, - "sha256": "1f42cbfd8c5858286a4e52cf64f4c8938d7745b0a513ad2a00ff62937123d7b5" + "size": 2516, + "sha256": "d6862bedb95195293506f0c8e5f076bf3eab975292085c41e3fa7cf9090ee572" }, { "path": "package/dist/adapters/runtime/lazy-execution.js", - "size": 3371, - "sha256": "8d341baf278aefbe70b96f4c82dc3b1a81533d1690d4814240c8a5255297aec6" + "size": 4012, + "sha256": "a85dd4caf5a6cd389457641f130c6c33e2b1f57de59938a8dcfaceb23b9600c6" }, { "path": "package/dist/adapters/runtime/lazy-execution.js.map", - "size": 2955, - "sha256": "b22064a58d520b7518b909b11c14c15a68e2d6c31eccb48d8516431b5b48c2d6" + "size": 3490, + "sha256": "1ffc4e6853d81f67329653787ddbf78f369f149d3bd9e89981aed0588c14aa55" }, { "path": "package/dist/adapters/runtime/mode-routing-execution.d.ts", @@ -1052,13 +1052,13 @@ }, { "path": "package/dist/adapters/runtime/retained-execution-contract.d.ts", - "size": 3303, - "sha256": "6cd453271adf1af9dad21950b518ab9f909f07b3be890bc77a62d1eede214c44" + "size": 3375, + "sha256": "bbdcd5d05bc52b85b54c896cf921d1192fd904de510312b93c2365c1773ec1f6" }, { "path": "package/dist/adapters/runtime/retained-execution-contract.d.ts.map", - "size": 2687, - "sha256": "1d42352b1586629954dd215316d25d1bc362f6526ccb0c7ffd30fc2e633e78b5" + "size": 2774, + "sha256": "82abaf9b01b2169fa729d94210d67a7a51f08087c9deebc92fe6a070b6f2ce0d" }, { "path": "package/dist/adapters/runtime/retained-execution-contract.js", @@ -1072,23 +1072,23 @@ }, { "path": "package/dist/adapters/runtime/retained-execution-projection.d.ts", - "size": 1257, - "sha256": "f25ceb31e523f1fc9dd5e3b05dfbdbb4659ddbf58d51801dc34297bc81f8fb5c" + "size": 1260, + "sha256": "8c0e5ed4786e79dffe4d336aff31f03379732e9a76d643d4c6180f91c46462be" }, { "path": "package/dist/adapters/runtime/retained-execution-projection.d.ts.map", - "size": 1110, - "sha256": "149493df6699d3375b7a26abe34414d6f1f85b02f5d0a6a84ab516f4e6d5029a" + "size": 1111, + "sha256": "af4664da48eaeaeeb66c69b183fc2664dff786502f94c8866b2d3475256dde12" }, { "path": "package/dist/adapters/runtime/retained-execution-projection.js", - "size": 4186, - "sha256": "64b393c04f8e37a3e960d624d0c009d9c411ecad23335faddbca54f45cbd9302" + "size": 4547, + "sha256": "d5d45903b5d3a78c07c5e28641e869ec577c948d730d850a67871d622f8563e2" }, { "path": "package/dist/adapters/runtime/retained-execution-projection.js.map", - "size": 4267, - "sha256": "803ed810be0910d3c8c378eb9d56f24a38a28640ac69a6298afe4180bbb429fb" + "size": 4509, + "sha256": "ee06c251292230ce29df3ca62c233731a0df1fcfb788d51d57110dc73eacade5" }, { "path": "package/dist/adapters/runtime/retained-execution-state.d.ts", @@ -1112,23 +1112,23 @@ }, { "path": "package/dist/adapters/runtime/retained-execution-stream.d.ts", - "size": 760, - "sha256": "f3d0a9fc7fe016d11732ca2677bfa4eb95c5fdc1d6f98ea95d2607f12930d711" + "size": 839, + "sha256": "f271b307609509078049147471102443a4f675b1bac2824db9e7b9a331c9e753" }, { "path": "package/dist/adapters/runtime/retained-execution-stream.d.ts.map", - "size": 741, - "sha256": "2f2bf3cb8ee66bd44d33196c95f6736e3bdd8ad89621c8b16af55d0a6d23c13d" + "size": 811, + "sha256": "907c9512cfaf24ddad53b8def2a2dbdb51d75bb7590a79c3b62952bffa1a9804" }, { "path": "package/dist/adapters/runtime/retained-execution-stream.js", - "size": 1873, - "sha256": "85fca4bddce11d21b2243475ca7600c119fbd2f59b519388311f1e6f6e07ecbc" + "size": 1939, + "sha256": "289c56365b43d9250f2f22ebe7fb7a5a272c57fd09aa98e8df8b04fa217b39cb" }, { "path": "package/dist/adapters/runtime/retained-execution-stream.js.map", - "size": 1910, - "sha256": "35be39778e41a3286fd1c3d4fe21336af1a53de0574393be2abe205767c211c0" + "size": 1985, + "sha256": "2c7abace45c973b8c1e7ff488edf92f3fab216cd5d9c4d9e4322430557fc9c34" }, { "path": "package/dist/adapters/runtime/retained-execution.d.ts", @@ -1138,37 +1138,37 @@ { "path": "package/dist/adapters/runtime/retained-execution.d.ts.map", "size": 2137, - "sha256": "f59303336c1251284ce3133a8df99413cc326868814036101f9dfc638fc24225" + "sha256": "4cbbe0974651b394f2a53525bc4bebff10b019149a75f71e20d09157d79fa433" }, { "path": "package/dist/adapters/runtime/retained-execution.js", - "size": 25704, - "sha256": "f29507dc4e3f81ec580464c3dffbf5af18854ddf3bd3030c859860127b0b6f85" + "size": 26924, + "sha256": "db2b65fb77269f33e48181a0d72efc24c30b6abff0b97d988d397b9c43eaf697" }, { "path": "package/dist/adapters/runtime/retained-execution.js.map", - "size": 22790, - "sha256": "8eee1d3646b5aef3d212585ac65ffec5125fa0c3d1d38f6f6c0e95d1ef8b851b" + "size": 23859, + "sha256": "346ef0336eb86357927cc28ee96ef177b5c252c89b1ce997bc1a14e5647cfcf8" }, { "path": "package/dist/adapters/runtime/retained-native-continuation.d.ts", - "size": 920, - "sha256": "1910997dc7b58204ec836add609e49d99d8ebaea2812a3d770ea0ed925e2c750" + "size": 1095, + "sha256": "1c280aafe60d21d0225da1901574cac0987e63f87fb2a41b57d982dcd387ad88" }, { "path": "package/dist/adapters/runtime/retained-native-continuation.d.ts.map", - "size": 736, - "sha256": "d6e1abb8d8f68e9cf63cb0ab88ef848da82b44b50735cd038c9e7593280d7463" + "size": 868, + "sha256": "eb44c5e63ce5c412b5e5b6c2db9771a5228ecb647d6988016e32a627737f5751" }, { "path": "package/dist/adapters/runtime/retained-native-continuation.js", - "size": 3953, - "sha256": "3da302353cbdfb2a0d27d4df5738a8f9aad84b4155aec2666687aed1089cab6f" + "size": 4983, + "sha256": "8429360baf79cb5104b2fd2ebb3ef64650ad1b6fdc509de94f297eb03c682f1c" }, { "path": "package/dist/adapters/runtime/retained-native-continuation.js.map", - "size": 3494, - "sha256": "d06ce0596c91bd230cc8c7c13cd3f068355bdc49425db9ba83d7e95b021be4a3" + "size": 4372, + "sha256": "ff8719c162b30c78a09224112573eea6958ebfcf94ccd5dd5b049ac63fa9d0bc" }, { "path": "package/dist/adapters/runtime/sandbox-account-observation.d.ts", @@ -1338,17 +1338,17 @@ { "path": "package/dist/adapters/runtime/tangle-retained-interactive-execution.d.ts.map", "size": 1963, - "sha256": "a6caba4dffdd23504e6c9fc1fcc61f7abb5de9483d810062c18c6ac20f528d0e" + "sha256": "0da4065599db190ed0d0937a530e84a7aeff022b84f0e38f8789c7daa1c0c5fb" }, { "path": "package/dist/adapters/runtime/tangle-retained-interactive-execution.js", - "size": 21334, - "sha256": "40f2bfd619e6070490e8d6b2f438a72286692b57d62b0239781d44dc683f527d" + "size": 21252, + "sha256": "b70f196f1fd36dd055956b7dedff82840935319f8de41079a682c9ee37684b56" }, { "path": "package/dist/adapters/runtime/tangle-retained-interactive-execution.js.map", - "size": 19836, - "sha256": "a4891d9be8422b1074e0b9f4706a65710f03616fb9c66cadc04058d24222b080" + "size": 19616, + "sha256": "14240ffa329ba14de7d7524a5ce330410d3510c4f3bba30acc99e29fdea258c0" }, { "path": "package/dist/adapters/runtime/tangle-retained-interactive-projection.d.ts", @@ -2198,17 +2198,17 @@ { "path": "package/dist/adapters/tui/application-ui-controller.d.ts.map", "size": 1357, - "sha256": "f10f773ff9781196399caca6cca6fba620fa3d20a47d0702f021d79ce5c9e3a0" + "sha256": "6a50daefb20ec4f6b1f7789f285d2bc2076c3cddfe690580bf2e0c6d20cfd456" }, { "path": "package/dist/adapters/tui/application-ui-controller.js", - "size": 12306, - "sha256": "fa7bfd80f19cdd4b9b21165a855c06fe26500fd33c7ddb37c82043e72e095506" + "size": 12337, + "sha256": "106ca931a22730ab5340a8d56b651f435fb10b061a6d7d3bf2e5e66bb49a9331" }, { "path": "package/dist/adapters/tui/application-ui-controller.js.map", - "size": 11102, - "sha256": "4dfe3043f2094b2307f8a5a306eefa58f909a80d0c3eebc563c8df6d483092fa" + "size": 11138, + "sha256": "060e52d425f6a38e18ec860a48278fc3c9942383b13c4e8dbe841b83968fb174" }, { "path": "package/dist/adapters/tui/native-terminal-transport.d.ts", @@ -2297,18 +2297,18 @@ }, { "path": "package/dist/adapters/tui/ui-capabilities.d.ts.map", - "size": 451, - "sha256": "21e370292ea6426ebf9f2b76778346c7b44dde5b18bdde7dac6886a45a56535f" + "size": 450, + "sha256": "7f6bebf11743178cb7833e4c5203fcc12195818c0146448645f77e7be858f996" }, { "path": "package/dist/adapters/tui/ui-capabilities.js", - "size": 12129, - "sha256": "8c474ca2bec8dfd7c30bb01da355890dbb5308d855a6a10308d429c82c620b5b" + "size": 12165, + "sha256": "9082687941171169c4b83ee93040f5668d38f0b2ca3e78e1ac6fd92da8cb8e55" }, { "path": "package/dist/adapters/tui/ui-capabilities.js.map", - "size": 9042, - "sha256": "7e6058230d6f6f2fa86c0388b65c7c7bda3d8d959e1c5c35e425cf2df0fed471" + "size": 9005, + "sha256": "6e4695146200330c551f804f082a64c638aaeb0761b210f4e322e2c407500d46" }, { "path": "package/dist/adapters/tui/ui-command-dispatch.d.ts", @@ -2318,17 +2318,17 @@ { "path": "package/dist/adapters/tui/ui-command-dispatch.d.ts.map", "size": 453, - "sha256": "06da5a36448ade425152b32fc0f0e8178d8c2fd16010f3705da78149f5a99037" + "sha256": "414b832a6c5cac476de6e0e81a6e52515b462f205e3b190cbef2d29239ec6f15" }, { "path": "package/dist/adapters/tui/ui-command-dispatch.js", - "size": 6020, - "sha256": "a704c3a0a6d76f2142b0fbc39874e6993c2e2ac385e8fa49ded3f9cb9a1c31c8" + "size": 6201, + "sha256": "72006e6e4f8b9ae8312326452e6465c84284c02296c64359b6c9e67bd6915af4" }, { "path": "package/dist/adapters/tui/ui-command-dispatch.js.map", - "size": 5657, - "sha256": "083db6dcc0493668160d68edfc5a70733baeb89a08cc2a2172e02ba18be52fd5" + "size": 5857, + "sha256": "2a5667a20159ce792307bf626f773d2b758750896c167c6926f382abac5bd285" }, { "path": "package/dist/adapters/tui/ui-conversation-dispatch.d.ts", @@ -2638,17 +2638,17 @@ { "path": "package/dist/adapters/tui/ui-view-model.d.ts.map", "size": 658, - "sha256": "76f92fa5707e0f79ecb8caee70ae2fe6c0d3327a5bb4e3900bb771620ba4ada9" + "sha256": "c97a7ca1e1f9c9a972ebdd29e7e200b0db50a032be875b4085fe7407209ae348" }, { "path": "package/dist/adapters/tui/ui-view-model.js", - "size": 9153, - "sha256": "9324ce3505f2472123ae0620c4bd97b43b57fe172dc0817b1ecdbcf8c51b45ed" + "size": 10498, + "sha256": "1b6599553ca5433c881d242328386961fc956629cd9f138179d03ed79d19289b" }, { "path": "package/dist/adapters/tui/ui-view-model.js.map", - "size": 8209, - "sha256": "35eab179b7c594f91fff439d52600cfbfd3c4e8f316df9445b7b62cd48bdf498" + "size": 9149, + "sha256": "a017074f2412f50ac650da23c4d6d17e0151f776dffc215b45e7468ef860c787" }, { "path": "package/dist/app/action-host.d.ts", @@ -3152,23 +3152,23 @@ }, { "path": "package/dist/app/application-interaction-actions.d.ts", - "size": 2180, - "sha256": "d7a87bb56136aff00f9b490b5197fbf9be5aa65e67b01cd76278631909347dd3" + "size": 2384, + "sha256": "3b7830b22174bab036eedc2cb04d3b0fd2a9075b4fffcaabeadd817105d12118" }, { "path": "package/dist/app/application-interaction-actions.d.ts.map", - "size": 1898, - "sha256": "87f9addde127ab68d4158a7da17a801e717ef61d7b21283687e93388b53f84da" + "size": 2044, + "sha256": "43381e5b42efffe2119e3cbba926d925fdeab5f5a2e76415f38905fea63d4d97" }, { "path": "package/dist/app/application-interaction-actions.js", - "size": 4257, - "sha256": "7cf4bfb5c00aaa9e94e173b80a002bdb0ed25b156325e6fb3beeb3ba8329617a" + "size": 5130, + "sha256": "32186b2ffc838cf5d13430bc74c90d95d5f0035b9bfacf07d61bd7992901560a" }, { "path": "package/dist/app/application-interaction-actions.js.map", - "size": 3825, - "sha256": "acc6893b6815a9aa185f0f422bd5150474046492ce34408d24db714333125bee" + "size": 4697, + "sha256": "3be628a2b461231bb27c2cd576915cf3de5a91959e9de765e99c95116baa9e87" }, { "path": "package/dist/app/application-lifecycle.d.ts", @@ -3358,37 +3358,37 @@ { "path": "package/dist/app/application.d.ts.map", "size": 3853, - "sha256": "9a784c4b1e331e661ac380b637544c4c0e88b4ec1baf1faeb603773fae54e890" + "sha256": "d294409ae6df260e02bb00e34e161166432393c75d13f99701c95326188e8b7f" }, { "path": "package/dist/app/application.js", - "size": 24731, - "sha256": "b29577aa4aa0b43ac75b9aeef61a91a4e66829000bd8a663c329a96d9239c949" + "size": 25564, + "sha256": "7b68a6ec8e3f620f5940cbf6fc8365b42c6244d0129fdf17f818d3fd3d61f825" }, { "path": "package/dist/app/application.js.map", - "size": 22860, - "sha256": "b1d075f071bdc9dad6e8faf1ef1669502e9d4bdce3a0e0148b903c9599ac5bb4" + "size": 23539, + "sha256": "ac47f7c0561a74e7e781d15895bab9d1a55dd5c4b21f212c15d0fbb38137c6f8" }, { "path": "package/dist/app/automation-actions.d.ts", - "size": 3715, - "sha256": "37739bafa0995265728a5bbce88b40a3e1b10b579540fac3235198a043799c87" + "size": 4016, + "sha256": "1fa2f19b84e399a0982212914cdccc5572910fd7d5e859460fa015d53a6679b1" }, { "path": "package/dist/app/automation-actions.d.ts.map", - "size": 3439, - "sha256": "6d00829165d51a1d5185b4b86d612b4b12968747c2f3c6fd701e93b19cca315d" + "size": 3638, + "sha256": "bc50526b9191e6b43ed3545d55ecdbc7c25f7b3c09cdf320a66a7a4d9d274b2b" }, { "path": "package/dist/app/automation-actions.js", - "size": 6446, - "sha256": "fb12733c4c533075cffc463618c4f52e88dc39158f94725175f31fd73cd12ce5" + "size": 6789, + "sha256": "7c8735923e7d7261f8c13f2963b9275993a6e2690684b6484888ac85d930e65d" }, { "path": "package/dist/app/automation-actions.js.map", - "size": 5978, - "sha256": "7900f82f7a4c4c292429ddb1023de22d1c2574ba5369b22bf7c710837670399e" + "size": 6236, + "sha256": "c84f76fb42e51f8af3d9f19a99fc0331e02c5744c1dec3e4855497587cd4682a" }, { "path": "package/dist/app/automation-matching.d.ts", @@ -3802,13 +3802,13 @@ }, { "path": "package/dist/app/conversation-branch-effects.js", - "size": 38435, - "sha256": "3fe2fc5ed338092c8e6c514516a8139118d222a9358e806d80763a384ecb59a0" + "size": 39113, + "sha256": "90ab46c598fbb8c3b05dbb9efc894df64394e0fb0d0823b427adc9446b515ff7" }, { "path": "package/dist/app/conversation-branch-effects.js.map", - "size": 32858, - "sha256": "90f06900bab6b119b0271fe4c547d1ef05b30294d3fcd7f35e2f044cad99da89" + "size": 33309, + "sha256": "32aaa058cc97e885741beb4dd440b844fdfedd3c4aa0eb32d1131a61689dbd95" }, { "path": "package/dist/app/conversation-branches.d.ts", @@ -3818,37 +3818,37 @@ { "path": "package/dist/app/conversation-branches.d.ts.map", "size": 881, - "sha256": "fd384f809f03e657bd0f6e1a8de117c61235a4479274d4f735de563769e5975c" + "sha256": "8b7c492f3c9c558cdc1332da10721b23d69c00feb3763a56519a12107364b463" }, { "path": "package/dist/app/conversation-branches.js", - "size": 22025, - "sha256": "027d9c8c21078a0a5c68fea534c34366cfbe8ea78448ae7345ae97183fd6ae60" + "size": 23468, + "sha256": "457a9a204845a9808bdab75de5aed76cd5da7cae928a58fb92de23cb4bb11067" }, { "path": "package/dist/app/conversation-branches.js.map", - "size": 20407, - "sha256": "e05fbb5d87dcc177f9cd097bdeed4f86bdc5350b40f07028d529e01fb2d7bf65" + "size": 21865, + "sha256": "9d6092f88338cc3d2eef069bc879941ee10732335e97565031f551dc08b4c305" }, { "path": "package/dist/app/conversation-composition.d.ts", - "size": 1004, - "sha256": "2e126fda2d102d889a0e74578df76f3230a03b9dcd01960c41452135fb25c2f0" + "size": 1099, + "sha256": "1c1915539df6319fa382339a42375e973c7be06ad7b05847654856c16e7eab04" }, { "path": "package/dist/app/conversation-composition.d.ts.map", - "size": 1040, - "sha256": "daf280381fada65c0b2a7e012b62839b4c9066797f8d6fae00c575cfdeb527da" + "size": 1118, + "sha256": "6387d0e025ba9e0225d98f9417816bc2ea21b5791dd08c88a0339f6fa4f3799e" }, { "path": "package/dist/app/conversation-composition.js", - "size": 1545, - "sha256": "7d63826fb75d5ce71716cc437a1fecea3bc2494491a9ecdbe852af810feca87f" + "size": 1621, + "sha256": "2e8d086669f5e055de77b93fd8c8767564bf4827f05ef4e19e42336ced7e7c7f" }, { "path": "package/dist/app/conversation-composition.js.map", - "size": 1270, - "sha256": "8bbcce036b085f2bd4ad5b38908520a88573ca87beb5ef88618180e402776a15" + "size": 1387, + "sha256": "61e40027f65e1ea131382291aefeea4aa5270460bad2eeba581343a428556c52" }, { "path": "package/dist/app/conversation-context.d.ts", @@ -4172,13 +4172,13 @@ }, { "path": "package/dist/app/conversation-types.d.ts", - "size": 5210, - "sha256": "487b36073d5f0e95af679b740138a2c535c40d3e47cd2a4f7522fae72be162be" + "size": 5334, + "sha256": "ae370c58f4e1061056b5acd911a692f5759472e02d420bacd46fd34ca9477068" }, { "path": "package/dist/app/conversation-types.d.ts.map", - "size": 5032, - "sha256": "c31d802245a75393cb546ccabf2e2b44eb00474b501003ca94b91b07e362cc6a" + "size": 5106, + "sha256": "b8c70b8be74825f19cab057507fca091e8af2d9b12a23838e87b9888e7449b15" }, { "path": "package/dist/app/conversation-types.js", @@ -4418,17 +4418,17 @@ { "path": "package/dist/app/interaction-controller.d.ts.map", "size": 1551, - "sha256": "5ad3cbc894cf58b163671ba75bd76d338c43f6f3a8f0dab0b9dde8b83510ded4" + "sha256": "adba7f01cb6ddd581c6bcd939f63ce0ac476e66309002eea78188c6ec5823617" }, { "path": "package/dist/app/interaction-controller.js", - "size": 10246, - "sha256": "dfe94de01bbd3637ca3808d66905781d2eda8a09bac91168c48eca39deba5b43" + "size": 12447, + "sha256": "581f5a37e45141e2afd5ad69f1ad4c3ca52b6069af2e30db48ea0d7c6009abea" }, { "path": "package/dist/app/interaction-controller.js.map", - "size": 8916, - "sha256": "2579edad54af54df7a6fb74861c9f2eb4a5e5d3a59a48df974fb7e00a71e292e" + "size": 10741, + "sha256": "4c92f41d0ea8744ca619df8ec995fa311aed37ffa496d9b967526bd86dbd6a8e" }, { "path": "package/dist/app/interaction-effects.d.ts", @@ -4472,23 +4472,23 @@ }, { "path": "package/dist/app/interaction-response-replay.d.ts", - "size": 1532, - "sha256": "1208a9709e4831147851fd9799a242849d6240d060796377ce073d8ea6f48c45" + "size": 1843, + "sha256": "538012620d87dc47c9eb0f48b06b1fdab50adc2790a78cdb3c422c20b810ef71" }, { "path": "package/dist/app/interaction-response-replay.d.ts.map", - "size": 1276, - "sha256": "053109a236ba17ee225bfcb5bbaba0384ff20753c63d6aee43ee6ea6bf39eea5" + "size": 1545, + "sha256": "2cdb6c2cc5671444c2f947985d33faeb0ee63cd42642db9d572bed94dceef5c7" }, { "path": "package/dist/app/interaction-response-replay.js", - "size": 2642, - "sha256": "9e27caf4629c653be4bbb7ce4d6cd2c97f13391805853fe146515ff776aae31c" + "size": 3074, + "sha256": "9ff7beaa572bb97392f248e95f645ce355bb533396820900178fd1cf0d647905" }, { "path": "package/dist/app/interaction-response-replay.js.map", - "size": 2355, - "sha256": "ab4128db2067e7d7a721ea1aac2f438878c8fe4a1e6f6d312d755403e7018a5b" + "size": 2768, + "sha256": "f515292bd5351a768ccc3af2a0f202be88189a37a7372b8d93bd01c355ecb397" }, { "path": "package/dist/app/interaction-response.d.ts", @@ -4890,6 +4890,26 @@ "size": 1886, "sha256": "fb0b5c2356c14a5a4336662dd10c0af8304041bc8ab332e63fb127348a649304" }, + { + "path": "package/dist/app/run-admission-context.d.ts", + "size": 177, + "sha256": "752b8e5d4b9424c5e7363e087cd11776cc4521bfe323649260b484b3f6421eec" + }, + { + "path": "package/dist/app/run-admission-context.d.ts.map", + "size": 246, + "sha256": "12673f5a8fee8e43b1230ec98453597efb6b74a80256fb88063b357b924e2998" + }, + { + "path": "package/dist/app/run-admission-context.js", + "size": 4731, + "sha256": "c754e6c05f025c03c50331de644175e28a68c7f61554fe2c6bd7a8987a6336f1" + }, + { + "path": "package/dist/app/run-admission-context.js.map", + "size": 3485, + "sha256": "f074a3930fe126a1d8fff06d2451cc9bbcbba5808e89402046861800d53a5faf" + }, { "path": "package/dist/app/run-admission-continuation.d.ts", "size": 418, @@ -4972,23 +4992,23 @@ }, { "path": "package/dist/app/run-admission-validation.d.ts", - "size": 1990, - "sha256": "1ef91ca040803e8bda1062abaab69b1f5202131a3fab45e870ed785d2d75df30" + "size": 1987, + "sha256": "0553c4087ef012996022364ca87f0ece6e0a51afbfc550907d211a778c40f9ac" }, { "path": "package/dist/app/run-admission-validation.d.ts.map", - "size": 1642, - "sha256": "6a785bb4d1142d9aaa566d4789da2b62fedd275e03715ccef63976bb84bb306a" + "size": 1631, + "sha256": "0334746cb7b10d06f3388fa78749a447cb282a0e06d1a1bb7e6821074cb011ae" }, { "path": "package/dist/app/run-admission-validation.js", - "size": 8249, - "sha256": "60a7ac71e828a15c59175c8152c56aaed2017eee13da17e788f8e3c8014dbea8" + "size": 6665, + "sha256": "2e61d32b541ce4c7657c54e4ff143979ca64672c603397ca0777e1c1a82321a1" }, { "path": "package/dist/app/run-admission-validation.js.map", - "size": 6235, - "sha256": "2fe5e5212718861125f2f7b7cff22baaec0b1598bfeacfd3a9dd0946b23d8fa2" + "size": 5183, + "sha256": "e34f856159925356107be43c45617ce710bf2cf1da10d278ee7f3c2ed88b90f2" }, { "path": "package/dist/app/run-admission.d.ts", @@ -5058,17 +5078,17 @@ { "path": "package/dist/app/run-event-mapper.d.ts.map", "size": 897, - "sha256": "fb035c20916bb472ca3facfe0d2c174220579968f65fb61361355cb6298c7732" + "sha256": "484486a3d23c8c843f62296528144b1c535c3763f9cf6944ffd6d067bed517c5" }, { "path": "package/dist/app/run-event-mapper.js", - "size": 19357, - "sha256": "3d6ba556db16119d3abcae83d19e4383ed0cd66ce6aee5712e61c4b4702c4506" + "size": 19619, + "sha256": "313122f3706a4d44a71764b2db28ee3fa201ee290ade1b308ab07a96afdd896e" }, { "path": "package/dist/app/run-event-mapper.js.map", - "size": 17578, - "sha256": "93036b4ad23d9ad86c26159474b845386cdf93de9849e01af754d1f3d7d313c8" + "size": 17823, + "sha256": "0a0af3c66d9c4a1d7454b2589481c381f72b76ab654470160ed9bccd99ba28f5" }, { "path": "package/dist/app/run-execution-snapshot.d.ts", @@ -6510,6 +6530,26 @@ "size": 484, "sha256": "7391b6f6bd8a5a5742d616166d083d5436bd9aa91e2a0432f5a9614edba8217e" }, + { + "path": "package/dist/domain/interaction-identity.d.ts", + "size": 283, + "sha256": "09a46875c243a0bdd47ac0c5d2e1e5179bf7a4b4e6a66fe39374f1cd214a744e" + }, + { + "path": "package/dist/domain/interaction-identity.d.ts.map", + "size": 280, + "sha256": "fbb6245df9a043ed30a81de09a4381dc02486d86b092dad9f963d76ff8a49a5e" + }, + { + "path": "package/dist/domain/interaction-identity.js", + "size": 409, + "sha256": "9f465a89647c327489a300634bd9aa97d97a6984972d55bea4e07f54a3b19345" + }, + { + "path": "package/dist/domain/interaction-identity.js.map", + "size": 417, + "sha256": "69afaca5dac62c00281207c36b88a117b55a5bc8b73cd3252dfcf91046698c36" + }, { "path": "package/dist/domain/interaction-timeout.d.ts", "size": 238, @@ -6612,23 +6652,23 @@ }, { "path": "package/dist/domain/invariants-retained-admission.d.ts", - "size": 184, - "sha256": "560a968e0434eeaa5e624b972be2bb33975a7b3ed77c115c682c0afd80f21e11" + "size": 297, + "sha256": "302548e040b6ee65dc8e8cd644b2460cd5ab59e7b993cbf3114941cf0528298d" }, { "path": "package/dist/domain/invariants-retained-admission.d.ts.map", - "size": 264, - "sha256": "24b0a1be99a020e3b8fb9d9145ae2a6df1afe708557913a9021146022174ee4a" + "size": 360, + "sha256": "c5885e4bcdc735b4656233f91f094caa423f3d05c1f34c78e0cc9588d9f0e08d" }, { "path": "package/dist/domain/invariants-retained-admission.js", - "size": 5651, - "sha256": "a61ed657d980322480803298e8cba2890d570cf58708f6da41a1a8d4375a7d10" + "size": 6235, + "sha256": "a526a07ca250e3da6538d835ca057708d17e795ddfe83624eaad98285797fce1" }, { "path": "package/dist/domain/invariants-retained-admission.js.map", - "size": 4179, - "sha256": "7095e7515f52143dc637c13a02fce5f34e1e48bc6c2c764058d1f782cb335cf3" + "size": 4642, + "sha256": "0e92fb47a8658b3f6a894cc20f47e8a48a5632df4ef8716f4f5d7595bbb87fa3" }, { "path": "package/dist/domain/invariants-run.d.ts", @@ -6638,17 +6678,17 @@ { "path": "package/dist/domain/invariants-run.d.ts.map", "size": 371, - "sha256": "afea0600b1efaa4bd3dbb502fa091249b9eb6cc7acd8a2327d051c6c6d4a037a" + "sha256": "657f6e5b008ab91deae19d31865166224c273467e6645bb2ba6ba030d12b1f1f" }, { "path": "package/dist/domain/invariants-run.js", - "size": 20681, - "sha256": "43946040b904e4fb5fa278c4f13855f9c6a2c9e05d3bdc25cc147f63a4892ecd" + "size": 21900, + "sha256": "182d6ea2210e583a50b09a8bcb2ad9c076f8697c1fe187c52f1740511ce82bee" }, { "path": "package/dist/domain/invariants-run.js.map", - "size": 17057, - "sha256": "615b2454bb56f1ea14dec4d520f33c5f43b9f5bb3001d8023e6e40aa879a545b" + "size": 17827, + "sha256": "6b926edf29234aff5ffd7e373d8d1127a05d5450adf55cca0bee33d2ac8dc2ad" }, { "path": "package/dist/domain/invariants-runtime.d.ts", @@ -6718,17 +6758,17 @@ { "path": "package/dist/domain/legacy-interaction-snapshot.d.ts.map", "size": 353, - "sha256": "2c67779b813049b42fd0b667552a236ecb6a411cba930224b59637e5e251da50" + "sha256": "1ccf5275190643dc9168b2e2b5caea1de3a91c998fb9a314696e898b44649a91" }, { "path": "package/dist/domain/legacy-interaction-snapshot.js", - "size": 9908, - "sha256": "cec7c8883ea249864397de278c1cf932263a76758f08cacba51a126e3963b0ce" + "size": 12861, + "sha256": "8a87d1d19c830f07ca626e2cfe1f9f18e53c4f74e0594217485f27f48751818a" }, { "path": "package/dist/domain/legacy-interaction-snapshot.js.map", - "size": 9130, - "sha256": "102a4fb92d2d300fe6facd27e7daf6c0a29044901db3f7b2fb9114e40f4192ed" + "size": 11592, + "sha256": "661f01b05724a161219d1edc93c19ec797b30d0fedb94a8035008380d4b87937" }, { "path": "package/dist/domain/materialization-receipt.d.ts", @@ -6998,17 +7038,17 @@ { "path": "package/dist/domain/reducer-interactions.d.ts.map", "size": 548, - "sha256": "37d8217d111babd3a98f4771482d8ea6089f973807e4908b7ff297b488575f46" + "sha256": "7526cade8824f8d70a2b24c32e7dceffa97d34f9366642a73ba42573556f758d" }, { "path": "package/dist/domain/reducer-interactions.js", - "size": 16145, - "sha256": "ea6d5c31f24b7994159e672ec11b9f9530138d0c15876bef6ff37e9802df5378" + "size": 16900, + "sha256": "e47f2dd64071af33bbbd7b3b72cedaca168c36bec0afdf89140179331d65ce59" }, { "path": "package/dist/domain/reducer-interactions.js.map", - "size": 13963, - "sha256": "f793e13bd3ed24f8182a8772f2f351a157d9c582ca46d05989bb370b17ecedc9" + "size": 14564, + "sha256": "62d0b272996d54381f4d6fae3e67c57c1c363ca5a0359368e60bcd161ccb88ce" }, { "path": "package/dist/domain/reducer-legacy.d.ts", @@ -7038,17 +7078,17 @@ { "path": "package/dist/domain/reducer-lifecycle.d.ts.map", "size": 579, - "sha256": "44d69ce041b44edd22fe002fd2efd7797289b99a78e74d1aa8ec43223551afb1" + "sha256": "7d004156ee96a992b16f65e8c2eeaf6c34897aab4a5231a64b9404c42de3a19d" }, { "path": "package/dist/domain/reducer-lifecycle.js", - "size": 13485, - "sha256": "b0986911a30948b59dd5d85c66b79ab0bac9f27e7966bcd776d8b97a149e7c75" + "size": 13181, + "sha256": "c06858650f629aac3b98240319bbc146ba82ed0b048aed6587874cdf462a78ce" }, { "path": "package/dist/domain/reducer-lifecycle.js.map", - "size": 12104, - "sha256": "1b8bad21c0aae619889009216ac4bc7d2e457893a5879725a9c23deb235e5552" + "size": 11869, + "sha256": "c681c39218ad49906e0617a20b2cc8788213276fc148dae052be1abf56abf4c6" }, { "path": "package/dist/domain/reducer-replay.d.ts", @@ -7272,13 +7312,13 @@ }, { "path": "package/dist/domain/runtime-projection.d.ts", - "size": 3778, - "sha256": "ef93a64d4564f747080cf590c7b555420e0115bb3f1f0934f7efd322cca7fbc8" + "size": 3942, + "sha256": "f09766b7912297ae97375b4e5be898bbd6436dee7c1902f9a25aea211ecacf4d" }, { "path": "package/dist/domain/runtime-projection.d.ts.map", - "size": 3585, - "sha256": "68f227cedc2c7fcdf70c5e990600521da8836d4d961110aadc13d995fdb7dc32" + "size": 3661, + "sha256": "2fbd7e32762d8e855c3fe4b1c64dd6a37de45b5de79961e83c3ea387f29dcc27" }, { "path": "package/dist/domain/runtime-projection.js", @@ -7288,7 +7328,7 @@ { "path": "package/dist/domain/runtime-projection.js.map", "size": 591, - "sha256": "b30e32d840ce9393fcd43a44396b8024cf5afb95172a00f9950672c1399b5599" + "sha256": "98d5df282334f49ce0cbe17db0540e2a90347cd3c903ae6e8cc2586c3a56c64a" }, { "path": "package/dist/domain/secret-sanitizer.d.ts", @@ -7312,23 +7352,23 @@ }, { "path": "package/dist/domain/state.d.ts", - "size": 5317, - "sha256": "7942e19d8ad38b04e1653c5dda5ae95ebd459b5e9f4b810152064552c8b726aa" + "size": 5467, + "sha256": "3a01b0f868f018270b14fe2fab8671ed2ce93cac5c0c0917e73d1fe55ae335a0" }, { "path": "package/dist/domain/state.d.ts.map", - "size": 4183, - "sha256": "83517e5060c951e5d9afcc7c13e4e7eebe8a7ba203f84b2811a02e5d7c7fd4ec" + "size": 4251, + "sha256": "03c945a56b011b2f94b803cf97c9dec78e714a41fdd67b73a18a02e22323bd91" }, { "path": "package/dist/domain/state.js", - "size": 3712, - "sha256": "c068e9e9022d405a2f0589e7112457c61bc90c94d386a5402bff3e6a9de388db" + "size": 4103, + "sha256": "76f143030da03107584f316f809e36bd2d6866f50184a16610cb8bebd8741b72" }, { "path": "package/dist/domain/state.js.map", - "size": 3219, - "sha256": "fb548e879d3711fe838646c4c4de1562fed6649bba455ae50afceb5097c4ea69" + "size": 3513, + "sha256": "927675ed093ad3e40b59049802e4bf87e8ce57cd84d9535dcf27529744640ea1" }, { "path": "package/dist/domain/terminal-sanitizer.d.ts", @@ -7732,23 +7772,23 @@ }, { "path": "package/dist/ports/execution.d.ts", - "size": 8790, - "sha256": "69cad4aec400144ae217974d45097c6a9e9b94c66c7a80943db789ddd63fc2eb" + "size": 8869, + "sha256": "c71f2d80aff1eb6c8036f54d8fcf96e497b26ddf39926751a5ff87d01c6b54d7" }, { "path": "package/dist/ports/execution.d.ts.map", - "size": 6422, - "sha256": "d2e0ee3a4ce87f7317cbdfcd80dac5790f02c0942d549b30756837e69324383d" + "size": 6482, + "sha256": "b244da23dcdb4a15199d9b489dc0d257b62460b67380803eab959060c13aac05" }, { "path": "package/dist/ports/execution.js", - "size": 2729, - "sha256": "87523e42b8f90a66752e1a9cdce1729dea7d7f45beab98958df2ca144da7a2ef" + "size": 2805, + "sha256": "98b2e95e30be6491cec750cbbd18ceab980ef81f16874a2b10079512fd2b2c01" }, { "path": "package/dist/ports/execution.js.map", - "size": 2153, - "sha256": "53f370f68983431ef440ef06ca5f98f2598e9bdd352be7d5f1b2ebc4881a49d1" + "size": 2198, + "sha256": "153793809897fe5b20982a487fbb909104c2fe2554a09eaffaccd47686208e06" }, { "path": "package/dist/ports/ids.d.ts", @@ -9762,13 +9802,13 @@ }, { "path": "package/dist/views/tui/profile-compatibility.js", - "size": 3747, - "sha256": "72b84787f400c90a1e71b9fbc1ee2e49b69d2b59b2b27fe77a41bcf7fc833f71" + "size": 3745, + "sha256": "a68eeacd2a5aa0c812701813ad28775742a21cef534cb22eb3737453a9a59327" }, { "path": "package/dist/views/tui/profile-compatibility.js.map", "size": 3225, - "sha256": "2075094ae98e2d8c3321265c986f60a08b2ea7f813d99b5368b7291961eb5647" + "sha256": "1f583f2af60a5e001c5d8c38a0bf4001272f4aea050d1fb15d3193246bab0e54" }, { "path": "package/dist/views/tui/profile-editor-actions.d.ts", @@ -10022,13 +10062,13 @@ }, { "path": "package/dist/views/tui/terminal-identity.js", - "size": 7989, - "sha256": "72bfaf308097163359dfeb169c0618859cd5722b728b7e2cb6b3b580dc3f76c4" + "size": 7988, + "sha256": "e8ceee67e0c7dc36c1c70a6846c33e6b8b257ad39dcbf49b168cb80b72ac4a45" }, { "path": "package/dist/views/tui/terminal-identity.js.map", "size": 8057, - "sha256": "be5a2165a7a9205acef6e1723e6dad4462196af7050c7e376eb9e9404c700292" + "sha256": "6aab0aa6c34a27c6d217eca67ef231eccc940570cb86d696f59603e146799aed" }, { "path": "package/dist/views/tui/terminal-input-controller.d.ts", @@ -10192,11 +10232,11 @@ }, { "path": "package/package.json", - "size": 6069, - "sha256": "b093ec5e7aef60709683e622eab7d50af769c402cbafecc9dd75b1d2b725831f" + "size": 6160, + "sha256": "5b6a72ffdb83769fd440001e817247111413bca8e6feb6eb4ba1c287e4e43ced" } ], - "digest": "d842b2dc20253877c91b19487542984c8c262a1b9bc82ddf744852cffefc49f7" + "digest": "f4b81fe5197fd1478b892a14fa18da61ccbe0053a5466f38f53e5a043be554b0" }, "rpcRecords": 37, "referenceSizes": [ diff --git a/artifacts/verification/w6/raw/transcript-keyboard.cast b/artifacts/verification/w6/raw/transcript-keyboard.cast index 8d505dd9..a5444d3c 100644 --- a/artifacts/verification/w6/raw/transcript-keyboard.cast +++ b/artifacts/verification/w6/raw/transcript-keyboard.cast @@ -1,76 +1,65 @@ -{"version":2,"width":80,"height":24,"timestamp":1788007730,"duration":1.860069,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} -[0.377688,"o","\u001b[?2004h"] -[0.37783,"o","\u001b[>7u\u001b[?u\u001b[c"] -[0.377957,"o","\u001b[?1049h\u001b[2J\u001b[H\u001b[?25l"] -[0.386075,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.386116,"o","\u001b[3A\u001b[2G\u001b[?25l"] -[0.402891,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] -[0.406509,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.406541,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.421933,"i","keyboard-flow-01"] -[0.422003,"i","\r"] -[0.428157,"o","\u001b[15G\u001b[?25l"] -[0.469989,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.528586,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.528636,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.622456,"i","keyboard-flow-02"] -[0.622518,"i","\r"] -[0.627316,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] -[0.627361,"o","\u001b[?25l"] -[0.629265,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G"] -[0.629285,"o","\u001b[?25l"] -[0.645228,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.645273,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[0.699926,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.782789,"i","keyboard-flow-03"] -[0.782843,"i","\r"] -[0.785061,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] -[0.785097,"o","\u001b[?25l"] -[0.787472,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.787484,"o","\u001b[15G\u001b[?25l"] -[0.802793,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.861766,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.943626,"i","keyboard-flow-04"] -[0.943681,"i","\r"] -[0.945643,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.9481,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.948133,"o","\u001b[15G\u001b[?25l"] -[0.96605,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.026643,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.103552,"i","keyboard-flow-05"] -[1.103605,"i","\r"] -[1.107729,"o","\u001b[15G\u001b[?25l"] -[1.124322,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G"] -[1.124384,"o","\u001b[?25l"] -[1.185041,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.264867,"i","keyboard-flow-06"] -[1.26493,"i","\r"] -[1.266737,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.269223,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.288585,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.288634,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[1.349751,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.349941,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[1.425542,"i","keyboard-flow-07"] -[1.425598,"i","\r"] -[1.427694,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-07\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.430478,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.449844,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n"] -[1.4499,"o","\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.514917,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.605856,"i","keyboard-flow-08"] -[1.605908,"i","\r"] -[1.607996,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.610381,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.626771,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.689973,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.690024,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[1.76682,"i","\u001b[5~"] -[1.766874,"i","\u001b[1;3H"] -[1.769673,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.769718,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[1.847511,"i","\u001b[6~"] -[1.847564,"i","\u001b[1;3F"] -[1.850033,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.850069,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[1.860069,"o","\u001b[0m"] +{"version":2,"width":80,"height":24,"timestamp":1788008297,"duration":1.756396,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} +[0.292471,"o","\u001b[?2004h"] +[0.292587,"o","\u001b[>7u\u001b[?u\u001b[c"] +[0.292604,"o","\u001b[?1049h\u001b[2J\u001b[H\u001b[?25l"] +[0.303119,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.30315,"o","\u001b[3A\u001b[2G"] +[0.303156,"o","\u001b[?25l"] +[0.326173,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] +[0.330584,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.330647,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.342254,"i","keyboard-flow-01"] +[0.34235,"i","\r"] +[0.346939,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-01\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.35533,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.378385,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.443399,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.524738,"i","keyboard-flow-02"] +[0.524834,"i","\r"] +[0.529164,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.530742,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.548013,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.599336,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.685218,"i","keyboard-flow-03"] +[0.685312,"i","\r"] +[0.688419,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.690295,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.70698,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.76263,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.846709,"i","keyboard-flow-04"] +[0.846798,"i","\r"] +[0.84927,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.851212,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.867799,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.922685,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.009328,"i","keyboard-flow-05"] +[1.009431,"i","\r"] +[1.012536,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-05\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.014385,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.032045,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.085954,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.172099,"i","keyboard-flow-06"] +[1.172211,"i","\r"] +[1.174371,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.176229,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.193667,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.250526,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.33621,"i","keyboard-flow-07"] +[1.336307,"i","\r"] +[1.34013,"o","\u001b[15G\u001b[?25l"] +[1.356209,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.41324,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] +[1.413318,"o","\u001b[?25l"] +[1.497999,"i","keyboard-flow-08"] +[1.498103,"i","\r"] +[1.500227,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.502393,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.519104,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.576931,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.660355,"i","\u001b[5~"] +[1.66044,"i","\u001b[1;3H"] +[1.665231,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.742854,"i","\u001b[6~"] +[1.742959,"i","\u001b[1;3F"] +[1.746396,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.756396,"o","\u001b[0m"] diff --git a/artifacts/verification/w6/states/active-streaming.json b/artifacts/verification/w6/states/active-streaming.json index c21b2c26..25532094 100644 --- a/artifacts/verification/w6/states/active-streaming.json +++ b/artifacts/verification/w6/states/active-streaming.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 80, @@ -320,7 +320,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-29T12:48:28.135Z", + "occurredAt": "2026-08-29T12:57:55.792Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -697,10 +697,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-18fb4f2ea4315b9485e2f7aa", + "id": "effect-op-terminal-000002-7af8efb4db2aaabf6ec9874d", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "18fb4f2ea4315b9485e2f7aa740a443a630558f65d1a8e4c4e8c4f5142b786bc", + "requestDigest": "7af8efb4db2aaabf6ec9874d6335e0371986dbea87c7625a02693d9a8a91c405", "kind": "send", "status": "pending", "attempt": 1, @@ -719,13 +719,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T12:48:28.135Z", + "occurredAt": "2026-08-29T12:57:55.792Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-aa7ce0df-ffda-4546-a4ba-1dddcb8d605a", + "id": "turn-718fa6f2-257a-4a6f-a893-7e855c481115", "intent": "W6 active streaming", "metadata": { "identity": { @@ -735,11 +735,11 @@ } }, "session": { - "id": "5d959641-1813-4738-a7cf-77a3e1e049c4", + "id": "0f0f50e5-afc1-4a5a-9d07-b8c4898f18db", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T12:48:28.135Z", - "updatedAt": "2026-08-29T12:48:28.135Z", + "createdAt": "2026-08-29T12:57:55.792Z", + "updatedAt": "2026-08-29T12:57:55.792Z", "metadata": "[unavailable]" }, "backend": "router", @@ -761,16 +761,16 @@ }, "execution": { "kind": "request", - "id": "turn-aa7ce0df-ffda-4546-a4ba-1dddcb8d605a" + "id": "turn-718fa6f2-257a-4a6f-a893-7e855c481115" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-aa7ce0df-ffda-4546-a4ba-1dddcb8d605a:attempt:6d56bf67-7908-4ef3-b21b-f44f348d03cc", - "materializationReceiptDigest": "sha256:f350a414fb447652a42c8a9c041fe052fd82cb32b3505571d711202ecc9c934a", - "bindingDigest": "sha256:ad029068d16f85a3e8f5265c2c35413d96b3f0bbbc681ee3fbf937fcc92f2956", + "attemptId": "turn-718fa6f2-257a-4a6f-a893-7e855c481115:attempt:53ca744c-2c49-442e-b2c5-364aad62e0fc", + "materializationReceiptDigest": "sha256:13fb22bcca0e0719404ec0295edc82971091c57a35c0a41d0a341d10360735af", + "bindingDigest": "sha256:0aa5f9d69e44070ede279df98caa1a075448ba0b84f02b533764de7011bfe6b9", "descriptor": { "kind": "router-request", "transport": "http", @@ -782,10 +782,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T12:48:28.133Z" + "startedAt": "2026-08-29T12:57:55.791Z" } }, - "timestamp": "2026-08-29T12:48:28.135Z" + "timestamp": "2026-08-29T12:57:55.792Z" } } } diff --git a/artifacts/verification/w6/states/active-streaming.png b/artifacts/verification/w6/states/active-streaming.png index e33c5ef332db8149676e923ad12dc8df3e48e4f4..96926cb0b5fe23e2a5dcb55a9ea4200c7c19476c 100644 GIT binary patch delta 17 Zcmexd`nhyM4x6Rr#>uM$Hx@No0RT`q2qFLg delta 17 Ycmexd`nhyM4x52&OwiZPjYW-C08WhvDgXcg diff --git a/artifacts/verification/w6/states/analysis.json b/artifacts/verification/w6/states/analysis.json index 30ab5622..4620173e 100644 --- a/artifacts/verification/w6/states/analysis.json +++ b/artifacts/verification/w6/states/analysis.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/analysis.png b/artifacts/verification/w6/states/analysis.png index 8fc317b11f57196fa327938dddceb09c7b83a45c..c2d4a6c86b735fda7aa50a0a458bab986f696bae 100644 GIT binary patch delta 19 bcmbPwf_dr*<_S4$Rvf1je!kdPwD>UqS6&Ia delta 19 bcmbPwf_dr*<_S4$2AZ|c7;QEdEq)9DP%#K) diff --git a/artifacts/verification/w6/states/automation.json b/artifacts/verification/w6/states/automation.json index b023432e..8edb0208 100644 --- a/artifacts/verification/w6/states/automation.json +++ b/artifacts/verification/w6/states/automation.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/automation.png b/artifacts/verification/w6/states/automation.png index c8ac7da5d43f1a433ac9fe9d465d0e0135ec0fed..13f39e5c0be41d2d997c98d99dfa4a29ff3e58bd 100644 GIT binary patch delta 19 bcmdm^ut#CTc1AWU=9o73T2T#?5;f>-hjjs0Psh diff --git a/artifacts/verification/w6/states/command-palette-120.json b/artifacts/verification/w6/states/command-palette-120.json index 813c08f2..0ca7d4e6 100644 --- a/artifacts/verification/w6/states/command-palette-120.json +++ b/artifacts/verification/w6/states/command-palette-120.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 120, diff --git a/artifacts/verification/w6/states/command-palette-120.png b/artifacts/verification/w6/states/command-palette-120.png index 2167c3f3766a649a2476c553b8cf38754efcaf51..9ffafc42bb9489dd1c7e468b5b48e7cc5c39945d 100644 GIT binary patch delta 19 bcmcaMpXu6srU^N0mZm#YpIL1zO6dmxRfPz0 delta 19 bcmcaMpXu6srU^N022zL260|lJrSt;;QHuxD diff --git a/artifacts/verification/w6/states/command-palette-40.json b/artifacts/verification/w6/states/command-palette-40.json index 7a5acee8..88520118 100644 --- a/artifacts/verification/w6/states/command-palette-40.json +++ b/artifacts/verification/w6/states/command-palette-40.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 40, diff --git a/artifacts/verification/w6/states/command-palette-40.png b/artifacts/verification/w6/states/command-palette-40.png index 62f752477a9913eda4ae9ef71f018f9c7a4bb10f..272d2e456e728da016e61ffd9e269cc01099dab4 100644 GIT binary patch delta 17 YcmeD3>hhY9!)9ru=2$#)W6=y1064D(XaE2J delta 17 YcmeD3>hhY9!)73Mxznd!`ArU^N0mL}(wuC3Wv6x9g;RP_j} delta 19 acmX>znd!`ArU^N01`;|JjBFc=qB;Raj3XP1=KKKwRWJz$ delta 19 bcmeDC#oYIcc|s1Gf%fDV2?867=KKKwSLX>D diff --git a/artifacts/verification/w6/states/empty.json b/artifacts/verification/w6/states/empty.json index 9923c091..063b96f1 100644 --- a/artifacts/verification/w6/states/empty.json +++ b/artifacts/verification/w6/states/empty.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/empty.png b/artifacts/verification/w6/states/empty.png index b802da4df9f0882531ac8333966e73951a4ce155..6e719d921209fe2a4f43b62a8e5788c7b84f567a 100644 GIT binary patch delta 19 acmbQHJ56^(F*BQ`d6;&)*yc)RSz!P_69u3E delta 19 acmbQHJ56^(F*BQi^j5=wJ)0|;WrYDlf(B0j diff --git a/artifacts/verification/w6/states/failure-or-reconnect.json b/artifacts/verification/w6/states/failure-or-reconnect.json index 6b3128b0..7f351336 100644 --- a/artifacts/verification/w6/states/failure-or-reconnect.json +++ b/artifacts/verification/w6/states/failure-or-reconnect.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 80, @@ -336,7 +336,7 @@ "title": "event backend_start", "status": "failed", "detail": "sequence 1", - "occurredAt": "2026-08-29T12:48:46.951Z", + "occurredAt": "2026-08-29T12:58:13.794Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -348,7 +348,7 @@ "title": "error", "status": "failed", "detail": "RUNTIME_BACKEND_ERROR", - "occurredAt": "2026-08-29T12:48:46.956Z", + "occurredAt": "2026-08-29T12:58:13.799Z", "sourceEventId": "run-000001:runtime:2", "runId": "run-000001", "entityType": "run", @@ -725,10 +725,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-462ac802b00ea30a3ed5d4cb", + "id": "effect-op-terminal-000002-5e39aac4d18105dd9e577ca7", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "462ac802b00ea30a3ed5d4cb107f6dc44ccd942357d5ba04b4f203fa0ac2f44e", + "requestDigest": "5e39aac4d18105dd9e577ca78326af4faad463c24670308fb8b7aa1361f7054c", "kind": "send", "status": "pending", "attempt": 1, @@ -747,13 +747,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T12:48:46.951Z", + "occurredAt": "2026-08-29T12:58:13.794Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-d61d6cea-2adf-4b9e-a66d-70020a24faa2", + "id": "turn-2769ffcc-98ea-4612-9576-2f322f445d1b", "intent": "W6 failure state", "metadata": { "identity": { @@ -763,11 +763,11 @@ } }, "session": { - "id": "d978c420-6d42-47cd-8bed-95af6eecec90", + "id": "e9bd77a2-9b79-41bf-b5be-854afbff5652", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T12:48:46.951Z", - "updatedAt": "2026-08-29T12:48:46.951Z", + "createdAt": "2026-08-29T12:58:13.794Z", + "updatedAt": "2026-08-29T12:58:13.794Z", "metadata": "[unavailable]" }, "backend": "router", @@ -789,16 +789,16 @@ }, "execution": { "kind": "request", - "id": "turn-d61d6cea-2adf-4b9e-a66d-70020a24faa2" + "id": "turn-2769ffcc-98ea-4612-9576-2f322f445d1b" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-d61d6cea-2adf-4b9e-a66d-70020a24faa2:attempt:599f7801-00f8-4dfc-80cd-2ce3529f8178", - "materializationReceiptDigest": "sha256:4013c3b1e71de4b39d338e69e123a73ce3d46b5e9ca8754f88da8589518a1f18", - "bindingDigest": "sha256:f7147209e049cf0a7eb7c75ff446acbe1c1da1d544058bcea79c5531328b3a4d", + "attemptId": "turn-2769ffcc-98ea-4612-9576-2f322f445d1b:attempt:2c9ef26e-cf70-4224-8b9c-f6442fd1cb0d", + "materializationReceiptDigest": "sha256:d02922ef9799ffd4d065649684bb2ae79b30b5ad6494dbf96a14d331e9ecabb5", + "bindingDigest": "sha256:1c9a2f7c75e37f9bf99cb00ed5bca04871428aa8bdc2bcf7cd6c53261cb4e9e8", "descriptor": { "kind": "router-request", "transport": "http", @@ -810,10 +810,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T12:48:46.949Z" + "startedAt": "2026-08-29T12:58:13.792Z" } }, - "timestamp": "2026-08-29T12:48:46.951Z" + "timestamp": "2026-08-29T12:58:13.794Z" } } }, @@ -826,7 +826,7 @@ "source": { "eventId": "run-000001:runtime:2", "providerSequence": 2, - "occurredAt": "2026-08-29T12:48:46.956Z", + "occurredAt": "2026-08-29T12:58:13.799Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "error": { @@ -845,7 +845,7 @@ "source": { "eventId": "run-000001:runtime:3", "providerSequence": 3, - "occurredAt": "2026-08-29T12:48:46.960Z", + "occurredAt": "2026-08-29T12:58:13.802Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "status": "failed", @@ -869,10 +869,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-462ac802b00ea30a3ed5d4cb", + "id": "effect-op-terminal-000002-5e39aac4d18105dd9e577ca7", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "462ac802b00ea30a3ed5d4cb107f6dc44ccd942357d5ba04b4f203fa0ac2f44e", + "requestDigest": "5e39aac4d18105dd9e577ca78326af4faad463c24670308fb8b7aa1361f7054c", "kind": "send", "status": "failed", "attempt": 1, diff --git a/artifacts/verification/w6/states/failure-or-reconnect.png b/artifacts/verification/w6/states/failure-or-reconnect.png index 0c73907489317eb920e60a7555c8370138d79eea..95937aa08655e5a9acbd07ceb0f7bef04dd862c7 100644 GIT binary patch delta 19 bcmaDfiSf}S#tAuWR(wj#F?Tl>eeeJPPc8@U delta 19 bcmaDfiSf}S#tAuW2KrN4mvC+@`rrWoRGkQI diff --git a/artifacts/verification/w6/states/fork-preview.json b/artifacts/verification/w6/states/fork-preview.json index 4c84f7ff..d47784de 100644 --- a/artifacts/verification/w6/states/fork-preview.json +++ b/artifacts/verification/w6/states/fork-preview.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/fork-preview.png b/artifacts/verification/w6/states/fork-preview.png index 04ed8605b9d1615f750409d5fcba62d97d050ee9..4049b1bffb94a65574269a0c5efd0fe5add26c4c 100644 GIT binary patch delta 19 acmbQ{JI!~42{W4&>(+~{p_{FkW0V0$eFnk+ delta 19 acmbQ{JI!~42{W64YDs{v_+~5S7-axI0tKJ| diff --git a/artifacts/verification/w6/states/graph-or-analysis.json b/artifacts/verification/w6/states/graph-or-analysis.json index 129a0219..f3f643fb 100644 --- a/artifacts/verification/w6/states/graph-or-analysis.json +++ b/artifacts/verification/w6/states/graph-or-analysis.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/graph-or-analysis.png b/artifacts/verification/w6/states/graph-or-analysis.png index 14dea5350d3eff2ae4979d54685ccdca630ddd46..beff85e4bb52c256bcdd19ca127098592c2a1217 100644 GIT binary patch delta 19 bcmZ3uka6Kc#tAuWR%|*quDst^q#pnPPsIo_ delta 19 bcmZ3uka6Kc#tAuW2I{lobgVZP=?4G+NiYWC diff --git a/artifacts/verification/w6/states/interaction.json b/artifacts/verification/w6/states/interaction.json index b6e80077..50f8c62c 100644 --- a/artifacts/verification/w6/states/interaction.json +++ b/artifacts/verification/w6/states/interaction.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/interaction.png b/artifacts/verification/w6/states/interaction.png index 9b2c582209c45d2673e9f71b3ad1b80791ff5c92..86951bb6342da9a7b81c2b0e9f02a39fd8b76889 100644 GIT binary patch delta 19 bcmbR8ka5aG#tAuWR!rJk1-@-8QYrudP_75Y delta 19 bcmbR8ka5aG#tAuW21>6?Zfx0Dq*MR^S3wA% diff --git a/artifacts/verification/w6/states/multi-run.json b/artifacts/verification/w6/states/multi-run.json index fd14ea0a..b555b319 100644 --- a/artifacts/verification/w6/states/multi-run.json +++ b/artifacts/verification/w6/states/multi-run.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 80, @@ -456,7 +456,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-29T12:48:29.997Z", + "occurredAt": "2026-08-29T12:57:57.576Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -468,7 +468,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-29T12:48:30.124Z", + "occurredAt": "2026-08-29T12:57:57.711Z", "sourceEventId": "run-000005:runtime:1", "runId": "run-000005", "entityType": "run", @@ -1022,10 +1022,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000003-b53694b57cbb0cdafda1f884", + "id": "effect-op-terminal-000003-354b13a404335bfa25af0aee", "operationId": "op-terminal-000003", "effectKind": "run.execute", - "requestDigest": "b53694b57cbb0cdafda1f8843907114ccecfe68085e482f961f6a56545fa8a86", + "requestDigest": "354b13a404335bfa25af0aee470c0330e1d69babf4a17dda9bd9ad8fe6f27b0e", "kind": "send", "status": "pending", "attempt": 1, @@ -1044,13 +1044,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T12:48:29.997Z", + "occurredAt": "2026-08-29T12:57:57.576Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-f93868c1-739d-4ee3-8d32-06e90e2ec6b7", + "id": "turn-2a0b3f72-352c-4468-91be-96ce0e9502ca", "intent": "parallel run A", "metadata": { "identity": { @@ -1060,11 +1060,11 @@ } }, "session": { - "id": "ac065684-19f0-47bf-a4bf-d367dbb53c1e", + "id": "3ab968e0-a991-4254-8320-7cdecf4f090c", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T12:48:29.997Z", - "updatedAt": "2026-08-29T12:48:29.997Z", + "createdAt": "2026-08-29T12:57:57.576Z", + "updatedAt": "2026-08-29T12:57:57.576Z", "metadata": "[unavailable]" }, "backend": "router", @@ -1086,16 +1086,16 @@ }, "execution": { "kind": "request", - "id": "turn-f93868c1-739d-4ee3-8d32-06e90e2ec6b7" + "id": "turn-2a0b3f72-352c-4468-91be-96ce0e9502ca" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-f93868c1-739d-4ee3-8d32-06e90e2ec6b7:attempt:69af5d89-4f74-48d7-b45c-10e1f4ff29d9", - "materializationReceiptDigest": "sha256:aa583a818811557ab8472ec061dab6460f082f46186709bbaff763829536a04f", - "bindingDigest": "sha256:4ec0dc8d6cac00f02ff624bc34c164920da5d4f15e0a32c41ac978e68add4a21", + "attemptId": "turn-2a0b3f72-352c-4468-91be-96ce0e9502ca:attempt:1ddc1f6c-3b37-4471-9cdf-1df4153b64ad", + "materializationReceiptDigest": "sha256:b24dde71ea5836c46a6dfd53a380981178af4e54bd4c907420986852770ea257", + "bindingDigest": "sha256:25d1202e69d9d4c9287d9545f4f41655ffbd32cac5bf7d945dfd75d8b3364d8d", "descriptor": { "kind": "router-request", "transport": "http", @@ -1107,10 +1107,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T12:48:29.994Z" + "startedAt": "2026-08-29T12:57:57.574Z" } }, - "timestamp": "2026-08-29T12:48:29.997Z" + "timestamp": "2026-08-29T12:57:57.576Z" } } }, @@ -1360,10 +1360,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000007-e380f2c90027dc906661fbe9", + "id": "effect-op-terminal-000007-925e14a7359350e02503ba59", "operationId": "op-terminal-000007", "effectKind": "run.execute", - "requestDigest": "e380f2c90027dc906661fbe9f44c50a094f00e70a8353cf51a708351d014b1c5", + "requestDigest": "925e14a7359350e02503ba59fc2c1f0443041ab24d81a02404943cece23c3dcf", "kind": "send", "status": "pending", "attempt": 1, @@ -1382,13 +1382,13 @@ "source": { "eventId": "run-000005:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T12:48:30.124Z", + "occurredAt": "2026-08-29T12:57:57.711Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-8a6bbb5a-5bef-49eb-be10-403a4cecec6e", + "id": "turn-72e1b6ee-9e74-4a13-a70a-50d0f444a174", "intent": "parallel run B", "metadata": { "identity": { @@ -1398,11 +1398,11 @@ } }, "session": { - "id": "880e30e5-b5c7-471b-83ff-77dec4f7169e", + "id": "76bc27f8-1247-4431-a222-3924c0202c80", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T12:48:30.124Z", - "updatedAt": "2026-08-29T12:48:30.124Z", + "createdAt": "2026-08-29T12:57:57.711Z", + "updatedAt": "2026-08-29T12:57:57.711Z", "metadata": "[unavailable]" }, "backend": "router", @@ -1424,16 +1424,16 @@ }, "execution": { "kind": "request", - "id": "turn-8a6bbb5a-5bef-49eb-be10-403a4cecec6e" + "id": "turn-72e1b6ee-9e74-4a13-a70a-50d0f444a174" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-8a6bbb5a-5bef-49eb-be10-403a4cecec6e:attempt:7acd6c6a-e578-4d1e-8433-15c8e9284bb2", - "materializationReceiptDigest": "sha256:b4472a6fea16fcdc65e541edb082a387840d5c77f22146313916302d1443b917", - "bindingDigest": "sha256:a77d6c96acb175c76a5cdadfb0e939ee82cda7de45565cbf0e2776b3108ad887", + "attemptId": "turn-72e1b6ee-9e74-4a13-a70a-50d0f444a174:attempt:5dace444-8cb6-4465-b692-ad101d306761", + "materializationReceiptDigest": "sha256:8e3a4854db5f2faee7343323e73e425ca3f91f49a36e3e09c541981d07ef905f", + "bindingDigest": "sha256:9fa3b9a1e018a743a72853bf019a6b0d649a016f1f41f15eca56ea2a7b272c27", "descriptor": { "kind": "router-request", "transport": "http", @@ -1445,10 +1445,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T12:48:30.124Z" + "startedAt": "2026-08-29T12:57:57.711Z" } }, - "timestamp": "2026-08-29T12:48:30.124Z" + "timestamp": "2026-08-29T12:57:57.711Z" } } }, diff --git a/artifacts/verification/w6/states/multi-run.png b/artifacts/verification/w6/states/multi-run.png index 953dd81ebd0179ef8dba72e61679a6db87632656..e1f40bdea554064fb332361e8ef850add8b00a59 100644 GIT binary patch delta 19 bcmaF5pYiE_#tAuWmR1_Gey`qGR2&ZgT@(o& delta 19 bcmaF5pYiE_#tAuW2J)L?rYzl9R2&ZgTipoQ diff --git a/artifacts/verification/w6/states/narrow.json b/artifacts/verification/w6/states/narrow.json index 608e2b3e..f4a743f6 100644 --- a/artifacts/verification/w6/states/narrow.json +++ b/artifacts/verification/w6/states/narrow.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "58a8863510b0af5864fc571b823db50e8e034d7e9a69576195cc748c2202b8fb" + "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" }, "dimensions": { "columns": 40, diff --git a/artifacts/verification/w6/states/narrow.png b/artifacts/verification/w6/states/narrow.png index 8bc58581dae1640220934690b1515acdfd4a12f7..3616c2b9afadc6b072dfd7a27b0d6739a526c555 100644 GIT binary patch delta 17 YcmZ4Pz1(|34x1J4ZZ6*RjYX!a06H!O Date: Sat, 29 Aug 2026 12:17:57 -0600 Subject: [PATCH 069/136] chore(deps): adopt current agent cohort --- docs/04-runtime-contracts.md | 39 ++++++++++--------- package.json | 6 +-- pnpm-lock.yaml | 74 ++++++++++++++++++------------------ pnpm-workspace.yaml | 8 ++-- 4 files changed, 65 insertions(+), 62 deletions(-) diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index 0bc8cce1..70a2e0ca 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -14,20 +14,20 @@ The following published versions were resolved in this worktree, and their insta | Package | Installed version | Braid boundary | | --- | ---: | --- | -| [`@tangle-network/agent-interface`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) | `1.8.0` | Canonical profile, capabilities, environment, stream, portable context, native continuation, and interaction contracts | -| [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.178.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | +| [`@tangle-network/agent-interface`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) | `1.9.0` | Canonical profile, capabilities, environment, stream, portable context, native continuation, and interaction contracts | +| [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.180.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | | [`@tangle-network/agent-eval`](https://github.com/tangle-network/agent-eval) | `0.170.0` | Run records, judges, trace analysts, comparisons, and feedback trajectories | -| `@tangle-network/agent-provider-cli-bridge` | `0.10.0` | CLI Bridge environment adapter with capability discovery, native retained sessions, live streaming, replay, retry-safe turns, retained control, durable interaction response, and explicit cancel | +| `@tangle-network/agent-provider-cli-bridge` | `0.11.1` | CLI Bridge environment adapter with capability discovery, native retained sessions, bounded terminal results, live streaming, replay, retry-safe turns, retained control, durable interaction response, and explicit cancel | | `@tangle-network/agent-provider-tangle` | `0.14.3` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations | | `@tangle-network/sandbox` | `0.34.3` | Tangle cloud client used by the provider, including keyed checkpoint/fork and interactive-agent operations | -The installed runtime publishes `agent-eval >=0.163.2 <0.171.0`, `agent-interface ^1.8.0`, and `sandbox >=0.34.0 <0.35.0` as peer ranges. +The installed runtime publishes `agent-eval >=0.170.0 <0.171.0`, `agent-interface ^1.9.0`, and `sandbox >=0.34.3 <0.35.0` as peer ranges. The installed Tangle provider publishes `sandbox >=0.34.0 <1.0.0` as a peer range. Sandbox `0.34.3` publishes peers `@mastra/core ^1.36.0`, `@modelcontextprotocol/sdk ^1.30.0`, `ai ^6.0.175`, `openai ^6.36.0`, and `viem ^2.0.0`. -Braid exercises Runtime `0.178.0` with interface `1.8.0`, eval `0.170.0`, CLI Bridge adapter `0.10.0`, Tangle adapter `0.14.3`, and Sandbox `0.34.3`. +Braid exercises the exact dependency cohort in the table above. The lockfile pins the registry integrity for every installed package. @@ -35,7 +35,7 @@ The lockfile pins the registry integrity for every installed package. `pnpm outdated --format json` returns `{}` for this worktree. -The Braid root and Runtime peer cohort resolve `agent-interface` `1.8.0` without a workspace override. +The workspace override pins the interface version in the table so Braid and Runtime use one canonical type copy. Historical snapshot: [Agent-runtime issue 803](https://github.com/tangle-network/agent-runtime/issues/803) records the interface peer mismatch fixed in Runtime `0.132.11`. @@ -53,13 +53,14 @@ Braid composes the current provider packages through `agent-runtime` and keeps a The CLI Bridge and Tangle providers remain transport implementations rather than alternate application shells. -Interface `1.8.0` carries requested interactions, portable context transfer, and native continuation on `AgentTurnInput`. +The installed Interface carries requested interactions, portable context transfer, and native continuation on `AgentTurnInput`. The map is not a capability declaration. Braid derives it only after exact per-run environment capabilities are admitted, and sends an explicit empty map when response idempotency is absent or unknown. -Runtime `0.178.0` projects the interaction map into the Sandbox prompt options, and Tangle provider `0.14.3` preserves it through retained dispatch. +The installed Runtime projects the interaction map into Sandbox prompt options. +The installed Tangle provider preserves the map through retained dispatch. The Tangle provider exposes response operations only when the deployment reports `interactions.responseDedupe`; Braid still requires that per-run capability and a real deployment check. @@ -337,7 +338,7 @@ These behaviors may be suitable for isolated benchmark automation under an expli ## Existing CLI Bridge provider contract -The published `@tangle-network/agent-provider-cli-bridge@0.10.0` resolves the bridge model from a turn override, provider default, or profile harness and model. +The installed CLI Bridge provider resolves the bridge model from a turn override, provider default, or profile harness and model. It sends stable `executionId` values as bridge run identifiers when they satisfy the bridge identifier rules. @@ -353,7 +354,7 @@ Stopping a retained stream reader detaches the reader without cancelling the bri Explicit exact cancellation remains separate from reader detach and binds to the server-issued request digest. -Its public turn type accepts requested interactions through Interface `1.8.0`, and its retained turn body carries them to the Bridge. +Its public turn type accepts requested interactions through Interface, and its retained turn body carries them to the Bridge. It reads the exact capability document for one model route from `GET /v1/capabilities?model=…` before it admits a run. @@ -365,7 +366,7 @@ The Braid retained CLI Bridge boundary test catches an interaction posture the r ## Existing Tangle provider contract -The published `@tangle-network/agent-provider-tangle@0.14.3` wraps `@tangle-network/sandbox@0.34.3` as an `AgentEnvironmentProvider`. +The installed Tangle provider wraps Sandbox as an `AgentEnvironmentProvider`. Its default document is an upper bound, not a claim about one client or deployment. @@ -482,10 +483,10 @@ The following historical upstream issues motivated these shared contracts; curre The current published cohort carries the interaction response contract through the shared types and provider adapters, while Braid still gates each action on effective deployment capabilities. -- Interface `1.8.0` publishes the interaction, checkpoint/fork, and interactive-agent contracts. -- Runtime `0.178.0` preserves `AgentTurnInput.interactions` and projects it into Sandbox prompt options. -- CLI Bridge `0.10.0` forwards the requested map and implements the durable response operation ([Agent SDK issue 204](https://github.com/tangle-network/agent-sdk/issues/204)). -- Tangle provider `0.14.3` narrows interaction kinds to the deployment catalog and exposes keyed workspace branching and interactive-agent operations when their deployment flags and methods are present. +- Interface publishes the interaction, checkpoint/fork, and interactive-agent contracts. +- Runtime preserves `AgentTurnInput.interactions` and projects it into Sandbox prompt options. +- CLI Bridge forwards the requested map and implements the durable response operation ([Agent SDK issue 204](https://github.com/tangle-network/agent-sdk/issues/204)). +- The Tangle provider narrows interaction kinds to the deployment catalog and exposes keyed workspace branching and interactive-agent operations when their deployment flags and methods are present. Braid does not cast around these gaps or duplicate provider dispatch. @@ -671,13 +672,15 @@ The provider package maps the bridge surface into the shared environment and run ## Tangle target transport -Sandbox `0.34.3` carries canonical interaction requests in its replayable event stream and accepts canonical responses bound to session, interaction, and operation identifiers when the deployment reports response deduplication. +The installed Sandbox carries canonical interaction requests in its replayable event stream. +It accepts canonical responses bound to session, interaction, and operation identifiers when the deployment reports response deduplication. -Tangle provider `0.14.3` maps that operation into `AgentEnvironment`, `AgentSession`, and Runtime retained run control. +The installed Tangle provider maps that operation into `AgentEnvironment`, `AgentSession`, and Runtime retained run control. Cloud interaction responses must remain valid after Braid reconnect when the sandbox session is still waiting. -Tangle provider `0.14.3` exposes checkpoint and fork requests with caller idempotency keys bound to canonical request digests when the linked Sandbox surface is complete. +The installed Tangle provider exposes checkpoint and fork requests when the linked Sandbox surface is complete. +It binds caller idempotency keys to canonical request digests. Retrying the same key and digest returns the original checkpoint or destination environment, while reusing a key with changed input returns a conflict. diff --git a/package.json b/package.json index a6ae7616..b0a8ab50 100644 --- a/package.json +++ b/package.json @@ -103,10 +103,10 @@ "@earendil-works/pi-tui": "0.84.4", "@napi-rs/keyring": "1.3.0", "@tangle-network/agent-eval": "0.170.0", - "@tangle-network/agent-interface": "1.8.0", - "@tangle-network/agent-provider-cli-bridge": "0.10.0", + "@tangle-network/agent-interface": "1.9.0", + "@tangle-network/agent-provider-cli-bridge": "0.11.1", "@tangle-network/agent-provider-tangle": "0.14.3", - "@tangle-network/agent-runtime": "0.178.0", + "@tangle-network/agent-runtime": "0.180.0", "@tangle-network/sandbox": "0.34.3", "@tangle-network/tcloud-attestation": "0.1.1", "better-sqlite3-multiple-ciphers": "13.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ef902641..b74d2f61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 '@tangle-network/agent-knowledge': 10.8.0 hono: 4.13.0 undici: 7.29.0 @@ -27,17 +27,17 @@ importers: specifier: 0.170.0 version: 0.170.0 '@tangle-network/agent-interface': - specifier: 1.8.0 - version: 1.8.0 + specifier: 1.9.0 + version: 1.9.0 '@tangle-network/agent-provider-cli-bridge': - specifier: 0.10.0 - version: 0.10.0 + specifier: 0.11.1 + version: 0.11.1 '@tangle-network/agent-provider-tangle': specifier: 0.14.3 version: 0.14.3(@tangle-network/sandbox@0.34.3) '@tangle-network/agent-runtime': - specifier: 0.178.0 - version: 0.178.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)(@tangle-network/sandbox@0.34.3) + specifier: 0.180.0 + version: 0.180.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.3) '@tangle-network/sandbox': specifier: 0.34.3 version: 0.34.3 @@ -522,8 +522,8 @@ packages: engines: {node: '>=20'} hasBin: true - '@tangle-network/agent-interface@1.8.0': - resolution: {integrity: sha512-8xp6L/rC58VBcNlq4wgOwwLIFy+XIERlcIWVb4ipGjJLzavIYnuv93wL6QmVcE4w0uLXPF525flBKeFq3dB6fg==} + '@tangle-network/agent-interface@1.9.0': + resolution: {integrity: sha512-HB43+EjiMFYQ+sA4h6FNd1pP81jm6HmOfo5Enfd9FZm0NrTWufK2WbbCUpoGgrnbG1vJv8h/Ly/YevnGTZ5baw==} '@tangle-network/agent-knowledge@10.8.0': resolution: {integrity: sha512-3XJvf5mtAUpT6B1cDAzkbc1tVHhXuC56ZFU/srlecKFceEiZ5CRwH9NouBThbwNGfF8Q0qhTvfQ8fxqT4urEnQ==} @@ -531,29 +531,29 @@ packages: hasBin: true peerDependencies: '@tangle-network/agent-eval': '>=0.170.0 <0.171.0' - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 '@tangle-network/agent-profile-materialize@0.17.1': resolution: {integrity: sha512-Nk/2PhkHndabvT53Wtrpd19V7btcJiJqvWcsUyRMSZQsjwAXDT/v3ipqhV4ysbyDRidAspadpDbo86enx/eExw==} peerDependencies: - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 - '@tangle-network/agent-provider-cli-bridge@0.10.0': - resolution: {integrity: sha512-G4EzQ8UErCFYVU/R0LHc9kjVOadIrrZYecqCX6Az8dlGzKPDRup8niu50EYKjR/VuaUNdmyNxNuWhcRExuPWyg==} + '@tangle-network/agent-provider-cli-bridge@0.11.1': + resolution: {integrity: sha512-KwzNK1iBS9fZ8KgpMS+/wpBQ4EvvNwPJxioraiiJ7lbuosFesrS3v9hJb4R/02+gDNf5z7D/YS4XExc1KtFx7Q==} '@tangle-network/agent-provider-tangle@0.14.3': resolution: {integrity: sha512-4EAfWp+8F3U0UKq/Bu+UIcRbDt2EGf2nY3drtgho37UsAj0KpOh+DykoKNFevlyM179jPutw9CEuvIqSztDTeg==} peerDependencies: '@tangle-network/sandbox': '>=0.34.0 <1.0.0' - '@tangle-network/agent-runtime@0.178.0': - resolution: {integrity: sha512-CltB1+dhcIOVKj+t2jpW4cM7qn8aLuY039RlfssZ+VTID0tBeXJZUa+G9dQIMTMLJA3qn2hxuh2u+dRgwhmnUQ==} + '@tangle-network/agent-runtime@0.180.0': + resolution: {integrity: sha512-/OI/YavBGIF8RgdoS+jXh6OUdJCUySM3meAJqMsGaCsPZ2fnQZANsXCgWi3VGe/zqQE8QN8rIrSO8NATOqFzQw==} engines: {node: '>=22.13.0'} hasBin: true peerDependencies: - '@tangle-network/agent-eval': '>=0.163.2 <0.171.0' - '@tangle-network/agent-interface': 1.8.0 - '@tangle-network/sandbox': '>=0.34.0 <0.35.0' + '@tangle-network/agent-eval': '>=0.170.0 <0.171.0' + '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/sandbox': '>=0.34.3 <0.35.0' peerDependenciesMeta: '@tangle-network/sandbox': optional: true @@ -872,8 +872,8 @@ packages: streamx@2.28.1: resolution: {integrity: sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==} - tar-stream@3.2.0: - resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + tar-stream@3.2.1: + resolution: {integrity: sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==} teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} @@ -1161,7 +1161,7 @@ snapshots: '@tangle-network/agent-core@0.9.5': dependencies: - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 zod: 4.4.3 '@tangle-network/agent-eval@0.170.0': @@ -1169,7 +1169,7 @@ snapshots: '@asteasolutions/zod-to-openapi': 9.1.0(zod@4.4.3) '@hono/node-server': 2.1.1(hono@4.13.0) '@tangle-network/agent-core': 0.9.5 - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 '@tangle-network/agent-trace-contract': 1.0.2 hono: 4.13.0 linear-sum-assignment: 1.0.9 @@ -1178,43 +1178,43 @@ snapshots: transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@tangle-network/agent-interface@1.8.0': + '@tangle-network/agent-interface@1.9.0': dependencies: '@noble/hashes': 1.8.0 spdx-expression-parse: 5.0.0 zod: 4.4.3 - '@tangle-network/agent-knowledge@10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)': + '@tangle-network/agent-knowledge@10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)': dependencies: '@tangle-network/agent-eval': 0.170.0 - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 '@types/proper-lockfile': 4.1.4 proper-lockfile: 4.1.2 zod: 4.4.3 - '@tangle-network/agent-profile-materialize@0.17.1(@tangle-network/agent-interface@1.8.0)': + '@tangle-network/agent-profile-materialize@0.17.1(@tangle-network/agent-interface@1.9.0)': dependencies: - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 - '@tangle-network/agent-provider-cli-bridge@0.10.0': + '@tangle-network/agent-provider-cli-bridge@0.11.1': dependencies: - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 undici: 7.29.0 '@tangle-network/agent-provider-tangle@0.14.3(@tangle-network/sandbox@0.34.3)': dependencies: - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 '@tangle-network/sandbox': 0.34.3 - '@tangle-network/agent-runtime@0.178.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0)(@tangle-network/sandbox@0.34.3)': + '@tangle-network/agent-runtime@0.180.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.3)': dependencies: '@tangle-network/agent-core': 0.9.5 '@tangle-network/agent-eval': 0.170.0 - '@tangle-network/agent-interface': 1.8.0 - '@tangle-network/agent-knowledge': 10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.8.0) - '@tangle-network/agent-profile-materialize': 0.17.1(@tangle-network/agent-interface@1.8.0) + '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-knowledge': 10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0) + '@tangle-network/agent-profile-materialize': 0.17.1(@tangle-network/agent-interface@1.9.0) '@tangle-network/agent-trace-contract': 1.0.2 - tar-stream: 3.2.0 + tar-stream: 3.2.1 optionalDependencies: '@tangle-network/sandbox': 0.34.3 transitivePeerDependencies: @@ -1228,7 +1228,7 @@ snapshots: '@tangle-network/sandbox@0.34.3': dependencies: '@tangle-network/agent-core': 0.9.5 - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 zod: 4.4.3 '@tangle-network/tcloud-attestation@0.1.1': {} @@ -1491,7 +1491,7 @@ snapshots: - bare-abort-controller - react-native-b4a - tar-stream@3.2.0: + tar-stream@3.2.1: dependencies: b4a: 1.8.1 bare-fs: 4.8.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index bccfafbf..6124063b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,5 @@ overrides: - '@tangle-network/agent-interface': 1.8.0 + '@tangle-network/agent-interface': 1.9.0 '@tangle-network/agent-knowledge': 10.8.0 hono: 4.13.0 undici: 7.29.0 @@ -11,12 +11,12 @@ allowBuilds: node-pty: true ignoreScripts: false minimumReleaseAgeExclude: - - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0 || 0.178.0' + - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0 || 0.178.0 || 0.179.0 || 0.180.0' - '@tangle-network/agent-eval@0.143.0 || 0.144.0 || 0.144.1 || 0.144.3 || 0.144.4 || 0.144.6 || 0.144.8 || 0.144.10 || 0.144.11 || 0.144.13 || 0.145.0 || 0.145.1 || 0.145.2 || 0.145.3 || 0.145.9 || 0.145.10 || 0.145.11 || 0.145.14 || 0.145.15 || 0.145.21 || 0.149.0 || 0.163.2 || 0.170.0' - - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0 || 1.7.0 || 1.7.1 || 1.8.0' + - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0 || 1.7.0 || 1.7.1 || 1.8.0 || 1.9.0' - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0 || 10.8.0' - '@tangle-network/agent-profile-materialize@0.10.2 || 0.13.1 || 0.14.0 || 0.14.2 || 0.15.1 || 0.15.2 || 0.17.1' - - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0' + - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0 || 0.11.0 || 0.11.1' - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2 || 0.14.3' - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0 || 0.34.3' - hono@4.13.0 From 4b618dbc13e5b225096cfb4cfdb2b08f2d8cf22a Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 12:21:41 -0600 Subject: [PATCH 070/136] fix(profile): bind cross-runner destination model --- src/app/conversation-branches.ts | 4 ++-- src/app/profile-selection.ts | 14 ++++++++++++-- test/conversation-branch-effects.test.ts | 6 +++++- test/profiles.test.ts | 1 + 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/app/conversation-branches.ts b/src/app/conversation-branches.ts index 26be69f4..1a146534 100644 --- a/src/app/conversation-branches.ts +++ b/src/app/conversation-branches.ts @@ -327,9 +327,9 @@ export class ConversationBranches { ...(input.destinationProvider === undefined ? {} : { destinationProvider: input.destinationProvider }), - ...(targetOverrides.model === undefined + ...(targetProfile.model?.default === undefined ? {} - : { destinationModel: targetOverrides.model }), + : { destinationModel: targetProfile.model.default }), profileDigest: canonicalAgentProfileDigestHex(targetProfile), }) : undefined diff --git a/src/app/profile-selection.ts b/src/app/profile-selection.ts index 1516105e..427a7e93 100644 --- a/src/app/profile-selection.ts +++ b/src/app/profile-selection.ts @@ -72,19 +72,29 @@ function applyProfileOverrides( profile: Readonly, overrides: ProfileRunOverrides, ): Readonly { + const changesRunnerAndModel = + overrides.harness !== undefined && + overrides.harness !== profile.harness && + overrides.model !== undefined + const baseProfile = (() => { + if (!changesRunnerAndModel || profile.model?.provider === undefined) return profile + const model = { ...profile.model } + delete model.provider + return { ...profile, model } + })() const overlay: AgentProfile = { ...(overrides.harness === undefined ? {} : { harness: overrides.harness }), ...(overrides.model === undefined && overrides.effort === undefined ? {} : { model: { - ...(profile.model ?? {}), + ...(baseProfile.model ?? {}), ...(overrides.model === undefined ? {} : { default: overrides.model }), ...(overrides.effort === undefined ? {} : { reasoningEffort: overrides.effort }), }, }), } - const merged = mergeAgentProfiles(profile, overlay) + const merged = mergeAgentProfiles(baseProfile, overlay) if (merged === undefined) throw new Error('AgentProfile override unexpectedly produced no profile') return snapshotAgentProfile(merged) diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts index 9927beb3..e3b2a879 100644 --- a/test/conversation-branch-effects.test.ts +++ b/test/conversation-branch-effects.test.ts @@ -461,6 +461,7 @@ test('cross-runner planning binds the exact destination profile after redaction harness: 'pi', model: { default: 'source-model', + provider: 'source-model-provider', metadata: { apiKey: 'profile-secret', maxTokens: 512 }, }, }) @@ -489,7 +490,10 @@ test('cross-runner planning binds the exact destination profile after redaction const expectedProfile = { ...profile, harness: 'codex' as const, - model: { ...profile.model, default: 'target-model' }, + model: { + default: 'target-model', + metadata: profile.model?.metadata, + }, } assert.equal( plan.portableContextPlan.destination.profileDigest, diff --git a/test/profiles.test.ts b/test/profiles.test.ts index 9a07cfd6..80d8c817 100644 --- a/test/profiles.test.ts +++ b/test/profiles.test.ts @@ -342,6 +342,7 @@ test('selection precedence and run overrides never mutate the source profile', ( assert.equal(effective.mode, 'fast') assert.equal(effective.connectionId, 'next-connection') assert.equal(effective.effectiveProfile.model?.small, fullProfile.model?.small) + assert.equal(effective.effectiveProfile.model?.provider, undefined) assert.equal(command.profile.model?.default, fullProfile.model?.default) assert.equal(effective.compatibility.modelSupported, true) From 9f257c5e92b22c9495de75faef559d1793bc50fa Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 12:21:47 -0600 Subject: [PATCH 071/136] fix(runtime): preserve terminal admission state --- src/domain/reducer-runtime.ts | 44 ++++--- src/views/shared/semantic-projection.ts | 154 +++++++++++++++++++++++- test/domain-reducer.test.ts | 59 +++++++++ test/plain-accessibility.test.ts | 70 +++++++++++ 4 files changed, 308 insertions(+), 19 deletions(-) diff --git a/src/domain/reducer-runtime.ts b/src/domain/reducer-runtime.ts index 39dd5bc8..cec57e78 100644 --- a/src/domain/reducer-runtime.ts +++ b/src/domain/reducer-runtime.ts @@ -3,6 +3,7 @@ import { reduceContentEvent } from './reducer-content.js' import { applyExecutionObservation } from './reducer-execution-observation.js' import { reduceInteractionEvent } from './reducer-interactions.js' import { reduceLifecycleEvent } from './reducer-lifecycle.js' +import { terminalMessageStatus } from './reducer-support.js' import type { BraidState } from './state.js' type RuntimeEventKind = @@ -102,19 +103,15 @@ export function reduceRuntimeEvent(state: BraidState, envelope: BraidEventEnvelo const next = missingHistory.length === timed.missingHistory.length ? timed : { ...timed, missingHistory } const incompleteRuns = new Set(missingHistory.map((range) => range.runId)) - const completedRunIds = new Set( - next.runs - .filter( - (candidate) => - !candidate.complete && - candidate.status !== 'unknown' && - ['completed', 'failed', 'aborted', 'cancelled', 'blocked', 'expired'].includes( - candidate.status, - ) && - !incompleteRuns.has(candidate.id), - ) - .map((candidate) => candidate.id), + const completedRunStatuses = new Map( + next.runs.flatMap((candidate) => { + const messageStatus = completableTerminalMessageStatus(candidate.status) + return !candidate.complete && messageStatus !== undefined && !incompleteRuns.has(candidate.id) + ? [[candidate.id, messageStatus] as const] + : [] + }), ) + const completedRunIds = new Set(completedRunStatuses.keys()) if (completedRunIds.size === 0) return next return { ...next, @@ -123,12 +120,7 @@ export function reduceRuntimeEvent(state: BraidState, envelope: BraidEventEnvelo ? { ...message, complete: true, - status: - next.runs.find((candidate) => candidate.id === message.runId)?.status === 'completed' - ? 'complete' - : next.runs.find((candidate) => candidate.id === message.runId)?.status === 'failed' - ? 'failed' - : message.status, + status: completedRunStatuses.get(message.runId) ?? message.status, } : message, ), @@ -138,6 +130,22 @@ export function reduceRuntimeEvent(state: BraidState, envelope: BraidEventEnvelo } } +function completableTerminalMessageStatus( + status: BraidState['runs'][number]['status'], +): BraidState['messages'][number]['status'] | undefined { + switch (status) { + case 'completed': + case 'failed': + case 'aborted': + case 'cancelled': + case 'blocked': + case 'expired': + return terminalMessageStatus(status) + default: + return undefined + } +} + function withRunTiming(state: BraidState, runId: string, occurredAt: string): BraidState { const run = state.runs.find((candidate) => candidate.id === runId) if (run === undefined) return state diff --git a/src/views/shared/semantic-projection.ts b/src/views/shared/semantic-projection.ts index aac1bb58..f224960d 100644 --- a/src/views/shared/semantic-projection.ts +++ b/src/views/shared/semantic-projection.ts @@ -1,5 +1,6 @@ import type { InteractionRequest } from '@tangle-network/agent-interface' import type { BraidEvent, BraidEventEnvelope, ProviderEventMeta } from '../../domain/events.js' +import type { RunAdmissionReceipt, RunCapabilities } from '../../domain/receipts.js' import type { BraidMessagePart } from '../../domain/state.js' import type { TranscriptPartView } from './models.js' import { boundVisibleText, redactStructuredValue, sanitizeTerminalText } from './sanitize.js' @@ -15,6 +16,19 @@ function safe(value: unknown): unknown { }) } +function safeWithin( + value: unknown, + limits: { readonly maxDepth: number; readonly maxItems: number; readonly maxBytes: number }, +): unknown { + return redactStructuredValue(value, undefined, limits) +} + +function boundedAdmissionText(value: unknown, maxBytes = 4096): string | undefined { + if (typeof value !== 'string') return undefined + const projected = safeWithin(value, { maxDepth: 1, maxItems: 1, maxBytes }) + return typeof projected === 'string' ? projected : undefined +} + function text(value: unknown): string | undefined { return typeof value === 'string' ? boundVisibleText(value) : undefined } @@ -228,7 +242,9 @@ export function projectSemanticEvent( return { ...base, text: text(event.text) ?? '', - admission: safe(event.receipt), + ...(event.receipt === undefined + ? {} + : { admission: semanticAdmissionReceipt(event.receipt) }), status: 'admitted', } case 'run.unknown': @@ -266,6 +282,142 @@ export function projectSemanticEvent( } } +/** Keep stable run identity independent of the size of provider capability data. */ +function semanticAdmissionReceipt(receipt: RunAdmissionReceipt): Readonly> { + const requested = receipt.requested + return { + version: receipt.version, + runId: boundedAdmissionText(receipt.runId) ?? '', + turnId: boundedAdmissionText(receipt.turnId) ?? '', + operationId: boundedAdmissionText(receipt.operationId) ?? '', + conversationId: boundedAdmissionText(receipt.conversationId) ?? '', + branchId: boundedAdmissionText(receipt.branchId) ?? '', + admittedAt: boundedAdmissionText(receipt.admittedAt) ?? '', + profileDigest: boundedAdmissionText(receipt.profileDigest) ?? '', + requested: { + text: boundedAdmissionText(requested.text, 8 * 1024) ?? '', + profile: safeWithin(requested.profile, { + maxDepth: 6, + maxItems: 64, + maxBytes: 12 * 1024, + }), + ...(requested.connectionId === undefined + ? {} + : { connectionId: boundedAdmissionText(requested.connectionId) ?? '' }), + ...(requested.mode === undefined ? {} : { mode: boundedAdmissionText(requested.mode) ?? '' }), + ...(requested.interactions === undefined + ? {} + : { + interactions: safeWithin(requested.interactions, { + maxDepth: 4, + maxItems: 32, + maxBytes: 4 * 1024, + }), + }), + ...(requested.model === undefined + ? {} + : { model: boundedAdmissionText(requested.model) ?? '' }), + ...(requested.runner === undefined + ? {} + : { runner: boundedAdmissionText(requested.runner) ?? '' }), + ...(requested.contextPlanDigest === undefined + ? {} + : { contextPlanDigest: boundedAdmissionText(requested.contextPlanDigest) ?? '' }), + }, + capabilities: semanticRunCapabilities(receipt.capabilities), + ...(receipt.provider === undefined + ? {} + : { provider: boundedAdmissionText(receipt.provider) ?? '' }), + ...(receipt.requestedSessionId === undefined + ? {} + : { requestedSessionId: boundedAdmissionText(receipt.requestedSessionId) ?? '' }), + ...(receipt.environmentId === undefined + ? {} + : { environmentId: boundedAdmissionText(receipt.environmentId) ?? '' }), + ...(receipt.providerSessionId === undefined + ? {} + : { providerSessionId: boundedAdmissionText(receipt.providerSessionId) ?? '' }), + ...(receipt.materializationReceipt === undefined + ? {} + : { + materializationReceipt: safeWithin(receipt.materializationReceipt, { + maxDepth: 6, + maxItems: 64, + maxBytes: 12 * 1024, + }), + }), + ...(receipt.contextTransfer === undefined + ? {} + : { + contextTransfer: safeWithin(receipt.contextTransfer, { + maxDepth: 4, + maxItems: 16, + maxBytes: 2 * 1024, + }), + }), + ...(receipt.nativeContextBoundaryProof === undefined + ? {} + : { + nativeContextBoundaryProof: safeWithin(receipt.nativeContextBoundaryProof, { + maxDepth: 4, + maxItems: 32, + maxBytes: 4 * 1024, + }), + }), + ...(receipt.warnings === undefined + ? {} + : { + warnings: receipt.warnings + .slice(0, 64) + .map((warning) => boundedAdmissionText(warning, 1024) ?? 'PROVIDER_WARNING'), + }), + ...(receipt.admissionStatus === undefined ? {} : { admissionStatus: receipt.admissionStatus }), + requestDigest: boundedAdmissionText(receipt.requestDigest) ?? '', + capabilitiesDigest: boundedAdmissionText(receipt.capabilitiesDigest) ?? '', + ...(receipt.materializationDigest === undefined + ? {} + : { materializationDigest: boundedAdmissionText(receipt.materializationDigest) ?? '' }), + digest: boundedAdmissionText(receipt.digest) ?? '', + } +} + +function semanticRunCapabilities(capabilities: RunCapabilities): Readonly> { + return { + streaming: { + live: capabilities.streaming.live, + replay: capabilities.streaming.replay, + detach: capabilities.streaming.detach, + turnIdempotency: capabilities.streaming.turnIdempotency, + }, + sessions: { + continue: capabilities.sessions.continue, + messages: capabilities.sessions.messages, + }, + controls: { + cancel: capabilities.controls.cancel, + steer: capabilities.controls.steer, + queue: capabilities.controls.queue, + status: capabilities.controls.status, + recreate: capabilities.controls.recreate, + }, + events: { + stableIdentity: capabilities.events.stableIdentity, + sequence: capabilities.events.sequence, + cursor: capabilities.events.cursor, + }, + usage: capabilities.usage, + ...(capabilities.environment === undefined + ? {} + : { + environment: safeWithin(capabilities.environment, { + maxDepth: 6, + maxItems: 128, + maxBytes: 16 * 1024, + }), + }), + } +} + function semanticInteractionRequest( request: InteractionRequest, ): Readonly> { diff --git a/test/domain-reducer.test.ts b/test/domain-reducer.test.ts index 6b9d1748..4005c0a8 100644 --- a/test/domain-reducer.test.ts +++ b/test/domain-reducer.test.ts @@ -1005,6 +1005,65 @@ test('terminal outcomes close every running reasoning and tool part precisely', } }) +test('the final missing provider event restores every terminal message status', () => { + const cases = [ + ['completed', 'complete'], + ['failed', 'failed'], + ['aborted', 'aborted'], + ['cancelled', 'cancelled'], + ['blocked', 'blocked'], + ['expired', 'expired'], + ] as const + + for (const [terminalStatus, messageStatus] of cases) { + const runId = `run-missing-terminal-${terminalStatus}` + const state = replayEvents(initialState(STARTER_PROFILE), [ + envelope({ kind: 'workspace.opened', workspace: '/workspace' }, 1), + envelope( + { + kind: 'run.requested', + operationId: `op-missing-terminal-${terminalStatus}`, + runId, + turnId: `turn-missing-terminal-${terminalStatus}`, + userMessageId: `message-user-missing-terminal-${terminalStatus}`, + assistantMessageId: `message-assistant-missing-terminal-${terminalStatus}`, + text: 'recover the terminal event', + }, + 2, + ), + envelope( + { + kind: 'history.missing', + range: { runId, fromSequence: 1, toSequence: 1, reason: 'provider-missing' }, + }, + 3, + ), + envelope( + { + kind: 'run.finished', + runId, + status: terminalStatus, + finalText: '', + usage: { input: 0, output: 0 }, + provider: { + eventId: `provider-missing-terminal-${terminalStatus}`, + providerSequence: 1, + cursor: `cursor-missing-terminal-${terminalStatus}`, + occurredAt: at, + }, + }, + 4, + ), + ]) + const assistant = state.messages.find((message) => message.role === 'assistant') + + assert.equal(state.missingHistory.length, 0, terminalStatus) + assert.equal(state.runs[0]?.complete, true, terminalStatus) + assert.equal(assistant?.complete, true, terminalStatus) + assert.equal(assistant?.status, messageStatus, terminalStatus) + } +}) + test('incremental and full replay checksums agree for 1,000 generated histories', () => { for (let index = 0; index < 1_000; index += 1) { const suffix = String(index).padStart(4, '0') diff --git a/test/plain-accessibility.test.ts b/test/plain-accessibility.test.ts index 0ae424b9..e231de57 100644 --- a/test/plain-accessibility.test.ts +++ b/test/plain-accessibility.test.ts @@ -5,9 +5,11 @@ import { interactionResponseBinding, } from '../src/app/interaction-request.js' import type { BraidEvent, BraidEventEnvelope } from '../src/domain/events.js' +import { createAdmissionReceipt } from '../src/domain/receipts.js' import type { BraidViewModel, InteractionView } from '../src/views/shared/models.js' import { plainAccessibilityText, plainEventText } from '../src/views/shared/plain-accessibility.js' import { projectSemanticEvent } from '../src/views/shared/semantic-projection.js' +import { interactionResponseRunCapabilities } from './support/run-capabilities.js' const request = createInteractionRequest({ id: 'interaction-plain', @@ -82,6 +84,74 @@ test('semantic projection keeps detached state and only public interaction reque assert.equal(JSON.stringify(interaction).includes('\u0007'), false) }) +test('semantic run admission keeps identity after projecting a full capability document', () => { + const receipt = createAdmissionReceipt({ + runId: 'run-destination', + turnId: 'turn-destination', + operationId: 'operation-destination', + conversationId: 'conversation-destination', + branchId: 'branch-destination', + admittedAt: '2026-08-29T00:00:00.000Z', + profile: { + name: 'Destination reviewer', + version: '1.0.0', + harness: 'codex', + model: { default: 'openai/gpt-5.6' }, + }, + connectionId: 'connection-destination', + text: 'Continue from the accepted context.', + capabilities: interactionResponseRunCapabilities(), + provider: 'cli-bridge', + environmentId: 'environment-destination', + providerSessionId: 'session-destination', + materializationReceipt: { + provider: 'cli-bridge', + runner: 'codex', + model: 'openai/gpt-5.6', + apiKey: 'must-not-appear', + }, + contextPlanDigest: 'sha256:context-plan', + contextTransfer: { + planDigest: 'sha256:context-plan', + sourceRunId: 'run-source', + destinationRunId: 'provider-run-destination', + destinationSessionId: 'session-destination', + acceptedAt: '2026-08-29T00:00:00.000Z', + }, + }) + const payload = projectSemanticEvent( + envelope({ + kind: 'run.requested', + operationId: receipt.operationId, + runId: receipt.runId, + turnId: receipt.turnId, + userMessageId: 'message-user', + assistantMessageId: 'message-assistant', + text: receipt.requested.text, + requestDigest: receipt.requestDigest, + receipt, + }), + ) + const admission = payload.admission as Record + const requested = admission.requested as Record + const contextTransfer = admission.contextTransfer as Record + const controls = (admission.capabilities as Record>).controls + + assert.equal(admission.runId, receipt.runId) + assert.equal(admission.branchId, receipt.branchId) + assert.equal(admission.profileDigest, receipt.profileDigest) + assert.equal(admission.requestDigest, receipt.requestDigest) + assert.equal(admission.capabilitiesDigest, receipt.capabilitiesDigest) + assert.equal(admission.materializationDigest, receipt.materializationDigest) + assert.equal(admission.digest, receipt.digest) + assert.equal(requested.contextPlanDigest, 'sha256:context-plan') + assert.equal(contextTransfer.destinationRunId, 'provider-run-destination') + assert.ok(controls) + assert.equal(controls.cancel, true) + assert.equal(admission.__braidTruncated, undefined) + assert.equal(JSON.stringify(payload).includes('must-not-appear'), false) +}) + test('plain interaction events expose the request needed for a safe decision', () => { const payload = projectSemanticEvent( envelope({ From ba64350ca22969431e5e730aa4fe134c90e4ba97 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 12:21:51 -0600 Subject: [PATCH 072/136] fix(rpc): await retained control completion --- src/views/headless/rpc.ts | 38 ++++++++++++++------- test/rpc.test.ts | 71 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 96 insertions(+), 13 deletions(-) diff --git a/src/views/headless/rpc.ts b/src/views/headless/rpc.ts index e2b6339e..ad45a7d4 100644 --- a/src/views/headless/rpc.ts +++ b/src/views/headless/rpc.ts @@ -175,6 +175,18 @@ export async function runRpc( await closePromise applicationClosed = true } + const trackCompletion = ( + completion: Promise, + onFulfilled?: () => void | Promise, + ): void => { + let tracked: Promise + tracked = completion + .then(() => onFulfilled?.()) + .then(() => undefined) + .finally(() => pendingCompletions.delete(tracked)) + pendingCompletions.add(tracked) + void tracked.catch(() => undefined) + } const trimReplayHistory = () => { while (requests.size > RPC_REPLAY_MAX_ENTRIES || replayBytes > RPC_REPLAY_MAX_BYTES) { const oldest = requests.entries().next().value as [string, RequestRecord] | undefined @@ -349,15 +361,10 @@ export async function runRpc( bufferedEvents = undefined if (admissionState) await respond(admissionState) if (result.completion) { - let tracked: Promise - tracked = result.completion.finally(() => pendingCompletions.delete(tracked)) - pendingCompletions.add(tracked) - void tracked - .then(() => { - if (applicationClosed) return - return respond(stateResponse(controller, request.requestId)) - }) - .catch(() => undefined) + trackCompletion(result.completion, () => { + if (applicationClosed) return + return respond(stateResponse(controller, request.requestId)) + }) } else { await respond(stateResponse(controller, request.requestId)) } @@ -390,7 +397,9 @@ export async function runRpc( } default: { const generic = request as GenericRpcRequest - if (generic.command === 'cancel_run') bufferedEvents = [] + const awaitControlCompletion = + generic.command === 'cancel_run' || generic.command === 'detach' + if (awaitControlCompletion) bufferedEvents = [] const result = await controller.dispatch({ type: 'headless-command', command: generic.command, @@ -416,11 +425,16 @@ export async function runRpc( ...(result.admission === undefined ? {} : { admission: result.admission }), ...(result.data === undefined ? {} : { result: result.data }), }) - if (generic.command === 'cancel_run') { + if (awaitControlCompletion) { + if (result.completion) await result.completion for (const event of bufferedEvents ?? []) await respond(eventResponse(event)) bufferedEvents = undefined - if (result.completion) await result.completion await respond(stateResponse(controller, request.requestId)) + } else if (result.completion) { + trackCompletion(result.completion, () => { + if (applicationClosed) return + return respond(stateResponse(controller, request.requestId)) + }) } break } diff --git a/test/rpc.test.ts b/test/rpc.test.ts index 185af457..ab72bf43 100644 --- a/test/rpc.test.ts +++ b/test/rpc.test.ts @@ -488,7 +488,6 @@ test('JSONL run configuration is replay safe, visible, and reaches Runtime', asy ...DETERMINISTIC_PROFILE, harness: 'codex', model: { - ...DETERMINISTIC_PROFILE.model, default: 'openai/gpt-5.6', reasoningEffort: 'xhigh', }, @@ -692,6 +691,76 @@ test('JSONL cancel interrupts an active send and reports the terminal state', as assert.equal(cancelReplay.outcome, 'accepted') }) +test('JSONL detach retains its completion and reports the detached event and state', async () => { + let releaseStream: (() => void) | undefined + const execution: ExecutionPort = { + capabilities: () => ({ + ...DEFAULT_RUN_CAPABILITIES, + streaming: { ...DEFAULT_RUN_CAPABILITIES.streaming, replay: true, detach: true }, + controls: { ...DEFAULT_RUN_CAPABILITIES.controls, recreate: true }, + }), + async *streamTurn(input) { + yield { type: 'text_delta', text: 'waiting for detach' } + await new Promise((resolve) => { + releaseStream = resolve + input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + }, + detachRun: async (input) => { + releaseStream?.() + return { operationId: input.operationId, outcome: 'accepted', detail: 'detached' } + }, + } + const app = createBraidApplication({ fixture: 'deterministic', execution }) + const responses: BraidResponse[] = [] + const code = await runRpc( + controllerFor(app), + requestInput([ + { + version: 1, + requestId: 'req-detach-init', + command: 'initialize', + params: { workspace: '/workspace', subscribe: true }, + }, + { + version: 1, + requestId: 'req-detach-send', + operationId: 'op-detach-send', + command: 'send', + params: { text: 'detach this active turn' }, + }, + { + version: 1, + requestId: 'req-detach', + operationId: 'op-detach-active', + command: 'detach', + params: { runId: 'run-000001' }, + }, + { + version: 1, + requestId: 'req-detach-stop', + operationId: 'op-detach-stop', + command: 'shutdown', + params: { mode: 'detach' }, + }, + ]), + { write: responseWriter(responses) }, + ) + + assert.equal(code, 0) + assert.ok( + responses.some( + (response) => response.type === 'event' && response.event.kind === 'run.detached', + ), + ) + const state = responses.find( + (response) => response.type === 'state' && response.requestId === 'req-detach', + ) + assert.equal(state?.type, 'state') + if (state?.type !== 'state' || state.projection !== 'full') assert.fail('missing detach state') + assert.equal(state.state.runs[0]?.status, 'detached') +}) + test('RPC and plain shutdown exit at the drain deadline for a never-ending iterator', async () => { for (const mode of ['rpc', 'plain'] as const) { const streamStarted = deferred() From 2ff0c1423bdfb0d898c220700cfe7b21f70cecce Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 12:21:56 -0600 Subject: [PATCH 073/136] fix(storage): retain bounded secret metadata --- src/adapters/storage/sqlite-crypto.ts | 13 ++++++++++++- test/security.test.ts | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/adapters/storage/sqlite-crypto.ts b/src/adapters/storage/sqlite-crypto.ts index ad8f5dd6..137797f2 100644 --- a/src/adapters/storage/sqlite-crypto.ts +++ b/src/adapters/storage/sqlite-crypto.ts @@ -79,6 +79,15 @@ function isSafeInteractionCapabilityFlag(path: string, key: string, value: JsonV ) } +function isSafeEnvironmentSecretNames(path: string, key: string, value: JsonValue): boolean { + return ( + path.endsWith('.environment') && + key === 'secretNames' && + Array.isArray(value) && + value.every((name) => typeof name === 'string' && /^[A-Za-z][A-Za-z0-9._-]{0,127}$/u.test(name)) + ) +} + function secretFieldNames(value: JsonValue): readonly string[] { if (value === null || typeof value !== 'object' || Array.isArray(value)) return [] const fields = (value as Readonly>).fields @@ -195,12 +204,14 @@ export function assertPersistablePayload(value: JsonValue): void { isSafeBooleanTelemetryField(key, child) || isSafeTokenUsageRecord(key, child)) const isSafeCapability = !containsSecret && isSafeInteractionCapabilityFlag(path, key, child) + const isSafeSecretMetadata = !containsSecret && isSafeEnvironmentSecretNames(path, key, child) if ( SECRET_KEY.test(key) && !SAFE_REFERENCE_SUFFIX.test(key) && !isSecretMarker && !isSafeTelemetry && - !isSafeCapability + !isSafeCapability && + !isSafeSecretMetadata ) { throw new StorageError( 'SECRET_PAYLOAD_REJECTED', diff --git a/test/security.test.ts b/test/security.test.ts index 27f3ad08..e2bdc45a 100644 --- a/test/security.test.ts +++ b/test/security.test.ts @@ -900,6 +900,25 @@ test('secret-designated interaction values are rejected before journal persisten credentialKind: 'keychain', }), ) + assert.doesNotThrow(() => + assertPersistablePayload({ + __braidEvent: { + environment: { secretNames: ['OPENAI_API_KEY', 'workspace-token'] }, + }, + }), + ) + assert.throws( + () => + assertPersistablePayload({ + __braidEvent: { + environment: { secretNames: ['not a bounded identifier'] }, + }, + }), + (error: unknown) => + error instanceof Error && + error.name === 'StorageError' && + error.message.includes('Secret-bearing'), + ) assert.doesNotThrow(() => assertPersistablePayload({ inputTokens: 12, outputTokens: 7, reasoningTokens: 3 }), ) From 515b5af81a69c662713ef4f9a4a5d2d38a906fe6 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 12:40:10 -0600 Subject: [PATCH 074/136] feat(bridge): complete retained context workflows --- .../verification/live/bridge/evidence.json | 17258 ++++++++++++---- scripts/live-bridge/config.mjs | 6 +- scripts/live-bridge/constants.mjs | 25 +- scripts/live-bridge/matrix.mjs | 7 + scripts/live-bridge/process.mjs | 18 + .../live-bridge/provider-session-cleanup.mjs | 92 + scripts/live-bridge/release-operations.mjs | 258 +- .../live-bridge/release-proof-validation.mjs | 139 +- .../release-proof-validation.test.mjs | 206 +- scripts/live-bridge/release-proofs.mjs | 63 +- scripts/live-bridge/target-actions.mjs | 50 +- scripts/live-bridge/target-flow.mjs | 35 +- .../runtime/cli-bridge-context-transfer.ts | 65 + .../runtime/cli-bridge-retained-execution.ts | 10 +- .../runtime/cli-bridge-retained-run.ts | 20 +- .../runtime/production-cli-bridge-backend.ts | 130 +- .../runtime/retained-execution-stream.ts | 14 +- src/app/production-composition.ts | 24 +- test/cli-bridge-context-transfer.test.ts | 160 + test/retained-execution-lifecycle.test.ts | 34 + test/scripts.test.ts | 1 + test/support/runtime-bridge-server.ts | 86 + 22 files changed, 14432 insertions(+), 4269 deletions(-) create mode 100644 scripts/live-bridge/provider-session-cleanup.mjs create mode 100644 src/adapters/runtime/cli-bridge-context-transfer.ts create mode 100644 test/cli-bridge-context-transfer.test.ts diff --git a/artifacts/verification/live/bridge/evidence.json b/artifacts/verification/live/bridge/evidence.json index 5c48b0be..685edb92 100644 --- a/artifacts/verification/live/bridge/evidence.json +++ b/artifacts/verification/live/bridge/evidence.json @@ -15,7 +15,7 @@ "excludes": [] }, "optIn": true, - "startedAt": "2026-08-29T00:20:30.312Z", + "startedAt": "2026-08-29T18:31:10.875Z", "runtime": { "node": "v24.18.0", "platform": "linux", @@ -23,19 +23,13 @@ "cwd": "/home/drew/code/.worktrees/braid-10-complete" }, "environment": { - "endpoint": "http://127.0.0.1:3355", + "endpoint": "http://127.0.0.1:3344", "bearerConfigured": true, - "launchRequested": false + "launchRequested": true }, "targetPolicy": { "source": "default:release-runners", "required": [ - { - "key": "claude-code-sonnet", - "label": "claude-code sonnet", - "modelId": "claude-code/sonnet", - "backend": "claude-code" - }, { "key": "glm-5.2", "label": "GLM 5.2", @@ -43,32 +37,33 @@ "backend": "opencode" }, { - "key": "kimi-code-kimi-for-coding", - "label": "kimi-code kimi-for-coding", - "modelId": "kimi-code/kimi-for-coding", - "backend": "kimi-code" + "key": "pi-tangle-router-deepseek-v4-flash", + "label": "Pi with Tangle Router DeepSeek V4 Flash", + "modelId": "pi/tangle-router/deepseek-v4-flash", + "backend": "pi" }, { - "key": "pi-deepseek-deepseek-v4-flash", - "label": "pi deepseek/deepseek-v4-flash", - "modelId": "pi/deepseek/deepseek-v4-flash", - "backend": "pi" + "key": "codex-default", + "label": "Codex default", + "modelId": "codex/default", + "backend": "codex" } ] }, "targets": [ { - "label": "claude-code sonnet", - "target": "claude-code/sonnet", + "label": "GLM 5.2", + "target": "opencode/zai-coding-plan/glm-5.2", "profile": { - "path": ".braid/profiles/profile-claude-code-sonnet.json", - "harness": "claude-code", - "model": "sonnet" + "path": ".braid/profiles/profile-opencode-zai-coding-plan-glm-5-2.json", + "harness": "opencode", + "model": "glm-5.2", + "provider": "zai-coding-plan" }, "connection": { "id": "connection-live-cli-bridge", "kind": "cli-bridge", - "endpoint": "http://127.0.0.1:3355", + "endpoint": "http://127.0.0.1:3344", "credentialConfigured": true }, "providerCapabilities": { @@ -76,7 +71,7 @@ "namedProfiles": false, "systemPrompt": { "replace": false, - "append": false + "append": true }, "instructions": true, "tools": true, @@ -113,6 +108,11 @@ "eventIdentity": true, "cancellationIdempotency": true }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, "workspace": { "read": false, "write": false, @@ -143,44 +143,61 @@ "requests": [ { "version": 1, - "requestId": "init-claude-code-sonnet", + "requestId": "init-glm-5.2", "command": "initialize", "params": { - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4", "subscribe": true } }, { "version": 1, - "requestId": "send-claude-code-sonnet", - "operationId": "op-live-send-claude-code-sonnet", + "requestId": "send-glm-5.2", + "operationId": "op-live-send-glm-5.2", "command": "send", "params": { "conversationId": "conv-1", "branchId": "branch-1", - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK" + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK" } }, { "version": 1, - "requestId": "cancel-send-claude-code-sonnet", - "operationId": "op-live-cancel-send-claude-code-sonnet", + "requestId": "cancel-send-glm-5.2", + "operationId": "op-live-cancel-send-glm-5.2", "command": "send", "params": { "conversationId": "conv-1", "branchId": "branch-1", - "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." } }, { "version": 1, - "requestId": "cancel-claude-code-sonnet", - "operationId": "op-live-cancel-claude-code-sonnet", + "requestId": "cancel-glm-5.2", + "operationId": "op-live-cancel-glm-5.2", "command": "cancel_run", "params": { - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", "reason": "live packed smoke cancellation" } + }, + { + "version": 1, + "requestId": "final-state-glm-5.2", + "command": "get_state", + "params": { + "projection": "full" + } + }, + { + "version": 1, + "requestId": "shutdown-glm-5.2", + "operationId": "op-live-shutdown-glm-5.2", + "command": "shutdown", + "params": { + "mode": "wait" + } } ], "operation": "cli-bridge.target-smoke", @@ -193,7 +210,7 @@ "initialize": { "version": 1, "type": "ack", - "requestId": "init-claude-code-sonnet", + "requestId": "init-glm-5.2", "revision": 4, "command": "initialize" }, @@ -382,36 +399,37 @@ "send": { "version": 1, "type": "ack", - "requestId": "send-claude-code-sonnet", - "operationId": "op-live-send-claude-code-sonnet", + "requestId": "send-glm-5.2", + "operationId": "op-live-send-glm-5.2", "revision": 4, "replayed": false, - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "admission": { "version": 1, - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "turnId": "turn-df965174-25ce-4080-ad08-32247f7bb757", - "operationId": "op-live-send-claude-code-sonnet", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "turnId": "turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4", + "operationId": "op-live-send-glm-5.2", "conversationId": "conv-1", "branchId": "branch-1", - "admittedAt": "2026-08-29T00:20:55.662Z", - "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", + "admittedAt": "2026-08-29T18:31:22.350Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", "requested": { - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", "profile": { - "name": "Braid live claude-code/sonnet", + "name": "Braid live opencode/zai-coding-plan/glm-5.2", "description": "Opt-in packed CLI Bridge smoke profile", "version": "0.1.0", "model": { - "default": "sonnet", + "default": "glm-5.2", + "provider": "zai-coding-plan", "reasoningEffort": "none" }, - "harness": "claude-code" + "harness": "opencode" }, "connectionId": "connection-live-cli-bridge", "interactions": {}, - "model": "sonnet", - "runner": "claude-code" + "model": "glm-5.2", + "runner": "opencode" }, "capabilities": { "streaming": { @@ -441,7 +459,7 @@ "profile": { "namedProfiles": false, "systemPrompt": { - "replace": true, + "replace": false, "append": true }, "instructions": true, @@ -479,6 +497,11 @@ "eventIdentity": true, "cancellationIdempotency": true }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, "workspace": { "read": false, "write": false, @@ -508,27 +531,27 @@ } }, "provider": "cli-bridge", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "materializationReceipt": { "provider": "cli-bridge", "backend": "environment-provider", "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "lifecycle": "retained-session", "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", - "model": "sonnet", - "route": "claude-code/sonnet", - "runner": "claude-code", - "providerRunId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "retainedControl": "exact-after-dispatch" }, "admissionStatus": "admitted", - "requestDigest": "c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b", - "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", - "materializationDigest": "fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356", - "digest": "3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345" + "requestDigest": "def112beeb6bec7c404a0307dd34a008f5b04aed4276d8f594c5e13f10cb02c2", + "capabilitiesDigest": "b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6", + "materializationDigest": "e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e", + "digest": "291afe4c38f54086e40c53bc21b3a0a3e10f8f21a5204d1a629d9bc9b0637f91" }, "command": "send" }, @@ -695,12 +718,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "Detach the active run before reconnecting it" + "reason": "There is no recoverable run to reconnect while another run is active" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "Detach the active run before reconciling it" + "reason": "There is no recoverable run to reconcile while another run is active" } }, "analysisAsk": { @@ -712,98 +735,238 @@ }, "normal": { "status": "completed", - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "run": { - "id": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "turnId": "turn-df965174-25ce-4080-ad08-32247f7bb757", - "operationId": "op-live-send-claude-code-sonnet", + "id": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "turnId": "turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4", + "operationId": "op-live-send-glm-5.2", "status": "completed", - "startedAt": "2026-08-29T00:20:55.674Z", - "updatedAt": "2026-08-29T00:21:02.681Z", - "terminalAt": "2026-08-29T00:21:02.681Z", - "durationMs": 7007, - "inputTokens": 2, - "outputTokens": 30, + "startedAt": "2026-08-29T18:31:22.361Z", + "updatedAt": "2026-08-29T18:31:26.299Z", + "terminalAt": "2026-08-29T18:31:26.299Z", + "durationMs": 3938, + "inputTokens": 7214, + "outputTokens": 50, "tokensKnown": true, - "usdKnown": true, + "usdKnown": false, "tokenStatus": "complete", - "costUsd": 0.0985582, - "costStatus": "reported", - "model": "claude-code/sonnet", + "costStatus": "unknown", + "model": "opencode/zai-coding-plan/glm-5.2", "provider": "cli-bridge", - "runner": "claude-code", + "runner": "opencode", "connectionId": "connection-live-cli-bridge", "completeness": "complete", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "environmentId": "environment-bd696f804a820bccca863d4b312600d9", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "environmentId": "environment-f05ac3863839863d6592e55bdc1d2166", "controlRef": { - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "provider": "cli-bridge", - "environmentId": "cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd", - "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "executionId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "requestDigest": "sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b" + "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "executionId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "requestDigest": "sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc" }, - "materializationDigest": "fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356", - "cursor": "1:0", + "materializationDigest": "e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e", + "cursor": "2:0", "cursorCommittedSequence": 12, - "contentBytes": 83 + "contentBytes": 61, + "receipt": { + "version": 1, + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "turnId": "turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4", + "operationId": "op-live-send-glm-5.2", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:22.350Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", + "profile": { + "name": "Braid live opencode/zai-coding-plan/glm-5.2", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "glm-5.2", + "provider": "zai-coding-plan", + "reasoningEffort": "none" + }, + "harness": "opencode" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "glm-5.2", + "runner": "opencode" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "def112beeb6bec7c404a0307dd34a008f5b04aed4276d8f594c5e13f10cb02c2", + "capabilitiesDigest": "b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6", + "materializationDigest": "e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e", + "digest": "291afe4c38f54086e40c53bc21b3a0a3e10f8f21a5204d1a629d9bc9b0637f91" + } }, "assistant": { - "id": "message-8d48ace7-c0fb-4669-8764-b66e64f597fa", + "id": "message-96449345-0f77-4bc7-a001-f3498fcab8a2", "role": "assistant", - "text": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "text": "LIVE_BRAID_GLM-5_2_OK", "status": "complete", - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "parts": [ { - "id": "op-live-send-claude-code-sonnet:text", + "id": "op-live-send-glm-5.2:text", "kind": "text", - "text": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", - "sourceEventId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final" + "text": "LIVE_BRAID_GLM-5_2_OK", + "sourceEventId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final" } ] }, - "finalText": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", - "marker": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", + "finalText": "LIVE_BRAID_GLM-5_2_OK", + "marker": "LIVE_BRAID_GLM-5_2_OK", "markerObserved": true, - "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK" + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", + "lastError": null }, "cancel": { - "prompt": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "prompt": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", "send": { "version": 1, "type": "ack", - "requestId": "cancel-send-claude-code-sonnet", - "operationId": "op-live-cancel-send-claude-code-sonnet", + "requestId": "cancel-send-glm-5.2", + "operationId": "op-live-cancel-send-glm-5.2", "revision": 14, "replayed": false, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", "admission": { "version": 1, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", - "operationId": "op-live-cancel-send-claude-code-sonnet", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "turnId": "turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0", + "operationId": "op-live-cancel-send-glm-5.2", "conversationId": "conv-1", "branchId": "branch-1", - "admittedAt": "2026-08-29T00:21:04.446Z", - "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", + "admittedAt": "2026-08-29T18:31:27.250Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", "requested": { - "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", "profile": { - "name": "Braid live claude-code/sonnet", + "name": "Braid live opencode/zai-coding-plan/glm-5.2", "description": "Opt-in packed CLI Bridge smoke profile", "version": "0.1.0", "model": { - "default": "sonnet", + "default": "glm-5.2", + "provider": "zai-coding-plan", "reasoningEffort": "none" }, - "harness": "claude-code" + "harness": "opencode" }, "connectionId": "connection-live-cli-bridge", "interactions": {}, - "model": "sonnet", - "runner": "claude-code" + "model": "glm-5.2", + "runner": "opencode" }, "capabilities": { "streaming": { @@ -861,6 +1024,11 @@ "eventIdentity": true, "cancellationIdempotency": true }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, "workspace": { "read": false, "write": false, @@ -890,73 +1058,107 @@ } }, "provider": "cli-bridge", - "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "requestedSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "materializationReceipt": { "provider": "cli-bridge", "backend": "environment-provider", "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "lifecycle": "retained-session", "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", - "model": "sonnet", - "route": "claude-code/sonnet", - "runner": "claude-code", - "providerRunId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", "retainedControl": "exact-after-dispatch" }, "admissionStatus": "admitted", - "requestDigest": "95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f", - "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", - "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5", - "digest": "d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1" + "requestDigest": "a6fe7228f6570b63e61c9323395d38ce4dad581f36768bbfa85b613a76fd3239", + "capabilitiesDigest": "b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6", + "materializationDigest": "dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e", + "digest": "251a428a92eb4a633c41e3c62f8aceebcfa42fa06a2ba0361f9281251aa3a35a" }, "command": "send" }, - "advertisedByProvider": false, + "advertisedByProvider": true, "advertisedByNormalAdmission": true, "advertisedByNormalRun": false, "advertisedByRun": true, "advertised": true, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", "activeRun": { - "id": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", - "operationId": "op-live-cancel-send-claude-code-sonnet", + "id": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "turnId": "turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0", + "operationId": "op-live-cancel-send-glm-5.2", "status": "streaming", - "startedAt": "2026-08-29T00:21:04.457Z", - "updatedAt": "2026-08-29T00:21:04.457Z", + "startedAt": "2026-08-29T18:31:27.260Z", + "updatedAt": "2026-08-29T18:31:27.260Z", "inputTokens": 0, "outputTokens": 0, "tokensKnown": false, "usdKnown": false, "tokenStatus": "unknown", "costStatus": "unknown", - "model": "sonnet", + "model": "glm-5.2", "provider": "cli-bridge", - "runner": "claude-code", + "runner": "opencode", "connectionId": "connection-live-cli-bridge", - "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "requestedSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", "completeness": "incomplete", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5" + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "materializationDigest": "dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e" }, "response": { "version": 1, "type": "ack", - "requestId": "cancel-claude-code-sonnet", - "revision": 25, - "operationId": "op-live-cancel-claude-code-sonnet", + "requestId": "cancel-glm-5.2", + "revision": 26, + "operationId": "op-live-cancel-glm-5.2", "command": "cancel_run", - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", "control": "cancel", - "outcome": "unknown", + "outcome": "accepted", "replayed": false }, + "run": { + "id": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "turnId": "turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0", + "operationId": "op-live-cancel-send-glm-5.2", + "status": "aborted", + "startedAt": "2026-08-29T18:31:27.260Z", + "updatedAt": "2026-08-29T18:31:28.207Z", + "terminalAt": "2026-08-29T18:31:28.207Z", + "durationMs": 947, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "completeness": "complete", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "environmentId": "environment-f05ac3863839863d6592e55bdc1d2166", + "controlRef": { + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "provider": "cli-bridge", + "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "executionId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "requestDigest": "sha256:85d9b4f9fbbc7de553bf899ade70609021eaf66fe5a4409d25498143301cd935" + }, + "materializationDigest": "dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e", + "contentBytes": 14 + }, "attemptedRun": true, - "status": "advertised-but-not-terminal-cancelled" + "status": "verified" }, "interaction": { "status": "reported-unavailable", @@ -970,1254 +1172,1240 @@ }, "attempted": false }, - "error": { - "code": "LIVE_CAPABILITY_CONTRADICTION", - "message": "cancel capability reported advertised-but-not-terminal-cancelled; expected verified", - "exitCode": 1, - "details": { - "name": "cancel", - "status": "advertised-but-not-terminal-cancelled", - "advertised": true, - "capability": { - "prompt": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", - "send": { - "version": 1, - "type": "ack", - "requestId": "cancel-send-claude-code-sonnet", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "revision": 14, - "replayed": false, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "admission": { - "version": 1, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "conversationId": "conv-1", - "branchId": "branch-1", - "admittedAt": "2026-08-29T00:21:04.446Z", - "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", - "requested": { - "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", - "profile": "[depth-limited]", - "connectionId": "connection-live-cli-bridge", - "interactions": "[depth-limited]", - "model": "sonnet", - "runner": "claude-code" - }, - "capabilities": { - "streaming": "[depth-limited]", - "sessions": "[depth-limited]", - "controls": "[depth-limited]", - "events": "[depth-limited]", - "usage": true, - "environment": "[depth-limited]" - }, - "provider": "cli-bridge", - "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "materializationReceipt": { - "provider": "cli-bridge", - "backend": "environment-provider", - "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "lifecycle": "retained-session", - "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", - "model": "sonnet", - "route": "claude-code/sonnet", - "runner": "claude-code", - "providerRunId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "retainedControl": "exact-after-dispatch" - }, - "admissionStatus": "admitted", - "requestDigest": "95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f", - "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", - "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5", - "digest": "d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1" - }, - "command": "send" - }, - "advertisedByProvider": false, - "advertisedByNormalAdmission": true, - "advertisedByNormalRun": false, - "advertisedByRun": true, - "advertised": true, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "activeRun": { - "id": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "status": "streaming", - "startedAt": "2026-08-29T00:21:04.457Z", - "updatedAt": "2026-08-29T00:21:04.457Z", - "inputTokens": 0, - "outputTokens": 0, - "tokensKnown": false, - "usdKnown": false, - "tokenStatus": "unknown", - "costStatus": "unknown", - "model": "sonnet", - "provider": "cli-bridge", - "runner": "claude-code", - "connectionId": "connection-live-cli-bridge", - "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "completeness": "incomplete", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5" - }, - "response": { - "version": 1, - "type": "ack", - "requestId": "cancel-claude-code-sonnet", - "revision": 25, - "operationId": "op-live-cancel-claude-code-sonnet", - "command": "cancel_run", - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "control": "cancel", - "outcome": "unknown", - "replayed": false - }, - "attemptedRun": true, - "status": "advertised-but-not-terminal-cancelled" - } - } + "semanticAssertions": { + "cancel": "verified", + "interaction": "reported-unavailable" }, - "status": "failed", - "stderr": "", - "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-claude-code-sonnet\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-claude-code-sonnet\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:53.785Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:53.785Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-claude-code-sonnet\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"revision\":4,\"replayed\":false,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"version\":1,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:20:55.662Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"digest\":\"3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"admission\":{\"version\":1,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:20:55.662Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"digest\":\"3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-claude-code-sonnet-87321068a54f8558de6d48df\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"87321068a54f8558de6d48dfc4ff071df6baa38536027ebb340caefeeb9deac6\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:20:55.684Z\",\"updatedAt\":\"2026-08-29T00:20:55.684Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"runId\":\"retained-intent-run:ab8d1d38943421a8bbfd85b56f698d10ca900a8f8d152a504a0ac7e3f9310f30\",\"requestedProfileDigest\":\"sha256:3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requestDigest\":\"sha256:ab8d1d38943421a8bbfd85b56f698d10ca900a8f8d152a504a0ac7e3f9310f30\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-claude-code-sonnet\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:20:55.674Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"activeRuns\":[{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"running\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\"},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"startedAt\":\"2026-08-29T00:20:55.674Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:20:57.505Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:20:57.505Z\"},\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"provider\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:20:57.505Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"1:0\",\"providerSequence\":2,\"cursor\":\"1:0\",\"receivedAt\":\"2026-08-29T00:21:00.866Z\"},\"part\":{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"1:0\"},\"delta\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:21:02.680Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"usage\":{\"input\":2,\"output\":30,\"costUsd\":0.0985582,\"model\":\"claude-code/sonnet\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-claude-code-sonnet-87321068a54f8558de6d48df\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"87321068a54f8558de6d48dfc4ff071df6baa38536027ebb340caefeeb9deac6\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T00:20:55.684Z\",\"updatedAt\":\"2026-08-29T00:21:02.701Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-claude-code-sonnet\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:20:57.505Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:20:57.505Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"2\"},{\"label\":\"output tokens\",\"value\":\"30\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"cost measurement\",\"value\":\"reported\"},{\"label\":\"model\",\"value\":\"claude-code/sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"revision\":14,\"replayed\":false,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"version\":1,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:21:04.446Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\",\"digest\":\"d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:21:04.446Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\",\"digest\":\"d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-claude-code-sonnet-e5f36571f043cb843a861455\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"e5f36571f043cb843a86145559563c6deb2f514f3274456ba1b25013bb90023a\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:21:04.466Z\",\"updatedAt\":\"2026-08-29T00:21:04.466Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"runId\":\"retained-intent-run:8bb3bcc8b1058253c5051a664a25e3c6af5f9932209834a5284b49f39f73313f\",\"requestedProfileDigest\":\"sha256:3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requestDigest\":\"sha256:8bb3bcc8b1058253c5051a664a25e3c6af5f9932209834a5284b49f39f73313f\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"revision\":16,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":16,\"sequence\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:04.457Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"running\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\"},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"activeRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:20:57.505Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:20:57.505Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-claude-code-sonnet\",\"revision\":25,\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"command\":\"cancel_run\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"outcome\":\"unknown\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-claude-code-sonnet-5515b6e8bbbfda20731ac558\",\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"5515b6e8bbbfda20731ac558c4952513a35ddfa7164a25a81e758a72c9aa690d\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:21:04.530Z\",\"updatedAt\":\"2026-08-29T00:21:04.530Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"source\":{\"eventId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:21:06.253Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:21:02.719Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:21:06.253Z\"},\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"provider\":{\"eventId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:21:06.253Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-claude-code-sonnet-5515b6e8bbbfda20731ac558\",\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"5515b6e8bbbfda20731ac558c4952513a35ddfa7164a25a81e758a72c9aa690d\",\"kind\":\"custom\",\"status\":\"unknown\",\"attempt\":1,\"outcomeDigest\":\"d0751b0e8ce25e30d2d826f1285ade45916c988dc0790be969fe898e27675605\",\"createdAt\":\"2026-08-29T00:21:04.530Z\",\"updatedAt\":\"2026-08-29T00:21:06.328Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"unknown\",\"detail\":\"CONTROL_OUTCOME_UNKNOWN\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.unknown\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"completeness\":\"unknown\",\"error\":\"Cancellation outcome could not be confirmed by the provider\"}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-claude-code-sonnet\",\"revision\":27,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":27,\"sequence\":27,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:06.347Z\",\"terminalAt\":\"2026-08-29T00:21:06.347Z\",\"durationMs\":1890,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"unknown\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[],\"lastError\":\"Cancellation outcome could not be confirmed by the provider\"},\"view\":{\"revision\":27,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"unknown\",\"statusText\":\"Cancellation outcome could not be confirmed by the provider\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"elapsedMs\":1890},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"unknown\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:21:06.253Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"unknown\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"unknown\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:lifecycle:local:unknown\",\"kind\":\"system\",\"title\":\"unknown\",\"status\":\"unknown\",\"detail\":\"Cancellation outcome could not be confirmed by the provider\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"unknown\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"unknown\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:21:06.253Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"unknown\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":true,\"source\":\"provider\"},\"run.reconcile\":{\"available\":true,\"source\":\"provider\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-claude-code-sonnet-e5f36571f043cb843a861455\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"e5f36571f043cb843a86145559563c6deb2f514f3274456ba1b25013bb90023a\",\"kind\":\"send\",\"status\":\"unknown\",\"attempt\":1,\"outcomeDigest\":\"d750ff0ec5ea61710ac8c366de9bad4d95a0636b9706f791721107881db4e8ac\",\"createdAt\":\"2026-08-29T00:21:04.466Z\",\"updatedAt\":\"2026-08-29T00:21:06.359Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"revision\":28,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":28,\"sequence\":28,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:06.347Z\",\"terminalAt\":\"2026-08-29T00:21:06.347Z\",\"durationMs\":1890,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"unknown\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[],\"lastError\":\"Cancellation outcome could not be confirmed by the provider\"},\"view\":{\"revision\":28,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"unknown\",\"statusText\":\"Cancellation outcome could not be confirmed by the provider\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"elapsedMs\":1890},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"unknown\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:21:06.253Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"unknown\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"unknown\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:lifecycle:local:unknown\",\"kind\":\"system\",\"title\":\"unknown\",\"status\":\"unknown\",\"detail\":\"Cancellation outcome could not be confirmed by the provider\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"unknown\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"unknown\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:21:06.253Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"unknown\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":true,\"source\":\"provider\"},\"run.reconcile\":{\"available\":true,\"source\":\"provider\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", - "process": { - "processIdentity": { - "instanceId": "4657286f-7f8b-4600-b17c-ffb56a0d099b", - "pid": 2246415, - "startedAt": 1787962853162 - }, - "termination": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": false, - "initialTree": { - "supported": true, - "gone": false, - "present": true, - "pids": [ - 2246415 - ], - "roots": [ - 2246415 - ], - "version": 0, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } - }, - "natural": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": false, - "initialTree": { - "supported": true, - "gone": false, - "present": true, - "pids": [ - 2246415 - ], - "roots": [ - 2246415 - ], - "version": 0, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } - }, - "exit": { - "code": 0, - "signal": null - } - } - }, - { - "label": "GLM 5.2", - "target": "opencode/zai-coding-plan/glm-5.2", - "profile": { - "path": ".braid/profiles/profile-opencode-zai-coding-plan-glm-5-2.json", + "targetProof": { + "key": "glm-5.2", "harness": "opencode", + "provider": "zai-coding-plan", "model": "glm-5.2", - "provider": "zai-coding-plan" - }, - "connection": { - "id": "connection-live-cli-bridge", - "kind": "cli-bridge", - "endpoint": "http://127.0.0.1:3355", - "credentialConfigured": true - }, - "providerCapabilities": { - "profile": { - "namedProfiles": false, - "systemPrompt": { - "replace": false, - "append": false - }, - "instructions": true, - "tools": true, - "permissions": true, - "mcp": true, - "subagents": true, - "resources": { - "files": true, - "instructions": true, - "tools": true, - "skills": true, - "agents": true, - "commands": true - }, - "hooks": false, - "modes": true, - "runtimeUpdate": false, - "validation": false - }, - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true - }, - "sessions": { - "continue": true, - "list": false, - "messages": false - }, - "retainedControl": { - "exactRunIdentity": true, - "resultIdentity": true, - "eventIdentity": true, - "cancellationIdempotency": true - }, - "workspace": { - "read": false, - "write": false, - "exec": false, - "git": false, - "upload": false, - "download": false - }, - "branching": { - "checkpoint": false, - "fork": false - }, - "placement": true, - "usage": true, - "confidential": false, - "observation": { - "identity": true, - "lifecycle": true, - "endpoint": true, - "placement": true, - "resources": false, - "resourceUse": false, - "modelUsage": true, - "computeBilling": false, - "accountUsage": false - } + "route": "opencode/zai-coding-plan/glm-5.2", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "materializationDigest": "e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e" }, - "requests": [ - { - "version": 1, - "requestId": "init-glm-5.2", - "command": "initialize", - "params": { - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2", - "subscribe": true - } - }, - { - "version": 1, - "requestId": "send-glm-5.2", - "operationId": "op-live-send-glm-5.2", - "command": "send", - "params": { - "conversationId": "conv-1", - "branchId": "branch-1", - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK" - } - }, - { - "version": 1, - "requestId": "cancel-send-glm-5.2", - "operationId": "op-live-cancel-send-glm-5.2", - "command": "send", - "params": { - "conversationId": "conv-1", - "branchId": "branch-1", - "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." - } - }, - { - "version": 1, - "requestId": "cancel-glm-5.2", - "operationId": "op-live-cancel-glm-5.2", - "command": "cancel_run", - "params": { - "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "reason": "live packed smoke cancellation" - } - } + "runIds": [ + "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3" ], - "operation": "cli-bridge.target-smoke", - "credentialLifecycle": { - "configured": true, - "stored": true, - "removed": true, - "facility": "encrypted-headless" - }, - "initialize": { + "finalState": { "version": 1, - "type": "ack", - "requestId": "init-glm-5.2", - "revision": 4, - "command": "initialize" - }, - "conversationId": "conv-1", - "branchId": "branch-1", - "initialCapabilities": { - "view": { - "conversation.create": { - "available": true, - "source": "application" - }, - "conversation.open": { - "available": true, - "source": "application" - }, - "run.runner": { - "available": true, - "source": "application" + "type": "state", + "requestId": "final-state-glm-5.2", + "revision": 28, + "projection": "full", + "state": { + "schemaVersion": 2, + "revision": 28, + "sequence": 28, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4", + "conversationId": "conv-1", + "branchId": "branch-1", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "updatedAt": "2026-08-29T18:31:27.260Z" + } + ], + "profile": { + "name": "Braid live opencode/zai-coding-plan/glm-5.2", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "glm-5.2", + "provider": "zai-coding-plan", + "reasoningEffort": "none" + }, + "harness": "opencode" }, - "run.model": { - "available": true, - "source": "application" + "runConfiguration": { + "profileName": "Braid live opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "model": "glm-5.2", + "effort": "none", + "connectionId": "connection-live-cli-bridge", + "overrides": {} }, - "run.effort": { - "available": true, - "source": "application" - }, - "conversation.branch": { - "available": true, - "source": "application" - }, - "conversation.clone": { - "available": true, - "source": "application" - }, - "conversation.fork": { - "available": true, - "source": "application" - }, - "analysis.ask": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "analysis.recipe": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "analysis.compare": { - "available": false, - "source": "application", - "reason": "Two completed or failed runs are required for comparison" - }, - "interaction.respond": { - "available": false, - "source": "runtime", - "reason": "Interaction response is not exposed by the current runtime adapter" - }, - "interaction.automation": { - "available": false, - "source": "application", - "reason": "Interaction automation requires the shared response contract" - }, - "run.interactive": { - "available": false, - "source": "application", - "reason": "Native terminal mode requires an interactive TUI and a supported provider" - }, - "run.attach": { - "available": false, - "source": "application", - "reason": "Native terminal attachment requires an interactive TUI and a retained session" - }, - "supervisor.worker.attach": { - "available": false, - "source": "runtime", - "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" - }, - "export.create": { - "available": true, - "source": "application" - }, - "analysis.cancel": { - "available": false, - "source": "application", - "reason": "There is no running analysis to cancel" - }, - "application.quit": { - "available": true, - "source": "local" - }, - "help.read": { - "available": true, - "source": "local" - }, - "profile.select": { - "available": true, - "source": "application" - }, - "connection.select": { - "available": true, - "source": "application" - }, - "settings.open": { - "available": true, - "source": "application" - }, - "activity.read": { - "available": true, - "source": "local" - }, - "graph.read": { - "available": true, - "source": "local" - }, - "details.read": { - "available": true, - "source": "local" - }, - "supervisor.refresh": { - "available": true, - "source": "runtime" - }, - "supervisor.worker.steer": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to steer" - }, - "supervisor.worker.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to cancel" - }, - "supervisor.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervisor to cancel" - }, - "draft.write": { - "available": true, - "source": "application" - }, - "run.send": { - "available": true, - "source": "provider" - }, - "run.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no active run to cancel" - }, - "run.queue": { - "available": false, - "source": "provider", - "reason": "There is no active run" - }, - "run.steer": { - "available": false, - "source": "provider", - "reason": "There is no active run" - }, - "run.detach": { - "available": false, - "source": "provider", - "reason": "There is no active run" - }, - "run.reconnect": { - "available": false, - "source": "provider", - "reason": "There is no recoverable run to reconnect" - }, - "run.reconcile": { - "available": false, - "source": "provider", - "reason": "There is no recoverable run to reconcile" - } - }, - "analysisAsk": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "run": {} - }, - "send": { - "version": 1, - "type": "ack", - "requestId": "send-glm-5.2", - "operationId": "op-live-send-glm-5.2", - "revision": 4, - "replayed": false, - "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "admission": { - "version": 1, - "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "turnId": "turn-d8860d89-c795-493b-9562-a815c84541bf", - "operationId": "op-live-send-glm-5.2", - "conversationId": "conv-1", - "branchId": "branch-1", - "admittedAt": "2026-08-29T00:23:08.659Z", - "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", - "requested": { - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", - "profile": { - "name": "Braid live opencode/zai-coding-plan/glm-5.2", - "description": "Opt-in packed CLI Bridge smoke profile", - "version": "0.1.0", - "model": { - "default": "glm-5.2", - "provider": "zai-coding-plan", - "reasoningEffort": "none" - }, - "harness": "opencode" + "draft": "", + "messages": [ + { + "id": "message-094b6958-b49c-4e70-a24b-91555cebd77d", + "role": "user", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", + "status": "complete", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "parts": [ + { + "id": "part-message-094b6958-b49c-4e70-a24b-91555cebd77d", + "kind": "text", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK" + } + ] }, - "connectionId": "connection-live-cli-bridge", - "interactions": {}, - "model": "glm-5.2", - "runner": "opencode" - }, - "capabilities": { - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true + { + "id": "message-96449345-0f77-4bc7-a001-f3498fcab8a2", + "role": "assistant", + "text": "LIVE_BRAID_GLM-5_2_OK", + "status": "complete", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "parts": [ + { + "id": "op-live-send-glm-5.2:text", + "kind": "text", + "text": "LIVE_BRAID_GLM-5_2_OK", + "sourceEventId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final" + } + ] }, - "sessions": { - "continue": true, - "messages": false + { + "id": "message-63410fe6-5915-4166-bda6-8d0659bc413a", + "role": "user", + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "status": "complete", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "parts": [ + { + "id": "part-message-63410fe6-5915-4166-bda6-8d0659bc413a", + "kind": "text", + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + ] }, - "controls": { - "cancel": true, - "steer": false, - "queue": true, - "status": true, - "recreate": true + { + "id": "message-6b7021ca-22df-4fdb-ae96-996a657e6864", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "parts": [] + } + ], + "runs": [ + { + "id": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "turnId": "turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4", + "operationId": "op-live-send-glm-5.2", + "status": "completed", + "startedAt": "2026-08-29T18:31:22.361Z", + "updatedAt": "2026-08-29T18:31:26.299Z", + "terminalAt": "2026-08-29T18:31:26.299Z", + "durationMs": 3938, + "inputTokens": 7214, + "outputTokens": 50, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "opencode/zai-coding-plan/glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "environmentId": "environment-f05ac3863839863d6592e55bdc1d2166", + "controlRef": { + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "provider": "cli-bridge", + "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "executionId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "requestDigest": "sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc" + }, + "materializationDigest": "e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e", + "cursor": "2:0", + "cursorCommittedSequence": 12, + "contentBytes": 61 }, - "events": { - "stableIdentity": true, - "sequence": true, - "cursor": true + { + "id": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "turnId": "turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0", + "operationId": "op-live-cancel-send-glm-5.2", + "status": "aborted", + "startedAt": "2026-08-29T18:31:27.260Z", + "updatedAt": "2026-08-29T18:31:28.207Z", + "terminalAt": "2026-08-29T18:31:28.207Z", + "durationMs": 947, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "completeness": "complete", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "environmentId": "environment-f05ac3863839863d6592e55bdc1d2166", + "controlRef": { + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "provider": "cli-bridge", + "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "executionId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "requestDigest": "sha256:85d9b4f9fbbc7de553bf899ade70609021eaf66fe5a4409d25498143301cd935" + }, + "materializationDigest": "dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e", + "contentBytes": 14 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 2, + "input": 7214, + "output": 50, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 2, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 2, + "unknownLatencySources": 2 }, - "usage": true, - "environment": { - "profile": { - "namedProfiles": false, - "systemPrompt": { - "replace": false, - "append": true - }, - "instructions": true, - "tools": true, - "permissions": true, - "mcp": true, - "subagents": true, - "resources": { - "files": true, - "instructions": true, - "tools": true, - "skills": true, - "agents": true, - "commands": true - }, - "hooks": false, - "modes": true, - "runtimeUpdate": false, - "validation": false - }, - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-f05ac3863839863d6592e55bdc1d2166", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:31:21.989Z", + "updatedAt": "2026-08-29T18:31:28.106Z" + } + ], + "interactions": [], + "queue": [], + "activeRunId": null, + "focusedRunId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "activeRuns": [], + "lastError": null + }, + "view": { + "revision": 28, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4", + "profileName": "Braid live opencode/zai-coding-plan/glm-5.2", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "runner": "opencode", + "model": "glm-5.2", + "effort": "none", + "runOverrides": {}, + "connection": "Live local CLI Bridge", + "conversationId": "conv-1", + "conversationTitle": "New conversation", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "active": true, + "updatedAt": "2026-08-29T18:31:27.260Z" + } + ], + "branch": "branch-1", + "status": "cancelled", + "statusText": "cancelled", + "queueCount": 0, + "queue": [], + "messages": [ + { + "id": "message-094b6958-b49c-4e70-a24b-91555cebd77d", + "role": "user", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", + "status": "complete", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "parts": [ + { + "id": "part-message-094b6958-b49c-4e70-a24b-91555cebd77d", + "kind": "text", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK" + } + ] + }, + { + "id": "message-96449345-0f77-4bc7-a001-f3498fcab8a2", + "role": "assistant", + "text": "LIVE_BRAID_GLM-5_2_OK", + "status": "complete", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "parts": [ + { + "id": "op-live-send-glm-5.2:text", + "kind": "text", + "text": "LIVE_BRAID_GLM-5_2_OK", + "sourceEventId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final" + } + ] + }, + { + "id": "message-63410fe6-5915-4166-bda6-8d0659bc413a", + "role": "user", + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "status": "complete", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "parts": [ + { + "id": "part-message-63410fe6-5915-4166-bda6-8d0659bc413a", + "kind": "text", + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + ] + }, + { + "id": "message-6b7021ca-22df-4fdb-ae96-996a657e6864", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "parts": [] + } + ], + "hiddenMessageCount": 0, + "runs": [ + { + "id": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "turnId": "turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-live-send-glm-5.2", + "status": "completed", + "profileName": "Braid live opencode/zai-coding-plan/glm-5.2", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "model": "opencode/zai-coding-plan/glm-5.2", + "effort": "none", + "cursor": "2:0", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "usage": { + "input": 7214, + "output": 50, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "opencode/zai-coding-plan/glm-5.2", + "elapsedMs": 3938 }, - "sessions": { - "continue": true, - "list": false, - "messages": false + "runner": "opencode", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-f05ac3863839863d6592e55bdc1d2166", + "completeness": "complete", + "contentBytes": 61 + }, + { + "id": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "turnId": "turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-live-cancel-send-glm-5.2", + "status": "cancelled", + "profileName": "Braid live opencode/zai-coding-plan/glm-5.2", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "model": "glm-5.2", + "effort": "none", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "requestedSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "usage": { + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "glm-5.2", + "elapsedMs": 947 }, - "retainedControl": { - "exactRunIdentity": true, - "resultIdentity": true, - "eventIdentity": true, - "cancellationIdempotency": true + "runner": "opencode", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-f05ac3863839863d6592e55bdc1d2166", + "completeness": "complete", + "contentBytes": 14 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 2, + "input": 7214, + "output": 50, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 2, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 2, + "unknownLatencySources": 2 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-f05ac3863839863d6592e55bdc1d2166", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:31:21.989Z", + "updatedAt": "2026-08-29T18:31:28.106Z" + } + ], + "focusedRunId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "interactions": [], + "activity": [ + { + "id": "run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "kind": "run", + "title": "run run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "status": "completed", + "elapsedMs": 3938, + "startedAt": "2026-08-29T18:31:22.361Z", + "occurredAt": "2026-08-29T18:31:22.361Z", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "entityType": "run", + "entityId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de" + }, + { + "id": "activity:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "completed", + "detail": "profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "occurredAt": "2026-08-29T18:31:26.299Z", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "entityType": "run", + "entityId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de" + }, + { + "id": "run:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "kind": "run", + "title": "run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "status": "cancelled", + "elapsedMs": 947, + "startedAt": "2026-08-29T18:31:27.260Z", + "occurredAt": "2026-08-29T18:31:27.260Z", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "entityType": "run", + "entityId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3" + }, + { + "id": "environment:environment-f05ac3863839863d6592e55bdc1d2166", + "kind": "environment", + "title": "cli-bridge execution", + "status": "complete", + "detail": "local-process · local · explicit", + "startedAt": "2026-08-29T18:31:21.989Z", + "occurredAt": "2026-08-29T18:31:28.106Z", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "entityType": "environment", + "entityId": "environment-f05ac3863839863d6592e55bdc1d2166" + }, + { + "id": "activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "cancelled", + "detail": "profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "occurredAt": "2026-08-29T18:31:28.207Z", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "entityType": "run", + "entityId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3" + }, + { + "id": "activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:control:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "live packed smoke cancellation", + "occurredAt": "2026-08-29T18:31:28.207Z", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "entityType": "run", + "entityId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3" + }, + { + "id": "activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:lifecycle:local:reconnecting", + "kind": "system", + "title": "reconnecting", + "status": "cancelled", + "occurredAt": "2026-08-29T18:31:28.207Z", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "entityType": "run", + "entityId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3" + }, + { + "id": "activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:control.ack:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "accepted", + "occurredAt": "2026-08-29T18:31:28.207Z", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "entityType": "run", + "entityId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3" + } + ], + "graph": [ + { + "id": "conv-1", + "type": "conversation", + "title": "New conversation", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-29T18:31:21.451Z" + }, + { + "id": "branch-1", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conv-1" + ], + "startedAt": "2026-08-29T18:31:21.451Z" + }, + { + "id": "environment-f05ac3863839863d6592e55bdc1d2166", + "type": "environment", + "title": "cli-bridge execution", + "status": "complete", + "depth": 4, + "edgeLabel": "attached", + "parentIds": [ + "run:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de" + ], + "runner": "cli-bridge", + "startedAt": "2026-08-29T18:31:21.989Z" + }, + { + "id": "turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4", + "type": "turn", + "title": "Turn", + "status": "complete", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:31:22.361Z" + }, + { + "id": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "type": "run", + "title": "Run", + "status": "completed", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4" + ], + "runner": "opencode", + "elapsedMs": 3938, + "startedAt": "2026-08-29T18:31:22.361Z" + }, + { + "id": "turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0", + "type": "turn", + "title": "Turn", + "status": "cancelled", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:31:27.260Z" + }, + { + "id": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "type": "run", + "title": "Run", + "status": "cancelled", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0" + ], + "runner": "opencode", + "elapsedMs": 947, + "startedAt": "2026-08-29T18:31:27.260Z" + } + ], + "graphQuery": "", + "entityDetails": [ + { + "entityType": "environment", + "entityId": "environment-f05ac3863839863d6592e55bdc1d2166", + "title": "cli-bridge execution", + "status": "ready", + "lines": [ + "provider: cli-bridge", + "execution: local-process · local", + "provider environment: cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0", + "connection: connection-live-cli-bridge", + "lifecycle: ready · retained · cleanup explicit", + "continuity: session", + "runtime endpoint host: 127.0.0.1", + "placement: requested not specified · verified unavailable", + "machine: unavailable · physical IP is not exposed", + "created: 2026-08-29T18:31:21.989Z", + "observed: 2026-08-29T18:31:28.106Z", + "unavailable: cli-subscription-and-quota:not-exposed-by-provider", + "unavailable: effective-resources:not-exposed-by-provider", + "unavailable: machine-specs:not-exposed-by-provider", + "unavailable: runtime-cpu-memory-usage:not-exposed-by-provider" + ] + } + ], + "details": { + "title": "run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "fields": [ + { + "label": "status", + "value": "aborted" }, - "workspace": { - "read": false, - "write": false, - "exec": false, - "git": false, - "upload": false, - "download": false + { + "label": "input tokens", + "value": "0" }, - "branching": { - "checkpoint": false, - "fork": false + { + "label": "output tokens", + "value": "0" }, - "placement": true, - "usage": true, - "confidential": false, - "observation": { - "identity": true, - "lifecycle": true, - "endpoint": true, - "placement": true, - "resources": false, - "resourceUse": false, - "modelUsage": true, - "computeBilling": false, - "accountUsage": false + { + "label": "model", + "value": "glm-5.2" } - } - }, - "provider": "cli-bridge", - "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "materializationReceipt": { - "provider": "cli-bridge", - "backend": "environment-provider", - "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "lifecycle": "retained-session", - "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2", - "model": "glm-5.2", - "route": "opencode/zai-coding-plan/glm-5.2", - "runner": "opencode", - "providerRunId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "retainedControl": "exact-after-dispatch" - }, - "admissionStatus": "admitted", - "requestDigest": "b68e6bdcee69b8fdf9bb71ace144ee2a32ece38f36ac72a1e2a944636cf07491", - "capabilitiesDigest": "cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd", - "materializationDigest": "a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc", - "digest": "2afa29fdd7f13affde6b0eafba617bd0f51279c7cb45573099e988e6cfa1b64e" - }, - "command": "send" - }, - "activeCapabilities": { - "view": { - "conversation.create": { - "available": true, - "source": "application" - }, - "conversation.open": { - "available": true, - "source": "application" - }, - "run.runner": { - "available": true, - "source": "application" - }, - "run.model": { - "available": true, - "source": "application" - }, - "run.effort": { - "available": true, - "source": "application" - }, - "conversation.branch": { - "available": true, - "source": "application" - }, - "conversation.clone": { - "available": true, - "source": "application" - }, - "conversation.fork": { - "available": true, - "source": "application" - }, - "analysis.ask": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "analysis.recipe": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "analysis.compare": { - "available": false, - "source": "application", - "reason": "Two completed or failed runs are required for comparison" - }, - "interaction.respond": { - "available": false, - "source": "runtime", - "reason": "Interaction response is not exposed by the current runtime adapter" - }, - "interaction.automation": { - "available": false, - "source": "application", - "reason": "Interaction automation requires the shared response contract" - }, - "run.interactive": { - "available": false, - "source": "application", - "reason": "Native terminal mode requires an interactive TUI and a supported provider" - }, - "run.attach": { - "available": false, - "source": "application", - "reason": "Native terminal attachment requires an interactive TUI and a retained session" + ] }, - "supervisor.worker.attach": { - "available": false, - "source": "runtime", - "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" - }, - "export.create": { - "available": true, - "source": "application" - }, - "analysis.cancel": { - "available": false, - "source": "application", - "reason": "There is no running analysis to cancel" - }, - "application.quit": { - "available": true, - "source": "local" - }, - "help.read": { - "available": true, - "source": "local" - }, - "profile.select": { - "available": true, - "source": "application" - }, - "connection.select": { - "available": true, - "source": "application" - }, - "settings.open": { - "available": true, - "source": "application" - }, - "activity.read": { - "available": true, - "source": "local" - }, - "graph.read": { - "available": true, - "source": "local" - }, - "details.read": { - "available": true, - "source": "local" - }, - "supervisor.refresh": { - "available": true, - "source": "runtime" - }, - "supervisor.worker.steer": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to steer" - }, - "supervisor.worker.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to cancel" - }, - "supervisor.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervisor to cancel" - }, - "draft.write": { - "available": true, - "source": "application" - }, - "run.send": { - "available": false, - "source": "application", - "reason": "A run is already active" - }, - "run.cancel": { - "available": true, - "source": "runtime" - }, - "run.queue": { - "available": true, - "source": "provider" - }, - "run.steer": { - "available": false, - "source": "provider", - "reason": "The current runtime does not report steering support" - }, - "run.detach": { - "available": true, - "source": "provider" - }, - "run.reconnect": { - "available": false, - "source": "provider", - "reason": "Detach the active run before reconnecting it" - }, - "run.reconcile": { - "available": false, - "source": "provider", - "reason": "Detach the active run before reconciling it" - } - }, - "analysisAsk": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "run": {} - }, - "normal": { - "status": "completed", - "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "run": { - "id": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "turnId": "turn-d8860d89-c795-493b-9562-a815c84541bf", - "operationId": "op-live-send-glm-5.2", - "status": "completed", - "startedAt": "2026-08-29T00:23:08.670Z", - "updatedAt": "2026-08-29T00:23:12.634Z", - "terminalAt": "2026-08-29T00:23:12.634Z", - "durationMs": 3964, - "inputTokens": 17707, - "outputTokens": 44, - "tokensKnown": true, - "usdKnown": false, - "tokenStatus": "complete", - "costStatus": "unknown", - "model": "opencode/zai-coding-plan/glm-5.2", - "provider": "cli-bridge", - "runner": "opencode", - "connectionId": "connection-live-cli-bridge", - "completeness": "complete", - "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "environmentId": "environment-e89db0533b51b9bf25167b4285bf9650", - "controlRef": { - "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "provider": "cli-bridge", - "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0", - "sessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "executionId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "requestDigest": "sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4" - }, - "materializationDigest": "a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc", - "cursor": "2:0", - "cursorCommittedSequence": 12, - "contentBytes": 61 - }, - "assistant": { - "id": "message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb", - "role": "assistant", - "text": "LIVE_BRAID_GLM-5_2_OK", - "status": "complete", - "runId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "parts": [ - { - "id": "op-live-send-glm-5.2:text", - "kind": "text", - "text": "LIVE_BRAID_GLM-5_2_OK", - "sourceEventId": "run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final" - } - ] - }, - "finalText": "LIVE_BRAID_GLM-5_2_OK", - "marker": "LIVE_BRAID_GLM-5_2_OK", - "markerObserved": true, - "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK" - }, - "cancel": { - "prompt": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", - "send": { - "version": 1, - "type": "ack", - "requestId": "cancel-send-glm-5.2", - "operationId": "op-live-cancel-send-glm-5.2", - "revision": 14, - "replayed": false, - "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "admission": { - "version": 1, - "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "turnId": "turn-ee012bc5-8987-476c-8194-81625ee71db1", - "operationId": "op-live-cancel-send-glm-5.2", - "conversationId": "conv-1", - "branchId": "branch-1", - "admittedAt": "2026-08-29T00:23:13.407Z", - "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", - "requested": { - "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", - "profile": { - "name": "Braid live opencode/zai-coding-plan/glm-5.2", - "description": "Opt-in packed CLI Bridge smoke profile", - "version": "0.1.0", - "model": { - "default": "glm-5.2", - "provider": "zai-coding-plan", - "reasoningEffort": "none" - }, - "harness": "opencode" - }, - "connectionId": "connection-live-cli-bridge", - "interactions": {}, - "model": "glm-5.2", - "runner": "opencode" + "capabilities": { + "conversation.create": { + "available": true, + "source": "application" }, - "capabilities": { - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true - }, - "sessions": { - "continue": true, - "messages": false - }, - "controls": { - "cancel": true, - "steer": false, - "queue": true, - "status": true, - "recreate": true - }, - "events": { - "stableIdentity": true, - "sequence": true, - "cursor": true - }, - "usage": true, - "environment": { - "profile": { - "namedProfiles": false, - "systemPrompt": "[depth-limited]", - "instructions": true, - "tools": true, - "permissions": true, - "mcp": true, - "subagents": true, - "resources": "[depth-limited]", - "hooks": false, - "modes": true, - "runtimeUpdate": false, - "validation": false - }, - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true - }, - "sessions": { - "continue": true, - "list": false, - "messages": false - }, - "retainedControl": { - "exactRunIdentity": true, - "resultIdentity": true, - "eventIdentity": true, - "cancellationIdempotency": true - }, - "workspace": { - "read": false, - "write": false, - "exec": false, - "git": false, - "upload": false, - "download": false - }, - "branching": { - "checkpoint": false, - "fork": false - }, - "placement": true, - "usage": true, - "confidential": false, - "observation": { - "identity": true, - "lifecycle": true, - "endpoint": true, - "placement": true, - "resources": false, - "resourceUse": false, - "modelUsage": true, - "computeBilling": false, - "accountUsage": false - } - } + "conversation.open": { + "available": true, + "source": "application" }, - "provider": "cli-bridge", - "requestedSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "materializationReceipt": { - "provider": "cli-bridge", - "backend": "environment-provider", - "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "lifecycle": "retained-session", - "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2", - "model": "glm-5.2", - "route": "opencode/zai-coding-plan/glm-5.2", - "runner": "opencode", - "providerRunId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "retainedControl": "exact-after-dispatch" + "run.runner": { + "available": true, + "source": "application" }, - "admissionStatus": "admitted", - "requestDigest": "991bee15b03b14fa9bc930ca0a390ff8acac2095ba0d0eef5505687841b87c3f", - "capabilitiesDigest": "cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd", - "materializationDigest": "b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b", - "digest": "074a2baab8b7a4f117d96a4a713ab364d613879a410c74d32fd76afdfdeb0af9" + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": true, + "source": "application" + }, + "analysis.recipe": { + "available": true, + "source": "application" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } }, - "command": "send" - }, - "advertisedByProvider": false, - "advertisedByNormalAdmission": true, - "advertisedByNormalRun": false, - "advertisedByRun": true, - "advertised": true, - "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "activeRun": { - "id": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "turnId": "turn-ee012bc5-8987-476c-8194-81625ee71db1", - "operationId": "op-live-cancel-send-glm-5.2", - "status": "streaming", - "startedAt": "2026-08-29T00:23:13.417Z", - "updatedAt": "2026-08-29T00:23:13.417Z", - "inputTokens": 0, - "outputTokens": 0, - "tokensKnown": false, - "usdKnown": false, - "tokenStatus": "unknown", - "costStatus": "unknown", - "model": "glm-5.2", - "provider": "cli-bridge", - "runner": "opencode", - "connectionId": "connection-live-cli-bridge", - "requestedSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "completeness": "incomplete", - "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "materializationDigest": "b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b" - }, - "response": { - "version": 1, - "type": "ack", - "requestId": "cancel-glm-5.2", - "revision": 25, - "operationId": "op-live-cancel-glm-5.2", - "command": "cancel_run", - "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "control": "cancel", - "outcome": "rejected", - "replayed": false - }, - "attemptedRun": true, - "status": "advertised-but-not-terminal-cancelled" + "draft": "", + "selectedSurface": "transcript", + "appearance": { + "color": "none", + "highContrast": false, + "reducedMotion": false + } + } }, - "interaction": { - "status": "reported-unavailable", - "advertisedByProvider": false, - "advertisedByBraid": false, - "advertised": false, - "braid": { - "available": false, - "source": "runtime", - "reason": "Interaction response is not exposed by the current runtime adapter" - }, - "attempted": false + "shutdown": { + "version": 1, + "type": "ack", + "requestId": "shutdown-glm-5.2", + "revision": 28, + "operationId": "op-live-shutdown-glm-5.2", + "command": "shutdown" }, - "error": { - "code": "LIVE_CAPABILITY_CONTRADICTION", - "message": "cancel capability reported advertised-but-not-terminal-cancelled; expected verified", - "exitCode": 1, - "details": { - "name": "cancel", - "status": "advertised-but-not-terminal-cancelled", - "advertised": true, - "capability": { - "prompt": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", - "send": { + "operationEvidence": { + "normal": { + "status": "completed", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "run": { + "id": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "turnId": "turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4", + "operationId": "op-live-send-glm-5.2", + "status": "completed", + "startedAt": "2026-08-29T18:31:22.361Z", + "updatedAt": "2026-08-29T18:31:26.299Z", + "terminalAt": "2026-08-29T18:31:26.299Z", + "durationMs": 3938, + "inputTokens": 7214, + "outputTokens": 50, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "opencode/zai-coding-plan/glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "environmentId": "environment-f05ac3863839863d6592e55bdc1d2166", + "controlRef": { + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "provider": "cli-bridge", + "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "executionId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "requestDigest": "sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc" + }, + "materializationDigest": "e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e", + "cursor": "2:0", + "cursorCommittedSequence": 12, + "contentBytes": 61, + "receipt": { "version": 1, - "type": "ack", - "requestId": "cancel-send-glm-5.2", - "operationId": "op-live-cancel-send-glm-5.2", - "revision": 14, - "replayed": false, - "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "admission": { - "version": 1, - "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "turnId": "turn-ee012bc5-8987-476c-8194-81625ee71db1", - "operationId": "op-live-cancel-send-glm-5.2", - "conversationId": "conv-1", - "branchId": "branch-1", - "admittedAt": "2026-08-29T00:23:13.407Z", - "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", - "requested": { - "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", - "profile": "[depth-limited]", - "connectionId": "connection-live-cli-bridge", - "interactions": "[depth-limited]", - "model": "glm-5.2", - "runner": "opencode" - }, - "capabilities": { - "streaming": "[depth-limited]", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "turnId": "turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4", + "operationId": "op-live-send-glm-5.2", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:22.350Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", + "profile": { + "name": "Braid live opencode/zai-coding-plan/glm-5.2", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "opencode" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "glm-5.2", + "runner": "opencode" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", "sessions": "[depth-limited]", - "controls": "[depth-limited]", - "events": "[depth-limited]", + "retainedControl": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, "usage": true, - "environment": "[depth-limited]" - }, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "materializationReceipt": { "provider": "cli-bridge", - "requestedSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "materializationReceipt": { - "provider": "cli-bridge", - "backend": "environment-provider", - "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "lifecycle": "retained-session", - "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2", - "model": "glm-5.2", - "route": "opencode/zai-coding-plan/glm-5.2", - "runner": "opencode", - "providerRunId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "retainedControl": "exact-after-dispatch" - }, - "admissionStatus": "admitted", - "requestDigest": "991bee15b03b14fa9bc930ca0a390ff8acac2095ba0d0eef5505687841b87c3f", - "capabilitiesDigest": "cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd", - "materializationDigest": "b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b", - "digest": "074a2baab8b7a4f117d96a4a713ab364d613879a410c74d32fd76afdfdeb0af9" - }, - "command": "send" - }, - "advertisedByProvider": false, - "advertisedByNormalAdmission": true, - "advertisedByNormalRun": false, - "advertisedByRun": true, - "advertised": true, - "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "activeRun": { - "id": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "turnId": "turn-ee012bc5-8987-476c-8194-81625ee71db1", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "def112beeb6bec7c404a0307dd34a008f5b04aed4276d8f594c5e13f10cb02c2", + "capabilitiesDigest": "b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6", + "materializationDigest": "e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e", + "digest": "291afe4c38f54086e40c53bc21b3a0a3e10f8f21a5204d1a629d9bc9b0637f91" + } + }, + "assistant": { + "id": "message-96449345-0f77-4bc7-a001-f3498fcab8a2", + "role": "assistant", + "text": "LIVE_BRAID_GLM-5_2_OK", + "status": "complete", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "parts": [ + { + "id": "op-live-send-glm-5.2:text", + "kind": "text", + "text": "LIVE_BRAID_GLM-5_2_OK", + "sourceEventId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final" + } + ] + }, + "finalText": "LIVE_BRAID_GLM-5_2_OK", + "marker": "LIVE_BRAID_GLM-5_2_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", + "lastError": null + }, + "cancel": { + "prompt": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-glm-5.2", + "operationId": "op-live-cancel-send-glm-5.2", + "revision": 14, + "replayed": false, + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "admission": { + "version": 1, + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "turnId": "turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0", "operationId": "op-live-cancel-send-glm-5.2", - "status": "streaming", - "startedAt": "2026-08-29T00:23:13.417Z", - "updatedAt": "2026-08-29T00:23:13.417Z", - "inputTokens": 0, - "outputTokens": 0, - "tokensKnown": false, - "usdKnown": false, - "tokenStatus": "unknown", - "costStatus": "unknown", - "model": "glm-5.2", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:27.250Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "requested": { + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live opencode/zai-coding-plan/glm-5.2", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "opencode" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "glm-5.2", + "runner": "opencode" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, "provider": "cli-bridge", - "runner": "opencode", - "connectionId": "connection-live-cli-bridge", - "requestedSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "completeness": "incomplete", - "providerSessionId": "session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1", - "materializationDigest": "b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b" + "requestedSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "a6fe7228f6570b63e61c9323395d38ce4dad581f36768bbfa85b613a76fd3239", + "capabilitiesDigest": "b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6", + "materializationDigest": "dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e", + "digest": "251a428a92eb4a633c41e3c62f8aceebcfa42fa06a2ba0361f9281251aa3a35a" }, - "response": { - "version": 1, - "type": "ack", - "requestId": "cancel-glm-5.2", - "revision": 25, - "operationId": "op-live-cancel-glm-5.2", - "command": "cancel_run", - "runId": "run-42b57b42-ab0b-4776-b1e4-45862c8c450f", - "control": "cancel", - "outcome": "rejected", - "replayed": false - }, - "attemptedRun": true, - "status": "advertised-but-not-terminal-cancelled" - } + "command": "send" + }, + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "activeRun": { + "id": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "turnId": "turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0", + "operationId": "op-live-cancel-send-glm-5.2", + "status": "streaming", + "startedAt": "2026-08-29T18:31:27.260Z", + "updatedAt": "2026-08-29T18:31:27.260Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "materializationDigest": "dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-glm-5.2", + "revision": 26, + "operationId": "op-live-cancel-glm-5.2", + "command": "cancel_run", + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "run": { + "id": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "turnId": "turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0", + "operationId": "op-live-cancel-send-glm-5.2", + "status": "aborted", + "startedAt": "2026-08-29T18:31:27.260Z", + "updatedAt": "2026-08-29T18:31:28.207Z", + "terminalAt": "2026-08-29T18:31:28.207Z", + "durationMs": 947, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "completeness": "complete", + "providerSessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "environmentId": "environment-f05ac3863839863d6592e55bdc1d2166", + "controlRef": { + "runId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "provider": "cli-bridge", + "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0", + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "executionId": "run-3818dc5d-d7d9-4d30-aca7-51259610c7b3", + "requestDigest": "sha256:85d9b4f9fbbc7de553bf899ade70609021eaf66fe5a4409d25498143301cd935" + }, + "materializationDigest": "dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e", + "contentBytes": 14 + }, + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": false, + "advertisedByBraid": false, + "advertised": false, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "targetProof": { + "key": "glm-5.2", + "harness": "opencode", + "provider": "zai-coding-plan", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "materializationDigest": "e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e" } }, - "status": "failed", + "operationReceipt": { + "operation": "cli-bridge.target-smoke", + "packed": true, + "runId": "run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "status": "passed" + }, + "status": "passed", "stderr": "", - "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-glm-5.2\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-glm-5.2\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:06.923Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:06.923Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-glm-5.2\",\"operationId\":\"op-live-send-glm-5.2\",\"revision\":4,\"replayed\":false,\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"admission\":{\"version\":1,\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:23:08.659Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"b68e6bdcee69b8fdf9bb71ace144ee2a32ece38f36ac72a1e2a944636cf07491\",\"capabilitiesDigest\":\"cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd\",\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"digest\":\"2afa29fdd7f13affde6b0eafba617bd0f51279c7cb45573099e988e6cfa1b64e\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"admission\":{\"version\":1,\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:23:08.659Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"b68e6bdcee69b8fdf9bb71ace144ee2a32ece38f36ac72a1e2a944636cf07491\",\"capabilitiesDigest\":\"cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd\",\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"digest\":\"2afa29fdd7f13affde6b0eafba617bd0f51279c7cb45573099e988e6cfa1b64e\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-glm-5.2-7fac9b274f98e53c6267030a\",\"operationId\":\"op-live-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"7fac9b274f98e53c6267030af185dce40a524d16228323746e5228b2662ef83a\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:23:08.680Z\",\"updatedAt\":\"2026-08-29T00:23:08.680Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-glm-5.2\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"runId\":\"retained-intent-run:698798373dedaacfab91ae06ca100d481aae4de79d4d5145337fb5af53017334\",\"requestedProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requestDigest\":\"sha256:698798373dedaacfab91ae06ca100d481aae4de79d4d5145337fb5af53017334\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-glm-5.2\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:08.670Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:08.670Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"focusedRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"activeRuns\":[{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:08.670Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"running\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\"},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"focusedRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"startedAt\":\"2026-08-29T00:23:08.670Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-glm-5.2\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-glm-5.2\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"source\":{\"eventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:23:09.478Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:23:09.478Z\"},\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"provider\":{\"eventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:23:09.478Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"source\":{\"eventId\":\"2:0\",\"providerSequence\":2,\"cursor\":\"2:0\",\"receivedAt\":\"2026-08-29T00:23:12.534Z\"},\"part\":{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"2:0\"},\"delta\":\"LIVE_BRAID_GLM-5_2_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"source\":{\"eventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:23:12.633Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_GLM-5_2_OK\",\"usage\":{\"input\":17707,\"output\":44,\"usdKnown\":false,\"model\":\"opencode/zai-coding-plan/glm-5.2\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-glm-5.2-7fac9b274f98e53c6267030a\",\"operationId\":\"op-live-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"7fac9b274f98e53c6267030af185dce40a524d16228323746e5228b2662ef83a\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T00:23:08.680Z\",\"updatedAt\":\"2026-08-29T00:23:12.651Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-glm-5.2\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:08.670Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:12.634Z\",\"terminalAt\":\"2026-08-29T00:23:12.634Z\",\"durationMs\":3964,\"inputTokens\":17707,\"outputTokens\":44,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:09.478Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:08.670Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3964},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":61}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:09.478Z\"}],\"focusedRunId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"completed\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"environment:environment-e89db0533b51b9bf25167b4285bf9650\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:23:07.947Z\",\"occurredAt\":\"2026-08-29T00:23:09.478Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:12.634Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:23:07.947Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:23:07.947Z\",\"observed: 2026-08-29T00:23:09.478Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"17707\"},{\"label\":\"output tokens\",\"value\":\"44\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"model\",\"value\":\"opencode/zai-coding-plan/glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-glm-5.2\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"revision\":14,\"replayed\":false,\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"admission\":{\"version\":1,\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:23:13.407Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"991bee15b03b14fa9bc930ca0a390ff8acac2095ba0d0eef5505687841b87c3f\",\"capabilitiesDigest\":\"cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd\",\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\",\"digest\":\"074a2baab8b7a4f117d96a4a713ab364d613879a410c74d32fd76afdfdeb0af9\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:23:13.407Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"991bee15b03b14fa9bc930ca0a390ff8acac2095ba0d0eef5505687841b87c3f\",\"capabilitiesDigest\":\"cd62362cca9fe92e3ff0e34ce3d72afa504d8749c3d778081be8890fe2859ebd\",\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\",\"digest\":\"074a2baab8b7a4f117d96a4a713ab364d613879a410c74d32fd76afdfdeb0af9\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-glm-5.2-53e3d0cbc21ce8a0b8bb2a71\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"53e3d0cbc21ce8a0b8bb2a717a163213811e9bf3d88cf27a9169954038491dc7\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:23:13.425Z\",\"updatedAt\":\"2026-08-29T00:23:13.425Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-glm-5.2\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"runId\":\"retained-intent-run:f5792847a638e3209db5f6e2baa692d8fe70fcae20d90defbf33c1bd7896974c\",\"requestedProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requestDigest\":\"sha256:f5792847a638e3209db5f6e2baa692d8fe70fcae20d90defbf33c1bd7896974c\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-glm-5.2\",\"revision\":16,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":16,\"sequence\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:12.634Z\",\"terminalAt\":\"2026-08-29T00:23:12.634Z\",\"durationMs\":3964,\"inputTokens\":17707,\"outputTokens\":44,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"updatedAt\":\"2026-08-29T00:23:13.417Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":17707,\"output\":44,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:09.478Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"activeRuns\":[{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3964},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"running\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\"},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":17707,\"output\":44,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:09.478Z\"}],\"activeRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"completed\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"environment:environment-e89db0533b51b9bf25167b4285bf9650\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:23:07.947Z\",\"occurredAt\":\"2026-08-29T00:23:09.478Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:12.634Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"kind\":\"run\",\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"occurredAt\":\"2026-08-29T00:23:13.417Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:13.417Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:23:07.947Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:13.417Z\"},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ee012bc5-8987-476c-8194-81625ee71db1\"],\"runner\":\"opencode\",\"startedAt\":\"2026-08-29T00:23:13.417Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:23:07.947Z\",\"observed: 2026-08-29T00:23:09.478Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-glm-5.2\",\"revision\":25,\"operationId\":\"op-live-cancel-glm-5.2\",\"command\":\"cancel_run\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":\"cancel\",\"outcome\":\"rejected\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":{\"operationId\":\"op-live-cancel-glm-5.2\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":{\"operationId\":\"op-live-cancel-glm-5.2\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-glm-5.2-59cd12bc13883a02269bbe42\",\"operationId\":\"op-live-cancel-glm-5.2\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"59cd12bc13883a02269bbe4236945b25bab48807ad8d59089a713ae574568a5e\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:23:13.492Z\",\"updatedAt\":\"2026-08-29T00:23:13.492Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-glm-5.2\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"requestDigest\":\"sha256:da30212595dc2cfea3fe5363087d1ef6a3c6d1009f52c1d059f635569c01552f\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-glm-5.2\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"source\":{\"eventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:23:14.218Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:23:12.677Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:23:14.218Z\"},\"controlRef\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"requestDigest\":\"sha256:da30212595dc2cfea3fe5363087d1ef6a3c6d1009f52c1d059f635569c01552f\"},\"provider\":{\"eventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:23:14.218Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-glm-5.2-59cd12bc13883a02269bbe42\",\"operationId\":\"op-live-cancel-glm-5.2\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"59cd12bc13883a02269bbe4236945b25bab48807ad8d59089a713ae574568a5e\",\"kind\":\"custom\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"9b36e01becb0d1203e711951cfba6431bf6287b23dc3b2ba9925d802bc3351ff\",\"createdAt\":\"2026-08-29T00:23:13.492Z\",\"updatedAt\":\"2026-08-29T00:23:14.257Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":{\"operationId\":\"op-live-cancel-glm-5.2\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"control\":\"cancel\",\"status\":\"rejected\",\"detail\":\"CONTROL_REJECTED\"}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-glm-5.2\",\"revision\":26,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":26,\"sequence\":26,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:12.634Z\",\"terminalAt\":\"2026-08-29T00:23:12.634Z\",\"durationMs\":3964,\"inputTokens\":17707,\"outputTokens\":44,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"cancelling\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"updatedAt\":\"2026-08-29T00:23:14.269Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"requestDigest\":\"sha256:da30212595dc2cfea3fe5363087d1ef6a3c6d1009f52c1d059f635569c01552f\"},\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":17707,\"output\":44,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:14.218Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"activeRuns\":[{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":26,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelling\",\"statusText\":\"cancelling\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3964},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"cancelling\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\"},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":17707,\"output\":44,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:14.218Z\"}],\"activeRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"completed\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:12.634Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"kind\":\"run\",\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"status\":\"cancelling\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"occurredAt\":\"2026-08-29T00:23:13.417Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"environment:environment-e89db0533b51b9bf25167b4285bf9650\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:23:07.947Z\",\"occurredAt\":\"2026-08-29T00:23:14.218Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelling\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:14.269Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelling\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:23:14.269Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelling\",\"detail\":\"rejected\",\"occurredAt\":\"2026-08-29T00:23:14.269Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:23:07.947Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelling\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:13.417Z\"},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelling\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ee012bc5-8987-476c-8194-81625ee71db1\"],\"runner\":\"opencode\",\"startedAt\":\"2026-08-29T00:23:13.417Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:23:07.947Z\",\"observed: 2026-08-29T00:23:14.218Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"fields\":[{\"label\":\"status\",\"value\":\"cancelling\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"The current runtime does not acknowledge provider cancellation\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"source\":{\"eventId\":\"3:0\",\"providerSequence\":2,\"cursor\":\"3:0\",\"receivedAt\":\"2026-08-29T00:24:07.874Z\"},\"part\":{\"id\":\"op-live-cancel-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"sourceEventId\":\"3:0\"},\"delta\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"source\":{\"eventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:24:08.006Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"usage\":{\"input\":17784,\"output\":5903,\"usdKnown\":false,\"model\":\"opencode/zai-coding-plan/glm-5.2\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-glm-5.2-53e3d0cbc21ce8a0b8bb2a71\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"53e3d0cbc21ce8a0b8bb2a717a163213811e9bf3d88cf27a9169954038491dc7\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T00:23:13.425Z\",\"updatedAt\":\"2026-08-29T00:24:08.046Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-glm-5.2\",\"revision\":29,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":29,\"sequence\":29,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"op-live-cancel-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"sourceEventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:final\"}]}],\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"updatedAt\":\"2026-08-29T00:23:12.634Z\",\"terminalAt\":\"2026-08-29T00:23:12.634Z\",\"durationMs\":3964,\"inputTokens\":17707,\"outputTokens\":44,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestDigest\":\"sha256:ee87ac5f1c1bc3b3271379d05795e6e8962115a987c3940cc41e67ddfe7008f4\"},\"materializationDigest\":\"a42ffc7b54aa8687bc1bbda69daf57d5793ff905d2fd7075996668ae9a709efc\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"updatedAt\":\"2026-08-29T00:24:08.025Z\",\"terminalAt\":\"2026-08-29T00:24:08.025Z\",\"durationMs\":54608,\"inputTokens\":17784,\"outputTokens\":5903,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"controlRef\":{\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OjZlZjU5ZWFlOGUyMTI1ZmVjMjM1NTVjNzYwMDhlOWI5M2UzMTFkMjVjNDA0MTVhOWU1YzhmZTMzNzJlZGJhYmEiLCJpSnFVX3VmdnFuWVFLZFFocmh5aV81LVA1aFVTV0Q3T1V1MUFSWVpaaElRIl0\",\"sessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"executionId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"requestDigest\":\"sha256:da30212595dc2cfea3fe5363087d1ef6a3c6d1009f52c1d059f635569c01552f\"},\"materializationDigest\":\"b8ec03ff75ee0502f2f7824214c0380f2b1a3227331c2aae1cefc2fe1a1ea83b\",\"cursor\":\"3:0\",\"cursorCommittedSequence\":27,\"contentBytes\":19124}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":35491,\"output\":5947,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:14.218Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":29,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-opencode-zai-coding-plan-glm-5-2\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:23:13.417Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"part-message-cc3ed35c-b7c4-4589-8aad-82fea8729aaa\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-7f9fb7ab-14b6-4101-b6bc-14f5484e40cb\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:final\"}]},{\"id\":\"message-41457560-af78-4264-8e1b-358962616cb8\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"part-message-41457560-af78-4264-8e1b-358962616cb8\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-ace8af67-0de5-4302-81a4-55799874dc24\",\"role\":\"assistant\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"status\":\"complete\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"parts\":[{\"id\":\"op-live-cancel-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"1. apple\\n2. bird\\n3. cat\\n4. dog\\n5. echo\\n6. fog\\n7. goat\\n8. hat\\n9. ice\\n10. jam\\n11. kite\\n12. lion\\n13. moon\\n14. nest\\n15. owl\\n16. pine\\n17. queen\\n18. rain\\n19. sun\\n20. tree\\n21. urn\\n22. vine\\n23. worm\\n24. yarn\\n25. zebra\\n26. axe\\n27. bee\\n28. clay\\n29. dew\\n30. elm\\n31. fin\\n32. gem\\n33. hill\\n34. ink\\n35. jet\\n36. keg\\n37. loop\\n38. mask\\n39. nook\\n40. oak\\n41. palm\\n42. quiz\\n43. reef\\n44. sail\\n45. tank\\n46. vale\\n47. wolf\\n48. box\\n49. cork\\n50. drum\\n51. apple\\n52. bird\\n53. cat\\n54. dog\\n55. echo\\n56. fog\\n57. goat\\n58. hat\\n59. ice\\n60. jam\\n61. kite\\n62. lion\\n63. moon\\n64. nest\\n65. owl\\n66. pine\\n67. queen\\n68. rain\\n69. sun\\n70. tree\\n71. urn\\n72. vine\\n73. worm\\n74. yarn\\n75. zebra\\n76. axe\\n77. bee\\n78. clay\\n79. dew\\n80. elm\\n81. fin\\n82. gem\\n83. hill\\n84. ink\\n85. jet\\n86. keg\\n87. loop\\n88. mask\\n89. nook\\n90. oak\\n91. palm\\n92. quiz\\n93. reef\\n94. sail\\n95. tank\\n96. vale\\n97. wolf\\n98. box\\n99. cork\\n100. drum\\n101. apple\\n102. bird\\n103. cat\\n104. dog\\n105. echo\\n106. fog\\n107. goat\\n108. hat\\n109. ice\\n110. jam\\n111. kite\\n112. lion\\n113. moon\\n114. nest\\n115. owl\\n116. pine\\n117. queen\\n118. rain\\n119. sun\\n120. tree\\n121. urn\\n122. vine\\n123. worm\\n124. yarn\\n125. zebra\\n126. axe\\n127. bee\\n128. clay\\n129. dew\\n130. elm\\n131. fin\\n132. gem\\n133. hill\\n134. ink\\n135. jet\\n136. keg\\n137. loop\\n138. mask\\n139. nook\\n140. oak\\n141. palm\\n142. quiz\\n143. reef\\n144. sail\\n145. tank\\n146. vale\\n147. wolf\\n148. box\\n149. cork\\n150. drum\\n151. apple\\n152. bird\\n153. cat\\n154. dog\\n155. echo\\n156. fog\\n157. goat\\n158. hat\\n159. ice\\n160. jam\\n161. kite\\n162. lion\\n163. moon\\n164. nest\\n165. owl\\n166. pine\\n167. queen\\n168. rain\\n169. sun\\n170. tree\\n171. urn\\n172. vine\\n173. worm\\n174. yarn\\n175. zebra\\n176. axe\\n177. bee\\n178. clay\\n179. dew\\n180. elm\\n181. fin\\n182. gem\\n183. hill\\n184. ink\\n185. jet\\n186. keg\\n187. loop\\n188. mask\\n189. nook\\n190. oak\\n191. palm\\n192. quiz\\n193. reef\\n194. sail\\n195. tank\\n196. vale\\n197. wolf\\n198. box\\n199. cork\\n200. drum\\n201. apple\\n202. bird\\n203. cat\\n204. dog\\n205. echo\\n206. fog\\n207. goat\\n208. hat\\n209. ice\\n210. jam\\n211. kite\\n212. lion\\n213. moon\\n214. nest\\n215. owl\\n216. pine\\n217. queen\\n218. rain\\n219. sun\\n220. tree\\n221. urn\\n222. vine\\n223. worm\\n224. yarn\\n225. zebra\\n226. axe\\n227. bee\\n228. clay\\n229. dew\\n230. elm\\n231. fin\\n232. gem\\n233. hill\\n234. ink\\n235. jet\\n236. keg\\n237. loop\\n238. mask\\n239. nook\\n240. oak\\n241. palm\\n242. quiz\\n243. reef\\n244. sail\\n245. tank\\n246. vale\\n247. wolf\\n248. box\\n249. cork\\n250. drum\\n251. apple\\n252. bird\\n253. cat\\n254. dog\\n255. echo\\n256. fog\\n257. goat\\n258. hat\\n259. ice\\n260. jam\\n261. kite\\n262. lion\\n263. moon\\n264. nest\\n265. owl\\n266. pine\\n267. queen\\n268. rain\\n269. sun\\n270. tree\\n271. urn\\n272. vine\\n273. worm\\n274. yarn\\n275. zebra\\n276. axe\\n277. bee\\n278. clay\\n279. dew\\n280. elm\\n281. fin\\n282. gem\\n283. hill\\n284. ink\\n285. jet\\n286. keg\\n287. loop\\n288. mask\\n289. nook\\n290. oak\\n291. palm\\n292. quiz\\n293. reef\\n294. sail\\n295. tank\\n296. vale\\n297. wolf\\n298. box\\n299. cork\\n300. drum\\n301. apple\\n302. bird\\n303. cat\\n304. dog\\n305. echo\\n306. fog\\n307. goat\\n308. hat\\n309. ice\\n310. jam\\n311. kite\\n312. lion\\n313. moon\\n314. nest\\n315. owl\\n316. pine\\n317. queen\\n318. rain\\n319. sun\\n320. tree\\n321. urn\\n322. vine\\n323. worm\\n324. yarn\\n325. zebra\\n326. axe\\n327. bee\\n328. clay\\n329. dew\\n330. elm\\n331. fin\\n332. gem\\n333. hill\\n334. ink\\n335. jet\\n336. keg\\n337. loop\\n338. mask\\n339. nook\\n340. oak\\n341. palm\\n342. quiz\\n343. reef\\n344. sail\\n345. tank\\n346. vale\\n347. wolf\\n348. box\\n349. cork\\n350. drum\\n351. apple\\n352. bird\\n353. cat\\n354. dog\\n355. echo\\n356. fog\\n357. goat\\n358. hat\\n359. ice\\n360. jam\\n361. kite\\n362. lion\\n363. moon\\n364. nest\\n365. owl\\n366. pine\\n367. queen\\n368. rain\\n369. sun\\n370. tree\\n371. urn\\n372. vine\\n373. worm\\n374. yarn\\n375. zebra\\n376. axe\\n377. bee\\n378. clay\\n379. dew\\n380. elm\\n381. fin\\n382. gem\\n383. hill\\n384. ink\\n385. jet\\n386. keg\\n387. loop\\n388. mask\\n389. nook\\n390. oak\\n391. palm\\n392. quiz\\n393. reef\\n394. sail\\n395. tank\\n396. vale\\n397. wolf\\n398. box\\n399. cork\\n400. drum\\n401. apple\\n402. bird\\n403. cat\\n404. dog\\n405. echo\\n406. fog\\n407. goat\\n408. hat\\n409. ice\\n410. jam\\n411. kite\\n412. lion\\n413. moon\\n414. nest\\n415. owl\\n416. pine\\n417. queen\\n418. rain\\n419. sun\\n420. tree\\n421. urn\\n422. vine\\n423. worm\\n424. yarn\\n425. zebra\\n426. axe\\n427. bee\\n428. clay\\n429. dew\\n430. elm\\n431. fin\\n432. gem\\n433. hill\\n434. ink\\n435. jet\\n436. keg\\n437. loop\\n438. mask\\n439. nook\\n440. oak\\n441. palm\\n442. quiz\\n443. reef\\n444. sail\\n445. tank\\n446. vale\\n447. wolf\\n448. box\\n449. cork\\n450. drum\\n451. apple\\n452. bird\\n453. cat\\n454. dog\\n455. echo\\n456. fog\\n457. goat\\n458. hat\\n459. ice\\n460. jam\\n461. kite\\n462. lion\\n463. moon\\n464. nest\\n465. owl\\n466. pine\\n467. queen\\n468. rain\\n469. sun\\n470. tree\\n471. urn\\n472. vine\\n473. worm\\n474. yarn\\n475. zebra\\n476. axe\\n477. bee\\n478. clay\\n479. dew\\n480. elm\\n481. fin\\n482. gem\\n483. hill\\n484. ink\\n485. jet\\n486. keg\\n487. loop\\n488. mask\\n489. nook\\n490. oak\\n491. palm\\n492. quiz\\n493. reef\\n494. sail\\n495. tank\\n496. vale\\n497. wolf\\n498. box\\n499. cork\\n500. drum\\n501. apple\\n502. bird\\n503. cat\\n504. dog\\n505. echo\\n506. fog\\n507. goat\\n508. hat\\n509. ice\\n510. jam\\n511. kite\\n512. lion\\n513. moon\\n514. nest\\n515. owl\\n516. pine\\n517. queen\\n518. rain\\n519. sun\\n520. tree\\n521. urn\\n522. vine\\n523. worm\\n524. yarn\\n525. zebra\\n526. axe\\n527. bee\\n528. clay\\n529. dew\\n530. elm\\n531. fin\\n532. gem\\n533. hill\\n534. ink\\n535. jet\\n536. keg\\n537. loop\\n538. mask\\n539. nook\\n540. oak\\n541. palm\\n542. quiz\\n543. reef\\n544. sail\\n545. tank\\n546. vale\\n547. wolf\\n548. box\\n549. cork\\n550. drum\\n551. apple\\n552. bird\\n553. cat\\n554. dog\\n555. echo\\n556. fog\\n557. goat\\n558. hat\\n559. ice\\n560. jam\\n561. kite\\n562. lion\\n563. moon\\n564. nest\\n565. owl\\n566. pine\\n567. queen\\n568. rain\\n569. sun\\n570. tree\\n571. urn\\n572. vine\\n573. worm\\n574. yarn\\n575. zebra\\n576. axe\\n577. bee\\n578. clay\\n579. dew\\n580. elm\\n581. fin\\n582. gem\\n583. hill\\n584. ink\\n585. jet\\n586. keg\\n587. loop\\n588. mask\\n589. nook\\n590. oak\\n591. palm\\n592. quiz\\n593. reef\\n594. sail\\n595. tank\\n596. vale\\n597. wolf\\n598. box\\n599. cork\\n600. drum\\n601. apple\\n602. bird\\n603. cat\\n604. dog\\n605. echo\\n606. fog\\n607. goat\\n608. hat\\n609. ice\\n610. jam\\n611. kite\\n612. lion\\n613. moon\\n614. nest\\n615. owl\\n616. pine\\n617. queen\\n618. rain\\n619. sun\\n620. tree\\n621. urn\\n622. vine\\n623. worm\\n624. yarn\\n625. zebra\\n626. axe\\n627. bee\\n628. clay\\n629. dew\\n630. elm\\n631. fin\\n632. gem\\n633. hill\\n634. ink\\n635. jet\\n636. keg\\n637. loop\\n638. mask\\n639. nook\\n640. oak\\n641. palm\\n642. quiz\\n643. reef\\n644. sail\\n645. tank\\n646. vale\\n647. wolf\\n648. box\\n649. cork\\n650. drum\\n651. apple\\n652. bird\\n653. cat\\n654. dog\\n655. echo\\n656. fog\\n657. goat\\n658. hat\\n659. ice\\n660. jam\\n661. kite\\n662. lion\\n663. moon\\n664. nest\\n665. owl\\n666. pine\\n667. queen\\n668. rain\\n669. sun\\n670. tree\\n671. urn\\n672. vine\\n673. worm\\n674. yarn\\n675. zebra\\n676. axe\\n677. bee\\n678. clay\\n679. dew\\n680. elm\\n681. fin\\n682. gem\\n683. hill\\n684. ink\\n685. jet\\n686. keg\\n687. loop\\n688. mask\\n689. nook\\n690. oak\\n691. palm\\n692. quiz\\n693. reef\\n694. sail\\n695. tank\\n696. vale\\n697. wolf\\n698. box\\n699. cork\\n700. drum\\n701. apple\\n702. bird\\n703. cat\\n704. dog\\n705. echo\\n706. fog\\n707. goat\\n708. hat\\n709. ice\\n710. jam\\n711. kite\\n712. lion\\n713. moon\\n714. nest\\n715. owl\\n716. pine\\n717. queen\\n718. rain\\n719. sun\\n720. tree\\n721. urn\\n722. vine\\n723. worm\\n724. yarn\\n725. zebra\\n726. axe\\n727. bee\\n728. clay\\n729. dew\\n730. elm\\n731. fin\\n732. gem\\n733. hill\\n734. ink\\n735. jet\\n736. keg\\n737. loop\\n738. mask\\n739. nook\\n740. oak\\n741. palm\\n742. quiz\\n743. reef\\n744. sail\\n745. tank\\n746. vale\\n747. wolf\\n748. box\\n749. cork\\n750. drum\\n751. apple\\n752. bird\\n753. cat\\n754. dog\\n755. echo\\n756. fog\\n757. goat\\n758. hat\\n759. ice\\n760. jam\\n761. kite\\n762. lion\\n763. moon\\n764. nest\\n765. owl\\n766. pine\\n767. queen\\n768. rain\\n769. sun\\n770. tree\\n771. urn\\n772. vine\\n773. worm\\n774. yarn\\n775. zebra\\n776. axe\\n777. bee\\n778. clay\\n779. dew\\n780. elm\\n781. fin\\n782. gem\\n783. hill\\n784. ink\\n785. jet\\n786. keg\\n787. loop\\n788. mask\\n789. nook\\n790. oak\\n791. palm\\n792. quiz\\n793. reef\\n794. sail\\n795. tank\\n796. vale\\n797. wolf\\n798. box\\n799. cork\\n800. drum\\n801. apple\\n802. bird\\n803. cat\\n804. dog\\n805. echo\\n806. fog\\n807. goat\\n808. hat\\n809. ice\\n810. jam\\n811. kite\\n812. lion\\n813. moon\\n814. nest\\n815. owl\\n816. pine\\n817. queen\\n818. rain\\n819. sun\\n820. tree\\n821. urn\\n822. vine\\n823. worm\\n824. yarn\\n825. zebra\\n826. axe\\n827. bee\\n828. clay\\n829. dew\\n830. elm\\n831. fin\\n832. gem\\n833. hill\\n834. ink\\n835. jet\\n836. keg\\n837. loop\\n838. mask\\n839. nook\\n840. oak\\n841. palm\\n842. quiz\\n843. reef\\n844. sail\\n845. tank\\n846. vale\\n847. wolf\\n848. box\\n849. cork\\n850. drum\\n851. apple\\n852. bird\\n853. cat\\n854. dog\\n855. echo\\n856. fog\\n857. goat\\n858. hat\\n859. ice\\n860. jam\\n861. kite\\n862. lion\\n863. moon\\n864. nest\\n865. owl\\n866. pine\\n867. queen\\n868. rain\\n869. sun\\n870. tree\\n871. urn\\n872. vine\\n873. worm\\n874. yarn\\n875. zebra\\n876. axe\\n877. bee\\n878. clay\\n879. dew\\n880. elm\\n881. fin\\n882. gem\\n883. hill\\n884. ink\\n885. jet\\n886. keg\\n887. loop\\n888. mask\\n889. nook\\n890. oak\\n891. palm\\n892. quiz\\n893. reef\\n894. sail\\n895. tank\\n896. vale\\n897. wolf\\n898. box\\n899. cork\\n900. drum\\n901. apple\\n902. bird\\n903. cat\\n904. dog\\n905. echo\\n906. fog\\n907. goat\\n908. hat\\n909. ice\\n910. jam\\n911. kite\\n912. lion\\n913. moon\\n914. nest\\n915. owl\\n916. pine\\n917. queen\\n918. rain\\n919. sun\\n920. tree\\n921. urn\\n922. vine\\n923. worm\\n924. yarn\\n925. zebra\\n926. axe\\n927. bee\\n928. clay\\n929. dew\\n930. elm\\n931. fin\\n932. gem\\n933. hill\\n934. ink\\n935. jet\\n936. keg\\n937. loop\\n938. mask\\n939. nook\\n940. oak\\n941. palm\\n942. quiz\\n943. reef\\n944. sail\\n945. tank\\n946. vale\\n947. wolf\\n948. box\\n949. cork\\n950. drum\\n951. apple\\n952. bird\\n953. cat\\n954. dog\\n955. echo\\n956. fog\\n957. goat\\n958. hat\\n959. ice\\n960. jam\\n961. kite\\n962. lion\\n963. moon\\n964. nest\\n965. owl\\n966. pine\\n967. queen\\n968. rain\\n969. sun\\n970. tree\\n971. urn\\n972. vine\\n973. worm\\n974. yarn\\n975. zebra\\n976. axe\\n977. bee\\n978. clay\\n979. dew\\n980. elm\\n981. fin\\n982. gem\\n983. hill\\n984. ink\\n985. jet\\n986. keg\\n987. loop\\n988. mask\\n989. nook\\n990. oak\\n991. palm\\n992. quiz\\n993. reef\\n994. sail\\n995. tank\\n996. vale\\n997. wolf\\n998. box\\n999. cork\\n1000. drum\",\"sourceEventId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"turnId\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17707,\"output\":44,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3964},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"turnId\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"3:0\",\"providerSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"requestedSessionId\":\"session-braid-run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"usage\":{\"input\":17784,\"output\":5903,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":54608},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"completeness\":\"complete\",\"contentBytes\":19124}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":35491,\"output\":5947,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:23:07.947Z\",\"updatedAt\":\"2026-08-29T00:23:14.218Z\"}],\"focusedRunId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"kind\":\"run\",\"title\":\"run run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"status\":\"completed\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\",\"occurredAt\":\"2026-08-29T00:23:08.670Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"activity:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:23:12.634Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"run\",\"entityId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"},{\"id\":\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"kind\":\"run\",\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"status\":\"completed\",\"elapsedMs\":54608,\"startedAt\":\"2026-08-29T00:23:13.417Z\",\"occurredAt\":\"2026-08-29T00:23:13.417Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"environment:environment-e89db0533b51b9bf25167b4285bf9650\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:23:07.947Z\",\"occurredAt\":\"2026-08-29T00:23:14.218Z\",\"runId\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T00:24:08.025Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"completed\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:24:08.025Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"},{\"id\":\"activity:run-42b57b42-ab0b-4776-b1e4-45862c8c450f:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"completed\",\"detail\":\"rejected\",\"occurredAt\":\"2026-08-29T00:24:08.025Z\",\"runId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"entityType\":\"run\",\"entityId\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:23:06.923Z\"},{\"id\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"run:run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:23:07.947Z\"},{\"id\":\"turn-d8860d89-c795-493b-9562-a815c84541bf\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"run-cc2e9a1f-c9a2-4a4e-a5d9-7aed6e4efaf1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-d8860d89-c795-493b-9562-a815c84541bf\"],\"runner\":\"opencode\",\"elapsedMs\":3964,\"startedAt\":\"2026-08-29T00:23:08.670Z\"},{\"id\":\"turn-ee012bc5-8987-476c-8194-81625ee71db1\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:23:13.417Z\"},{\"id\":\"run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ee012bc5-8987-476c-8194-81625ee71db1\"],\"runner\":\"opencode\",\"elapsedMs\":54608,\"startedAt\":\"2026-08-29T00:23:13.417Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-e89db0533b51b9bf25167b4285bf9650\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:23:07.947Z\",\"observed: 2026-08-29T00:23:14.218Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-42b57b42-ab0b-4776-b1e4-45862c8c450f\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"17784\"},{\"label\":\"output tokens\",\"value\":\"5903\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"model\",\"value\":\"opencode/zai-coding-plan/glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":true,\"source\":\"application\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":30,\"revision\":30,\"event\":{\"sequence\":30,\"revision\":30,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-glm-5.2\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-glm-5.2\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:21.451Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:21.451Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:21.451Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-glm-5.2\",\"operationId\":\"op-live-send-glm-5.2\",\"revision\":4,\"replayed\":false,\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"admission\":{\"version\":1,\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"operationId\":\"op-live-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:22.350Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"def112beeb6bec7c404a0307dd34a008f5b04aed4276d8f594c5e13f10cb02c2\",\"capabilitiesDigest\":\"b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6\",\"materializationDigest\":\"e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e\",\"digest\":\"291afe4c38f54086e40c53bc21b3a0a3e10f8f21a5204d1a629d9bc9b0637f91\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"admission\":{\"version\":1,\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"operationId\":\"op-live-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:22.350Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"def112beeb6bec7c404a0307dd34a008f5b04aed4276d8f594c5e13f10cb02c2\",\"capabilitiesDigest\":\"b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6\",\"materializationDigest\":\"e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e\",\"digest\":\"291afe4c38f54086e40c53bc21b3a0a3e10f8f21a5204d1a629d9bc9b0637f91\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-glm-5.2-afcbd429d3df281ccfc48be6\",\"operationId\":\"op-live-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"afcbd429d3df281ccfc48be6f14c42f4154175b0b7588ebae8f405c2c05aed5a\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T18:31:22.372Z\",\"updatedAt\":\"2026-08-29T18:31:22.372Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-glm-5.2\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"runId\":\"retained-intent-run:95e4566e4f22d3f1df8602746b41af1d560a0bf4f406501470ef15b74b9027b7\",\"requestedProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requestDigest\":\"sha256:95e4566e4f22d3f1df8602746b41af1d560a0bf4f406501470ef15b74b9027b7\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-glm-5.2\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:22.361Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[]}],\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"updatedAt\":\"2026-08-29T18:31:22.361Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"materializationDigest\":\"e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"focusedRunId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"activeRuns\":[{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:22.361Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"running\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\"},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"focusedRunId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"kind\":\"run\",\"title\":\"run run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"status\":\"running\",\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"occurredAt\":\"2026-08-29T18:31:22.361Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"activity:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:22.361Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\"],\"runner\":\"opencode\",\"startedAt\":\"2026-08-29T18:31:22.361Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect while another run is active\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile while another run is active\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-glm-5.2\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestDigest\":\"sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-glm-5.2\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"source\":{\"eventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:23.175Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T18:31:23.175Z\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\"},\"controlRef\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestDigest\":\"sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc\"},\"provider\":{\"eventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:23.175Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"source\":{\"eventId\":\"2:0\",\"providerSequence\":2,\"cursor\":\"2:0\",\"receivedAt\":\"2026-08-29T18:31:26.181Z\"},\"part\":{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"2:0\"},\"delta\":\"LIVE_BRAID_GLM-5_2_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"source\":{\"eventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T18:31:26.298Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_GLM-5_2_OK\",\"usage\":{\"input\":7214,\"output\":50,\"usdKnown\":false,\"model\":\"opencode/zai-coding-plan/glm-5.2\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-glm-5.2-afcbd429d3df281ccfc48be6\",\"operationId\":\"op-live-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"afcbd429d3df281ccfc48be6f14c42f4154175b0b7588ebae8f405c2c05aed5a\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T18:31:22.372Z\",\"updatedAt\":\"2026-08-29T18:31:26.322Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-glm-5.2\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:22.361Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]}],\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"updatedAt\":\"2026-08-29T18:31:26.299Z\",\"terminalAt\":\"2026-08-29T18:31:26.299Z\",\"durationMs\":3938,\"inputTokens\":7214,\"outputTokens\":50,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"controlRef\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestDigest\":\"sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc\"},\"materializationDigest\":\"e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":7214,\"output\":50,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:23.175Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:22.361Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":7214,\"output\":50,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3938},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"completeness\":\"complete\",\"contentBytes\":61}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":7214,\"output\":50,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:23.175Z\"}],\"focusedRunId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"kind\":\"run\",\"title\":\"run run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"status\":\"completed\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"occurredAt\":\"2026-08-29T18:31:22.361Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"environment:environment-f05ac3863839863d6592e55bdc1d2166\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:21.989Z\",\"occurredAt\":\"2026-08-29T18:31:23.175Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\"},{\"id\":\"activity:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:26.299Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:21.989Z\"},{\"id\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\"],\"runner\":\"opencode\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:21.989Z\",\"observed: 2026-08-29T18:31:23.175Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"7214\"},{\"label\":\"output tokens\",\"value\":\"50\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"model\",\"value\":\"opencode/zai-coding-plan/glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-glm-5.2\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"revision\":14,\"replayed\":false,\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"admission\":{\"version\":1,\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:27.250Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"a6fe7228f6570b63e61c9323395d38ce4dad581f36768bbfa85b613a76fd3239\",\"capabilitiesDigest\":\"b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6\",\"materializationDigest\":\"dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e\",\"digest\":\"251a428a92eb4a633c41e3c62f8aceebcfa42fa06a2ba0361f9281251aa3a35a\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:27.250Z\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requested\":{\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"glm-5.2\",\"runner\":\"opencode\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"model\":\"glm-5.2\",\"route\":\"opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"providerRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"a6fe7228f6570b63e61c9323395d38ce4dad581f36768bbfa85b613a76fd3239\",\"capabilitiesDigest\":\"b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6\",\"materializationDigest\":\"dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e\",\"digest\":\"251a428a92eb4a633c41e3c62f8aceebcfa42fa06a2ba0361f9281251aa3a35a\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-glm-5.2-17efb85fd96541bfb7b9f2ad\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"17efb85fd96541bfb7b9f2adfaeb0f321a09486fb8a1c8ac39a617795b2b1303\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T18:31:27.269Z\",\"updatedAt\":\"2026-08-29T18:31:27.269Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-glm-5.2\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"runId\":\"retained-intent-run:619220e0997a81de38e570bcfe74f4410bd112a9c0802367b5a452fe105f7af1\",\"requestedProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"requestDigest\":\"sha256:619220e0997a81de38e570bcfe74f4410bd112a9c0802367b5a452fe105f7af1\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-glm-5.2\",\"revision\":16,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":16,\"sequence\":16,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:27.260Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]},{\"id\":\"message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[{\"id\":\"part-message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-6b7021ca-22df-4fdb-ae96-996a657e6864\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[]}],\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"updatedAt\":\"2026-08-29T18:31:26.299Z\",\"terminalAt\":\"2026-08-29T18:31:26.299Z\",\"durationMs\":3938,\"inputTokens\":7214,\"outputTokens\":50,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"controlRef\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestDigest\":\"sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc\"},\"materializationDigest\":\"e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T18:31:27.260Z\",\"updatedAt\":\"2026-08-29T18:31:27.260Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"materializationDigest\":\"dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":7214,\"output\":50,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:23.175Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"focusedRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"activeRuns\":[{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":16,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:27.260Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]},{\"id\":\"message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[{\"id\":\"part-message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-6b7021ca-22df-4fdb-ae96-996a657e6864\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":7214,\"output\":50,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3938},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"running\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\"},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":7214,\"output\":50,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:23.175Z\"}],\"activeRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"focusedRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"kind\":\"run\",\"title\":\"run run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"status\":\"completed\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"occurredAt\":\"2026-08-29T18:31:22.361Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"environment:environment-f05ac3863839863d6592e55bdc1d2166\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:21.989Z\",\"occurredAt\":\"2026-08-29T18:31:23.175Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\"},{\"id\":\"activity:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:26.299Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"run:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"kind\":\"run\",\"title\":\"run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"status\":\"running\",\"startedAt\":\"2026-08-29T18:31:27.260Z\",\"occurredAt\":\"2026-08-29T18:31:27.260Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:27.260Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:21.989Z\"},{\"id\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\"],\"runner\":\"opencode\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:27.260Z\"},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\"],\"runner\":\"opencode\",\"startedAt\":\"2026-08-29T18:31:27.260Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:21.989Z\",\"observed: 2026-08-29T18:31:23.175Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect while another run is active\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile while another run is active\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-glm-5.2\",\"revision\":26,\"operationId\":\"op-live-cancel-glm-5.2\",\"command\":\"cancel_run\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"control\":\"cancel\",\"outcome\":\"accepted\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"control\":{\"operationId\":\"op-live-cancel-glm-5.2\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"control\":{\"operationId\":\"op-live-cancel-glm-5.2\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-glm-5.2-b4de53c49b613b2b1ee869c2\",\"operationId\":\"op-live-cancel-glm-5.2\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"b4de53c49b613b2b1ee869c2f2c190e5ff3bc433dedf57c2d21f2b4bede99b12\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T18:31:27.515Z\",\"updatedAt\":\"2026-08-29T18:31:27.515Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-glm-5.2\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"requestDigest\":\"sha256:85d9b4f9fbbc7de553bf899ade70609021eaf66fe5a4409d25498143301cd935\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-glm-5.2\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"source\":{\"eventId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:28.106Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T18:31:26.822Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T18:31:28.106Z\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\"},\"controlRef\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"requestDigest\":\"sha256:85d9b4f9fbbc7de553bf899ade70609021eaf66fe5a4409d25498143301cd935\"},\"provider\":{\"eventId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:28.106Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-glm-5.2-b4de53c49b613b2b1ee869c2\",\"operationId\":\"op-live-cancel-glm-5.2\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"b4de53c49b613b2b1ee869c2f2c190e5ff3bc433dedf57c2d21f2b4bede99b12\",\"kind\":\"custom\",\"status\":\"acknowledged\",\"attempt\":1,\"outcomeDigest\":\"f430d9c9c101fec536eed9da90bf212be94a7c138332862d1e9774b1266d9187\",\"createdAt\":\"2026-08-29T18:31:27.515Z\",\"updatedAt\":\"2026-08-29T18:31:28.170Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.reconnecting\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"status\":\"reconnecting\",\"completeness\":\"streaming\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"control\":{\"operationId\":\"op-live-cancel-glm-5.2\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"control\":\"cancel\",\"status\":\"accepted\",\"detail\":\"CONTROL_DETAIL\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"status\":\"aborted\",\"completeness\":\"complete\",\"finalText\":\"\",\"usage\":{\"input\":0,\"output\":0,\"tokensKnown\":false,\"usdKnown\":false,\"model\":\"glm-5.2\"},\"reason\":\"CONTROL_DETAIL\"}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-glm-5.2\",\"revision\":28,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":28,\"sequence\":28,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:27.260Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]},{\"id\":\"message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[{\"id\":\"part-message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-6b7021ca-22df-4fdb-ae96-996a657e6864\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[]}],\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"updatedAt\":\"2026-08-29T18:31:26.299Z\",\"terminalAt\":\"2026-08-29T18:31:26.299Z\",\"durationMs\":3938,\"inputTokens\":7214,\"outputTokens\":50,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"controlRef\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestDigest\":\"sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc\"},\"materializationDigest\":\"e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T18:31:27.260Z\",\"updatedAt\":\"2026-08-29T18:31:28.207Z\",\"terminalAt\":\"2026-08-29T18:31:28.207Z\",\"durationMs\":947,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"controlRef\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"requestDigest\":\"sha256:85d9b4f9fbbc7de553bf899ade70609021eaf66fe5a4409d25498143301cd935\"},\"materializationDigest\":\"dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":7214,\"output\":50,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:28.106Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":28,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:27.260Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]},{\"id\":\"message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[{\"id\":\"part-message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-6b7021ca-22df-4fdb-ae96-996a657e6864\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":7214,\"output\":50,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3938},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"cancelled\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"elapsedMs\":947},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"completeness\":\"complete\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":7214,\"output\":50,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:28.106Z\"}],\"focusedRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"kind\":\"run\",\"title\":\"run run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"status\":\"completed\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"occurredAt\":\"2026-08-29T18:31:22.361Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"activity:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:26.299Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"run:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"kind\":\"run\",\"title\":\"run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"status\":\"cancelled\",\"elapsedMs\":947,\"startedAt\":\"2026-08-29T18:31:27.260Z\",\"occurredAt\":\"2026-08-29T18:31:27.260Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"environment:environment-f05ac3863839863d6592e55bdc1d2166\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:21.989Z\",\"occurredAt\":\"2026-08-29T18:31:28.106Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:21.989Z\"},{\"id\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\"],\"runner\":\"opencode\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:27.260Z\"},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\"],\"runner\":\"opencode\",\"elapsedMs\":947,\"startedAt\":\"2026-08-29T18:31:27.260Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:21.989Z\",\"observed: 2026-08-29T18:31:28.106Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"final-state-glm-5.2\",\"revision\":28,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":28,\"sequence\":28,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:27.260Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]},{\"id\":\"message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[{\"id\":\"part-message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-6b7021ca-22df-4fdb-ae96-996a657e6864\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[]}],\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"updatedAt\":\"2026-08-29T18:31:26.299Z\",\"terminalAt\":\"2026-08-29T18:31:26.299Z\",\"durationMs\":3938,\"inputTokens\":7214,\"outputTokens\":50,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"controlRef\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestDigest\":\"sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc\"},\"materializationDigest\":\"e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T18:31:27.260Z\",\"updatedAt\":\"2026-08-29T18:31:28.207Z\",\"terminalAt\":\"2026-08-29T18:31:28.207Z\",\"durationMs\":947,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"controlRef\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"requestDigest\":\"sha256:85d9b4f9fbbc7de553bf899ade70609021eaf66fe5a4409d25498143301cd935\"},\"materializationDigest\":\"dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":7214,\"output\":50,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:28.106Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":28,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:27.260Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]},{\"id\":\"message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[{\"id\":\"part-message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-6b7021ca-22df-4fdb-ae96-996a657e6864\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":7214,\"output\":50,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3938},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"cancelled\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"elapsedMs\":947},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"completeness\":\"complete\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":7214,\"output\":50,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:28.106Z\"}],\"focusedRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"kind\":\"run\",\"title\":\"run run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"status\":\"completed\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"occurredAt\":\"2026-08-29T18:31:22.361Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"activity:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:26.299Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"run:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"kind\":\"run\",\"title\":\"run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"status\":\"cancelled\",\"elapsedMs\":947,\"startedAt\":\"2026-08-29T18:31:27.260Z\",\"occurredAt\":\"2026-08-29T18:31:27.260Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"environment:environment-f05ac3863839863d6592e55bdc1d2166\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:21.989Z\",\"occurredAt\":\"2026-08-29T18:31:28.106Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:21.989Z\"},{\"id\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\"],\"runner\":\"opencode\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:27.260Z\"},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\"],\"runner\":\"opencode\",\"elapsedMs\":947,\"startedAt\":\"2026-08-29T18:31:27.260Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:21.989Z\",\"observed: 2026-08-29T18:31:28.106Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"shutdown-glm-5.2\",\"revision\":28,\"operationId\":\"op-live-shutdown-glm-5.2\",\"command\":\"shutdown\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-live-shutdown-glm-5.2\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":30,\"revision\":30,\"event\":{\"sequence\":30,\"revision\":30,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-glm-5.2-17efb85fd96541bfb7b9f2ad\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"effectKind\":\"run.execute\",\"requestDigest\":\"17efb85fd96541bfb7b9f2adfaeb0f321a09486fb8a1c8ac39a617795b2b1303\",\"kind\":\"send\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"709050be156660bc04bed3766c3160fcc713b9a8ebb19bfd0cd66bbe285c86e9\",\"createdAt\":\"2026-08-29T18:31:27.269Z\",\"updatedAt\":\"2026-08-29T18:31:29.848Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-glm-5.2\",\"revision\":30,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":30,\"sequence\":30,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:27.260Z\"}],\"profile\":{\"name\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"glm-5.2\",\"provider\":\"zai-coding-plan\",\"reasoningEffort\":\"none\"},\"harness\":\"opencode\"},\"runConfiguration\":{\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]},{\"id\":\"message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[{\"id\":\"part-message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-6b7021ca-22df-4fdb-ae96-996a657e6864\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[]}],\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"updatedAt\":\"2026-08-29T18:31:26.299Z\",\"terminalAt\":\"2026-08-29T18:31:26.299Z\",\"durationMs\":3938,\"inputTokens\":7214,\"outputTokens\":50,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"controlRef\":{\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestDigest\":\"sha256:c0ef17faf9448154d336a74fd3f025943cf92a69718c9ceefd65d17202d7dedc\"},\"materializationDigest\":\"e1ec4f299874316d276549b7b705be0ab266d2b73e7b78d9bab65d5ef241a11e\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":61},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T18:31:27.260Z\",\"updatedAt\":\"2026-08-29T18:31:28.207Z\",\"terminalAt\":\"2026-08-29T18:31:28.207Z\",\"durationMs\":947,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"provider\":\"cli-bridge\",\"runner\":\"opencode\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"controlRef\":{\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"sessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"executionId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"requestDigest\":\"sha256:85d9b4f9fbbc7de553bf899ade70609021eaf66fe5a4409d25498143301cd935\"},\"materializationDigest\":\"dae3b4f552a407191ac8d8642899ee98e076e12c9d4f7120a1a5497d280be75e\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":7214,\"output\":50,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:28.106Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":30,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-3c4b098b-087e-4ff0-9e52-2ac513c213c4\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"runner\":\"opencode\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:27.260Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"part-message-094b6958-b49c-4e70-a24b-91555cebd77d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK\"}]},{\"id\":\"message-96449345-0f77-4bc7-a001-f3498fcab8a2\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"status\":\"complete\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"parts\":[{\"id\":\"op-live-send-glm-5.2:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_GLM-5_2_OK\",\"sourceEventId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:final\"}]},{\"id\":\"message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[{\"id\":\"part-message-63410fe6-5915-4166-bda6-8d0659bc413a\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-6b7021ca-22df-4fdb-ae96-996a657e6864\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"turnId\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-glm-5.2\",\"status\":\"completed\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":7214,\"output\":50,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"elapsedMs\":3938},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"completeness\":\"complete\",\"contentBytes\":61},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"turnId\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-glm-5.2\",\"status\":\"cancelled\",\"profileName\":\"Braid live opencode/zai-coding-plan/glm-5.2\",\"profileDigest\":\"b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"model\":\"glm-5.2\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"requestedSessionId\":\"session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"glm-5.2\",\"elapsedMs\":947},\"runner\":\"opencode\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"completeness\":\"complete\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":7214,\"output\":50,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:21.989Z\",\"updatedAt\":\"2026-08-29T18:31:28.106Z\"}],\"focusedRunId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"kind\":\"run\",\"title\":\"run run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"status\":\"completed\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\",\"occurredAt\":\"2026-08-29T18:31:22.361Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"activity:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:26.299Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"run\",\"entityId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"},{\"id\":\"run:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"kind\":\"run\",\"title\":\"run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"status\":\"cancelled\",\"elapsedMs\":947,\"startedAt\":\"2026-08-29T18:31:27.260Z\",\"occurredAt\":\"2026-08-29T18:31:27.260Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"environment:environment-f05ac3863839863d6592e55bdc1d2166\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:21.989Z\",\"occurredAt\":\"2026-08-29T18:31:28.106Z\",\"runId\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"},{\"id\":\"activity:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T18:31:28.207Z\",\"runId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"entityType\":\"run\",\"entityId\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:21.451Z\"},{\"id\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"run:run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:21.989Z\"},{\"id\":\"turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-3f827a0a-fed5-45d4-8aca-de99d7984ab4\"],\"runner\":\"opencode\",\"elapsedMs\":3938,\"startedAt\":\"2026-08-29T18:31:22.361Z\"},{\"id\":\"turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:27.260Z\"},{\"id\":\"run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-703a08c6-8370-4940-bfa5-249a9d3cf1a0\"],\"runner\":\"opencode\",\"elapsedMs\":947,\"startedAt\":\"2026-08-29T18:31:27.260Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-f05ac3863839863d6592e55bdc1d2166\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmI3OTBlYTg3NWMwZmEwODU4ODI2NzlhNGE2ZWM2NmRiMGZmMzM0Mjg1NjRiZDE0MmI0MzAyZThiOGJhODY1NjgiLCJZeG13RmpJN3ZxOWkzM21XdzUwWTdtTDhCa3RxM3JnODdKZ3c0eVBGcjNZIl0\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:21.989Z\",\"observed: 2026-08-29T18:31:28.106Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-3818dc5d-d7d9-4d30-aca7-51259610c7b3\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"glm-5.2\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n", "process": { "processIdentity": { - "instanceId": "584d7b9a-0e6a-4702-8155-6ba64717ab24", - "pid": 2252629, - "startedAt": 1787962986475 + "instanceId": "c5268ce5-a6ff-488a-a2af-2018d25559ba", + "pid": 3343758, + "startedAt": 1788028280847 }, "termination": { "strategy": "natural-exit", @@ -2232,10 +2420,10 @@ "gone": false, "present": true, "pids": [ - 2252629 + 3343758 ], "roots": [ - 2252629 + 3343758 ], "version": 0, "mechanism": "posix-descendant-tracker", @@ -2273,10 +2461,10 @@ "gone": false, "present": true, "pids": [ - 2252629 + 3343758 ], "roots": [ - 2252629 + 3343758 ], "version": 0, "mechanism": "posix-descendant-tracker", @@ -2305,28 +2493,45 @@ "code": 0, "signal": null } + }, + "providerSessionCleanup": { + "attempted": 1, + "closed": 0, + "alreadyAbsent": 1, + "released": 1, + "complete": true, + "results": [ + { + "sessionId": "session-braid-run-9dab369e-cfe6-4aa9-8b07-d8937d15c3de", + "status": 404, + "closed": false, + "alreadyAbsent": true, + "released": true + } + ] } }, { - "label": "kimi-code kimi-for-coding", - "target": "kimi-code/kimi-for-coding", + "label": "Pi with Tangle Router DeepSeek V4 Flash", + "target": "pi/tangle-router/deepseek-v4-flash", "profile": { - "path": ".braid/profiles/profile-kimi-code-kimi-for-coding.json", - "harness": "kimi-code", - "model": "kimi-for-coding" + "path": ".braid/profiles/profile-pi-tangle-router-deepseek-v4-flash.json", + "harness": "pi", + "model": "deepseek-v4-flash", + "provider": "tangle-router" }, "connection": { "id": "connection-live-cli-bridge", "kind": "cli-bridge", - "endpoint": "http://127.0.0.1:3355", + "endpoint": "http://127.0.0.1:3344", "credentialConfigured": true }, "providerCapabilities": { "profile": { "namedProfiles": false, "systemPrompt": { - "replace": false, - "append": false + "replace": true, + "append": true }, "instructions": true, "tools": true, @@ -2363,6 +2568,31 @@ "eventIdentity": true, "cancellationIdempotency": true }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, "workspace": { "read": false, "write": false, @@ -2393,46 +2623,84 @@ "requests": [ { "version": 1, - "requestId": "init-kimi-code-kimi-for-coding", + "requestId": "init-pi-tangle-router-deepseek-v4-flash", "command": "initialize", "params": { - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04", "subscribe": true } }, { "version": 1, - "requestId": "send-kimi-code-kimi-for-coding", - "operationId": "op-live-send-kimi-code-kimi-for-coding", + "requestId": "send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", "command": "send", "params": { "conversationId": "conv-1", "branchId": "branch-1", - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK" + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK" } - } - ], - "operation": "cli-bridge.target-smoke", - "credentialLifecycle": { - "configured": true, - "stored": true, - "removed": true, - "facility": "encrypted-headless" - }, - "initialize": { - "version": 1, - "type": "ack", - "requestId": "init-kimi-code-kimi-for-coding", - "revision": 4, - "command": "initialize" - }, - "conversationId": "conv-1", - "branchId": "branch-1", - "initialCapabilities": { - "view": { - "conversation.create": { - "available": true, - "source": "application" + }, + { + "version": 1, + "requestId": "cancel-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + }, + { + "version": 1, + "requestId": "cancel-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "params": { + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "reason": "live packed smoke cancellation" + } + }, + { + "version": 1, + "requestId": "final-state-pi-tangle-router-deepseek-v4-flash", + "command": "get_state", + "params": { + "projection": "full" + } + }, + { + "version": 1, + "requestId": "shutdown-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-shutdown-pi-tangle-router-deepseek-v4-flash", + "command": "shutdown", + "params": { + "mode": "wait" + } + } + ], + "operation": "cli-bridge.target-smoke", + "credentialLifecycle": { + "configured": true, + "stored": true, + "removed": true, + "facility": "encrypted-headless" + }, + "initialize": { + "version": 1, + "type": "ack", + "requestId": "init-pi-tangle-router-deepseek-v4-flash", + "revision": 4, + "command": "initialize" + }, + "conversationId": "conv-1", + "branchId": "branch-1", + "initialCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" }, "conversation.open": { "available": true, @@ -2611,36 +2879,39 @@ "send": { "version": 1, "type": "ack", - "requestId": "send-kimi-code-kimi-for-coding", - "operationId": "op-live-send-kimi-code-kimi-for-coding", + "requestId": "send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", "revision": 4, "replayed": false, - "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", "admission": { "version": 1, - "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", - "turnId": "turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b", - "operationId": "op-live-send-kimi-code-kimi-for-coding", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "turnId": "turn-4a95ae49-bcee-49cd-b5af-4501dbd51060", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", "conversationId": "conv-1", "branchId": "branch-1", - "admittedAt": "2026-08-29T00:25:17.087Z", - "profileDigest": "fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5", + "admittedAt": "2026-08-29T18:31:31.413Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", "requested": { - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", "profile": { - "name": "Braid live kimi-code/kimi-for-coding", + "name": "Braid live pi/tangle-router/deepseek-v4-flash", "description": "Opt-in packed CLI Bridge smoke profile", "version": "0.1.0", "model": { - "default": "kimi-for-coding", + "default": "deepseek-v4-flash", + "provider": "tangle-router", "reasoningEffort": "none" }, - "harness": "kimi-code" + "harness": "pi" }, "connectionId": "connection-live-cli-bridge", - "interactions": {}, - "model": "kimi-for-coding", - "runner": "kimi-code" + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" }, "capabilities": { "streaming": { @@ -2670,8 +2941,8 @@ "profile": { "namedProfiles": false, "systemPrompt": { - "replace": false, - "append": false + "replace": true, + "append": true }, "instructions": true, "tools": true, @@ -2679,9 +2950,9 @@ "mcp": true, "subagents": true, "resources": { - "files": true, + "files": false, "instructions": true, - "tools": true, + "tools": false, "skills": true, "agents": true, "commands": true @@ -2708,6 +2979,31 @@ "eventIdentity": true, "cancellationIdempotency": true }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, "workspace": { "read": false, "write": false, @@ -2737,27 +3033,27 @@ } }, "provider": "cli-bridge", - "providerSessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", "materializationReceipt": { "provider": "cli-bridge", "backend": "environment-provider", "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", "lifecycle": "retained-session", "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding", - "model": "kimi-for-coding", - "route": "kimi-code/kimi-for-coding", - "runner": "kimi-code", - "providerRunId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", "retainedControl": "exact-after-dispatch" }, "admissionStatus": "admitted", - "requestDigest": "7ff82b77bfc9b0b6366f70f5ae97ef3ab28c3a6f097e0bce0d516d9af210f40b", - "capabilitiesDigest": "b0057140d0dc718383709f80ba5aed38aebd502fc88950123c3da6aadc3c39a8", - "materializationDigest": "e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928", - "digest": "dd711fedf9bac28d135ab3a87286cbbbdf345102c66de88255e4cd819a84fae2" + "requestDigest": "ee0eabc709467fe6b53f36d96d6a07a49ea32e3d1b85f888a19dcaa07878f4e9", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a", + "digest": "a55da5866d4df133c203edf1c4db23551a08eb8a95ee257313c4d20a24aceda0" }, "command": "send" }, @@ -2924,12 +3220,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "Detach the active run before reconnecting it" + "reason": "There is no recoverable run to reconnect while another run is active" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "Detach the active run before reconciling it" + "reason": "There is no recoverable run to reconcile while another run is active" } }, "analysisAsk": { @@ -2940,967 +3236,1966 @@ "run": {} }, "normal": { - "status": "failed", - "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "status": "completed", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", "run": { - "id": "run-9408140a-dfdb-4854-8306-03cda6969eb9", - "turnId": "turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b", - "operationId": "op-live-send-kimi-code-kimi-for-coding", - "status": "failed", - "startedAt": "2026-08-29T00:25:17.097Z", - "updatedAt": "2026-08-29T00:25:18.963Z", - "terminalAt": "2026-08-29T00:25:18.963Z", - "durationMs": 1866, - "inputTokens": 0, - "outputTokens": 0, - "tokensKnown": false, + "id": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "turnId": "turn-4a95ae49-bcee-49cd-b5af-4501dbd51060", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T18:31:31.439Z", + "updatedAt": "2026-08-29T18:31:35.734Z", + "terminalAt": "2026-08-29T18:31:35.734Z", + "durationMs": 4295, + "inputTokens": 1011, + "outputTokens": 25, + "tokensKnown": true, "usdKnown": false, - "tokenStatus": "unknown", + "tokenStatus": "complete", + "reasoningTokens": 0, "costStatus": "unknown", - "model": "kimi-for-coding", + "model": "pi/tangle-router/deepseek-v4-flash", "provider": "cli-bridge", - "runner": "kimi-code", + "runner": "pi", "connectionId": "connection-live-cli-bridge", - "completeness": "failed", - "providerSessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", - "environmentId": "environment-74b47b1fb3209b04ebfe833c616a7e3b", + "completeness": "complete", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "environmentId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", "controlRef": { - "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", "provider": "cli-bridge", - "environmentId": "cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0", - "sessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", - "executionId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", - "requestDigest": "sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b" - }, - "materializationDigest": "e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928", - "cursor": "2:0", - "cursorCommittedSequence": 12 - }, - "assistant": { - "id": "message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0", - "role": "assistant", - "text": "", - "status": "failed", - "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", - "parts": [] - }, - "finalText": "", - "marker": "LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK", - "markerObserved": false, - "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK" - }, - "error": { - "code": "LIVE_FINAL_OUTPUT_MISMATCH", - "message": "Packed Braid kimi-code kimi-for-coding turn completed without the expected response marker", - "exitCode": 1, - "details": { - "run": { - "id": "run-9408140a-dfdb-4854-8306-03cda6969eb9", - "turnId": "turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b", - "operationId": "op-live-send-kimi-code-kimi-for-coding", - "status": "failed", - "startedAt": "2026-08-29T00:25:17.097Z", - "updatedAt": "2026-08-29T00:25:18.963Z", - "terminalAt": "2026-08-29T00:25:18.963Z", - "durationMs": 1866, - "inputTokens": 0, - "outputTokens": 0, - "tokensKnown": false, - "usdKnown": false, - "tokenStatus": "unknown", - "costStatus": "unknown", - "model": "kimi-for-coding", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "executionId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "requestDigest": "sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27" + }, + "materializationDigest": "a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a", + "cursor": "37", + "cursorCommittedSequence": 48, + "contentBytes": 163, + "receipt": { + "version": 1, + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "turnId": "turn-4a95ae49-bcee-49cd-b5af-4501dbd51060", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:31.413Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "interactions": { + "kinds": "[depth-limited]", + "answerFieldTypes": "[depth-limited]", + "responseScopes": "[depth-limited]", + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, "provider": "cli-bridge", - "runner": "kimi-code", - "connectionId": "connection-live-cli-bridge", - "completeness": "failed", - "providerSessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", - "environmentId": "environment-74b47b1fb3209b04ebfe833c616a7e3b", - "controlRef": { - "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "materializationReceipt": { "provider": "cli-bridge", - "environmentId": "cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0", - "sessionId": "session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9", - "executionId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", - "requestDigest": "sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b" + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "retainedControl": "exact-after-dispatch" }, - "materializationDigest": "e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928", - "cursor": "2:0", - "cursorCommittedSequence": 12 - }, - "assistant": { - "id": "message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0", - "role": "assistant", - "text": "", - "status": "failed", - "runId": "run-9408140a-dfdb-4854-8306-03cda6969eb9", - "parts": [] + "admissionStatus": "admitted", + "requestDigest": "ee0eabc709467fe6b53f36d96d6a07a49ea32e3d1b85f888a19dcaa07878f4e9", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a", + "digest": "a55da5866d4df133c203edf1c4db23551a08eb8a95ee257313c4d20a24aceda0" } - } - }, - "status": "failed", - "stderr": "", - "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-kimi-code-kimi-for-coding\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-kimi-code-kimi-for-coding\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:14.829Z\"}],\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"runConfiguration\":{\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:14.829Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:14.829Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-kimi-code-kimi-for-coding\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"revision\":4,\"replayed\":false,\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"admission\":{\"version\":1,\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:25:17.087Z\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"kimi-for-coding\",\"runner\":\"kimi-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":false},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"model\":\"kimi-for-coding\",\"route\":\"kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"providerRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"7ff82b77bfc9b0b6366f70f5ae97ef3ab28c3a6f097e0bce0d516d9af210f40b\",\"capabilitiesDigest\":\"b0057140d0dc718383709f80ba5aed38aebd502fc88950123c3da6aadc3c39a8\",\"materializationDigest\":\"e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928\",\"digest\":\"dd711fedf9bac28d135ab3a87286cbbbdf345102c66de88255e4cd819a84fae2\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"admission\":{\"version\":1,\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:25:17.087Z\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"kimi-for-coding\",\"runner\":\"kimi-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":false,\"append\":false},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"model\":\"kimi-for-coding\",\"route\":\"kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"providerRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"7ff82b77bfc9b0b6366f70f5ae97ef3ab28c3a6f097e0bce0d516d9af210f40b\",\"capabilitiesDigest\":\"b0057140d0dc718383709f80ba5aed38aebd502fc88950123c3da6aadc3c39a8\",\"materializationDigest\":\"e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928\",\"digest\":\"dd711fedf9bac28d135ab3a87286cbbbdf345102c66de88255e4cd819a84fae2\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-kimi-code-kimi-for-coding-9fe8f4e6c89bb451cb1a0bcc\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"effectKind\":\"run.execute\",\"requestDigest\":\"9fe8f4e6c89bb451cb1a0bccf8353f80aac5d88c8d59abfb9715355b09c881c1\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:25:17.107Z\",\"updatedAt\":\"2026-08-29T00:25:17.107Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-kimi-code-kimi-for-coding\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"runId\":\"retained-intent-run:081a99813cee86bef4c1fcf1b868e258518261f1805ba1da1e5ffaf325bfea65\",\"requestedProfileDigest\":\"sha256:fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"requestDigest\":\"sha256:081a99813cee86bef4c1fcf1b868e258518261f1805ba1da1e5ffaf325bfea65\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-kimi-code-kimi-for-coding\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:17.097Z\"}],\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"runConfiguration\":{\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"status\":\"complete\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[{\"id\":\"part-message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}]},{\"id\":\"message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[]}],\"runs\":[{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:25:17.097Z\",\"updatedAt\":\"2026-08-29T00:25:17.097Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"kimi-for-coding\",\"provider\":\"cli-bridge\",\"runner\":\"kimi-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"materializationDigest\":\"e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"focusedRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"activeRuns\":[{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:17.097Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"status\":\"complete\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[{\"id\":\"part-message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}]},{\"id\":\"message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"status\":\"running\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"kimi-for-coding\"},\"runner\":\"kimi-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"focusedRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"kind\":\"run\",\"title\":\"run run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:25:17.097Z\",\"occurredAt\":\"2026-08-29T00:25:17.097Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"},{\"id\":\"activity:run-9408140a-dfdb-4854-8306-03cda6969eb9:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"occurredAt\":\"2026-08-29T00:25:17.097Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:25:17.097Z\"},{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\"],\"runner\":\"kimi-code\",\"startedAt\":\"2026-08-29T00:25:17.097Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"kimi-for-coding\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-kimi-code-kimi-for-coding\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"requestDigest\":\"sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-kimi-code-kimi-for-coding\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"source\":{\"eventId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:25:18.369Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:25:15.901Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:25:18.369Z\"},\"controlRef\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"requestDigest\":\"sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b\"},\"provider\":{\"eventId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:25:18.369Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"source\":{\"eventId\":\"2:0\",\"providerSequence\":2,\"cursor\":\"2:0\",\"receivedAt\":\"2026-08-29T00:25:18.962Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"status\":\"failed\",\"detail\":\"RUNTIME_STATUS\",\"provider\":{\"eventId\":\"2:0\",\"providerSequence\":2,\"cursor\":\"2:0\",\"receivedAt\":\"2026-08-29T00:25:18.962Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-kimi-code-kimi-for-coding-9fe8f4e6c89bb451cb1a0bcc\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"effectKind\":\"run.execute\",\"requestDigest\":\"9fe8f4e6c89bb451cb1a0bccf8353f80aac5d88c8d59abfb9715355b09c881c1\",\"kind\":\"send\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"2d2acf569882146ba42c49e3553984f716d39e5c29483aa9dd35daa8fb1f60bc\",\"createdAt\":\"2026-08-29T00:25:17.107Z\",\"updatedAt\":\"2026-08-29T00:25:18.972Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-kimi-code-kimi-for-coding\",\"revision\":13,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":13,\"sequence\":13,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:17.097Z\"}],\"profile\":{\"name\":\"Braid live kimi-code/kimi-for-coding\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"kimi-for-coding\",\"reasoningEffort\":\"none\"},\"harness\":\"kimi-code\"},\"runConfiguration\":{\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"status\":\"complete\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[{\"id\":\"part-message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}]},{\"id\":\"message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"failed\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[]}],\"runs\":[{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"status\":\"failed\",\"startedAt\":\"2026-08-29T00:25:17.097Z\",\"updatedAt\":\"2026-08-29T00:25:18.963Z\",\"terminalAt\":\"2026-08-29T00:25:18.963Z\",\"durationMs\":1866,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"kimi-for-coding\",\"provider\":\"cli-bridge\",\"runner\":\"kimi-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"failed\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"environmentId\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"controlRef\":{\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJraW1pLWNvZGUiLCJraW1pLWNvZGUva2ltaS1mb3ItY29kaW5nIiwic2hhMjU2OmE2MGJmNzNhMTU4ZjRmYjBhZTQyZWJjY2RiNjIzYWQ3MTMyNWI4MWY4MTZhMmY5NTI0MGQ5NWVkNWYyOTE5MjQiLCI1YUZhNGs1VVdEeVRWOUpDTnZOMG5IMEtKbWFCZzdxcGwtYWI4Z0tFTGZFIl0\",\"sessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"executionId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"requestDigest\":\"sha256:753bb043c2c6c47a30d3d3e369bfa0c2db4aa702133a1cd9c2b3424baf6e644b\"},\"materializationDigest\":\"e0f59b370525caa44d34ee991a028f8ae3336636475a8b5c08fdfc47d4314928\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:25:15.901Z\",\"updatedAt\":\"2026-08-29T00:25:18.369Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":13,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-kimi-code-kimi-for-coding\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"runner\":\"kimi-code\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:17.097Z\"}],\"branch\":\"branch-1\",\"status\":\"failed\",\"statusText\":\"failed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\",\"status\":\"complete\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[{\"id\":\"part-message-0941b6ae-22e5-4f35-ae72-e579c5dff0e9\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_KIMI-CODE-KIMI-FOR-CODING_OK\"}]},{\"id\":\"message-094875aa-ddd5-4c8b-bdff-ca2ff73631c0\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"failed\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"turnId\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-kimi-code-kimi-for-coding\",\"status\":\"failed\",\"profileName\":\"Braid live kimi-code/kimi-for-coding\",\"profileDigest\":\"fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"model\":\"kimi-for-coding\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"kimi-for-coding\",\"elapsedMs\":1866},\"runner\":\"kimi-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"completeness\":\"failed\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:25:15.901Z\",\"updatedAt\":\"2026-08-29T00:25:18.369Z\"}],\"focusedRunId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"kind\":\"run\",\"title\":\"run run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"status\":\"failed\",\"elapsedMs\":1866,\"startedAt\":\"2026-08-29T00:25:17.097Z\",\"occurredAt\":\"2026-08-29T00:25:17.097Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"},{\"id\":\"environment:environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:25:15.901Z\",\"occurredAt\":\"2026-08-29T00:25:18.369Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"environment\",\"entityId\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\"},{\"id\":\"activity:run-9408140a-dfdb-4854-8306-03cda6969eb9:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"failed\",\"detail\":\"profile fd43a0753d282b032ddfceb810d0fa2e3a9e2d5fb977ffadec047b52ca6b30b5\",\"occurredAt\":\"2026-08-29T00:25:18.963Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"},{\"id\":\"activity:run-9408140a-dfdb-4854-8306-03cda6969eb9:status:local:failed\",\"kind\":\"system\",\"title\":\"failed\",\"status\":\"failed\",\"detail\":\"RUNTIME_STATUS\",\"occurredAt\":\"2026-08-29T00:25:18.963Z\",\"runId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"entityType\":\"run\",\"entityId\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:14.829Z\"},{\"id\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-9408140a-dfdb-4854-8306-03cda6969eb9\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:25:15.901Z\"},{\"id\":\"turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"failed\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:25:17.097Z\"},{\"id\":\"run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"failed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-6b49b5ca-2f12-4f1b-8a23-73ec69d59e5b\"],\"runner\":\"kimi-code\",\"elapsedMs\":1866,\"startedAt\":\"2026-08-29T00:25:17.097Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-74b47b1fb3209b04ebfe833c616a7e3b\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:25:15.901Z\",\"observed: 2026-08-29T00:25:18.369Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-9408140a-dfdb-4854-8306-03cda6969eb9\",\"fields\":[{\"label\":\"status\",\"value\":\"failed\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"kimi-for-coding\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", - "process": { - "processIdentity": { - "instanceId": "08c6a3ac-cb39-483f-b208-74d0cc2b9215", - "pid": 2259754, - "startedAt": 1787963114379 }, - "termination": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": false, - "initialTree": { - "supported": true, - "gone": false, - "present": true, - "pids": [ - 2259754 - ], - "roots": [ - 2259754 - ], - "version": 0, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } - }, - "natural": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": false, - "initialTree": { - "supported": true, - "gone": false, - "present": true, - "pids": [ - 2259754 - ], - "roots": [ - 2259754 - ], - "version": 0, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } + "assistant": { + "id": "message-072a898a-e540-4db0-bf38-f1a4d5aa6c58", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "parts": [ + { + "id": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:final" + } + ] }, - "exit": { - "code": 0, - "signal": null - } - } - }, - { - "label": "pi deepseek/deepseek-v4-flash", - "target": "pi/deepseek/deepseek-v4-flash", - "profile": { - "path": ".braid/profiles/profile-pi-deepseek-deepseek-v4-flash.json", - "harness": "pi", - "model": "deepseek-v4-flash", - "provider": "deepseek" - }, - "connection": { - "id": "connection-live-cli-bridge", - "kind": "cli-bridge", - "endpoint": "http://127.0.0.1:3355", - "credentialConfigured": true + "finalText": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "marker": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "lastError": null }, - "providerCapabilities": { - "profile": { - "namedProfiles": false, - "systemPrompt": { - "replace": false, - "append": false - }, - "instructions": true, - "tools": true, - "permissions": true, - "mcp": true, - "subagents": true, - "resources": { - "files": true, - "instructions": true, - "tools": true, - "skills": true, - "agents": true, - "commands": true + "cancel": { + "prompt": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "revision": 50, + "replayed": false, + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "admission": { + "version": 1, + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "turnId": "turn-39526126-278b-4f0b-9c58-3b4483c28a0c", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:36.445Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "interactions": { + "kinds": "[depth-limited]", + "answerFieldTypes": "[depth-limited]", + "responseScopes": "[depth-limited]", + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "retainedControl": "exact-after-dispatch" + }, + "nativeContextBoundaryProof": { + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "executionId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "requestDigest": "sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27", + "boundary": { + "kind": "revision", + "revision": "pi:8206bc20-9cb4-4e21-9076-cdaef25ba464:2" + }, + "observedAt": "2026-08-29T18:31:35.666Z" + }, + "admissionStatus": "admitted", + "requestDigest": "aff7fb801f2d0a4fe636870f58b5f692663cbfca8611bdc641632e3b0f077518", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5", + "digest": "7660ff3662caaca9c51c7838375600ce0c30d037a4e978072ac90e08a62f80c8" }, - "hooks": false, - "modes": true, - "runtimeUpdate": false, - "validation": false - }, - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true + "command": "send" }, - "sessions": { - "continue": true, - "list": false, - "messages": false + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "activeRun": { + "id": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "turnId": "turn-39526126-278b-4f0b-9c58-3b4483c28a0c", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "streaming", + "startedAt": "2026-08-29T18:31:36.457Z", + "updatedAt": "2026-08-29T18:31:36.457Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "materializationDigest": "26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5" }, - "retainedControl": { - "exactRunIdentity": true, - "resultIdentity": true, - "eventIdentity": true, - "cancellationIdempotency": true + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-pi-tangle-router-deepseek-v4-flash", + "revision": 67, + "operationId": "op-live-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "control": "cancel", + "outcome": "accepted", + "replayed": false }, - "workspace": { - "read": false, - "write": false, - "exec": false, - "git": false, - "upload": false, - "download": false - }, - "branching": { - "checkpoint": false, - "fork": false + "run": { + "id": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "turnId": "turn-39526126-278b-4f0b-9c58-3b4483c28a0c", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T18:31:36.457Z", + "updatedAt": "2026-08-29T18:31:37.706Z", + "terminalAt": "2026-08-29T18:31:37.706Z", + "durationMs": 1249, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "completeness": "complete", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "environmentId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "controlRef": { + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "executionId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "requestDigest": "sha256:ba6a1c5173c479d6b4469efa3d1aafbc6422e5c172ce93f35f8c3e9235af8992" + }, + "materializationDigest": "26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5", + "cursor": "5", + "cursorCommittedSequence": 65, + "contentBytes": 14 }, - "placement": true, - "usage": true, - "confidential": false, - "observation": { - "identity": true, - "lifecycle": true, - "endpoint": true, - "placement": true, - "resources": false, - "resourceUse": false, - "modelUsage": true, - "computeBilling": false, - "accountUsage": false - } + "attemptedRun": true, + "status": "verified" }, - "requests": [ - { - "version": 1, - "requestId": "init-pi-deepseek-deepseek-v4-flash", - "command": "initialize", - "params": { - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash", - "subscribe": true - } + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": true, + "advertisedByBraid": false, + "advertised": false, + "provider": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true }, - { - "version": 1, - "requestId": "send-pi-deepseek-deepseek-v4-flash", - "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", - "command": "send", - "params": { - "conversationId": "conv-1", - "branchId": "branch-1", - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK" - } - } - ], - "operation": "cli-bridge.target-smoke", - "credentialLifecycle": { - "configured": true, - "stored": true, - "removed": true, - "facility": "encrypted-headless" + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false }, - "initialize": { - "version": 1, - "type": "ack", - "requestId": "init-pi-deepseek-deepseek-v4-flash", - "revision": 4, - "command": "initialize" + "semanticAssertions": { + "cancel": "verified", + "interaction": "reported-unavailable" }, - "conversationId": "conv-1", - "branchId": "branch-1", - "initialCapabilities": { - "view": { - "conversation.create": { - "available": true, - "source": "application" - }, - "conversation.open": { - "available": true, - "source": "application" - }, - "run.runner": { - "available": true, - "source": "application" - }, - "run.model": { - "available": true, - "source": "application" - }, - "run.effort": { - "available": true, - "source": "application" - }, - "conversation.branch": { - "available": true, - "source": "application" - }, - "conversation.clone": { - "available": true, - "source": "application" - }, - "conversation.fork": { - "available": true, - "source": "application" - }, - "analysis.ask": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "analysis.recipe": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "analysis.compare": { - "available": false, - "source": "application", - "reason": "Two completed or failed runs are required for comparison" - }, - "interaction.respond": { - "available": false, - "source": "runtime", - "reason": "Interaction response is not exposed by the current runtime adapter" - }, - "interaction.automation": { - "available": false, - "source": "application", - "reason": "Interaction automation requires the shared response contract" + "targetProof": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "materializationDigest": "a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a" + }, + "runIds": [ + "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + ], + "finalState": { + "version": 1, + "type": "state", + "requestId": "final-state-pi-tangle-router-deepseek-v4-flash", + "revision": 69, + "projection": "full", + "state": { + "schemaVersion": 2, + "revision": 69, + "sequence": 69, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04", + "conversationId": "conv-1", + "branchId": "branch-1", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "updatedAt": "2026-08-29T18:31:36.457Z" + } + ], + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" }, - "run.interactive": { - "available": false, - "source": "application", - "reason": "Native terminal mode requires an interactive TUI and a supported provider" + "runConfiguration": { + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "connectionId": "connection-live-cli-bridge", + "overrides": {} }, - "run.attach": { - "available": false, - "source": "application", - "reason": "Native terminal attachment requires an interactive TUI and a retained session" + "draft": "", + "messages": [ + { + "id": "message-58a5a576-6b08-407e-ba21-248f7d9e9aad", + "role": "user", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "parts": [ + { + "id": "part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad", + "kind": "text", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK" + } + ] + }, + { + "id": "message-072a898a-e540-4db0-bf38-f1a4d5aa6c58", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "parts": [ + { + "id": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:final" + } + ] + }, + { + "id": "message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd", + "role": "user", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "status": "complete", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "parts": [ + { + "id": "part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd", + "kind": "text", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + ] + }, + { + "id": "message-73da876d-7b95-49e4-8e7a-8be8c74988e5", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "parts": [] + } + ], + "runs": [ + { + "id": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "turnId": "turn-4a95ae49-bcee-49cd-b5af-4501dbd51060", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T18:31:31.439Z", + "updatedAt": "2026-08-29T18:31:35.734Z", + "terminalAt": "2026-08-29T18:31:35.734Z", + "durationMs": 4295, + "inputTokens": 1011, + "outputTokens": 25, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "reasoningTokens": 0, + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "environmentId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "controlRef": { + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "executionId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "requestDigest": "sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27" + }, + "materializationDigest": "a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a", + "cursor": "37", + "cursorCommittedSequence": 48, + "contentBytes": 163 + }, + { + "id": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "turnId": "turn-39526126-278b-4f0b-9c58-3b4483c28a0c", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T18:31:36.457Z", + "updatedAt": "2026-08-29T18:31:37.706Z", + "terminalAt": "2026-08-29T18:31:37.706Z", + "durationMs": 1249, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "completeness": "complete", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "environmentId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "controlRef": { + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "executionId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "requestDigest": "sha256:ba6a1c5173c479d6b4469efa3d1aafbc6422e5c172ce93f35f8c3e9235af8992" + }, + "materializationDigest": "26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5", + "cursor": "5", + "cursorCommittedSequence": 65, + "contentBytes": 14 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 2, + "input": 1011, + "output": 25, + "reasoning": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 2, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 2, + "unknownLatencySources": 2 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" }, - "supervisor.worker.attach": { - "available": false, - "source": "runtime", - "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + "environments": [ + { + "id": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:31:31.038Z", + "updatedAt": "2026-08-29T18:31:37.592Z" + } + ], + "interactions": [], + "queue": [], + "activeRunId": null, + "focusedRunId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "activeRuns": [], + "lastError": null + }, + "view": { + "revision": 69, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "runOverrides": {}, + "connection": "Live local CLI Bridge", + "conversationId": "conv-1", + "conversationTitle": "New conversation", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "active": true, + "updatedAt": "2026-08-29T18:31:36.457Z" + } + ], + "branch": "branch-1", + "status": "cancelled", + "statusText": "cancelled", + "queueCount": 0, + "queue": [], + "messages": [ + { + "id": "message-58a5a576-6b08-407e-ba21-248f7d9e9aad", + "role": "user", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "parts": [ + { + "id": "part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad", + "kind": "text", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK" + } + ] + }, + { + "id": "message-072a898a-e540-4db0-bf38-f1a4d5aa6c58", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "parts": [ + { + "id": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:final" + } + ] + }, + { + "id": "message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd", + "role": "user", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "status": "complete", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "parts": [ + { + "id": "part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd", + "kind": "text", + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + ] + }, + { + "id": "message-73da876d-7b95-49e4-8e7a-8be8c74988e5", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "parts": [] + } + ], + "hiddenMessageCount": 0, + "runs": [ + { + "id": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "turnId": "turn-4a95ae49-bcee-49cd-b5af-4501dbd51060", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "model": "pi/tangle-router/deepseek-v4-flash", + "effort": "none", + "cursor": "37", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "usage": { + "input": 1011, + "output": 25, + "reasoning": 0, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "elapsedMs": 4295 + }, + "runner": "pi", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "completeness": "complete", + "contentBytes": 163 + }, + { + "id": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "turnId": "turn-39526126-278b-4f0b-9c58-3b4483c28a0c", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "cancelled", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "model": "deepseek-v4-flash", + "effort": "none", + "cursor": "5", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "requestedSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "usage": { + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "elapsedMs": 1249 + }, + "runner": "pi", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "completeness": "complete", + "contentBytes": 14 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 2, + "input": 1011, + "output": 25, + "reasoning": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 2, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 2, + "unknownLatencySources": 2 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" }, - "export.create": { - "available": true, - "source": "application" - }, - "analysis.cancel": { - "available": false, - "source": "application", - "reason": "There is no running analysis to cancel" - }, - "application.quit": { - "available": true, - "source": "local" - }, - "help.read": { - "available": true, - "source": "local" - }, - "profile.select": { - "available": true, - "source": "application" - }, - "connection.select": { - "available": true, - "source": "application" - }, - "settings.open": { - "available": true, - "source": "application" - }, - "activity.read": { - "available": true, - "source": "local" - }, - "graph.read": { - "available": true, - "source": "local" - }, - "details.read": { - "available": true, - "source": "local" - }, - "supervisor.refresh": { - "available": true, - "source": "runtime" - }, - "supervisor.worker.steer": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to steer" - }, - "supervisor.worker.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to cancel" - }, - "supervisor.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervisor to cancel" - }, - "draft.write": { - "available": true, - "source": "application" - }, - "run.send": { - "available": true, - "source": "provider" - }, - "run.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no active run to cancel" - }, - "run.queue": { - "available": false, - "source": "provider", - "reason": "There is no active run" - }, - "run.steer": { - "available": false, - "source": "provider", - "reason": "There is no active run" - }, - "run.detach": { - "available": false, - "source": "provider", - "reason": "There is no active run" - }, - "run.reconnect": { - "available": false, - "source": "provider", - "reason": "There is no recoverable run to reconnect" - }, - "run.reconcile": { - "available": false, - "source": "provider", - "reason": "There is no recoverable run to reconcile" - } - }, - "analysisAsk": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "run": {} - }, - "send": { - "version": 1, - "type": "ack", - "requestId": "send-pi-deepseek-deepseek-v4-flash", - "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", - "revision": 4, - "replayed": false, - "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "admission": { - "version": 1, - "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "turnId": "turn-7998ada5-574b-470c-84bd-07e5c00c6d99", - "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", - "conversationId": "conv-1", - "branchId": "branch-1", - "admittedAt": "2026-08-29T00:25:20.226Z", - "profileDigest": "1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928", - "requested": { - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK", - "profile": { - "name": "Braid live pi/deepseek/deepseek-v4-flash", - "description": "Opt-in packed CLI Bridge smoke profile", - "version": "0.1.0", - "model": { - "default": "deepseek-v4-flash", - "provider": "deepseek", - "reasoningEffort": "none" - }, - "harness": "pi" + "environments": [ + { + "id": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:31:31.038Z", + "updatedAt": "2026-08-29T18:31:37.592Z" + } + ], + "focusedRunId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "interactions": [], + "activity": [ + { + "id": "run:run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "kind": "run", + "title": "run run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "status": "completed", + "elapsedMs": 4295, + "startedAt": "2026-08-29T18:31:31.439Z", + "occurredAt": "2026-08-29T18:31:31.439Z", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" }, - "connectionId": "connection-live-cli-bridge", - "interactions": { - "permission": true + { + "id": "activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "completed", + "detail": "profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "occurredAt": "2026-08-29T18:31:35.734Z", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" }, - "model": "deepseek-v4-flash", - "runner": "pi" - }, - "capabilities": { - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true + { + "id": "activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting", + "kind": "system", + "title": "starting", + "status": "completed", + "occurredAt": "2026-08-29T18:31:35.734Z", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" }, - "sessions": { - "continue": true, - "messages": false + { + "id": "activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting", + "kind": "system", + "title": "starting", + "status": "completed", + "occurredAt": "2026-08-29T18:31:35.734Z", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" }, - "controls": { - "cancel": true, - "steer": false, - "queue": true, - "status": true, - "recreate": true + { + "id": "activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "completed", + "occurredAt": "2026-08-29T18:31:35.734Z", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" }, - "events": { - "stableIdentity": true, - "sequence": true, - "cursor": true + { + "id": "activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:running", + "kind": "system", + "title": "running", + "status": "completed", + "occurredAt": "2026-08-29T18:31:35.734Z", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" }, - "usage": true, - "environment": { - "profile": { - "namedProfiles": false, - "systemPrompt": { - "replace": true, - "append": true - }, - "instructions": true, - "tools": true, - "permissions": true, - "mcp": true, - "subagents": true, - "resources": { - "files": false, - "instructions": true, - "tools": false, - "skills": true, - "agents": true, - "commands": true - }, - "hooks": false, - "modes": true, - "runtimeUpdate": false, - "validation": false + { + "id": "event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:4", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 5", + "occurredAt": "2026-08-29T18:31:35.734Z", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:4", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" + }, + { + "id": "event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:5", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 6", + "occurredAt": "2026-08-29T18:31:35.734Z", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:5", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" + }, + { + "id": "event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:6", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 7", + "occurredAt": "2026-08-29T18:31:35.734Z", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:6", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" + }, + { + "id": "event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:33", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 34", + "occurredAt": "2026-08-29T18:31:35.734Z", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:33", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" + }, + { + "id": "event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:34", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 35", + "occurredAt": "2026-08-29T18:31:35.734Z", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:34", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" + }, + { + "id": "event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:35", + "kind": "system", + "title": "event model-processing", + "status": "completed", + "detail": "sequence 36", + "occurredAt": "2026-08-29T18:31:35.734Z", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:35", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" + }, + { + "id": "event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:36", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 37", + "occurredAt": "2026-08-29T18:31:35.734Z", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:36", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "run", + "entityId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41" + }, + { + "id": "run:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "kind": "run", + "title": "run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "status": "cancelled", + "elapsedMs": 1249, + "startedAt": "2026-08-29T18:31:36.457Z", + "occurredAt": "2026-08-29T18:31:36.457Z", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + }, + { + "id": "environment:environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "kind": "environment", + "title": "cli-bridge execution", + "status": "complete", + "detail": "local-process · local · explicit", + "startedAt": "2026-08-29T18:31:31.038Z", + "occurredAt": "2026-08-29T18:31:37.592Z", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "entityType": "environment", + "entityId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae" + }, + { + "id": "activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "cancelled", + "detail": "profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "occurredAt": "2026-08-29T18:31:37.706Z", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + }, + { + "id": "activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:control:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "live packed smoke cancellation", + "occurredAt": "2026-08-29T18:31:37.706Z", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + }, + { + "id": "activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:starting", + "kind": "system", + "title": "starting", + "status": "cancelled", + "occurredAt": "2026-08-29T18:31:37.706Z", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + }, + { + "id": "activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:starting", + "kind": "system", + "title": "starting", + "status": "cancelled", + "occurredAt": "2026-08-29T18:31:37.706Z", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + }, + { + "id": "activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "cancelled", + "occurredAt": "2026-08-29T18:31:37.706Z", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + }, + { + "id": "activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:lifecycle:local:reconnecting", + "kind": "system", + "title": "reconnecting", + "status": "cancelled", + "detail": "5", + "occurredAt": "2026-08-29T18:31:37.706Z", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + }, + { + "id": "activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:control.ack:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "accepted", + "occurredAt": "2026-08-29T18:31:37.706Z", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + }, + { + "id": "event:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:4", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 5", + "occurredAt": "2026-08-29T18:31:37.706Z", + "sourceEventId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:4", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + }, + { + "id": "event:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:5", + "kind": "system", + "title": "event raw", + "status": "cancelled", + "detail": "sequence 6", + "occurredAt": "2026-08-29T18:31:37.706Z", + "sourceEventId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:5", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "entityType": "run", + "entityId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef" + } + ], + "graph": [ + { + "id": "conv-1", + "type": "conversation", + "title": "New conversation", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-29T18:31:30.533Z" + }, + { + "id": "branch-1", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conv-1" + ], + "startedAt": "2026-08-29T18:31:30.533Z" + }, + { + "id": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "type": "environment", + "title": "cli-bridge execution", + "status": "complete", + "depth": 4, + "edgeLabel": "attached", + "parentIds": [ + "run:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "run:run-f8735ad8-12bc-4549-888d-a745a2dadf41" + ], + "runner": "cli-bridge", + "startedAt": "2026-08-29T18:31:31.038Z" + }, + { + "id": "turn-4a95ae49-bcee-49cd-b5af-4501dbd51060", + "type": "turn", + "title": "Turn", + "status": "complete", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:31:31.439Z" + }, + { + "id": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "type": "run", + "title": "Run", + "status": "completed", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-4a95ae49-bcee-49cd-b5af-4501dbd51060" + ], + "runner": "pi", + "elapsedMs": 4295, + "startedAt": "2026-08-29T18:31:31.439Z" + }, + { + "id": "turn-39526126-278b-4f0b-9c58-3b4483c28a0c", + "type": "turn", + "title": "Turn", + "status": "cancelled", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:31:36.457Z" + }, + { + "id": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "type": "run", + "title": "Run", + "status": "cancelled", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-39526126-278b-4f0b-9c58-3b4483c28a0c" + ], + "runner": "pi", + "elapsedMs": 1249, + "startedAt": "2026-08-29T18:31:36.457Z" + } + ], + "graphQuery": "", + "entityDetails": [ + { + "entityType": "environment", + "entityId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "title": "cli-bridge execution", + "status": "ready", + "lines": [ + "provider: cli-bridge", + "execution: local-process · local", + "provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "connection: connection-live-cli-bridge", + "lifecycle: ready · retained · cleanup explicit", + "continuity: session", + "runtime endpoint host: 127.0.0.1", + "placement: requested not specified · verified unavailable", + "machine: unavailable · physical IP is not exposed", + "created: 2026-08-29T18:31:31.038Z", + "observed: 2026-08-29T18:31:37.592Z", + "unavailable: cli-subscription-and-quota:not-exposed-by-provider", + "unavailable: effective-resources:not-exposed-by-provider", + "unavailable: machine-specs:not-exposed-by-provider", + "unavailable: runtime-cpu-memory-usage:not-exposed-by-provider" + ] + } + ], + "details": { + "title": "run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "fields": [ + { + "label": "status", + "value": "aborted" }, - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true + { + "label": "input tokens", + "value": "0" }, - "sessions": { - "continue": true, - "list": false, - "messages": false + { + "label": "output tokens", + "value": "0" }, - "retainedControl": { - "exactRunIdentity": true, - "resultIdentity": true, - "eventIdentity": true, - "cancellationIdempotency": true - }, - "nativeContinuation": { - "atomicBoundary": true, - "requestIdempotency": true - }, - "interactions": { - "kinds": [ - "permission" - ], - "answerFieldTypes": [ - "select" - ], - "responseScopes": [ - "interaction" - ], - "secretAnswers": false, - "concurrentRequests": false, - "replay": true, - "responseIdempotency": true - }, - "workspace": { - "read": false, - "write": false, - "exec": false, - "git": false, - "upload": false, - "download": false - }, - "branching": { - "checkpoint": false, - "fork": false - }, - "placement": true, - "usage": true, - "confidential": false, - "observation": { - "identity": true, - "lifecycle": true, - "endpoint": true, - "placement": true, - "resources": false, - "resourceUse": false, - "modelUsage": true, - "computeBilling": false, - "accountUsage": false + { + "label": "model", + "value": "deepseek-v4-flash" } + ] + }, + "capabilities": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": true, + "source": "application" + }, + "analysis.recipe": { + "available": true, + "source": "application" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" } }, - "provider": "cli-bridge", - "providerSessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "materializationReceipt": { + "draft": "", + "selectedSurface": "transcript", + "appearance": { + "color": "none", + "highContrast": false, + "reducedMotion": false + } + } + }, + "shutdown": { + "version": 1, + "type": "ack", + "requestId": "shutdown-pi-tangle-router-deepseek-v4-flash", + "revision": 69, + "operationId": "op-live-shutdown-pi-tangle-router-deepseek-v4-flash", + "command": "shutdown" + }, + "operationEvidence": { + "normal": { + "status": "completed", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "run": { + "id": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "turnId": "turn-4a95ae49-bcee-49cd-b5af-4501dbd51060", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T18:31:31.439Z", + "updatedAt": "2026-08-29T18:31:35.734Z", + "terminalAt": "2026-08-29T18:31:35.734Z", + "durationMs": 4295, + "inputTokens": 1011, + "outputTokens": 25, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "reasoningTokens": 0, + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", "provider": "cli-bridge", - "backend": "environment-provider", - "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "lifecycle": "retained-session", - "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash", - "model": "deepseek-v4-flash", - "route": "pi/deepseek/deepseek-v4-flash", "runner": "pi", - "providerRunId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "retainedControl": "exact-after-dispatch" - }, - "admissionStatus": "admitted", - "requestDigest": "0a8422f02e7951be1a620d63f79b5903c78c80d03b21c3660ce9d32448b05d57", - "capabilitiesDigest": "a9476d5bcb86b084bf94eb567b88ff77a83808043f3e699102be9a304c0539e5", - "materializationDigest": "0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99", - "digest": "10374b5fb3a910d49b701440872276621824023cc9373b9e79a1c56d4b5d6990" - }, - "command": "send" - }, - "activeCapabilities": { - "view": { - "conversation.create": { - "available": true, - "source": "application" - }, - "conversation.open": { - "available": true, - "source": "application" - }, - "run.runner": { - "available": true, - "source": "application" - }, - "run.model": { - "available": true, - "source": "application" - }, - "run.effort": { - "available": true, - "source": "application" + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "environmentId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "controlRef": { + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "executionId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "requestDigest": "sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27" + }, + "materializationDigest": "a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a", + "cursor": "37", + "cursorCommittedSequence": 48, + "contentBytes": 163, + "receipt": { + "version": 1, + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "turnId": "turn-4a95ae49-bcee-49cd-b5af-4501dbd51060", + "operationId": "op-live-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:31.413Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "nativeContinuation": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "interactions": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "ee0eabc709467fe6b53f36d96d6a07a49ea32e3d1b85f888a19dcaa07878f4e9", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a", + "digest": "a55da5866d4df133c203edf1c4db23551a08eb8a95ee257313c4d20a24aceda0" + } }, - "conversation.branch": { - "available": true, - "source": "application" + "assistant": { + "id": "message-072a898a-e540-4db0-bf38-f1a4d5aa6c58", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "parts": [ + { + "id": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41:final" + } + ] }, - "conversation.clone": { - "available": true, - "source": "application" + "finalText": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "marker": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "lastError": null + }, + "cancel": { + "prompt": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "revision": 50, + "replayed": false, + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "admission": { + "version": 1, + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "turnId": "turn-39526126-278b-4f0b-9c58-3b4483c28a0c", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:36.445Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "nativeContinuation": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "interactions": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "retainedControl": "exact-after-dispatch" + }, + "nativeContextBoundaryProof": { + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "executionId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "requestDigest": "sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27", + "boundary": { + "kind": "revision", + "revision": "pi:8206bc20-9cb4-4e21-9076-cdaef25ba464:2" + }, + "observedAt": "2026-08-29T18:31:35.666Z" + }, + "admissionStatus": "admitted", + "requestDigest": "aff7fb801f2d0a4fe636870f58b5f692663cbfca8611bdc641632e3b0f077518", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5", + "digest": "7660ff3662caaca9c51c7838375600ce0c30d037a4e978072ac90e08a62f80c8" + }, + "command": "send" }, - "conversation.fork": { - "available": true, - "source": "application" + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "activeRun": { + "id": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "turnId": "turn-39526126-278b-4f0b-9c58-3b4483c28a0c", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "streaming", + "startedAt": "2026-08-29T18:31:36.457Z", + "updatedAt": "2026-08-29T18:31:36.457Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "materializationDigest": "26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5" }, - "analysis.ask": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-pi-tangle-router-deepseek-v4-flash", + "revision": 67, + "operationId": "op-live-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "control": "cancel", + "outcome": "accepted", + "replayed": false }, - "analysis.recipe": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" + "run": { + "id": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "turnId": "turn-39526126-278b-4f0b-9c58-3b4483c28a0c", + "operationId": "op-live-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T18:31:36.457Z", + "updatedAt": "2026-08-29T18:31:37.706Z", + "terminalAt": "2026-08-29T18:31:37.706Z", + "durationMs": 1249, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "completeness": "complete", + "providerSessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "environmentId": "environment-ec4e3b764feeaec1ea17a6f64c74e4ae", + "controlRef": { + "runId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ", + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "executionId": "run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef", + "requestDigest": "sha256:ba6a1c5173c479d6b4469efa3d1aafbc6422e5c172ce93f35f8c3e9235af8992" + }, + "materializationDigest": "26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5", + "cursor": "5", + "cursorCommittedSequence": 65, + "contentBytes": 14 }, - "analysis.compare": { - "available": false, - "source": "application", - "reason": "Two completed or failed runs are required for comparison" + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": true, + "advertisedByBraid": false, + "advertised": false, + "provider": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true }, - "interaction.respond": { + "braid": { "available": false, "source": "runtime", "reason": "Interaction response is not exposed by the current runtime adapter" }, - "interaction.automation": { - "available": false, - "source": "application", - "reason": "Interaction automation requires the shared response contract" - }, - "run.interactive": { - "available": false, - "source": "application", - "reason": "Native terminal mode requires an interactive TUI and a supported provider" - }, - "run.attach": { - "available": false, - "source": "application", - "reason": "Native terminal attachment requires an interactive TUI and a retained session" - }, - "supervisor.worker.attach": { - "available": false, - "source": "runtime", - "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" - }, - "export.create": { - "available": true, - "source": "application" - }, - "analysis.cancel": { - "available": false, - "source": "application", - "reason": "There is no running analysis to cancel" - }, - "application.quit": { - "available": true, - "source": "local" - }, - "help.read": { - "available": true, - "source": "local" - }, - "profile.select": { - "available": true, - "source": "application" - }, - "connection.select": { - "available": true, - "source": "application" - }, - "settings.open": { - "available": true, - "source": "application" - }, - "activity.read": { - "available": true, - "source": "local" - }, - "graph.read": { - "available": true, - "source": "local" - }, - "details.read": { - "available": true, - "source": "local" - }, - "supervisor.refresh": { - "available": true, - "source": "runtime" - }, - "supervisor.worker.steer": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to steer" - }, - "supervisor.worker.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to cancel" - }, - "supervisor.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervisor to cancel" - }, - "draft.write": { - "available": true, - "source": "application" - }, - "run.send": { - "available": false, - "source": "application", - "reason": "A run is already active" - }, - "run.cancel": { - "available": true, - "source": "runtime" - }, - "run.queue": { - "available": true, - "source": "provider" - }, - "run.steer": { - "available": false, - "source": "provider", - "reason": "The current runtime does not report steering support" - }, - "run.detach": { - "available": true, - "source": "provider" - }, - "run.reconnect": { - "available": false, - "source": "provider", - "reason": "Detach the active run before reconnecting it" - }, - "run.reconcile": { - "available": false, - "source": "provider", - "reason": "Detach the active run before reconciling it" - } - }, - "analysisAsk": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "run": {} - }, - "normal": { - "status": "failed", - "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "run": { - "id": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "turnId": "turn-7998ada5-574b-470c-84bd-07e5c00c6d99", - "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", - "status": "failed", - "startedAt": "2026-08-29T00:25:20.237Z", - "updatedAt": "2026-08-29T00:25:23.102Z", - "terminalAt": "2026-08-29T00:25:23.064Z", - "durationMs": 2827, - "inputTokens": 0, - "outputTokens": 0, - "tokensKnown": false, - "usdKnown": false, - "tokenStatus": "unknown", - "costStatus": "unknown", - "model": "pi/deepseek/deepseek-v4-flash", - "provider": "cli-bridge", - "runner": "pi", - "connectionId": "connection-live-cli-bridge", - "error": "RUNTIME_FINAL_ERROR", - "completeness": "failed", - "providerSessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "environmentId": "environment-0cad3c10f35f7aef52edafb03c248148", - "controlRef": { - "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "provider": "cli-bridge", - "environmentId": "cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0", - "sessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "executionId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "requestDigest": "sha256:ce76ce135f002bfeadab2d36cfc8bfd1652c0f0ce914019c423c179c10403eb5" - }, - "materializationDigest": "0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99", - "cursor": "1", - "cursorCommittedSequence": 12, - "contentBytes": 39 + "attempted": false }, - "assistant": { - "id": "message-c91eb4e7-22fc-4aef-a353-eb61fb36f879", - "role": "assistant", - "text": "", - "status": "failed", - "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "parts": [] - }, - "finalText": "", - "marker": "LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK", - "markerObserved": false, - "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK" - }, - "error": { - "code": "LIVE_FINAL_OUTPUT_MISMATCH", - "message": "Packed Braid pi deepseek/deepseek-v4-flash turn completed without the expected response marker", - "exitCode": 1, - "details": { - "run": { - "id": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "turnId": "turn-7998ada5-574b-470c-84bd-07e5c00c6d99", - "operationId": "op-live-send-pi-deepseek-deepseek-v4-flash", - "status": "failed", - "startedAt": "2026-08-29T00:25:20.237Z", - "updatedAt": "2026-08-29T00:25:23.102Z", - "terminalAt": "2026-08-29T00:25:23.064Z", - "durationMs": 2827, - "inputTokens": 0, - "outputTokens": 0, - "tokensKnown": false, - "usdKnown": false, - "tokenStatus": "unknown", - "costStatus": "unknown", - "model": "pi/deepseek/deepseek-v4-flash", - "provider": "cli-bridge", - "runner": "pi", - "connectionId": "connection-live-cli-bridge", - "error": "RUNTIME_FINAL_ERROR", - "completeness": "failed", - "providerSessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "environmentId": "environment-0cad3c10f35f7aef52edafb03c248148", - "controlRef": { - "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "provider": "cli-bridge", - "environmentId": "cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0", - "sessionId": "session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "executionId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "requestDigest": "sha256:ce76ce135f002bfeadab2d36cfc8bfd1652c0f0ce914019c423c179c10403eb5" - }, - "materializationDigest": "0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99", - "cursor": "1", - "cursorCommittedSequence": 12, - "contentBytes": 39 - }, - "assistant": { - "id": "message-c91eb4e7-22fc-4aef-a353-eb61fb36f879", - "role": "assistant", - "text": "", - "status": "failed", - "runId": "run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4", - "parts": [] - } + "targetProof": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "materializationDigest": "a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a" } }, - "status": "failed", + "operationReceipt": { + "operation": "cli-bridge.target-smoke", + "packed": true, + "runId": "run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "status": "passed" + }, + "status": "passed", "stderr": "", - "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-pi-deepseek-deepseek-v4-flash\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-pi-deepseek-deepseek-v4-flash\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:19.516Z\"}],\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:19.516Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:19.516Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-pi-deepseek-deepseek-v4-flash\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"revision\":4,\"replayed\":false,\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"admission\":{\"version\":1,\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:25:20.226Z\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"model\":\"deepseek-v4-flash\",\"route\":\"pi/deepseek/deepseek-v4-flash\",\"runner\":\"pi\",\"providerRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"0a8422f02e7951be1a620d63f79b5903c78c80d03b21c3660ce9d32448b05d57\",\"capabilitiesDigest\":\"a9476d5bcb86b084bf94eb567b88ff77a83808043f3e699102be9a304c0539e5\",\"materializationDigest\":\"0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99\",\"digest\":\"10374b5fb3a910d49b701440872276621824023cc9373b9e79a1c56d4b5d6990\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"admission\":{\"version\":1,\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:25:20.226Z\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"__braidTruncated\":true},\"__braidTruncated\":true},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-pi-deepseek-deepseek-v4-flash-ab8bdc367345bad70b10d22f\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"ab8bdc367345bad70b10d22fe24ce354d7dbd841e44895b3dd7d713bdabc5b37\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:25:20.249Z\",\"updatedAt\":\"2026-08-29T00:25:20.249Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"executionId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"runId\":\"retained-intent-run:10232103a420175a3c5caeaf5d8557b74c52362f42c7415ccb5a2bacff017105\",\"requestedProfileDigest\":\"sha256:1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"requestDigest\":\"sha256:10232103a420175a3c5caeaf5d8557b74c52362f42c7415ccb5a2bacff017105\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-pi-deepseek-deepseek-v4-flash\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:20.237Z\"}],\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[{\"id\":\"part-message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-c91eb4e7-22fc-4aef-a353-eb61fb36f879\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[]}],\"runs\":[{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:25:20.237Z\",\"updatedAt\":\"2026-08-29T00:25:20.237Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"materializationDigest\":\"0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"focusedRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"activeRuns\":[{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:20.237Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[{\"id\":\"part-message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-c91eb4e7-22fc-4aef-a353-eb61fb36f879\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"status\":\"running\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\"},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"focusedRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"kind\":\"run\",\"title\":\"run run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:25:20.237Z\",\"occurredAt\":\"2026-08-29T00:25:20.237Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"},{\"id\":\"activity:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"occurredAt\":\"2026-08-29T00:25:20.237Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:25:20.237Z\"},{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-7998ada5-574b-470c-84bd-07e5c00c6d99\"],\"runner\":\"pi\",\"startedAt\":\"2026-08-29T00:25:20.237Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"executionId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.reconnecting\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"status\":\"reconnecting\",\"completeness\":\"streaming\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"source\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:25:23.023Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:25:21.243Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:25:23.023Z\"},\"controlRef\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"executionId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"requestDigest\":\"sha256:ce76ce135f002bfeadab2d36cfc8bfd1652c0f0ce914019c423c179c10403eb5\"},\"provider\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:25:23.023Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"source\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T00:25:23.064Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"status\":\"failed\",\"detail\":\"RUNTIME_STATUS\",\"provider\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T00:25:23.064Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"source\":{\"eventId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:25:23.101Z\"},\"status\":\"failed\",\"completeness\":\"complete\",\"finalText\":\"\",\"usage\":{\"input\":0,\"output\":0,\"tokensKnown\":false,\"usdKnown\":false,\"model\":\"pi/deepseek/deepseek-v4-flash\"},\"reason\":\"RUNTIME_FINAL_REASON\",\"error\":\"RUNTIME_FINAL_ERROR\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-pi-deepseek-deepseek-v4-flash-ab8bdc367345bad70b10d22f\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"ab8bdc367345bad70b10d22fe24ce354d7dbd841e44895b3dd7d713bdabc5b37\",\"kind\":\"send\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"2d2acf569882146ba42c49e3553984f716d39e5c29483aa9dd35daa8fb1f60bc\",\"createdAt\":\"2026-08-29T00:25:20.249Z\",\"updatedAt\":\"2026-08-29T00:25:23.122Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-pi-deepseek-deepseek-v4-flash\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:25:20.237Z\"}],\"profile\":{\"name\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"deepseek\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[{\"id\":\"part-message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-c91eb4e7-22fc-4aef-a353-eb61fb36f879\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"failed\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[]}],\"runs\":[{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"status\":\"failed\",\"startedAt\":\"2026-08-29T00:25:20.237Z\",\"updatedAt\":\"2026-08-29T00:25:23.102Z\",\"terminalAt\":\"2026-08-29T00:25:23.064Z\",\"durationMs\":2827,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"pi/deepseek/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"error\":\"RUNTIME_FINAL_ERROR\",\"completeness\":\"failed\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"environmentId\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"controlRef\":{\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL2RlZXBzZWVrL2RlZXBzZWVrLXY0LWZsYXNoIiwic2hhMjU2OjEzZjc2YjE5MWM0NjEwZjgzMGE4ZTI0OTgzZjZlNmZkNmE4ODVhOGQ5ZmYyMDMxNjllNzliMzNhNjI0ZmEyNGMiLCJ5UnBleG1mVHgxMlN4MTBwakFla2hmUk9YXy03WExtY0V6dWlLWGVudVVJIl0\",\"sessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"executionId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"requestDigest\":\"sha256:ce76ce135f002bfeadab2d36cfc8bfd1652c0f0ce914019c423c179c10403eb5\"},\"materializationDigest\":\"0e39e86e557d55e70c6cea1abb305ac66e5598a41054de5acb2ec95e1fd06e99\",\"cursor\":\"1\",\"cursorCommittedSequence\":12,\"contentBytes\":39}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:25:21.243Z\",\"updatedAt\":\"2026-08-29T00:25:23.023Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"activeRuns\":[],\"lastError\":\"RUNTIME_FINAL_ERROR\"},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-pi-deepseek-deepseek-v4-flash\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:25:20.237Z\"}],\"branch\":\"branch-1\",\"status\":\"failed\",\"statusText\":\"RUNTIME_FINAL_ERROR\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[{\"id\":\"part-message-80d9f9de-b1ae-494c-90fe-eb81109a9e5d\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-DEEPSEEK-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-c91eb4e7-22fc-4aef-a353-eb61fb36f879\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"failed\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"turnId\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-deepseek-deepseek-v4-flash\",\"status\":\"failed\",\"profileName\":\"Braid live pi/deepseek/deepseek-v4-flash\",\"profileDigest\":\"1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"model\":\"pi/deepseek/deepseek-v4-flash\",\"effort\":\"none\",\"error\":\"RUNTIME_FINAL_ERROR\",\"cursor\":\"1\",\"providerSessionId\":\"session-braid-run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"pi/deepseek/deepseek-v4-flash\",\"elapsedMs\":2827},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"completeness\":\"failed\",\"contentBytes\":39}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:25:21.243Z\",\"updatedAt\":\"2026-08-29T00:25:23.023Z\"}],\"focusedRunId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"kind\":\"run\",\"title\":\"run run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"status\":\"failed\",\"detail\":\"RUNTIME_FINAL_ERROR\",\"elapsedMs\":2827,\"startedAt\":\"2026-08-29T00:25:20.237Z\",\"occurredAt\":\"2026-08-29T00:25:20.237Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"},{\"id\":\"environment:environment-0cad3c10f35f7aef52edafb03c248148\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:25:21.243Z\",\"occurredAt\":\"2026-08-29T00:25:23.023Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"environment\",\"entityId\":\"environment-0cad3c10f35f7aef52edafb03c248148\"},{\"id\":\"activity:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"failed\",\"detail\":\"profile 1c80f935ec9cb2ba3fed47ca062681141c5e91f6bc3847815009d71cfb4e1928\",\"occurredAt\":\"2026-08-29T00:25:23.102Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"},{\"id\":\"activity:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"failed\",\"occurredAt\":\"2026-08-29T00:25:23.102Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"},{\"id\":\"activity:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4:status:local:failed\",\"kind\":\"system\",\"title\":\"failed\",\"status\":\"failed\",\"detail\":\"RUNTIME_STATUS\",\"occurredAt\":\"2026-08-29T00:25:23.102Z\",\"runId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"entityType\":\"run\",\"entityId\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:25:19.516Z\"},{\"id\":\"turn-7998ada5-574b-470c-84bd-07e5c00c6d99\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"failed\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:25:20.237Z\"},{\"id\":\"run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"failed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-7998ada5-574b-470c-84bd-07e5c00c6d99\"],\"runner\":\"pi\",\"elapsedMs\":2827,\"startedAt\":\"2026-08-29T00:25:20.237Z\"},{\"id\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:25:21.243Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-0cad3c10f35f7aef52edafb03c248148\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:25:21.243Z\",\"observed: 2026-08-29T00:25:23.023Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-976df820-5d95-49a5-a8c1-8d7e7c5e2cf4\",\"fields\":[{\"label\":\"status\",\"value\":\"failed\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"pi/deepseek/deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-pi-tangle-router-deepseek-v4-flash\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-pi-tangle-router-deepseek-v4-flash\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:30.533Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:30.533Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:30.533Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-pi-tangle-router-deepseek-v4-flash\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":4,\"replayed\":false,\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"admission\":{\"version\":1,\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:31.413Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"model\":\"deepseek-v4-flash\",\"route\":\"pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"providerRunId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"ee0eabc709467fe6b53f36d96d6a07a49ea32e3d1b85f888a19dcaa07878f4e9\",\"capabilitiesDigest\":\"87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626\",\"materializationDigest\":\"a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a\",\"digest\":\"a55da5866d4df133c203edf1c4db23551a08eb8a95ee257313c4d20a24aceda0\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"admission\":{\"version\":1,\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:31.413Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"model\":\"deepseek-v4-flash\",\"route\":\"pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"providerRunId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"ee0eabc709467fe6b53f36d96d6a07a49ea32e3d1b85f888a19dcaa07878f4e9\",\"capabilitiesDigest\":\"87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626\",\"materializationDigest\":\"a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a\",\"digest\":\"a55da5866d4df133c203edf1c4db23551a08eb8a95ee257313c4d20a24aceda0\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-pi-tangle-router-deepseek-v4-flash-1a11cbfb13924e90e84cb4af\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"1a11cbfb13924e90e84cb4afd42dd819da878cfc3853665f73f7ee559a17e91d\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T18:31:31.466Z\",\"updatedAt\":\"2026-08-29T18:31:31.466Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"runId\":\"retained-intent-run:182958cd437931dd9419a57ae038713326cf6b3b573de7321220eeb5f397efd3\",\"requestedProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requestDigest\":\"sha256:182958cd437931dd9419a57ae038713326cf6b3b573de7321220eeb5f397efd3\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-pi-tangle-router-deepseek-v4-flash\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:31.439Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[]}],\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"updatedAt\":\"2026-08-29T18:31:31.439Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"materializationDigest\":\"a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"focusedRunId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"activeRuns\":[{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:31.439Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"running\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\"},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"focusedRunId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"kind\":\"run\",\"title\":\"run run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"running\",\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"occurredAt\":\"2026-08-29T18:31:31.439Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:31.439Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\"],\"runner\":\"pi\",\"startedAt\":\"2026-08-29T18:31:31.439Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect while another run is active\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile while another run is active\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestDigest\":\"sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:33.289Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T18:31:33.289Z\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\"},\"controlRef\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestDigest\":\"sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27\"},\"provider\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:33.289Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T18:31:33.308Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T18:31:33.308Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T18:31:33.659Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T18:31:33.659Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T18:31:33.669Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"streaming\",\"provider\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T18:31:33.669Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"providerSequence\":5,\"cursor\":\"4\",\"receivedAt\":\"2026-08-29T18:31:33.679Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"providerSequence\":6,\"cursor\":\"5\",\"receivedAt\":\"2026-08-29T18:31:33.689Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"providerSequence\":7,\"cursor\":\"6\",\"receivedAt\":\"2026-08-29T18:31:34.920Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:7\",\"providerSequence\":8,\"cursor\":\"7\",\"receivedAt\":\"2026-08-29T18:31:35.134Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:7\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:8\",\"providerSequence\":9,\"cursor\":\"8\",\"receivedAt\":\"2026-08-29T18:31:35.143Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"L\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:8\"},\"delta\":\"L\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:9\",\"providerSequence\":10,\"cursor\":\"9\",\"receivedAt\":\"2026-08-29T18:31:35.155Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:9\"},\"delta\":\"IVE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:10\",\"providerSequence\":11,\"cursor\":\"10\",\"receivedAt\":\"2026-08-29T18:31:35.166Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_B\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:10\"},\"delta\":\"_\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:11\",\"providerSequence\":12,\"cursor\":\"11\",\"receivedAt\":\"2026-08-29T18:31:35.176Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRA\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:11\"},\"delta\":\"BR\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:12\",\"providerSequence\":13,\"cursor\":\"12\",\"receivedAt\":\"2026-08-29T18:31:35.188Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:12\"},\"delta\":\"AID\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:13\",\"providerSequence\":14,\"cursor\":\"13\",\"receivedAt\":\"2026-08-29T18:31:35.199Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_P\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:13\"},\"delta\":\"_\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:14\",\"providerSequence\":15,\"cursor\":\"14\",\"receivedAt\":\"2026-08-29T18:31:35.207Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:14\"},\"delta\":\"PI\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:15\",\"providerSequence\":16,\"cursor\":\"15\",\"receivedAt\":\"2026-08-29T18:31:35.219Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-T\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:15\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:16\",\"providerSequence\":17,\"cursor\":\"16\",\"receivedAt\":\"2026-08-29T18:31:35.230Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANG\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:16\"},\"delta\":\"TANG\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:17\",\"providerSequence\":18,\"cursor\":\"17\",\"receivedAt\":\"2026-08-29T18:31:35.238Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:17\"},\"delta\":\"LE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:18\",\"providerSequence\":19,\"cursor\":\"18\",\"receivedAt\":\"2026-08-29T18:31:35.248Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:18\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":30,\"revision\":30,\"event\":{\"sequence\":30,\"revision\":30,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:19\",\"providerSequence\":20,\"cursor\":\"19\",\"receivedAt\":\"2026-08-29T18:31:35.257Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-RO\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:19\"},\"delta\":\"RO\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":31,\"revision\":31,\"event\":{\"sequence\":31,\"revision\":31,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:20\",\"providerSequence\":21,\"cursor\":\"20\",\"receivedAt\":\"2026-08-29T18:31:35.264Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUT\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:20\"},\"delta\":\"U\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":32,\"revision\":32,\"event\":{\"sequence\":32,\"revision\":32,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:21\",\"providerSequence\":22,\"cursor\":\"21\",\"receivedAt\":\"2026-08-29T18:31:35.276Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:21\"},\"delta\":\"TER\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":33,\"revision\":33,\"event\":{\"sequence\":33,\"revision\":33,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:22\",\"providerSequence\":23,\"cursor\":\"22\",\"receivedAt\":\"2026-08-29T18:31:35.282Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-D\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:22\"},\"delta\":\"-D\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":34,\"revision\":34,\"event\":{\"sequence\":34,\"revision\":34,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:23\",\"providerSequence\":24,\"cursor\":\"23\",\"receivedAt\":\"2026-08-29T18:31:35.289Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEP\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:23\"},\"delta\":\"EE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":35,\"revision\":35,\"event\":{\"sequence\":35,\"revision\":35,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:24\",\"providerSequence\":25,\"cursor\":\"24\",\"receivedAt\":\"2026-08-29T18:31:35.297Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEE\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:24\"},\"delta\":\"PSEE\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":36,\"revision\":36,\"event\":{\"sequence\":36,\"revision\":36,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:25\",\"providerSequence\":26,\"cursor\":\"25\",\"receivedAt\":\"2026-08-29T18:31:35.305Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:25\"},\"delta\":\"\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":37,\"revision\":37,\"event\":{\"sequence\":37,\"revision\":37,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:26\",\"providerSequence\":27,\"cursor\":\"26\",\"receivedAt\":\"2026-08-29T18:31:35.312Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:26\"},\"delta\":\"K-V\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":38,\"revision\":38,\"event\":{\"sequence\":38,\"revision\":38,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:27\",\"providerSequence\":28,\"cursor\":\"27\",\"receivedAt\":\"2026-08-29T18:31:35.322Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:27\"},\"delta\":\"4\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":39,\"revision\":39,\"event\":{\"sequence\":39,\"revision\":39,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:28\",\"providerSequence\":29,\"cursor\":\"28\",\"receivedAt\":\"2026-08-29T18:31:35.330Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-F\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:28\"},\"delta\":\"-\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":40,\"revision\":40,\"event\":{\"sequence\":40,\"revision\":40,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:29\",\"providerSequence\":30,\"cursor\":\"29\",\"receivedAt\":\"2026-08-29T18:31:35.337Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FL\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:29\"},\"delta\":\"FL\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":41,\"revision\":41,\"event\":{\"sequence\":41,\"revision\":41,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:30\",\"providerSequence\":31,\"cursor\":\"30\",\"receivedAt\":\"2026-08-29T18:31:35.345Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:30\"},\"delta\":\"AS\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":42,\"revision\":42,\"event\":{\"sequence\":42,\"revision\":42,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:31\",\"providerSequence\":32,\"cursor\":\"31\",\"receivedAt\":\"2026-08-29T18:31:35.352Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:31\"},\"delta\":\"H_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":43,\"revision\":43,\"event\":{\"sequence\":43,\"revision\":43,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:32\",\"providerSequence\":33,\"cursor\":\"32\",\"receivedAt\":\"2026-08-29T18:31:35.667Z\"},\"part\":{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:32\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":44,\"revision\":44,\"event\":{\"sequence\":44,\"revision\":44,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"providerSequence\":34,\"cursor\":\"33\",\"receivedAt\":\"2026-08-29T18:31:35.677Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":45,\"revision\":45,\"event\":{\"sequence\":45,\"revision\":45,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"providerSequence\":35,\"cursor\":\"34\",\"receivedAt\":\"2026-08-29T18:31:35.686Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":46,\"revision\":46,\"event\":{\"sequence\":46,\"revision\":46,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"providerSequence\":36,\"cursor\":\"35\",\"receivedAt\":\"2026-08-29T18:31:35.694Z\"},\"unknown\":{\"type\":\"model-processing\",\"phase\":\"generating\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":47,\"revision\":47,\"event\":{\"sequence\":47,\"revision\":47,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"providerSequence\":37,\"cursor\":\"36\",\"receivedAt\":\"2026-08-29T18:31:35.702Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":48,\"revision\":48,\"event\":{\"sequence\":48,\"revision\":48,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:37\",\"providerSequence\":38,\"cursor\":\"37\",\"receivedAt\":\"2026-08-29T18:31:35.712Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"running\",\"provider\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:37\",\"providerSequence\":38,\"cursor\":\"37\",\"receivedAt\":\"2026-08-29T18:31:35.712Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":49,\"revision\":49,\"event\":{\"sequence\":49,\"revision\":49,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"source\":{\"eventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\",\"providerSequence\":39,\"receivedAt\":\"2026-08-29T18:31:35.733Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"usage\":{\"input\":1011,\"output\":25,\"reasoning\":0,\"usdKnown\":false,\"model\":\"pi/tangle-router/deepseek-v4-flash\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":50,\"revision\":50,\"event\":{\"sequence\":50,\"revision\":50,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-pi-tangle-router-deepseek-v4-flash-1a11cbfb13924e90e84cb4af\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"1a11cbfb13924e90e84cb4afd42dd819da878cfc3853665f73f7ee559a17e91d\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T18:31:31.466Z\",\"updatedAt\":\"2026-08-29T18:31:35.759Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-pi-tangle-router-deepseek-v4-flash\",\"revision\":50,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":50,\"sequence\":50,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:31.439Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]}],\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"updatedAt\":\"2026-08-29T18:31:35.734Z\",\"terminalAt\":\"2026-08-29T18:31:35.734Z\",\"durationMs\":4295,\"inputTokens\":1011,\"outputTokens\":25,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":0,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"controlRef\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestDigest\":\"sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27\"},\"materializationDigest\":\"a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a\",\"cursor\":\"37\",\"cursorCommittedSequence\":48,\"contentBytes\":163}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:33.289Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":50,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:31.439Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"37\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":4295},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"completeness\":\"complete\",\"contentBytes\":163}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:33.289Z\"}],\"focusedRunId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"kind\":\"run\",\"title\":\"run run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"completed\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"occurredAt\":\"2026-08-29T18:31:31.439Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"environment:environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:31.038Z\",\"occurredAt\":\"2026-08-29T18:31:33.289Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 34\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 35\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 36\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 37\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:31.038Z\"},{\"id\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\"],\"runner\":\"pi\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:31.038Z\",\"observed: 2026-08-29T18:31:33.289Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"1011\"},{\"label\":\"output tokens\",\"value\":\"25\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"model\",\"value\":\"pi/tangle-router/deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-pi-tangle-router-deepseek-v4-flash\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":50,\"replayed\":false,\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"admission\":{\"version\":1,\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:36.445Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"model\":\"deepseek-v4-flash\",\"route\":\"pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"providerRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"retainedControl\":\"exact-after-dispatch\"},\"nativeContextBoundaryProof\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestDigest\":\"sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27\",\"boundary\":{\"kind\":\"revision\",\"revision\":\"pi:8206bc20-9cb4-4e21-9076-cdaef25ba464:2\"},\"observedAt\":\"2026-08-29T18:31:35.666Z\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"aff7fb801f2d0a4fe636870f58b5f692663cbfca8611bdc641632e3b0f077518\",\"capabilitiesDigest\":\"87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626\",\"materializationDigest\":\"26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5\",\"digest\":\"7660ff3662caaca9c51c7838375600ce0c30d037a4e978072ac90e08a62f80c8\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":51,\"revision\":51,\"event\":{\"sequence\":51,\"revision\":51,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":52,\"revision\":52,\"event\":{\"sequence\":52,\"revision\":52,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:36.445Z\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requested\":{\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{\"permission\":true},\"model\":\"deepseek-v4-flash\",\"runner\":\"pi\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":false,\"instructions\":true,\"tools\":false,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"nativeContinuation\":{\"atomicBoundary\":true,\"requestIdempotency\":true,\"admissionControl\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"interactions\":{\"kinds\":[\"permission\"],\"answerFieldTypes\":[\"select\"],\"responseScopes\":[\"interaction\"],\"secretAnswers\":false,\"concurrentRequests\":false,\"replay\":true,\"responseIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"model\":\"deepseek-v4-flash\",\"route\":\"pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"providerRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"retainedControl\":\"exact-after-dispatch\"},\"nativeContextBoundaryProof\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestDigest\":\"sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27\",\"boundary\":{\"kind\":\"revision\",\"revision\":\"pi:8206bc20-9cb4-4e21-9076-cdaef25ba464:2\"},\"observedAt\":\"2026-08-29T18:31:35.666Z\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"aff7fb801f2d0a4fe636870f58b5f692663cbfca8611bdc641632e3b0f077518\",\"capabilitiesDigest\":\"87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626\",\"materializationDigest\":\"26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5\",\"digest\":\"7660ff3662caaca9c51c7838375600ce0c30d037a4e978072ac90e08a62f80c8\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":53,\"revision\":53,\"event\":{\"sequence\":53,\"revision\":53,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-pi-tangle-router-deepseek-v4-flash-668bff6cf721b2f8b8222cc8\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"668bff6cf721b2f8b8222cc8fc1cf80ddf6662a694d477905175bd7ec3e235af\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T18:31:36.468Z\",\"updatedAt\":\"2026-08-29T18:31:36.468Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":54,\"revision\":54,\"event\":{\"sequence\":54,\"revision\":54,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"runId\":\"retained-intent-run:097efadc470e115dfbae903c73eb3bd1dcf6f10c03615dde9bfad1b5dfaa5bad\",\"requestedProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"requestDigest\":\"sha256:097efadc470e115dfbae903c73eb3bd1dcf6f10c03615dde9bfad1b5dfaa5bad\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":52,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":52,\"sequence\":52,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:36.457Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]},{\"id\":\"message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[{\"id\":\"part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-73da876d-7b95-49e4-8e7a-8be8c74988e5\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[]}],\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"updatedAt\":\"2026-08-29T18:31:35.734Z\",\"terminalAt\":\"2026-08-29T18:31:35.734Z\",\"durationMs\":4295,\"inputTokens\":1011,\"outputTokens\":25,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":0,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"controlRef\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestDigest\":\"sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27\"},\"materializationDigest\":\"a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a\",\"cursor\":\"37\",\"cursorCommittedSequence\":48,\"contentBytes\":163},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T18:31:36.457Z\",\"updatedAt\":\"2026-08-29T18:31:36.457Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"materializationDigest\":\"26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:33.289Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"focusedRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"activeRuns\":[{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":52,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:36.457Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]},{\"id\":\"message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[{\"id\":\"part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-73da876d-7b95-49e4-8e7a-8be8c74988e5\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"37\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":4295},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"completeness\":\"complete\",\"contentBytes\":163},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"running\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\"},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:33.289Z\"}],\"activeRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"focusedRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"kind\":\"run\",\"title\":\"run run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"completed\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"occurredAt\":\"2026-08-29T18:31:31.439Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"environment:environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:31.038Z\",\"occurredAt\":\"2026-08-29T18:31:33.289Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 34\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 35\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 36\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 37\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"run:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"kind\":\"run\",\"title\":\"run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"status\":\"running\",\"startedAt\":\"2026-08-29T18:31:36.457Z\",\"occurredAt\":\"2026-08-29T18:31:36.457Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:36.457Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:31.038Z\"},{\"id\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\"],\"runner\":\"pi\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:36.457Z\"},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-39526126-278b-4f0b-9c58-3b4483c28a0c\"],\"runner\":\"pi\",\"startedAt\":\"2026-08-29T18:31:36.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:31.038Z\",\"observed: 2026-08-29T18:31:33.289Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect while another run is active\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile while another run is active\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-pi-tangle-router-deepseek-v4-flash\",\"revision\":67,\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"command\":\"cancel_run\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"control\":\"cancel\",\"outcome\":\"accepted\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":55,\"revision\":55,\"event\":{\"sequence\":55,\"revision\":55,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"control\":{\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":56,\"revision\":56,\"event\":{\"sequence\":56,\"revision\":56,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"control\":{\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":57,\"revision\":57,\"event\":{\"sequence\":57,\"revision\":57,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-pi-tangle-router-deepseek-v4-flash-4dc274e520211d459efe3cbf\",\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"4dc274e520211d459efe3cbf4bed1eae46f78f5848b8dfa8eb3260cd5e5c7eb8\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T18:31:36.551Z\",\"updatedAt\":\"2026-08-29T18:31:36.551Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":58,\"revision\":58,\"event\":{\"sequence\":58,\"revision\":58,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":59,\"revision\":59,\"event\":{\"sequence\":59,\"revision\":59,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"requestDigest\":\"sha256:ba6a1c5173c479d6b4469efa3d1aafbc6422e5c172ce93f35f8c3e9235af8992\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":60,\"revision\":60,\"event\":{\"sequence\":60,\"revision\":60,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"source\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:37.592Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T18:31:36.105Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T18:31:37.592Z\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\"},\"controlRef\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"requestDigest\":\"sha256:ba6a1c5173c479d6b4469efa3d1aafbc6422e5c172ce93f35f8c3e9235af8992\"},\"provider\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:37.592Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":61,\"revision\":61,\"event\":{\"sequence\":61,\"revision\":61,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"source\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T18:31:37.623Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:1\",\"providerSequence\":2,\"cursor\":\"1\",\"receivedAt\":\"2026-08-29T18:31:37.623Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":62,\"revision\":62,\"event\":{\"sequence\":62,\"revision\":62,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"source\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T18:31:37.633Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"status\":\"starting\",\"provider\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:2\",\"providerSequence\":3,\"cursor\":\"2\",\"receivedAt\":\"2026-08-29T18:31:37.633Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":63,\"revision\":63,\"event\":{\"sequence\":63,\"revision\":63,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"source\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T18:31:37.642Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"status\":\"streaming\",\"provider\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:3\",\"providerSequence\":4,\"cursor\":\"3\",\"receivedAt\":\"2026-08-29T18:31:37.642Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":64,\"revision\":64,\"event\":{\"sequence\":64,\"revision\":64,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"source\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:4\",\"providerSequence\":5,\"cursor\":\"4\",\"receivedAt\":\"2026-08-29T18:31:37.651Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":65,\"revision\":65,\"event\":{\"sequence\":65,\"revision\":65,\"kind\":\"run.provider.event\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"source\":{\"eventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:5\",\"providerSequence\":6,\"cursor\":\"5\",\"receivedAt\":\"2026-08-29T18:31:37.659Z\"},\"unknown\":{\"type\":\"raw\",\"event\":{\"redacted\":true}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":66,\"revision\":66,\"event\":{\"sequence\":66,\"revision\":66,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-pi-tangle-router-deepseek-v4-flash-4dc274e520211d459efe3cbf\",\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"4dc274e520211d459efe3cbf4bed1eae46f78f5848b8dfa8eb3260cd5e5c7eb8\",\"kind\":\"custom\",\"status\":\"acknowledged\",\"attempt\":1,\"outcomeDigest\":\"f430d9c9c101fec536eed9da90bf212be94a7c138332862d1e9774b1266d9187\",\"createdAt\":\"2026-08-29T18:31:36.551Z\",\"updatedAt\":\"2026-08-29T18:31:37.674Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":67,\"revision\":67,\"event\":{\"sequence\":67,\"revision\":67,\"kind\":\"run.reconnecting\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"status\":\"reconnecting\",\"completeness\":\"streaming\",\"cursor\":\"5\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":68,\"revision\":68,\"event\":{\"sequence\":68,\"revision\":68,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"control\":{\"operationId\":\"op-live-cancel-pi-tangle-router-deepseek-v4-flash\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"control\":\"cancel\",\"status\":\"accepted\",\"detail\":\"CONTROL_DETAIL\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":69,\"revision\":69,\"event\":{\"sequence\":69,\"revision\":69,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"status\":\"aborted\",\"completeness\":\"complete\",\"finalText\":\"\",\"usage\":{\"input\":0,\"output\":0,\"tokensKnown\":false,\"usdKnown\":false,\"model\":\"deepseek-v4-flash\"},\"reason\":\"CONTROL_DETAIL\"}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-pi-tangle-router-deepseek-v4-flash\",\"revision\":69,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":69,\"sequence\":69,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:36.457Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]},{\"id\":\"message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[{\"id\":\"part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-73da876d-7b95-49e4-8e7a-8be8c74988e5\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[]}],\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"updatedAt\":\"2026-08-29T18:31:35.734Z\",\"terminalAt\":\"2026-08-29T18:31:35.734Z\",\"durationMs\":4295,\"inputTokens\":1011,\"outputTokens\":25,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":0,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"controlRef\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestDigest\":\"sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27\"},\"materializationDigest\":\"a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a\",\"cursor\":\"37\",\"cursorCommittedSequence\":48,\"contentBytes\":163},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T18:31:36.457Z\",\"updatedAt\":\"2026-08-29T18:31:37.706Z\",\"terminalAt\":\"2026-08-29T18:31:37.706Z\",\"durationMs\":1249,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"controlRef\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"requestDigest\":\"sha256:ba6a1c5173c479d6b4469efa3d1aafbc6422e5c172ce93f35f8c3e9235af8992\"},\"materializationDigest\":\"26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5\",\"cursor\":\"5\",\"cursorCommittedSequence\":65,\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:37.592Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":69,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:36.457Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]},{\"id\":\"message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[{\"id\":\"part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-73da876d-7b95-49e4-8e7a-8be8c74988e5\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"37\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":4295},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"completeness\":\"complete\",\"contentBytes\":163},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"5\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":1249},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"completeness\":\"complete\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:37.592Z\"}],\"focusedRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"kind\":\"run\",\"title\":\"run run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"completed\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"occurredAt\":\"2026-08-29T18:31:31.439Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 34\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 35\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 36\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 37\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"run:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"kind\":\"run\",\"title\":\"run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"status\":\"cancelled\",\"elapsedMs\":1249,\"startedAt\":\"2026-08-29T18:31:36.457Z\",\"occurredAt\":\"2026-08-29T18:31:36.457Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"environment:environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:31.038Z\",\"occurredAt\":\"2026-08-29T18:31:37.592Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"5\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"event:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"sourceEventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:4\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"event:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"sourceEventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:5\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:31.038Z\"},{\"id\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\"],\"runner\":\"pi\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:36.457Z\"},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-39526126-278b-4f0b-9c58-3b4483c28a0c\"],\"runner\":\"pi\",\"elapsedMs\":1249,\"startedAt\":\"2026-08-29T18:31:36.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:31.038Z\",\"observed: 2026-08-29T18:31:37.592Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"final-state-pi-tangle-router-deepseek-v4-flash\",\"revision\":69,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":69,\"sequence\":69,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:36.457Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]},{\"id\":\"message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[{\"id\":\"part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-73da876d-7b95-49e4-8e7a-8be8c74988e5\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[]}],\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"updatedAt\":\"2026-08-29T18:31:35.734Z\",\"terminalAt\":\"2026-08-29T18:31:35.734Z\",\"durationMs\":4295,\"inputTokens\":1011,\"outputTokens\":25,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":0,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"controlRef\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestDigest\":\"sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27\"},\"materializationDigest\":\"a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a\",\"cursor\":\"37\",\"cursorCommittedSequence\":48,\"contentBytes\":163},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T18:31:36.457Z\",\"updatedAt\":\"2026-08-29T18:31:37.706Z\",\"terminalAt\":\"2026-08-29T18:31:37.706Z\",\"durationMs\":1249,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"controlRef\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"requestDigest\":\"sha256:ba6a1c5173c479d6b4469efa3d1aafbc6422e5c172ce93f35f8c3e9235af8992\"},\"materializationDigest\":\"26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5\",\"cursor\":\"5\",\"cursorCommittedSequence\":65,\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:37.592Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":69,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:36.457Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]},{\"id\":\"message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[{\"id\":\"part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-73da876d-7b95-49e4-8e7a-8be8c74988e5\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"37\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":4295},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"completeness\":\"complete\",\"contentBytes\":163},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"5\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":1249},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"completeness\":\"complete\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:37.592Z\"}],\"focusedRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"kind\":\"run\",\"title\":\"run run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"completed\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"occurredAt\":\"2026-08-29T18:31:31.439Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 34\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 35\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 36\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 37\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"run:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"kind\":\"run\",\"title\":\"run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"status\":\"cancelled\",\"elapsedMs\":1249,\"startedAt\":\"2026-08-29T18:31:36.457Z\",\"occurredAt\":\"2026-08-29T18:31:36.457Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"environment:environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:31.038Z\",\"occurredAt\":\"2026-08-29T18:31:37.592Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"5\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"event:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"sourceEventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:4\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"event:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"sourceEventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:5\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:31.038Z\"},{\"id\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\"],\"runner\":\"pi\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:36.457Z\"},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-39526126-278b-4f0b-9c58-3b4483c28a0c\"],\"runner\":\"pi\",\"elapsedMs\":1249,\"startedAt\":\"2026-08-29T18:31:36.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:31.038Z\",\"observed: 2026-08-29T18:31:37.592Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"shutdown-pi-tangle-router-deepseek-v4-flash\",\"revision\":69,\"operationId\":\"op-live-shutdown-pi-tangle-router-deepseek-v4-flash\",\"command\":\"shutdown\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":70,\"revision\":70,\"event\":{\"sequence\":70,\"revision\":70,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-live-shutdown-pi-tangle-router-deepseek-v4-flash\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":71,\"revision\":71,\"event\":{\"sequence\":71,\"revision\":71,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-pi-tangle-router-deepseek-v4-flash-668bff6cf721b2f8b8222cc8\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"effectKind\":\"run.execute\",\"requestDigest\":\"668bff6cf721b2f8b8222cc8fc1cf80ddf6662a694d477905175bd7ec3e235af\",\"kind\":\"send\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"709050be156660bc04bed3766c3160fcc713b9a8ebb19bfd0cd66bbe285c86e9\",\"createdAt\":\"2026-08-29T18:31:36.468Z\",\"updatedAt\":\"2026-08-29T18:31:38.993Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-pi-tangle-router-deepseek-v4-flash\",\"revision\":71,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":71,\"sequence\":71,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:36.457Z\"}],\"profile\":{\"name\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"deepseek-v4-flash\",\"provider\":\"tangle-router\",\"reasoningEffort\":\"none\"},\"harness\":\"pi\"},\"runConfiguration\":{\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]},{\"id\":\"message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[{\"id\":\"part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-73da876d-7b95-49e4-8e7a-8be8c74988e5\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[]}],\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"updatedAt\":\"2026-08-29T18:31:35.734Z\",\"terminalAt\":\"2026-08-29T18:31:35.734Z\",\"durationMs\":4295,\"inputTokens\":1011,\"outputTokens\":25,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"reasoningTokens\":0,\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"controlRef\":{\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestDigest\":\"sha256:4309e7d88403e2e900208ba1c2df3afc26e2454e1256e4dc865e04a263ff4b27\"},\"materializationDigest\":\"a25723812e5b15fa8be363ab5d888b486fe55271d8f45548d4b7e14b5ef5197a\",\"cursor\":\"37\",\"cursorCommittedSequence\":48,\"contentBytes\":163},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"aborted\",\"startedAt\":\"2026-08-29T18:31:36.457Z\",\"updatedAt\":\"2026-08-29T18:31:37.706Z\",\"terminalAt\":\"2026-08-29T18:31:37.706Z\",\"durationMs\":1249,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"provider\":\"cli-bridge\",\"runner\":\"pi\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"controlRef\":{\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"sessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"executionId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"requestDigest\":\"sha256:ba6a1c5173c479d6b4469efa3d1aafbc6422e5c172ce93f35f8c3e9235af8992\"},\"materializationDigest\":\"26e213aa6caebaf02c8172e2ab86fd8c8284c68f754bc7254da51865206c9fe5\",\"cursor\":\"5\",\"cursorCommittedSequence\":65,\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:37.592Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":71,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a26ae0a9-9cd2-450e-b6b3-57a38c0ace04\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"runner\":\"pi\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:36.457Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"part-message-58a5a576-6b08-407e-ba21-248f7d9e9aad\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\"}]},{\"id\":\"message-072a898a-e540-4db0-bf38-f1a4d5aa6c58\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"status\":\"complete\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"parts\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:message:0:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:final\"}]},{\"id\":\"message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[{\"id\":\"part-message-a2fbee65-c82a-487e-8e1c-4bdc30e3e7dd\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-73da876d-7b95-49e4-8e7a-8be8c74988e5\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"turnId\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"completed\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"37\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"elapsedMs\":4295},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"completeness\":\"complete\",\"contentBytes\":163},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"turnId\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-pi-tangle-router-deepseek-v4-flash\",\"status\":\"cancelled\",\"profileName\":\"Braid live pi/tangle-router/deepseek-v4-flash\",\"profileDigest\":\"2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"model\":\"deepseek-v4-flash\",\"effort\":\"none\",\"cursor\":\"5\",\"providerSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"requestedSessionId\":\"session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"deepseek-v4-flash\",\"elapsedMs\":1249},\"runner\":\"pi\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"completeness\":\"complete\",\"contentBytes\":14}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":1011,\"output\":25,\"reasoning\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:31.038Z\",\"updatedAt\":\"2026-08-29T18:31:37.592Z\"}],\"focusedRunId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"kind\":\"run\",\"title\":\"run run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"status\":\"completed\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\",\"occurredAt\":\"2026-08-29T18:31:31.439Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"activity:run-f8735ad8-12bc-4549-888d-a745a2dadf41:status:local:running\",\"kind\":\"system\",\"title\":\"running\",\"status\":\"completed\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:4\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:5\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 7\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:6\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 34\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:33\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 35\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:34\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"kind\":\"system\",\"title\":\"event model-processing\",\"status\":\"completed\",\"detail\":\"sequence 36\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:35\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"event:run-f8735ad8-12bc-4549-888d-a745a2dadf41:run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"completed\",\"detail\":\"sequence 37\",\"occurredAt\":\"2026-08-29T18:31:35.734Z\",\"sourceEventId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41:36\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"run\",\"entityId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\"},{\"id\":\"run:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"kind\":\"run\",\"title\":\"run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"status\":\"cancelled\",\"elapsedMs\":1249,\"startedAt\":\"2026-08-29T18:31:36.457Z\",\"occurredAt\":\"2026-08-29T18:31:36.457Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"environment:environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:31.038Z\",\"occurredAt\":\"2026-08-29T18:31:37.592Z\",\"runId\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:starting\",\"kind\":\"system\",\"title\":\"starting\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:status:local:streaming\",\"kind\":\"system\",\"title\":\"streaming\",\"status\":\"cancelled\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:lifecycle:local:reconnecting\",\"kind\":\"system\",\"title\":\"reconnecting\",\"status\":\"cancelled\",\"detail\":\"5\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"activity:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"event:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:4\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 5\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"sourceEventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:4\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"},{\"id\":\"event:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:5\",\"kind\":\"system\",\"title\":\"event raw\",\"status\":\"cancelled\",\"detail\":\"sequence 6\",\"occurredAt\":\"2026-08-29T18:31:37.706Z\",\"sourceEventId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef:5\",\"runId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"entityType\":\"run\",\"entityId\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:30.533Z\"},{\"id\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"run:run-f8735ad8-12bc-4549-888d-a745a2dadf41\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:31.038Z\"},{\"id\":\"turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"run-f8735ad8-12bc-4549-888d-a745a2dadf41\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-4a95ae49-bcee-49cd-b5af-4501dbd51060\"],\"runner\":\"pi\",\"elapsedMs\":4295,\"startedAt\":\"2026-08-29T18:31:31.439Z\"},{\"id\":\"turn-39526126-278b-4f0b-9c58-3b4483c28a0c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:36.457Z\"},{\"id\":\"run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-39526126-278b-4f0b-9c58-3b4483c28a0c\"],\"runner\":\"pi\",\"elapsedMs\":1249,\"startedAt\":\"2026-08-29T18:31:36.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-ec4e3b764feeaec1ea17a6f64c74e4ae\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YzI2M2QxMDg3NjkyZjM3OWVlZTFjOTkzM2I0MWI3NmE0MWFkYmI2YTAwNGZkMjM0ZTFiZWRhOWM0ODM4NWQyNyIsIlAyNmRzRk1WMWt4MXBwVjRmT3VCNGx1aUxPbzZUNVd3TEFsQmRGUnNiYnciXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:31.038Z\",\"observed: 2026-08-29T18:31:37.592Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-6cc0b10a-4d1b-4f67-91ff-5b707ef080ef\",\"fields\":[{\"label\":\"status\",\"value\":\"aborted\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"deepseek-v4-flash\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n", "process": { "processIdentity": { - "instanceId": "06bed5f3-b6f4-487a-90c0-442aa0a3130a", - "pid": 2260083, - "startedAt": 1787963119084 + "instanceId": "8312ccfd-c934-443f-974d-16b5d85c5aea", + "pid": 3350386, + "startedAt": 1788028290048 }, "termination": { "strategy": "natural-exit", @@ -3915,10 +5210,10 @@ "gone": false, "present": true, "pids": [ - 2260083 + 3350386 ], "roots": [ - 2260083 + 3350386 ], "version": 0, "mechanism": "posix-descendant-tracker", @@ -3956,10 +5251,10 @@ "gone": false, "present": true, "pids": [ - 2260083 + 3350386 ], "roots": [ - 2260083 + 3350386 ], "version": 0, "mechanism": "posix-descendant-tracker", @@ -3988,1351 +5283,783 @@ "code": 0, "signal": null } - } - } - ], - "releaseProofs": [], - "releaseOperations": [], - "bridge": { - "initialHealth": { - "status": 200, - "ok": true, - "body": { - "status": "ok", - "cached_verdicts": false, - "oldest_probed_at": "2026-08-29T00:20:30.167Z", - "backends": [ - { - "name": "claude-code", - "state": "ready", - "version": "2.1.248 (Claude Code)", - "probed_at": "2026-08-29T00:20:30.167Z", - "cached": false - }, - { - "name": "opencode", - "state": "ready", - "version": "1.18.18", - "probed_at": "2026-08-29T00:20:30.167Z", - "cached": false - }, - { - "name": "kimi-code", - "state": "ready", - "version": "0.36.1", - "probed_at": "2026-08-29T00:20:30.167Z", - "cached": false - }, - { - "name": "pi", - "state": "ready", - "version": "0.83.0", - "probed_at": "2026-08-29T00:20:30.167Z", - "cached": false - }, + }, + "providerSessionCleanup": { + "attempted": 1, + "closed": 1, + "alreadyAbsent": 0, + "released": 1, + "complete": true, + "results": [ { - "name": "passthrough", - "state": "unavailable", - "detail": "no provider keys configured", - "probed_at": "2026-08-29T00:20:30.333Z", - "cached": false - } - ], - "admission": { - "active": 6, - "live": 6, - "stale": 0, - "unbound": 0, - "oldestHeldMs": 15624593, - "reclaimed": 8, - "queued": 0, - "maxActive": 20, - "maxQueue": 48, - "reservedActive": 2, - "bulkMaxActive": 18, - "activeByClass": { - "reserved": 6, - "bulk": 0 - }, - "queuedByClass": { - "reserved": 0, - "bulk": 0 + "sessionId": "session-braid-run-f8735ad8-12bc-4549-888d-a745a2dadf41", + "status": 200, + "closed": true, + "alreadyAbsent": false, + "released": true } - }, - "memory": { - "heap_used_bytes": 113001800, - "heap_total_bytes": 118554624, - "heap_limit_bytes": 17381195776, - "heap_used_pct": 0.7, - "rss_bytes": 215638016, - "external_bytes": 7782974, - "runs_retained": 2309, - "run_replay_bytes": 79310 - }, - "ts": "2026-08-29T00:20:30.333Z" - }, - "text": "{\"status\":\"ok\",\"cached_verdicts\":false,\"oldest_probed_at\":\"2026-08-29T00:20:30.167Z\",\"backends\":[{\"name\":\"claude-code\",\"state\":\"ready\",\"version\":\"2.1.248 (Claude Code)\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":false},{\"name\":\"opencode\",\"state\":\"ready\",\"version\":\"1.18.18\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":false},{\"name\":\"kimi-code\",\"state\":\"ready\",\"version\":\"0.36.1\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":false},{\"name\":\"pi\",\"state\":\"ready\",\"version\":\"0.83.0\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":false},{\"name\":\"passthrough\",\"state\":\"unavailable\",\"detail\":\"no provider keys configured\",\"probed_at\":\"2026-08-29T00:20:30.333Z\",\"cached\":false}],\"admission\":{\"active\":6,\"live\":6,\"stale\":0,\"unbound\":0,\"oldestHeldMs\":15624593,\"reclaimed\":8,\"queued\":0,\"maxActive\":20,\"maxQueue\":48,\"reservedActive\":2,\"bulkMaxActive\":18,\"activeByClass\":{\"reserved\":6,\"bulk\":0},\"queuedByClass\":{\"reserved\":0,\"bulk\":0}},\"memory\":{\"heap_used_bytes\":113001800,\"heap_total_bytes\":118554624,\"heap_limit_bytes\":17381195776,\"heap_used_pct\":0.7,\"rss_bytes\":215638016,\"external_bytes\":7782974,\"runs_retained\":2309,\"run_replay_bytes\":79310},\"ts\":\"2026-08-29T00:20:30.333Z\"}" - }, - "runtimeContract": { - "status": 200, - "ok": true, - "body": { - "name": "cli-bridge", - "version": "0.2.0", - "scheme": "bridge//", - "capabilities": { - "profileMaterialization": "cli-bridge.profile-materialization.v2", - "usageCostProvenance": "cli-bridge.usage-cost.v1" - }, - "backends": [ - "claude-code", - "opencode", - "kimi-code", - "pi", - "passthrough" - ], - "endpoints": [ - "/health", - "/v1/models", - "/v1/chat/completions", - "/v1/sessions", - "/v1/capabilities", - "/v1/sessions/:id/turns", - "/v1/sessions/:id/input", - "/v1/sessions/:id/events", - "/v1/sessions/:id/status", - "/v1/sessions/:id/transcript", - "/v1/sessions/:id/steer", - "/v1/sessions/:id/cancel", - "/v1/sessions/:id/detach", - "/v1/sessions/:id/close", - "/v1/runs/:id", - "/v1/runs/:id/events", - "/v1/runs/:id/cancel", - "/v1/runs/:runId/interactions/:interactionId/respond", - "/cad/render", - "/images/generate" ] - }, - "text": "{\"name\":\"cli-bridge\",\"version\":\"0.2.0\",\"scheme\":\"bridge//\",\"capabilities\":{\"profileMaterialization\":\"cli-bridge.profile-materialization.v2\",\"usageCostProvenance\":\"cli-bridge.usage-cost.v1\"},\"backends\":[\"claude-code\",\"opencode\",\"kimi-code\",\"pi\",\"passthrough\"],\"endpoints\":[\"/health\",\"/v1/models\",\"/v1/chat/completions\",\"/v1/sessions\",\"/v1/capabilities\",\"/v1/sessions/:id/turns\",\"/v1/sessions/:id/input\",\"/v1/sessions/:id/events\",\"/v1/sessions/:id/status\",\"/v1/sessions/:id/transcript\",\"/v1/sessions/:id/steer\",\"/v1/sessions/:id/cancel\",\"/v1/sessions/:id/detach\",\"/v1/sessions/:id/close\",\"/v1/runs/:id\",\"/v1/runs/:id/events\",\"/v1/runs/:id/cancel\",\"/v1/runs/:runId/interactions/:interactionId/respond\",\"/cad/render\",\"/images/generate\"]}" + } }, - "models": { - "status": 200, - "ok": true, - "body": { - "object": "list", - "data": [ - { - "id": "claude-code/sonnet", - "object": "model", - "backend": "claude-code" - }, - { - "id": "claude-code/opus", - "object": "model", - "backend": "claude-code" - }, - { - "id": "claude-code/haiku", - "object": "model", - "backend": "claude-code" + { + "label": "Codex default", + "target": "codex/default", + "profile": { + "path": ".braid/profiles/profile-codex-default.json", + "harness": "codex", + "model": "default" + }, + "connection": { + "id": "connection-live-cli-bridge", + "kind": "cli-bridge", + "endpoint": "http://127.0.0.1:3344", + "credentialConfigured": true + }, + "providerCapabilities": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": false }, - { - "id": "opencode/deepseek/deepseek-v4-flash", - "object": "model", - "backend": "opencode" + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true }, - { - "id": "opencode/deepseek/deepseek-v4-flash-vision-exp", - "object": "model", - "backend": "opencode" + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "requests": [ + { + "version": 1, + "requestId": "init-codex-default", + "command": "initialize", + "params": { + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe", + "subscribe": true + } + }, + { + "version": 1, + "requestId": "send-codex-default", + "operationId": "op-live-send-codex-default", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK" + } + }, + { + "version": 1, + "requestId": "cancel-send-codex-default", + "operationId": "op-live-cancel-send-codex-default", + "command": "send", + "params": { + "conversationId": "conv-1", + "branchId": "branch-1", + "text": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + }, + { + "version": 1, + "requestId": "cancel-codex-default", + "operationId": "op-live-cancel-codex-default", + "command": "cancel_run", + "params": { + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "reason": "live packed smoke cancellation" + } + }, + { + "version": 1, + "requestId": "final-state-codex-default", + "command": "get_state", + "params": { + "projection": "full" + } + }, + { + "version": 1, + "requestId": "shutdown-codex-default", + "operationId": "op-live-shutdown-codex-default", + "command": "shutdown", + "params": { + "mode": "wait" + } + } + ], + "operation": "cli-bridge.target-smoke", + "credentialLifecycle": { + "configured": true, + "stored": true, + "removed": true, + "facility": "encrypted-headless" + }, + "initialize": { + "version": 1, + "type": "ack", + "requestId": "init-codex-default", + "revision": 4, + "command": "initialize" + }, + "conversationId": "conv-1", + "branchId": "branch-1", + "initialCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" }, - { - "id": "opencode/deepseek/deepseek-v4-pro", - "object": "model", - "backend": "opencode" + "conversation.open": { + "available": true, + "source": "application" }, - { - "id": "opencode/kimi-for-coding/k3", - "object": "model", - "backend": "opencode" + "run.runner": { + "available": true, + "source": "application" }, - { - "id": "opencode/kimi-for-coding/k3-256k", - "object": "model", - "backend": "opencode" + "run.model": { + "available": true, + "source": "application" }, - { - "id": "opencode/kimi-for-coding/kimi-for-coding", - "object": "model", - "backend": "opencode" + "run.effort": { + "available": true, + "source": "application" }, - { - "id": "opencode/kimi-for-coding/kimi-for-coding-highspeed", - "object": "model", - "backend": "opencode" + "conversation.branch": { + "available": true, + "source": "application" }, - { - "id": "opencode/zai-coding-plan/glm-4.7", - "object": "model", - "backend": "opencode" + "conversation.clone": { + "available": true, + "source": "application" }, - { - "id": "opencode/zai-coding-plan/glm-5-turbo", - "object": "model", - "backend": "opencode" + "conversation.fork": { + "available": true, + "source": "application" }, - { - "id": "opencode/zai-coding-plan/glm-5.2", - "object": "model", - "backend": "opencode" + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" }, - { - "id": "opencode/zai-coding-plan/glm-5.2-highspeed", - "object": "model", - "backend": "opencode" + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" }, - { - "id": "opencode/zai-coding-plan/glm-5.3", - "object": "model", - "backend": "opencode" + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" }, - { - "id": "opencode/zai-coding-plan/glm-5.3-flash", - "object": "model", - "backend": "opencode" + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" }, - { - "id": "opencode/zai-coding-plan/glm-5.3-highspeed", - "object": "model", - "backend": "opencode" + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" }, - { - "id": "kimi-code/kimi-for-coding", - "object": "model", - "backend": "kimi-code" + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" }, - { - "id": "kimi-code/kimi-k2.6", - "object": "model", - "backend": "kimi-code" + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, - { - "id": "pi/deepseek/deepseek-v4-flash", - "object": "model", - "backend": "pi" + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" }, - { - "id": "pi/deepseek/deepseek-v4-pro", - "object": "model", - "backend": "pi" + "export.create": { + "available": true, + "source": "application" }, - { - "id": "pi/kimi-for-coding-oauth/kimi-for-coding", - "object": "model", - "backend": "pi" + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" }, - { - "id": "pi/moonshot/kimi-k2-thinking", - "object": "model", - "backend": "pi" + "application.quit": { + "available": true, + "source": "local" }, - { - "id": "pi/moonshot/kimi-k2.5", - "object": "model", - "backend": "pi" + "help.read": { + "available": true, + "source": "local" }, - { - "id": "pi/openai-codex/gpt-5.3-codex-spark", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/openai-codex/gpt-5.4", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/openai-codex/gpt-5.4-mini", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/openai-codex/gpt-5.5", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/openai-codex/gpt-5.6-luna", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/openai-codex/gpt-5.6-sol", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/openai-codex/gpt-5.6-terra", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/claude-haiku-4-5-20251001", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/claude-opus-4-6", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/claude-sonnet-4-6", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/deepseek-v4-flash", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/deepseek-v4-pro", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/deepseek/deepseek-chat", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/fireworks/deepseek-v4-flash", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/gemini-2.5-flash-lite", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/gemini-3-pro-preview", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/glm-5.2", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/gpt-4o-mini", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/gpt-5-mini", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/gpt-5.4", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/gpt-5.4-mini", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/groq/llama-3.1-8b-instant", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/moonshotai/kimi-k2.5", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/openai/gpt-5.6-luna", - "object": "model", - "backend": "pi" - }, - { - "id": "pi/tangle-router/openrouter/auto", - "object": "model", - "backend": "pi" + "profile.select": { + "available": true, + "source": "application" }, - { - "id": "pi/zai-coding-paas/glm-5", - "object": "model", - "backend": "pi" + "connection.select": { + "available": true, + "source": "application" }, - { - "id": "pi/zai-coding-paas/glm-5-code", - "object": "model", - "backend": "pi" + "settings.open": { + "available": true, + "source": "application" }, - { - "id": "pi/zai-coding-paas/glm-5-turbo", - "object": "model", - "backend": "pi" + "activity.read": { + "available": true, + "source": "local" }, - { - "id": "pi/zai-coding-paas/glm-5.1", - "object": "model", - "backend": "pi" + "graph.read": { + "available": true, + "source": "local" }, - { - "id": "pi/zai-glm/glm-4.5", - "object": "model", - "backend": "pi" + "details.read": { + "available": true, + "source": "local" }, - { - "id": "pi/zai-glm/glm-4.5-air", - "object": "model", - "backend": "pi" + "supervisor.refresh": { + "available": true, + "source": "runtime" }, - { - "id": "pi/zai-glm/glm-4.5-airx", - "object": "model", - "backend": "pi" + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" }, - { - "id": "pi/zai-glm/glm-4.5-flash", - "object": "model", - "backend": "pi" + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" }, - { - "id": "pi/zai-glm/glm-4.5-x", - "object": "model", - "backend": "pi" + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" }, - { - "id": "pi/zai-glm/glm-4.6", - "object": "model", - "backend": "pi" + "draft.write": { + "available": true, + "source": "application" }, - { - "id": "pi/zai-glm/glm-4.7", - "object": "model", - "backend": "pi" + "run.send": { + "available": true, + "source": "provider" }, - { - "id": "pi/zai-glm/glm-4.7-flash", - "object": "model", - "backend": "pi" + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" }, - { - "id": "pi/zai-glm/glm-4.7-flashx", - "object": "model", - "backend": "pi" + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" }, - { - "id": "pi/zai-glm/glm-5", - "object": "model", - "backend": "pi" + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" }, - { - "id": "pi/zai-glm/glm-5-code", - "object": "model", - "backend": "pi" + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" }, - { - "id": "pi/zai-glm/glm-5-turbo", - "object": "model", - "backend": "pi" + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" }, - { - "id": "pi/zai-glm/glm-5.1", - "object": "model", - "backend": "pi" + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" } - ] - }, - "text": "{\"object\":\"list\",\"data\":[{\"id\":\"claude-code/sonnet\",\"object\":\"model\",\"backend\":\"claude-code\"},{\"id\":\"claude-code/opus\",\"object\":\"model\",\"backend\":\"claude-code\"},{\"id\":\"claude-code/haiku\",\"object\":\"model\",\"backend\":\"claude-code\"},{\"id\":\"opencode/deepseek/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/deepseek/deepseek-v4-flash-vision-exp\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/deepseek/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/k3\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/k3-256k\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/kimi-for-coding\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/kimi-for-coding-highspeed\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-4.7\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5-turbo\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.2\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.2-highspeed\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.3\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.3-flash\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.3-highspeed\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"kimi-code/kimi-for-coding\",\"object\":\"model\",\"backend\":\"kimi-code\"},{\"id\":\"kimi-code/kimi-k2.6\",\"object\":\"model\",\"backend\":\"kimi-code\"},{\"id\":\"pi/deepseek/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/deepseek/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/kimi-for-coding-oauth/kimi-for-coding\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/moonshot/kimi-k2-thinking\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/moonshot/kimi-k2.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.3-codex-spark\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.4\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.4-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-luna\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-sol\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-terra\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-haiku-4-5-20251001\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-opus-4-6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-sonnet-4-6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek/deepseek-chat\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/fireworks/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gemini-2.5-flash-lite\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gemini-3-pro-preview\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/glm-5.2\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-4o-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5.4\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5.4-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/groq/llama-3.1-8b-instant\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/moonshotai/kimi-k2.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/openai/gpt-5.6-luna\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/openrouter/auto\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5-code\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5-turbo\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5.1\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-air\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-airx\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-x\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7-flashx\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5-code\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5-turbo\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5.1\",\"object\":\"model\",\"backend\":\"pi\"}]}" - }, - "requiredHealth": { - "status": 200, - "ok": true, - "body": { - "status": "ok", - "cached_verdicts": true, - "oldest_probed_at": "2026-08-29T00:20:30.167Z", - "backends": [ - { - "name": "claude-code", - "state": "ready", - "version": "2.1.248 (Claude Code)", - "probed_at": "2026-08-29T00:20:30.167Z", - "cached": true - }, - { - "name": "opencode", - "state": "ready", - "version": "1.18.18", - "probed_at": "2026-08-29T00:20:30.167Z", - "cached": true - }, - { - "name": "kimi-code", - "state": "ready", - "version": "0.36.1", - "probed_at": "2026-08-29T00:20:30.167Z", - "cached": true + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "send": { + "version": 1, + "type": "ack", + "requestId": "send-codex-default", + "operationId": "op-live-send-codex-default", + "revision": 4, + "replayed": false, + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "admission": { + "version": 1, + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "turnId": "turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7", + "operationId": "op-live-send-codex-default", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:40.334Z", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK", + "profile": { + "name": "Braid live codex/default", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "default", + "reasoningEffort": "none" + }, + "harness": "codex" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "default", + "runner": "codex" }, - { - "name": "pi", - "state": "ready", - "version": "0.83.0", - "probed_at": "2026-08-29T00:20:30.167Z", - "cached": true + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": false + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true + }, + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } }, - { - "name": "passthrough", - "state": "unavailable", - "detail": "no provider keys configured", - "probed_at": "2026-08-29T00:20:44.756Z", - "cached": false - } - ], - "admission": { - "active": 6, - "live": 6, - "stale": 0, - "unbound": 0, - "oldestHeldMs": 15638273, - "reclaimed": 8, - "queued": 0, - "maxActive": 20, - "maxQueue": 48, - "reservedActive": 2, - "bulkMaxActive": 18, - "activeByClass": { - "reserved": 6, - "bulk": 0 + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe", + "model": "default", + "route": "codex/default", + "runner": "codex", + "providerRunId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "retainedControl": "exact-after-dispatch" }, - "queuedByClass": { - "reserved": 0, - "bulk": 0 - } + "admissionStatus": "admitted", + "requestDigest": "7bfdff7fd48d40cd22a04810b00655357d2a50b295f4f8d5598c4b8de8169414", + "capabilitiesDigest": "7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a", + "materializationDigest": "b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f", + "digest": "4036280ea47d6ff6f7538e8a19ebaa7711e7c0e5dc5cbd6d26a9e5888cf33372" }, - "memory": { - "heap_used_bytes": 112990056, - "heap_total_bytes": 118554624, - "heap_limit_bytes": 17381195776, - "heap_used_pct": 0.7, - "rss_bytes": 215638016, - "external_bytes": 7490048, - "runs_retained": 2310, - "run_replay_bytes": 46057 - }, - "ts": "2026-08-29T00:20:44.756Z" - }, - "text": "{\"status\":\"ok\",\"cached_verdicts\":true,\"oldest_probed_at\":\"2026-08-29T00:20:30.167Z\",\"backends\":[{\"name\":\"claude-code\",\"state\":\"ready\",\"version\":\"2.1.248 (Claude Code)\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":true},{\"name\":\"opencode\",\"state\":\"ready\",\"version\":\"1.18.18\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":true},{\"name\":\"kimi-code\",\"state\":\"ready\",\"version\":\"0.36.1\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":true},{\"name\":\"pi\",\"state\":\"ready\",\"version\":\"0.83.0\",\"probed_at\":\"2026-08-29T00:20:30.167Z\",\"cached\":true},{\"name\":\"passthrough\",\"state\":\"unavailable\",\"detail\":\"no provider keys configured\",\"probed_at\":\"2026-08-29T00:20:44.756Z\",\"cached\":false}],\"admission\":{\"active\":6,\"live\":6,\"stale\":0,\"unbound\":0,\"oldestHeldMs\":15638273,\"reclaimed\":8,\"queued\":0,\"maxActive\":20,\"maxQueue\":48,\"reservedActive\":2,\"bulkMaxActive\":18,\"activeByClass\":{\"reserved\":6,\"bulk\":0},\"queuedByClass\":{\"reserved\":0,\"bulk\":0}},\"memory\":{\"heap_used_bytes\":112990056,\"heap_total_bytes\":118554624,\"heap_limit_bytes\":17381195776,\"heap_used_pct\":0.7,\"rss_bytes\":215638016,\"external_bytes\":7490048,\"runs_retained\":2310,\"run_replay_bytes\":46057},\"ts\":\"2026-08-29T00:20:44.756Z\"}" - }, - "advertisedModels": [ - "claude-code/sonnet", - "claude-code/opus", - "claude-code/haiku", - "opencode/deepseek/deepseek-v4-flash", - "opencode/deepseek/deepseek-v4-flash-vision-exp", - "opencode/deepseek/deepseek-v4-pro", - "opencode/kimi-for-coding/k3", - "opencode/kimi-for-coding/k3-256k", - "opencode/kimi-for-coding/kimi-for-coding", - "opencode/kimi-for-coding/kimi-for-coding-highspeed", - "opencode/zai-coding-plan/glm-4.7", - "opencode/zai-coding-plan/glm-5-turbo", - "opencode/zai-coding-plan/glm-5.2", - "opencode/zai-coding-plan/glm-5.2-highspeed", - "opencode/zai-coding-plan/glm-5.3", - "opencode/zai-coding-plan/glm-5.3-flash", - "opencode/zai-coding-plan/glm-5.3-highspeed", - "kimi-code/kimi-for-coding", - "kimi-code/kimi-k2.6", - "pi/deepseek/deepseek-v4-flash", - "pi/deepseek/deepseek-v4-pro", - "pi/kimi-for-coding-oauth/kimi-for-coding", - "pi/moonshot/kimi-k2-thinking", - "pi/moonshot/kimi-k2.5", - "pi/openai-codex/gpt-5.3-codex-spark", - "pi/openai-codex/gpt-5.4", - "pi/openai-codex/gpt-5.4-mini", - "pi/openai-codex/gpt-5.5", - "pi/openai-codex/gpt-5.6-luna", - "pi/openai-codex/gpt-5.6-sol", - "pi/openai-codex/gpt-5.6-terra", - "pi/tangle-router/claude-haiku-4-5-20251001", - "pi/tangle-router/claude-opus-4-6", - "pi/tangle-router/claude-sonnet-4-6", - "pi/tangle-router/deepseek-v4-flash", - "pi/tangle-router/deepseek-v4-pro", - "pi/tangle-router/deepseek/deepseek-chat", - "pi/tangle-router/fireworks/deepseek-v4-flash", - "pi/tangle-router/gemini-2.5-flash-lite", - "pi/tangle-router/gemini-3-pro-preview", - "pi/tangle-router/glm-5.2", - "pi/tangle-router/gpt-4o-mini", - "pi/tangle-router/gpt-5-mini", - "pi/tangle-router/gpt-5.4", - "pi/tangle-router/gpt-5.4-mini", - "pi/tangle-router/groq/llama-3.1-8b-instant", - "pi/tangle-router/moonshotai/kimi-k2.5", - "pi/tangle-router/openai/gpt-5.6-luna", - "pi/tangle-router/openrouter/auto", - "pi/zai-coding-paas/glm-5", - "pi/zai-coding-paas/glm-5-code", - "pi/zai-coding-paas/glm-5-turbo", - "pi/zai-coding-paas/glm-5.1", - "pi/zai-glm/glm-4.5", - "pi/zai-glm/glm-4.5-air", - "pi/zai-glm/glm-4.5-airx", - "pi/zai-glm/glm-4.5-flash", - "pi/zai-glm/glm-4.5-x", - "pi/zai-glm/glm-4.6", - "pi/zai-glm/glm-4.7", - "pi/zai-glm/glm-4.7-flash", - "pi/zai-glm/glm-4.7-flashx", - "pi/zai-glm/glm-5", - "pi/zai-glm/glm-5-code", - "pi/zai-glm/glm-5-turbo", - "pi/zai-glm/glm-5.1" - ], - "missingTargets": [], - "selectedTargets": [ - { - "key": "claude-code-sonnet", - "label": "claude-code sonnet", - "modelId": "claude-code/sonnet" - }, - { - "key": "glm-5.2", - "label": "GLM 5.2", - "modelId": "opencode/zai-coding-plan/glm-5.2" - }, - { - "key": "kimi-code-kimi-for-coding", - "label": "kimi-code kimi-for-coding", - "modelId": "kimi-code/kimi-for-coding" + "command": "send" }, - { - "key": "pi-deepseek-deepseek-v4-flash", - "label": "pi deepseek/deepseek-v4-flash", - "modelId": "pi/deepseek/deepseek-v4-flash" - } - ] - }, - "selectedTargets": [ - { - "key": "claude-code-sonnet", - "label": "claude-code sonnet", - "modelId": "claude-code/sonnet" - }, - { - "key": "glm-5.2", - "label": "GLM 5.2", - "modelId": "opencode/zai-coding-plan/glm-5.2" - }, - { - "key": "kimi-code-kimi-for-coding", - "label": "kimi-code kimi-for-coding", - "modelId": "kimi-code/kimi-for-coding" - }, - { - "key": "pi-deepseek-deepseek-v4-flash", - "label": "pi deepseek/deepseek-v4-flash", - "modelId": "pi/deepseek/deepseek-v4-flash" - } - ], - "temp": { - "packRoot": "/tmp/braid-live-pack-eV8ASJ", - "installRoot": "/tmp/braid-live-install-bKXPm2" - }, - "build": { - "command": "pnpm", - "args": [ - "run", - "build" - ], - "code": 0, - "signal": null, - "stdout": "", - "stderr": "\u001b[2m$ node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/build-startup.mjs\u001b[22m\n", - "durationMs": 1635, - "timedOut": false, - "cleanupOk": true, - "termination": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": true, - "initialTree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } - } - }, - "packCommand": { - "command": "pnpm", - "args": [ - "pack", - "--pack-destination", - "/tmp/braid-live-pack-eV8ASJ" - ], - "code": 0, - "signal": null, - "stdout": "package: @tangle-network/braid@0.3.0\n\u001b[94mTarball Contents\u001b[39m\ndist/adapters/agent-interface/harness-runtime.d.ts\ndist/adapters/agent-interface/harness-runtime.d.ts.map\ndist/adapters/agent-interface/harness-runtime.js\ndist/adapters/agent-interface/harness-runtime.js.map\ndist/adapters/agent-interface/interaction-runtime.d.ts\ndist/adapters/agent-interface/interaction-runtime.d.ts.map\ndist/adapters/agent-interface/interaction-runtime.js\ndist/adapters/agent-interface/interaction-runtime.js.map\ndist/adapters/agent-interface/module-url.d.ts\ndist/adapters/agent-interface/module-url.d.ts.map\ndist/adapters/agent-interface/module-url.js\ndist/adapters/agent-interface/module-url.js.map\ndist/adapters/agent-interface/profile-runtime.d.ts\ndist/adapters/agent-interface/profile-runtime.d.ts.map\ndist/adapters/agent-interface/profile-runtime.js\ndist/adapters/agent-interface/profile-runtime.js.map\ndist/adapters/analysis/agent-eval-version.d.ts\ndist/adapters/analysis/agent-eval-version.d.ts.map\ndist/adapters/analysis/agent-eval-version.js\ndist/adapters/analysis/agent-eval-version.js.map\ndist/adapters/analysis/citations.d.ts\ndist/adapters/analysis/citations.d.ts.map\ndist/adapters/analysis/citations.js\ndist/adapters/analysis/citations.js.map\ndist/adapters/analysis/eval-analyst.d.ts\ndist/adapters/analysis/eval-analyst.d.ts.map\ndist/adapters/analysis/eval-analyst.js\ndist/adapters/analysis/eval-analyst.js.map\ndist/adapters/analysis/managed-analysis-runtime.d.ts\ndist/adapters/analysis/managed-analysis-runtime.d.ts.map\ndist/adapters/analysis/managed-analysis-runtime.js\ndist/adapters/analysis/managed-analysis-runtime.js.map\ndist/adapters/analysis/model-execution-scope.d.ts\ndist/adapters/analysis/model-execution-scope.d.ts.map\ndist/adapters/analysis/model-execution-scope.js\ndist/adapters/analysis/model-execution-scope.js.map\ndist/adapters/analysis/production-analysis-analyst.d.ts\ndist/adapters/analysis/production-analysis-analyst.d.ts.map\ndist/adapters/analysis/production-analysis-analyst.js\ndist/adapters/analysis/production-analysis-analyst.js.map\ndist/adapters/analysis/python-runner.d.ts\ndist/adapters/analysis/python-runner.d.ts.map\ndist/adapters/analysis/python-runner.js\ndist/adapters/analysis/python-runner.js.map\ndist/adapters/analysis/question-analyst.d.ts\ndist/adapters/analysis/question-analyst.d.ts.map\ndist/adapters/analysis/question-analyst.js\ndist/adapters/analysis/question-analyst.js.map\ndist/adapters/analysis/runtime-model-owner.d.ts\ndist/adapters/analysis/runtime-model-owner.d.ts.map\ndist/adapters/analysis/runtime-model-owner.js\ndist/adapters/analysis/runtime-model-owner.js.map\ndist/adapters/analysis/runtime-retained-model-call.d.ts\ndist/adapters/analysis/runtime-retained-model-call.d.ts.map\ndist/adapters/analysis/runtime-retained-model-call.js\ndist/adapters/analysis/runtime-retained-model-call.js.map\ndist/adapters/analysis/trace-analysis-adapter.d.ts\ndist/adapters/analysis/trace-analysis-adapter.d.ts.map\ndist/adapters/analysis/trace-analysis-adapter.js\ndist/adapters/analysis/trace-analysis-adapter.js.map\ndist/adapters/analysis/trace-event-projection.d.ts\ndist/adapters/analysis/trace-event-projection.d.ts.map\ndist/adapters/analysis/trace-event-projection.js\ndist/adapters/analysis/trace-event-projection.js.map\ndist/adapters/analysis/trace-store.d.ts\ndist/adapters/analysis/trace-store.d.ts.map\ndist/adapters/analysis/trace-store.js\ndist/adapters/analysis/trace-store.js.map\ndist/adapters/connections/aws-nitro-root-g1.d.ts\ndist/adapters/connections/aws-nitro-root-g1.d.ts.map\ndist/adapters/connections/aws-nitro-root-g1.js\ndist/adapters/connections/aws-nitro-root-g1.js.map\ndist/adapters/connections/cli-bridge-health.d.ts\ndist/adapters/connections/cli-bridge-health.d.ts.map\ndist/adapters/connections/cli-bridge-health.js\ndist/adapters/connections/cli-bridge-health.js.map\ndist/adapters/connections/cli-bridge-model-route.d.ts\ndist/adapters/connections/cli-bridge-model-route.d.ts.map\ndist/adapters/connections/cli-bridge-model-route.js\ndist/adapters/connections/cli-bridge-model-route.js.map\ndist/adapters/connections/cli-bridge-model-validation.d.ts\ndist/adapters/connections/cli-bridge-model-validation.d.ts.map\ndist/adapters/connections/cli-bridge-model-validation.js\ndist/adapters/connections/cli-bridge-model-validation.js.map\ndist/adapters/connections/nitro-confidential-attestation.d.ts\ndist/adapters/connections/nitro-confidential-attestation.d.ts.map\ndist/adapters/connections/nitro-confidential-attestation.js\ndist/adapters/connections/nitro-confidential-attestation.js.map\ndist/adapters/connections/production-connection-credentials.d.ts\ndist/adapters/connections/production-connection-credentials.d.ts.map\ndist/adapters/connections/production-connection-credentials.js\ndist/adapters/connections/production-connection-credentials.js.map\ndist/adapters/connections/production-connection-endpoints.d.ts\ndist/adapters/connections/production-connection-endpoints.d.ts.map\ndist/adapters/connections/production-connection-endpoints.js\ndist/adapters/connections/production-connection-endpoints.js.map\ndist/adapters/connections/production-connection-health.d.ts\ndist/adapters/connections/production-connection-health.d.ts.map\ndist/adapters/connections/production-connection-health.js\ndist/adapters/connections/production-connection-health.js.map\ndist/adapters/connections/production-connection-providers.d.ts\ndist/adapters/connections/production-connection-providers.d.ts.map\ndist/adapters/connections/production-connection-providers.js\ndist/adapters/connections/production-connection-providers.js.map\ndist/adapters/connections/production-connection-types.d.ts\ndist/adapters/connections/production-connection-types.d.ts.map\ndist/adapters/connections/production-connection-types.js\ndist/adapters/connections/production-connection-types.js.map\ndist/adapters/connections/production-connections.d.ts\ndist/adapters/connections/production-connections.d.ts.map\ndist/adapters/connections/production-connections.js\ndist/adapters/connections/production-connections.js.map\ndist/adapters/connections/tangle-retained-control-lookup.d.ts\ndist/adapters/connections/tangle-retained-control-lookup.d.ts.map\ndist/adapters/connections/tangle-retained-control-lookup.js\ndist/adapters/connections/tangle-retained-control-lookup.js.map\ndist/adapters/credentials/headless-key.d.ts\ndist/adapters/credentials/headless-key.d.ts.map\ndist/adapters/credentials/headless-key.js\ndist/adapters/credentials/headless-key.js.map\ndist/adapters/credentials/headless-store.d.ts\ndist/adapters/credentials/headless-store.d.ts.map\ndist/adapters/credentials/headless-store.js\ndist/adapters/credentials/headless-store.js.map\ndist/adapters/credentials/memory.d.ts\ndist/adapters/credentials/memory.d.ts.map\ndist/adapters/credentials/memory.js\ndist/adapters/credentials/memory.js.map\ndist/adapters/credentials/os.d.ts\ndist/adapters/credentials/os.d.ts.map\ndist/adapters/credentials/os.js\ndist/adapters/credentials/os.js.map\ndist/adapters/persistence/posix-at.d.ts\ndist/adapters/persistence/posix-at.d.ts.map\ndist/adapters/persistence/posix-at.js\ndist/adapters/persistence/posix-at.js.map\ndist/adapters/persistence/safe-file-descriptor.d.ts\ndist/adapters/persistence/safe-file-descriptor.d.ts.map\ndist/adapters/persistence/safe-file-descriptor.js\ndist/adapters/persistence/safe-file-descriptor.js.map\ndist/adapters/persistence/safe-file-io.d.ts\ndist/adapters/persistence/safe-file-io.d.ts.map\ndist/adapters/persistence/safe-file-io.js\ndist/adapters/persistence/safe-file-io.js.map\ndist/adapters/persistence/safe-file.d.ts\ndist/adapters/persistence/safe-file.d.ts.map\ndist/adapters/persistence/safe-file.js\ndist/adapters/persistence/safe-file.js.map\ndist/adapters/runtime/agent-runtime-execution.d.ts\ndist/adapters/runtime/agent-runtime-execution.d.ts.map\ndist/adapters/runtime/agent-runtime-execution.js\ndist/adapters/runtime/agent-runtime-execution.js.map\ndist/adapters/runtime/agent-runtime-version.d.ts\ndist/adapters/runtime/agent-runtime-version.d.ts.map\ndist/adapters/runtime/agent-runtime-version.js\ndist/adapters/runtime/agent-runtime-version.js.map\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-execution.js\ndist/adapters/runtime/cli-bridge-retained-execution.js.map\ndist/adapters/runtime/cli-bridge-retained-run.d.ts\ndist/adapters/runtime/cli-bridge-retained-run.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-run.js\ndist/adapters/runtime/cli-bridge-retained-run.js.map\ndist/adapters/runtime/execution-observation-source.d.ts\ndist/adapters/runtime/execution-observation-source.d.ts.map\ndist/adapters/runtime/execution-observation-source.js\ndist/adapters/runtime/execution-observation-source.js.map\ndist/adapters/runtime/lazy-execution.d.ts\ndist/adapters/runtime/lazy-execution.d.ts.map\ndist/adapters/runtime/lazy-execution.js\ndist/adapters/runtime/lazy-execution.js.map\ndist/adapters/runtime/mode-routing-execution.d.ts\ndist/adapters/runtime/mode-routing-execution.d.ts.map\ndist/adapters/runtime/mode-routing-execution.js\ndist/adapters/runtime/mode-routing-execution.js.map\ndist/adapters/runtime/native-interactive-run-broker.d.ts\ndist/adapters/runtime/native-interactive-run-broker.d.ts.map\ndist/adapters/runtime/native-interactive-run-broker.js\ndist/adapters/runtime/native-interactive-run-broker.js.map\ndist/adapters/runtime/prepared-execution.d.ts\ndist/adapters/runtime/prepared-execution.d.ts.map\ndist/adapters/runtime/prepared-execution.js\ndist/adapters/runtime/prepared-execution.js.map\ndist/adapters/runtime/production-backend-common.d.ts\ndist/adapters/runtime/production-backend-common.d.ts.map\ndist/adapters/runtime/production-backend-common.js\ndist/adapters/runtime/production-backend-common.js.map\ndist/adapters/runtime/production-backend-resolver.d.ts\ndist/adapters/runtime/production-backend-resolver.d.ts.map\ndist/adapters/runtime/production-backend-resolver.js\ndist/adapters/runtime/production-backend-resolver.js.map\ndist/adapters/runtime/production-cli-bridge-backend.d.ts\ndist/adapters/runtime/production-cli-bridge-backend.d.ts.map\ndist/adapters/runtime/production-cli-bridge-backend.js\ndist/adapters/runtime/production-cli-bridge-backend.js.map\ndist/adapters/runtime/production-tangle-inference-backend.d.ts\ndist/adapters/runtime/production-tangle-inference-backend.d.ts.map\ndist/adapters/runtime/production-tangle-inference-backend.js\ndist/adapters/runtime/production-tangle-inference-backend.js.map\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts.map\ndist/adapters/runtime/production-tangle-sandbox-backend.js\ndist/adapters/runtime/production-tangle-sandbox-backend.js.map\ndist/adapters/runtime/retained-execution-contract.d.ts\ndist/adapters/runtime/retained-execution-contract.d.ts.map\ndist/adapters/runtime/retained-execution-contract.js\ndist/adapters/runtime/retained-execution-contract.js.map\ndist/adapters/runtime/retained-execution-projection.d.ts\ndist/adapters/runtime/retained-execution-projection.d.ts.map\ndist/adapters/runtime/retained-execution-projection.js\ndist/adapters/runtime/retained-execution-projection.js.map\ndist/adapters/runtime/retained-execution-state.d.ts\ndist/adapters/runtime/retained-execution-state.d.ts.map\ndist/adapters/runtime/retained-execution-state.js\ndist/adapters/runtime/retained-execution-state.js.map\ndist/adapters/runtime/retained-execution-stream.d.ts\ndist/adapters/runtime/retained-execution-stream.d.ts.map\ndist/adapters/runtime/retained-execution-stream.js\ndist/adapters/runtime/retained-execution-stream.js.map\ndist/adapters/runtime/retained-execution.d.ts\ndist/adapters/runtime/retained-execution.d.ts.map\ndist/adapters/runtime/retained-execution.js\ndist/adapters/runtime/retained-execution.js.map\ndist/adapters/runtime/retained-native-continuation.d.ts\ndist/adapters/runtime/retained-native-continuation.d.ts.map\ndist/adapters/runtime/retained-native-continuation.js\ndist/adapters/runtime/retained-native-continuation.js.map\ndist/adapters/runtime/sandbox-account-observation.d.ts\ndist/adapters/runtime/sandbox-account-observation.d.ts.map\ndist/adapters/runtime/sandbox-account-observation.js\ndist/adapters/runtime/sandbox-account-observation.js.map\ndist/adapters/runtime/sandbox-instance-observation.d.ts\ndist/adapters/runtime/sandbox-instance-observation.d.ts.map\ndist/adapters/runtime/sandbox-instance-observation.js\ndist/adapters/runtime/sandbox-instance-observation.js.map\ndist/adapters/runtime/sandbox-observation-types.d.ts\ndist/adapters/runtime/sandbox-observation-types.d.ts.map\ndist/adapters/runtime/sandbox-observation-types.js\ndist/adapters/runtime/sandbox-observation-types.js.map\ndist/adapters/runtime/sandbox-observation.d.ts\ndist/adapters/runtime/sandbox-observation.d.ts.map\ndist/adapters/runtime/sandbox-observation.js\ndist/adapters/runtime/sandbox-observation.js.map\ndist/adapters/runtime/supervisor-control.d.ts\ndist/adapters/runtime/supervisor-control.d.ts.map\ndist/adapters/runtime/supervisor-control.js\ndist/adapters/runtime/supervisor-control.js.map\ndist/adapters/runtime/supervisor-watch.d.ts\ndist/adapters/runtime/supervisor-watch.d.ts.map\ndist/adapters/runtime/supervisor-watch.js\ndist/adapters/runtime/supervisor-watch.js.map\ndist/adapters/runtime/tangle-retained-execution.d.ts\ndist/adapters/runtime/tangle-retained-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-execution.js\ndist/adapters/runtime/tangle-retained-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-contract.js\ndist/adapters/runtime/tangle-retained-interactive-contract.js.map\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-execution.js\ndist/adapters/runtime/tangle-retained-interactive-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-projection.js\ndist/adapters/runtime/tangle-retained-interactive-projection.js.map\ndist/adapters/runtime/tangle-retained-run.d.ts\ndist/adapters/runtime/tangle-retained-run.d.ts.map\ndist/adapters/runtime/tangle-retained-run.js\ndist/adapters/runtime/tangle-retained-run.js.map\ndist/adapters/runtime/tangle-sandbox-retention.d.ts\ndist/adapters/runtime/tangle-sandbox-retention.d.ts.map\ndist/adapters/runtime/tangle-sandbox-retention.js\ndist/adapters/runtime/tangle-sandbox-retention.js.map\ndist/adapters/runtime/unavailable-execution.d.ts\ndist/adapters/runtime/unavailable-execution.d.ts.map\ndist/adapters/runtime/unavailable-execution.js\ndist/adapters/runtime/unavailable-execution.js.map\ndist/adapters/storage/memory-base.d.ts\ndist/adapters/storage/memory-base.d.ts.map\ndist/adapters/storage/memory-base.js\ndist/adapters/storage/memory-base.js.map\ndist/adapters/storage/memory-effects.d.ts\ndist/adapters/storage/memory-effects.d.ts.map\ndist/adapters/storage/memory-effects.js\ndist/adapters/storage/memory-effects.js.map\ndist/adapters/storage/memory-journal.d.ts\ndist/adapters/storage/memory-journal.d.ts.map\ndist/adapters/storage/memory-journal.js\ndist/adapters/storage/memory-journal.js.map\ndist/adapters/storage/memory-maintenance.d.ts\ndist/adapters/storage/memory-maintenance.d.ts.map\ndist/adapters/storage/memory-maintenance.js\ndist/adapters/storage/memory-maintenance.js.map\ndist/adapters/storage/memory-operations.d.ts\ndist/adapters/storage/memory-operations.d.ts.map\ndist/adapters/storage/memory-operations.js\ndist/adapters/storage/memory-operations.js.map\ndist/adapters/storage/memory-retention.d.ts\ndist/adapters/storage/memory-retention.d.ts.map\ndist/adapters/storage/memory-retention.js\ndist/adapters/storage/memory-retention.js.map\ndist/adapters/storage/memory.d.ts\ndist/adapters/storage/memory.d.ts.map\ndist/adapters/storage/memory.js\ndist/adapters/storage/memory.js.map\ndist/adapters/storage/sqlite-base.d.ts\ndist/adapters/storage/sqlite-base.d.ts.map\ndist/adapters/storage/sqlite-base.js\ndist/adapters/storage/sqlite-base.js.map\ndist/adapters/storage/sqlite-bound-open.d.ts\ndist/adapters/storage/sqlite-bound-open.d.ts.map\ndist/adapters/storage/sqlite-bound-open.js\ndist/adapters/storage/sqlite-bound-open.js.map\ndist/adapters/storage/sqlite-content.d.ts\ndist/adapters/storage/sqlite-content.d.ts.map\ndist/adapters/storage/sqlite-content.js\ndist/adapters/storage/sqlite-content.js.map\ndist/adapters/storage/sqlite-crypto.d.ts\ndist/adapters/storage/sqlite-crypto.d.ts.map\ndist/adapters/storage/sqlite-crypto.js\ndist/adapters/storage/sqlite-crypto.js.map\ndist/adapters/storage/sqlite-driver.d.ts\ndist/adapters/storage/sqlite-driver.d.ts.map\ndist/adapters/storage/sqlite-driver.js\ndist/adapters/storage/sqlite-driver.js.map\ndist/adapters/storage/sqlite-effects.d.ts\ndist/adapters/storage/sqlite-effects.d.ts.map\ndist/adapters/storage/sqlite-effects.js\ndist/adapters/storage/sqlite-effects.js.map\ndist/adapters/storage/sqlite-errors.d.ts\ndist/adapters/storage/sqlite-errors.d.ts.map\ndist/adapters/storage/sqlite-errors.js\ndist/adapters/storage/sqlite-errors.js.map\ndist/adapters/storage/sqlite-initialization.d.ts\ndist/adapters/storage/sqlite-initialization.d.ts.map\ndist/adapters/storage/sqlite-initialization.js\ndist/adapters/storage/sqlite-initialization.js.map\ndist/adapters/storage/sqlite-journal.d.ts\ndist/adapters/storage/sqlite-journal.d.ts.map\ndist/adapters/storage/sqlite-journal.js\ndist/adapters/storage/sqlite-journal.js.map\ndist/adapters/storage/sqlite-lifecycle.d.ts\ndist/adapters/storage/sqlite-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-lifecycle.js\ndist/adapters/storage/sqlite-lifecycle.js.map\ndist/adapters/storage/sqlite-maintenance.d.ts\ndist/adapters/storage/sqlite-maintenance.d.ts.map\ndist/adapters/storage/sqlite-maintenance.js\ndist/adapters/storage/sqlite-maintenance.js.map\ndist/adapters/storage/sqlite-operations.d.ts\ndist/adapters/storage/sqlite-operations.d.ts.map\ndist/adapters/storage/sqlite-operations.js\ndist/adapters/storage/sqlite-operations.js.map\ndist/adapters/storage/sqlite-paths.d.ts\ndist/adapters/storage/sqlite-paths.d.ts.map\ndist/adapters/storage/sqlite-paths.js\ndist/adapters/storage/sqlite-paths.js.map\ndist/adapters/storage/sqlite-projection.d.ts\ndist/adapters/storage/sqlite-projection.d.ts.map\ndist/adapters/storage/sqlite-projection.js\ndist/adapters/storage/sqlite-projection.js.map\ndist/adapters/storage/sqlite-queue.d.ts\ndist/adapters/storage/sqlite-queue.d.ts.map\ndist/adapters/storage/sqlite-queue.js\ndist/adapters/storage/sqlite-queue.js.map\ndist/adapters/storage/sqlite-recovery.d.ts\ndist/adapters/storage/sqlite-recovery.d.ts.map\ndist/adapters/storage/sqlite-recovery.js\ndist/adapters/storage/sqlite-recovery.js.map\ndist/adapters/storage/sqlite-redaction.d.ts\ndist/adapters/storage/sqlite-redaction.d.ts.map\ndist/adapters/storage/sqlite-redaction.js\ndist/adapters/storage/sqlite-redaction.js.map\ndist/adapters/storage/sqlite-rows.d.ts\ndist/adapters/storage/sqlite-rows.d.ts.map\ndist/adapters/storage/sqlite-rows.js\ndist/adapters/storage/sqlite-rows.js.map\ndist/adapters/storage/sqlite-schema.d.ts\ndist/adapters/storage/sqlite-schema.d.ts.map\ndist/adapters/storage/sqlite-schema.js\ndist/adapters/storage/sqlite-schema.js.map\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-codec.js\ndist/adapters/storage/sqlite-state-snapshot-codec.js.map\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-keys.js\ndist/adapters/storage/sqlite-state-snapshot-keys.js.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js.map\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-read.js\ndist/adapters/storage/sqlite-state-snapshot-read.js.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.js\ndist/adapters/storage/sqlite-state-snapshot-transaction.js.map\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-types.js\ndist/adapters/storage/sqlite-state-snapshot-types.js.map\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-write.js\ndist/adapters/storage/sqlite-state-snapshot-write.js.map\ndist/adapters/storage/sqlite-state-snapshots.d.ts\ndist/adapters/storage/sqlite-state-snapshots.d.ts.map\ndist/adapters/storage/sqlite-state-snapshots.js\ndist/adapters/storage/sqlite-state-snapshots.js.map\ndist/adapters/storage/sqlite-types.d.ts\ndist/adapters/storage/sqlite-types.d.ts.map\ndist/adapters/storage/sqlite-types.js\ndist/adapters/storage/sqlite-types.js.map\ndist/adapters/storage/sqlite.d.ts\ndist/adapters/storage/sqlite.d.ts.map\ndist/adapters/storage/sqlite.js\ndist/adapters/storage/sqlite.js.map\ndist/adapters/storage/storage-validation.d.ts\ndist/adapters/storage/storage-validation.d.ts.map\ndist/adapters/storage/storage-validation.js\ndist/adapters/storage/storage-validation.js.map\ndist/adapters/tui/alternate-screen-terminal.d.ts\ndist/adapters/tui/alternate-screen-terminal.d.ts.map\ndist/adapters/tui/alternate-screen-terminal.js\ndist/adapters/tui/alternate-screen-terminal.js.map\ndist/adapters/tui/application-ui-controller.d.ts\ndist/adapters/tui/application-ui-controller.d.ts.map\ndist/adapters/tui/application-ui-controller.js\ndist/adapters/tui/application-ui-controller.js.map\ndist/adapters/tui/native-terminal-transport.d.ts\ndist/adapters/tui/native-terminal-transport.d.ts.map\ndist/adapters/tui/native-terminal-transport.js\ndist/adapters/tui/native-terminal-transport.js.map\ndist/adapters/tui/profile-connection-dispatch.d.ts\ndist/adapters/tui/profile-connection-dispatch.d.ts.map\ndist/adapters/tui/profile-connection-dispatch.js\ndist/adapters/tui/profile-connection-dispatch.js.map\ndist/adapters/tui/ui-automation-command.d.ts\ndist/adapters/tui/ui-automation-command.d.ts.map\ndist/adapters/tui/ui-automation-command.js\ndist/adapters/tui/ui-automation-command.js.map\ndist/adapters/tui/ui-automation-dispatch.d.ts\ndist/adapters/tui/ui-automation-dispatch.d.ts.map\ndist/adapters/tui/ui-automation-dispatch.js\ndist/adapters/tui/ui-automation-dispatch.js.map\ndist/adapters/tui/ui-capabilities.d.ts\ndist/adapters/tui/ui-capabilities.d.ts.map\ndist/adapters/tui/ui-capabilities.js\ndist/adapters/tui/ui-capabilities.js.map\ndist/adapters/tui/ui-command-dispatch.d.ts\ndist/adapters/tui/ui-command-dispatch.d.ts.map\ndist/adapters/tui/ui-command-dispatch.js\ndist/adapters/tui/ui-command-dispatch.js.map\ndist/adapters/tui/ui-conversation-dispatch.d.ts\ndist/adapters/tui/ui-conversation-dispatch.d.ts.map\ndist/adapters/tui/ui-conversation-dispatch.js\ndist/adapters/tui/ui-conversation-dispatch.js.map\ndist/adapters/tui/ui-core-dispatch.d.ts\ndist/adapters/tui/ui-core-dispatch.d.ts.map\ndist/adapters/tui/ui-core-dispatch.js\ndist/adapters/tui/ui-core-dispatch.js.map\ndist/adapters/tui/ui-dispatch-context.d.ts\ndist/adapters/tui/ui-dispatch-context.d.ts.map\ndist/adapters/tui/ui-dispatch-context.js\ndist/adapters/tui/ui-dispatch-context.js.map\ndist/adapters/tui/ui-dispatch-error.d.ts\ndist/adapters/tui/ui-dispatch-error.d.ts.map\ndist/adapters/tui/ui-dispatch-error.js\ndist/adapters/tui/ui-dispatch-error.js.map\ndist/adapters/tui/ui-dispatch.d.ts\ndist/adapters/tui/ui-dispatch.d.ts.map\ndist/adapters/tui/ui-dispatch.js\ndist/adapters/tui/ui-dispatch.js.map\ndist/adapters/tui/ui-entity-details.d.ts\ndist/adapters/tui/ui-entity-details.d.ts.map\ndist/adapters/tui/ui-entity-details.js\ndist/adapters/tui/ui-entity-details.js.map\ndist/adapters/tui/ui-fixtures.d.ts\ndist/adapters/tui/ui-fixtures.d.ts.map\ndist/adapters/tui/ui-fixtures.js\ndist/adapters/tui/ui-fixtures.js.map\ndist/adapters/tui/ui-headless-dispatch.d.ts\ndist/adapters/tui/ui-headless-dispatch.d.ts.map\ndist/adapters/tui/ui-headless-dispatch.js\ndist/adapters/tui/ui-headless-dispatch.js.map\ndist/adapters/tui/ui-intelligence-dispatch.d.ts\ndist/adapters/tui/ui-intelligence-dispatch.d.ts.map\ndist/adapters/tui/ui-intelligence-dispatch.js\ndist/adapters/tui/ui-intelligence-dispatch.js.map\ndist/adapters/tui/ui-intelligence-fixtures.d.ts\ndist/adapters/tui/ui-intelligence-fixtures.d.ts.map\ndist/adapters/tui/ui-intelligence-fixtures.js\ndist/adapters/tui/ui-intelligence-fixtures.js.map\ndist/adapters/tui/ui-intelligence-result-view.d.ts\ndist/adapters/tui/ui-intelligence-result-view.d.ts.map\ndist/adapters/tui/ui-intelligence-result-view.js\ndist/adapters/tui/ui-intelligence-result-view.js.map\ndist/adapters/tui/ui-interaction-receipt.d.ts\ndist/adapters/tui/ui-interaction-receipt.d.ts.map\ndist/adapters/tui/ui-interaction-receipt.js\ndist/adapters/tui/ui-interaction-receipt.js.map\ndist/adapters/tui/ui-projection.d.ts\ndist/adapters/tui/ui-projection.d.ts.map\ndist/adapters/tui/ui-projection.js\ndist/adapters/tui/ui-projection.js.map\ndist/adapters/tui/ui-semantic-state.d.ts\ndist/adapters/tui/ui-semantic-state.d.ts.map\ndist/adapters/tui/ui-semantic-state.js\ndist/adapters/tui/ui-semantic-state.js.map\ndist/adapters/tui/ui-subscriber-delivery.d.ts\ndist/adapters/tui/ui-subscriber-delivery.d.ts.map\ndist/adapters/tui/ui-subscriber-delivery.js\ndist/adapters/tui/ui-subscriber-delivery.js.map\ndist/adapters/tui/ui-view-model.d.ts\ndist/adapters/tui/ui-view-model.d.ts.map\ndist/adapters/tui/ui-view-model.js\ndist/adapters/tui/ui-view-model.js.map\ndist/app/action-host.d.ts\ndist/app/action-host.d.ts.map\ndist/app/action-host.js\ndist/app/action-host.js.map\ndist/app/action-serialization.d.ts\ndist/app/action-serialization.d.ts.map\ndist/app/action-serialization.js\ndist/app/action-serialization.js.map\ndist/app/analysis-comparison-contracts.d.ts\ndist/app/analysis-comparison-contracts.d.ts.map\ndist/app/analysis-comparison-contracts.js\ndist/app/analysis-comparison-contracts.js.map\ndist/app/analysis-comparison-evidence.d.ts\ndist/app/analysis-comparison-evidence.d.ts.map\ndist/app/analysis-comparison-evidence.js\ndist/app/analysis-comparison-evidence.js.map\ndist/app/analysis-comparison-facts.d.ts\ndist/app/analysis-comparison-facts.d.ts.map\ndist/app/analysis-comparison-facts.js\ndist/app/analysis-comparison-facts.js.map\ndist/app/analysis-comparison-graph.d.ts\ndist/app/analysis-comparison-graph.d.ts.map\ndist/app/analysis-comparison-graph.js\ndist/app/analysis-comparison-graph.js.map\ndist/app/analysis-comparison-lifecycle.d.ts\ndist/app/analysis-comparison-lifecycle.d.ts.map\ndist/app/analysis-comparison-lifecycle.js\ndist/app/analysis-comparison-lifecycle.js.map\ndist/app/analysis-comparison-record.d.ts\ndist/app/analysis-comparison-record.d.ts.map\ndist/app/analysis-comparison-record.js\ndist/app/analysis-comparison-record.js.map\ndist/app/analysis-comparison-request.d.ts\ndist/app/analysis-comparison-request.d.ts.map\ndist/app/analysis-comparison-request.js\ndist/app/analysis-comparison-request.js.map\ndist/app/analysis-comparison.d.ts\ndist/app/analysis-comparison.d.ts.map\ndist/app/analysis-comparison.js\ndist/app/analysis-comparison.js.map\ndist/app/analysis-execution-session.d.ts\ndist/app/analysis-execution-session.d.ts.map\ndist/app/analysis-execution-session.js\ndist/app/analysis-execution-session.js.map\ndist/app/analysis-execution-target.d.ts\ndist/app/analysis-execution-target.d.ts.map\ndist/app/analysis-execution-target.js\ndist/app/analysis-execution-target.js.map\ndist/app/analysis-graph-projector.d.ts\ndist/app/analysis-graph-projector.d.ts.map\ndist/app/analysis-graph-projector.js\ndist/app/analysis-graph-projector.js.map\ndist/app/analysis-lifecycle.d.ts\ndist/app/analysis-lifecycle.d.ts.map\ndist/app/analysis-lifecycle.js\ndist/app/analysis-lifecycle.js.map\ndist/app/analysis-model-call-records.d.ts\ndist/app/analysis-model-call-records.d.ts.map\ndist/app/analysis-model-call-records.js\ndist/app/analysis-model-call-records.js.map\ndist/app/analysis-operation.d.ts\ndist/app/analysis-operation.d.ts.map\ndist/app/analysis-operation.js\ndist/app/analysis-operation.js.map\ndist/app/analysis-persistence.d.ts\ndist/app/analysis-persistence.d.ts.map\ndist/app/analysis-persistence.js\ndist/app/analysis-persistence.js.map\ndist/app/analysis-promotion.d.ts\ndist/app/analysis-promotion.d.ts.map\ndist/app/analysis-promotion.js\ndist/app/analysis-promotion.js.map\ndist/app/analysis-request.d.ts\ndist/app/analysis-request.d.ts.map\ndist/app/analysis-request.js\ndist/app/analysis-request.js.map\ndist/app/analysis-result-mapper.d.ts\ndist/app/analysis-result-mapper.d.ts.map\ndist/app/analysis-result-mapper.js\ndist/app/analysis-result-mapper.js.map\ndist/app/analysis-retained-admission.d.ts\ndist/app/analysis-retained-admission.d.ts.map\ndist/app/analysis-retained-admission.js\ndist/app/analysis-retained-admission.js.map\ndist/app/analysis-service.d.ts\ndist/app/analysis-service.d.ts.map\ndist/app/analysis-service.js\ndist/app/analysis-service.js.map\ndist/app/analysis-source.d.ts\ndist/app/analysis-source.d.ts.map\ndist/app/analysis-source.js\ndist/app/analysis-source.js.map\ndist/app/analysis-types.d.ts\ndist/app/analysis-types.d.ts.map\ndist/app/analysis-types.js\ndist/app/analysis-types.js.map\ndist/app/application-guards.d.ts\ndist/app/application-guards.d.ts.map\ndist/app/application-guards.js\ndist/app/application-guards.js.map\ndist/app/application-interaction-actions.d.ts\ndist/app/application-interaction-actions.d.ts.map\ndist/app/application-interaction-actions.js\ndist/app/application-interaction-actions.js.map\ndist/app/application-lifecycle.d.ts\ndist/app/application-lifecycle.d.ts.map\ndist/app/application-lifecycle.js\ndist/app/application-lifecycle.js.map\ndist/app/application-options.d.ts\ndist/app/application-options.d.ts.map\ndist/app/application-options.js\ndist/app/application-options.js.map\ndist/app/application-port-builder.d.ts\ndist/app/application-port-builder.d.ts.map\ndist/app/application-port-builder.js\ndist/app/application-port-builder.js.map\ndist/app/application-port-runtime.d.ts\ndist/app/application-port-runtime.d.ts.map\ndist/app/application-port-runtime.js\ndist/app/application-port-runtime.js.map\ndist/app/application-ports.d.ts\ndist/app/application-ports.d.ts.map\ndist/app/application-ports.js\ndist/app/application-ports.js.map\ndist/app/application-runtime-wiring.d.ts\ndist/app/application-runtime-wiring.d.ts.map\ndist/app/application-runtime-wiring.js\ndist/app/application-runtime-wiring.js.map\ndist/app/application-support.d.ts\ndist/app/application-support.d.ts.map\ndist/app/application-support.js\ndist/app/application-support.js.map\ndist/app/application-transition.d.ts\ndist/app/application-transition.d.ts.map\ndist/app/application-transition.js\ndist/app/application-transition.js.map\ndist/app/application-types.d.ts\ndist/app/application-types.d.ts.map\ndist/app/application-types.js\ndist/app/application-types.js.map\ndist/app/application.d.ts\ndist/app/application.d.ts.map\ndist/app/application.js\ndist/app/application.js.map\ndist/app/automation-actions.d.ts\ndist/app/automation-actions.d.ts.map\ndist/app/automation-actions.js\ndist/app/automation-actions.js.map\ndist/app/automation-matching.d.ts\ndist/app/automation-matching.d.ts.map\ndist/app/automation-matching.js\ndist/app/automation-matching.js.map\ndist/app/automation-rule-audit.d.ts\ndist/app/automation-rule-audit.d.ts.map\ndist/app/automation-rule-audit.js\ndist/app/automation-rule-audit.js.map\ndist/app/automation-rule-persistence.d.ts\ndist/app/automation-rule-persistence.d.ts.map\ndist/app/automation-rule-persistence.js\ndist/app/automation-rule-persistence.js.map\ndist/app/automation-rule-store.d.ts\ndist/app/automation-rule-store.d.ts.map\ndist/app/automation-rule-store.js\ndist/app/automation-rule-store.js.map\ndist/app/automation-rule-types.d.ts\ndist/app/automation-rule-types.d.ts.map\ndist/app/automation-rule-types.js\ndist/app/automation-rule-types.js.map\ndist/app/automation-rule-update.d.ts\ndist/app/automation-rule-update.d.ts.map\ndist/app/automation-rule-update.js\ndist/app/automation-rule-update.js.map\ndist/app/automation-rule-validation.d.ts\ndist/app/automation-rule-validation.d.ts.map\ndist/app/automation-rule-validation.js\ndist/app/automation-rule-validation.js.map\ndist/app/automation-rules.d.ts\ndist/app/automation-rules.d.ts.map\ndist/app/automation-rules.js\ndist/app/automation-rules.js.map\ndist/app/composition-options.d.ts\ndist/app/composition-options.d.ts.map\ndist/app/composition-options.js\ndist/app/composition-options.js.map\ndist/app/composition.d.ts\ndist/app/composition.d.ts.map\ndist/app/composition.js\ndist/app/composition.js.map\ndist/app/configuration-action-transition.d.ts\ndist/app/configuration-action-transition.d.ts.map\ndist/app/configuration-action-transition.js\ndist/app/configuration-action-transition.js.map\ndist/app/configuration-session.d.ts\ndist/app/configuration-session.d.ts.map\ndist/app/configuration-session.js\ndist/app/configuration-session.js.map\ndist/app/connection-action-support.d.ts\ndist/app/connection-action-support.d.ts.map\ndist/app/connection-action-support.js\ndist/app/connection-action-support.js.map\ndist/app/connection-action-types.d.ts\ndist/app/connection-action-types.d.ts.map\ndist/app/connection-action-types.js\ndist/app/connection-action-types.js.map\ndist/app/connection-actions.d.ts\ndist/app/connection-actions.d.ts.map\ndist/app/connection-actions.js\ndist/app/connection-actions.js.map\ndist/app/connection-errors.d.ts\ndist/app/connection-errors.d.ts.map\ndist/app/connection-errors.js\ndist/app/connection-errors.js.map\ndist/app/connection-probe.d.ts\ndist/app/connection-probe.d.ts.map\ndist/app/connection-probe.js\ndist/app/connection-probe.js.map\ndist/app/connection-record-factory.d.ts\ndist/app/connection-record-factory.d.ts.map\ndist/app/connection-record-factory.js\ndist/app/connection-record-factory.js.map\ndist/app/connections.d.ts\ndist/app/connections.d.ts.map\ndist/app/connections.js\ndist/app/connections.js.map\ndist/app/control-effects.d.ts\ndist/app/control-effects.d.ts.map\ndist/app/control-effects.js\ndist/app/control-effects.js.map\ndist/app/conversation-branch-effects.d.ts\ndist/app/conversation-branch-effects.d.ts.map\ndist/app/conversation-branch-effects.js\ndist/app/conversation-branch-effects.js.map\ndist/app/conversation-branches.d.ts\ndist/app/conversation-branches.d.ts.map\ndist/app/conversation-branches.js\ndist/app/conversation-branches.js.map\ndist/app/conversation-composition.d.ts\ndist/app/conversation-composition.d.ts.map\ndist/app/conversation-composition.js\ndist/app/conversation-composition.js.map\ndist/app/conversation-context.d.ts\ndist/app/conversation-context.d.ts.map\ndist/app/conversation-context.js\ndist/app/conversation-context.js.map\ndist/app/conversation-drafts.d.ts\ndist/app/conversation-drafts.d.ts.map\ndist/app/conversation-drafts.js\ndist/app/conversation-drafts.js.map\ndist/app/conversation-exports.d.ts\ndist/app/conversation-exports.d.ts.map\ndist/app/conversation-exports.js\ndist/app/conversation-exports.js.map\ndist/app/conversation-import-analyses.d.ts\ndist/app/conversation-import-analyses.d.ts.map\ndist/app/conversation-import-analyses.js\ndist/app/conversation-import-analyses.js.map\ndist/app/conversation-import-builder.d.ts\ndist/app/conversation-import-builder.d.ts.map\ndist/app/conversation-import-builder.js\ndist/app/conversation-import-builder.js.map\ndist/app/conversation-import-document.d.ts\ndist/app/conversation-import-document.d.ts.map\ndist/app/conversation-import-document.js\ndist/app/conversation-import-document.js.map\ndist/app/conversation-import-graph.d.ts\ndist/app/conversation-import-graph.d.ts.map\ndist/app/conversation-import-graph.js\ndist/app/conversation-import-graph.js.map\ndist/app/conversation-import-messages.d.ts\ndist/app/conversation-import-messages.d.ts.map\ndist/app/conversation-import-messages.js\ndist/app/conversation-import-messages.js.map\ndist/app/conversation-import-runs.d.ts\ndist/app/conversation-import-runs.d.ts.map\ndist/app/conversation-import-runs.js\ndist/app/conversation-import-runs.js.map\ndist/app/conversation-import-validation.d.ts\ndist/app/conversation-import-validation.d.ts.map\ndist/app/conversation-import-validation.js\ndist/app/conversation-import-validation.js.map\ndist/app/conversation-import-values.d.ts\ndist/app/conversation-import-values.d.ts.map\ndist/app/conversation-import-values.js\ndist/app/conversation-import-values.js.map\ndist/app/conversation-imports.d.ts\ndist/app/conversation-imports.d.ts.map\ndist/app/conversation-imports.js\ndist/app/conversation-imports.js.map\ndist/app/conversation-lifecycle.d.ts\ndist/app/conversation-lifecycle.d.ts.map\ndist/app/conversation-lifecycle.js\ndist/app/conversation-lifecycle.js.map\ndist/app/conversation-operation-coordinator.d.ts\ndist/app/conversation-operation-coordinator.d.ts.map\ndist/app/conversation-operation-coordinator.js\ndist/app/conversation-operation-coordinator.js.map\ndist/app/conversation-records.d.ts\ndist/app/conversation-records.d.ts.map\ndist/app/conversation-records.js\ndist/app/conversation-records.js.map\ndist/app/conversation-support.d.ts\ndist/app/conversation-support.d.ts.map\ndist/app/conversation-support.js\ndist/app/conversation-support.js.map\ndist/app/conversation-types.d.ts\ndist/app/conversation-types.d.ts.map\ndist/app/conversation-types.js\ndist/app/conversation-types.js.map\ndist/app/conversation-visibility.d.ts\ndist/app/conversation-visibility.d.ts.map\ndist/app/conversation-visibility.js\ndist/app/conversation-visibility.js.map\ndist/app/conversations.d.ts\ndist/app/conversations.d.ts.map\ndist/app/conversations.js\ndist/app/conversations.js.map\ndist/app/default-profiles.d.ts\ndist/app/default-profiles.d.ts.map\ndist/app/default-profiles.js\ndist/app/default-profiles.js.map\ndist/app/durable-send.d.ts\ndist/app/durable-send.d.ts.map\ndist/app/durable-send.js\ndist/app/durable-send.js.map\ndist/app/effect-coordinator.d.ts\ndist/app/effect-coordinator.d.ts.map\ndist/app/effect-coordinator.js\ndist/app/effect-coordinator.js.map\ndist/app/effect-projection.d.ts\ndist/app/effect-projection.d.ts.map\ndist/app/effect-projection.js\ndist/app/effect-projection.js.map\ndist/app/effective-run-configuration.d.ts\ndist/app/effective-run-configuration.d.ts.map\ndist/app/effective-run-configuration.js\ndist/app/effective-run-configuration.js.map\ndist/app/errors.d.ts\ndist/app/errors.d.ts.map\ndist/app/errors.js\ndist/app/errors.js.map\ndist/app/fail-closed-journal.d.ts\ndist/app/fail-closed-journal.d.ts.map\ndist/app/fail-closed-journal.js\ndist/app/fail-closed-journal.js.map\ndist/app/intelligence-actions.d.ts\ndist/app/intelligence-actions.d.ts.map\ndist/app/intelligence-actions.js\ndist/app/intelligence-actions.js.map\ndist/app/interaction-automation-coordinator.d.ts\ndist/app/interaction-automation-coordinator.d.ts.map\ndist/app/interaction-automation-coordinator.js\ndist/app/interaction-automation-coordinator.js.map\ndist/app/interaction-controller.d.ts\ndist/app/interaction-controller.d.ts.map\ndist/app/interaction-controller.js\ndist/app/interaction-controller.js.map\ndist/app/interaction-effects.d.ts\ndist/app/interaction-effects.d.ts.map\ndist/app/interaction-effects.js\ndist/app/interaction-effects.js.map\ndist/app/interaction-request.d.ts\ndist/app/interaction-request.d.ts.map\ndist/app/interaction-request.js\ndist/app/interaction-request.js.map\ndist/app/interaction-response-replay.d.ts\ndist/app/interaction-response-replay.d.ts.map\ndist/app/interaction-response-replay.js\ndist/app/interaction-response-replay.js.map\ndist/app/interaction-response.d.ts\ndist/app/interaction-response.d.ts.map\ndist/app/interaction-response.js\ndist/app/interaction-response.js.map\ndist/app/journal.d.ts\ndist/app/journal.d.ts.map\ndist/app/journal.js\ndist/app/journal.js.map\ndist/app/legacy-cancel.d.ts\ndist/app/legacy-cancel.d.ts.map\ndist/app/legacy-cancel.js\ndist/app/legacy-cancel.js.map\ndist/app/operation-fingerprint.d.ts\ndist/app/operation-fingerprint.d.ts.map\ndist/app/operation-fingerprint.js\ndist/app/operation-fingerprint.js.map\ndist/app/operation-ledger.d.ts\ndist/app/operation-ledger.d.ts.map\ndist/app/operation-ledger.js\ndist/app/operation-ledger.js.map\ndist/app/production-composition.d.ts\ndist/app/production-composition.d.ts.map\ndist/app/production-composition.js\ndist/app/production-composition.js.map\ndist/app/profile-action-support.d.ts\ndist/app/profile-action-support.d.ts.map\ndist/app/profile-action-support.js\ndist/app/profile-action-support.js.map\ndist/app/profile-actions.d.ts\ndist/app/profile-actions.d.ts.map\ndist/app/profile-actions.js\ndist/app/profile-actions.js.map\ndist/app/profile-draft.d.ts\ndist/app/profile-draft.d.ts.map\ndist/app/profile-draft.js\ndist/app/profile-draft.js.map\ndist/app/profile-model-settings.d.ts\ndist/app/profile-model-settings.d.ts.map\ndist/app/profile-model-settings.js\ndist/app/profile-model-settings.js.map\ndist/app/profile-persistence.d.ts\ndist/app/profile-persistence.d.ts.map\ndist/app/profile-persistence.js\ndist/app/profile-persistence.js.map\ndist/app/profile-save-recovery.d.ts\ndist/app/profile-save-recovery.d.ts.map\ndist/app/profile-save-recovery.js\ndist/app/profile-save-recovery.js.map\ndist/app/profile-selection.d.ts\ndist/app/profile-selection.d.ts.map\ndist/app/profile-selection.js\ndist/app/profile-selection.js.map\ndist/app/profile-snapshots.d.ts\ndist/app/profile-snapshots.d.ts.map\ndist/app/profile-snapshots.js\ndist/app/profile-snapshots.js.map\ndist/app/profile-sources.d.ts\ndist/app/profile-sources.d.ts.map\ndist/app/profile-sources.js\ndist/app/profile-sources.js.map\ndist/app/profile-types.d.ts\ndist/app/profile-types.d.ts.map\ndist/app/profile-types.js\ndist/app/profile-types.js.map\ndist/app/profile-validation.d.ts\ndist/app/profile-validation.d.ts.map\ndist/app/profile-validation.js\ndist/app/profile-validation.js.map\ndist/app/profiles.d.ts\ndist/app/profiles.d.ts.map\ndist/app/profiles.js\ndist/app/profiles.js.map\ndist/app/provider-snapshot.d.ts\ndist/app/provider-snapshot.d.ts.map\ndist/app/provider-snapshot.js\ndist/app/provider-snapshot.js.map\ndist/app/provider-values.d.ts\ndist/app/provider-values.d.ts.map\ndist/app/provider-values.js\ndist/app/provider-values.js.map\ndist/app/run-admission-continuation.d.ts\ndist/app/run-admission-continuation.d.ts.map\ndist/app/run-admission-continuation.js\ndist/app/run-admission-continuation.js.map\ndist/app/run-admission-dispatch.d.ts\ndist/app/run-admission-dispatch.d.ts.map\ndist/app/run-admission-dispatch.js\ndist/app/run-admission-dispatch.js.map\ndist/app/run-admission-receipt.d.ts\ndist/app/run-admission-receipt.d.ts.map\ndist/app/run-admission-receipt.js\ndist/app/run-admission-receipt.js.map\ndist/app/run-admission-request.d.ts\ndist/app/run-admission-request.d.ts.map\ndist/app/run-admission-request.js\ndist/app/run-admission-request.js.map\ndist/app/run-admission-validation.d.ts\ndist/app/run-admission-validation.d.ts.map\ndist/app/run-admission-validation.js\ndist/app/run-admission-validation.js.map\ndist/app/run-admission.d.ts\ndist/app/run-admission.d.ts.map\ndist/app/run-admission.js\ndist/app/run-admission.js.map\ndist/app/run-continuation.d.ts\ndist/app/run-continuation.d.ts.map\ndist/app/run-continuation.js\ndist/app/run-continuation.js.map\ndist/app/run-controls.d.ts\ndist/app/run-controls.d.ts.map\ndist/app/run-controls.js\ndist/app/run-controls.js.map\ndist/app/run-event-mapper.d.ts\ndist/app/run-event-mapper.d.ts.map\ndist/app/run-event-mapper.js\ndist/app/run-event-mapper.js.map\ndist/app/run-execution-snapshot.d.ts\ndist/app/run-execution-snapshot.d.ts.map\ndist/app/run-execution-snapshot.js\ndist/app/run-execution-snapshot.js.map\ndist/app/run-execution.d.ts\ndist/app/run-execution.d.ts.map\ndist/app/run-execution.js\ndist/app/run-execution.js.map\ndist/app/run-ingestion.d.ts\ndist/app/run-ingestion.d.ts.map\ndist/app/run-ingestion.js\ndist/app/run-ingestion.js.map\ndist/app/run-ledger.d.ts\ndist/app/run-ledger.d.ts.map\ndist/app/run-ledger.js\ndist/app/run-ledger.js.map\ndist/app/run-recovery-context.d.ts\ndist/app/run-recovery-context.d.ts.map\ndist/app/run-recovery-context.js\ndist/app/run-recovery-context.js.map\ndist/app/run-replay.d.ts\ndist/app/run-replay.d.ts.map\ndist/app/run-replay.js\ndist/app/run-replay.js.map\ndist/app/run-status.d.ts\ndist/app/run-status.d.ts.map\ndist/app/run-status.js\ndist/app/run-status.js.map\ndist/app/run-stream-sanitizer.d.ts\ndist/app/run-stream-sanitizer.d.ts.map\ndist/app/run-stream-sanitizer.js\ndist/app/run-stream-sanitizer.js.map\ndist/app/runtime-selection.d.ts\ndist/app/runtime-selection.d.ts.map\ndist/app/runtime-selection.js\ndist/app/runtime-selection.js.map\ndist/app/shutdown-controller.d.ts\ndist/app/shutdown-controller.d.ts.map\ndist/app/shutdown-controller.js\ndist/app/shutdown-controller.js.map\ndist/app/storage-journal-support.d.ts\ndist/app/storage-journal-support.d.ts.map\ndist/app/storage-journal-support.js\ndist/app/storage-journal-support.js.map\ndist/app/storage-journal.d.ts\ndist/app/storage-journal.d.ts.map\ndist/app/storage-journal.js\ndist/app/storage-journal.js.map\ndist/app/supervisor-projection.d.ts\ndist/app/supervisor-projection.d.ts.map\ndist/app/supervisor-projection.js\ndist/app/supervisor-projection.js.map\ndist/app/supervisor-service.d.ts\ndist/app/supervisor-service.d.ts.map\ndist/app/supervisor-service.js\ndist/app/supervisor-service.js.map\ndist/app/unavailable-analyst.d.ts\ndist/app/unavailable-analyst.d.ts.map\ndist/app/unavailable-analyst.js\ndist/app/unavailable-analyst.js.map\ndist/bin/args.d.ts\ndist/bin/args.d.ts.map\ndist/bin/args.js\ndist/bin/args.js.map\ndist/bin/braid-runtime.d.ts\ndist/bin/braid-runtime.d.ts.map\ndist/bin/braid-runtime.js\ndist/bin/braid-runtime.js.map\ndist/bin/braid.d.ts\ndist/bin/braid.d.ts.map\ndist/bin/braid.js\ndist/bin/braid.js.map\ndist/bin/fixture-application.d.ts\ndist/bin/fixture-application.d.ts.map\ndist/bin/fixture-application.js\ndist/bin/fixture-application.js.map\ndist/bin/interface-runner.d.ts\ndist/bin/interface-runner.d.ts.map\ndist/bin/interface-runner.js\ndist/bin/interface-runner.js.map\ndist/bin/interface-signal-lifecycle.d.ts\ndist/bin/interface-signal-lifecycle.d.ts.map\ndist/bin/interface-signal-lifecycle.js\ndist/bin/interface-signal-lifecycle.js.map\ndist/bin/interface-state-recorder.d.ts\ndist/bin/interface-state-recorder.d.ts.map\ndist/bin/interface-state-recorder.js\ndist/bin/interface-state-recorder.js.map\ndist/bin/native-interactive-actions.d.ts\ndist/bin/native-interactive-actions.d.ts.map\ndist/bin/native-interactive-actions.js\ndist/bin/native-interactive-actions.js.map\ndist/bin/plain.d.ts\ndist/bin/plain.d.ts.map\ndist/bin/plain.js\ndist/bin/plain.js.map\ndist/bin/production-active-profile.d.ts\ndist/bin/production-active-profile.d.ts.map\ndist/bin/production-active-profile.js\ndist/bin/production-active-profile.js.map\ndist/bin/production-application.d.ts\ndist/bin/production-application.d.ts.map\ndist/bin/production-application.js\ndist/bin/production-application.js.map\ndist/bin/production-bridge-client.d.ts\ndist/bin/production-bridge-client.d.ts.map\ndist/bin/production-bridge-client.js\ndist/bin/production-bridge-client.js.map\ndist/bin/production-bridge-discovery.d.ts\ndist/bin/production-bridge-discovery.d.ts.map\ndist/bin/production-bridge-discovery.js\ndist/bin/production-bridge-discovery.js.map\ndist/bin/production-config-mutation-lock.d.ts\ndist/bin/production-config-mutation-lock.d.ts.map\ndist/bin/production-config-mutation-lock.js\ndist/bin/production-config-mutation-lock.js.map\ndist/bin/production-connection-action-options.d.ts\ndist/bin/production-connection-action-options.d.ts.map\ndist/bin/production-connection-action-options.js\ndist/bin/production-connection-action-options.js.map\ndist/bin/production-connection-actions.d.ts\ndist/bin/production-connection-actions.d.ts.map\ndist/bin/production-connection-actions.js\ndist/bin/production-connection-actions.js.map\ndist/bin/production-connection-catalog.d.ts\ndist/bin/production-connection-catalog.d.ts.map\ndist/bin/production-connection-catalog.js\ndist/bin/production-connection-catalog.js.map\ndist/bin/production-connection-credential-cleanup.d.ts\ndist/bin/production-connection-credential-cleanup.d.ts.map\ndist/bin/production-connection-credential-cleanup.js\ndist/bin/production-connection-credential-cleanup.js.map\ndist/bin/production-connection-credential-removal-record.d.ts\ndist/bin/production-connection-credential-removal-record.d.ts.map\ndist/bin/production-connection-credential-removal-record.js\ndist/bin/production-connection-credential-removal-record.js.map\ndist/bin/production-connection-removal.d.ts\ndist/bin/production-connection-removal.d.ts.map\ndist/bin/production-connection-removal.js\ndist/bin/production-connection-removal.js.map\ndist/bin/production-connection-replay.d.ts\ndist/bin/production-connection-replay.d.ts.map\ndist/bin/production-connection-replay.js\ndist/bin/production-connection-replay.js.map\ndist/bin/production-credential-context.d.ts\ndist/bin/production-credential-context.d.ts.map\ndist/bin/production-credential-context.js\ndist/bin/production-credential-context.js.map\ndist/bin/production-credential-reference.d.ts\ndist/bin/production-credential-reference.d.ts.map\ndist/bin/production-credential-reference.js\ndist/bin/production-credential-reference.js.map\ndist/bin/production-key-path.d.ts\ndist/bin/production-key-path.d.ts.map\ndist/bin/production-key-path.js\ndist/bin/production-key-path.js.map\ndist/bin/production-profile-projection.d.ts\ndist/bin/production-profile-projection.d.ts.map\ndist/bin/production-profile-projection.js\ndist/bin/production-profile-projection.js.map\ndist/bin/production-setup-credentials.d.ts\ndist/bin/production-setup-credentials.d.ts.map\ndist/bin/production-setup-credentials.js\ndist/bin/production-setup-credentials.js.map\ndist/bin/production-setup-discovery.d.ts\ndist/bin/production-setup-discovery.d.ts.map\ndist/bin/production-setup-discovery.js\ndist/bin/production-setup-discovery.js.map\ndist/bin/production-setup-persistence.d.ts\ndist/bin/production-setup-persistence.d.ts.map\ndist/bin/production-setup-persistence.js\ndist/bin/production-setup-persistence.js.map\ndist/bin/production-setup-transition.d.ts\ndist/bin/production-setup-transition.d.ts.map\ndist/bin/production-setup-transition.js\ndist/bin/production-setup-transition.js.map\ndist/bin/production-setup-types.d.ts\ndist/bin/production-setup-types.d.ts.map\ndist/bin/production-setup-types.js\ndist/bin/production-setup-types.js.map\ndist/bin/production-setup-validation.d.ts\ndist/bin/production-setup-validation.d.ts.map\ndist/bin/production-setup-validation.js\ndist/bin/production-setup-validation.js.map\ndist/bin/production-setup.d.ts\ndist/bin/production-setup.d.ts.map\ndist/bin/production-setup.js\ndist/bin/production-setup.js.map\ndist/bin/production-startup.d.ts\ndist/bin/production-startup.d.ts.map\ndist/bin/production-startup.js\ndist/bin/production-startup.js.map\ndist/bin/runtime-startup-options.d.ts\ndist/bin/runtime-startup-options.d.ts.map\ndist/bin/runtime-startup-options.js\ndist/bin/runtime-startup-options.js.map\ndist/bin/state-path.d.ts\ndist/bin/state-path.d.ts.map\ndist/bin/state-path.js\ndist/bin/state-path.js.map\ndist/domain/analysis-model-call.d.ts\ndist/domain/analysis-model-call.d.ts.map\ndist/domain/analysis-model-call.js\ndist/domain/analysis-model-call.js.map\ndist/domain/bounded-structured.d.ts\ndist/domain/bounded-structured.d.ts.map\ndist/domain/bounded-structured.js\ndist/domain/bounded-structured.js.map\ndist/domain/canonical-json.d.ts\ndist/domain/canonical-json.d.ts.map\ndist/domain/canonical-json.js\ndist/domain/canonical-json.js.map\ndist/domain/canonical.d.ts\ndist/domain/canonical.d.ts.map\ndist/domain/canonical.js\ndist/domain/canonical.js.map\ndist/domain/code-unit-order.d.ts\ndist/domain/code-unit-order.d.ts.map\ndist/domain/code-unit-order.js\ndist/domain/code-unit-order.js.map\ndist/domain/connection-removal.d.ts\ndist/domain/connection-removal.d.ts.map\ndist/domain/connection-removal.js\ndist/domain/connection-removal.js.map\ndist/domain/content-budget.d.ts\ndist/domain/content-budget.d.ts.map\ndist/domain/content-budget.js\ndist/domain/content-budget.js.map\ndist/domain/entities-base.d.ts\ndist/domain/entities-base.d.ts.map\ndist/domain/entities-base.js\ndist/domain/entities-base.js.map\ndist/domain/entities-core.d.ts\ndist/domain/entities-core.d.ts.map\ndist/domain/entities-core.js\ndist/domain/entities-core.js.map\ndist/domain/entities-graph.d.ts\ndist/domain/entities-graph.d.ts.map\ndist/domain/entities-graph.js\ndist/domain/entities-graph.js.map\ndist/domain/entities-interactions.d.ts\ndist/domain/entities-interactions.d.ts.map\ndist/domain/entities-interactions.js\ndist/domain/entities-interactions.js.map\ndist/domain/entities-messages.d.ts\ndist/domain/entities-messages.d.ts.map\ndist/domain/entities-messages.js\ndist/domain/entities-messages.js.map\ndist/domain/entities-runtime.d.ts\ndist/domain/entities-runtime.d.ts.map\ndist/domain/entities-runtime.js\ndist/domain/entities-runtime.js.map\ndist/domain/entities.d.ts\ndist/domain/entities.d.ts.map\ndist/domain/entities.js\ndist/domain/entities.js.map\ndist/domain/events-legacy.d.ts\ndist/domain/events-legacy.d.ts.map\ndist/domain/events-legacy.js\ndist/domain/events-legacy.js.map\ndist/domain/events.d.ts\ndist/domain/events.d.ts.map\ndist/domain/events.js\ndist/domain/events.js.map\ndist/domain/execution-observation.d.ts\ndist/domain/execution-observation.d.ts.map\ndist/domain/execution-observation.js\ndist/domain/execution-observation.js.map\ndist/domain/graph-records.d.ts\ndist/domain/graph-records.d.ts.map\ndist/domain/graph-records.js\ndist/domain/graph-records.js.map\ndist/domain/ids-core.d.ts\ndist/domain/ids-core.d.ts.map\ndist/domain/ids-core.js\ndist/domain/ids-core.js.map\ndist/domain/ids-types.d.ts\ndist/domain/ids-types.d.ts.map\ndist/domain/ids-types.js\ndist/domain/ids-types.js.map\ndist/domain/ids-values.d.ts\ndist/domain/ids-values.d.ts.map\ndist/domain/ids-values.js\ndist/domain/ids-values.js.map\ndist/domain/ids.d.ts\ndist/domain/ids.d.ts.map\ndist/domain/ids.js\ndist/domain/ids.js.map\ndist/domain/interaction-timeout.d.ts\ndist/domain/interaction-timeout.d.ts.map\ndist/domain/interaction-timeout.js\ndist/domain/interaction-timeout.js.map\ndist/domain/invariants-base.d.ts\ndist/domain/invariants-base.d.ts.map\ndist/domain/invariants-base.js\ndist/domain/invariants-base.js.map\ndist/domain/invariants-conversation.d.ts\ndist/domain/invariants-conversation.d.ts.map\ndist/domain/invariants-conversation.js\ndist/domain/invariants-conversation.js.map\ndist/domain/invariants-profile.d.ts\ndist/domain/invariants-profile.d.ts.map\ndist/domain/invariants-profile.js\ndist/domain/invariants-profile.js.map\ndist/domain/invariants-relations.d.ts\ndist/domain/invariants-relations.d.ts.map\ndist/domain/invariants-relations.js\ndist/domain/invariants-relations.js.map\ndist/domain/invariants-retained-admission.d.ts\ndist/domain/invariants-retained-admission.d.ts.map\ndist/domain/invariants-retained-admission.js\ndist/domain/invariants-retained-admission.js.map\ndist/domain/invariants-run.d.ts\ndist/domain/invariants-run.d.ts.map\ndist/domain/invariants-run.js\ndist/domain/invariants-run.js.map\ndist/domain/invariants-runtime.d.ts\ndist/domain/invariants-runtime.d.ts.map\ndist/domain/invariants-runtime.js\ndist/domain/invariants-runtime.js.map\ndist/domain/invariants-state.d.ts\ndist/domain/invariants-state.d.ts.map\ndist/domain/invariants-state.js\ndist/domain/invariants-state.js.map\ndist/domain/invariants.d.ts\ndist/domain/invariants.d.ts.map\ndist/domain/invariants.js\ndist/domain/invariants.js.map\ndist/domain/legacy-interaction-snapshot.d.ts\ndist/domain/legacy-interaction-snapshot.d.ts.map\ndist/domain/legacy-interaction-snapshot.js\ndist/domain/legacy-interaction-snapshot.js.map\ndist/domain/materialization-receipt.d.ts\ndist/domain/materialization-receipt.d.ts.map\ndist/domain/materialization-receipt.js\ndist/domain/materialization-receipt.js.map\ndist/domain/materialized-state-snapshot.d.ts\ndist/domain/materialized-state-snapshot.d.ts.map\ndist/domain/materialized-state-snapshot.js\ndist/domain/materialized-state-snapshot.js.map\ndist/domain/materialized-state.d.ts\ndist/domain/materialized-state.d.ts.map\ndist/domain/materialized-state.js\ndist/domain/materialized-state.js.map\ndist/domain/projection-checksum.d.ts\ndist/domain/projection-checksum.d.ts.map\ndist/domain/projection-checksum.js\ndist/domain/projection-checksum.js.map\ndist/domain/provider-values.d.ts\ndist/domain/provider-values.d.ts.map\ndist/domain/provider-values.js\ndist/domain/provider-values.js.map\ndist/domain/public-metadata.d.ts\ndist/domain/public-metadata.d.ts.map\ndist/domain/public-metadata.js\ndist/domain/public-metadata.js.map\ndist/domain/receipts.d.ts\ndist/domain/receipts.d.ts.map\ndist/domain/receipts.js\ndist/domain/receipts.js.map\ndist/domain/redaction.d.ts\ndist/domain/redaction.d.ts.map\ndist/domain/redaction.js\ndist/domain/redaction.js.map\ndist/domain/reducer-content.d.ts\ndist/domain/reducer-content.d.ts.map\ndist/domain/reducer-content.js\ndist/domain/reducer-content.js.map\ndist/domain/reducer-conversation-events.d.ts\ndist/domain/reducer-conversation-events.d.ts.map\ndist/domain/reducer-conversation-events.js\ndist/domain/reducer-conversation-events.js.map\ndist/domain/reducer-domain-events.d.ts\ndist/domain/reducer-domain-events.d.ts.map\ndist/domain/reducer-domain-events.js\ndist/domain/reducer-domain-events.js.map\ndist/domain/reducer-execution-observation.d.ts\ndist/domain/reducer-execution-observation.d.ts.map\ndist/domain/reducer-execution-observation.js\ndist/domain/reducer-execution-observation.js.map\ndist/domain/reducer-helpers.d.ts\ndist/domain/reducer-helpers.d.ts.map\ndist/domain/reducer-helpers.js\ndist/domain/reducer-helpers.js.map\ndist/domain/reducer-interactions.d.ts\ndist/domain/reducer-interactions.d.ts.map\ndist/domain/reducer-interactions.js\ndist/domain/reducer-interactions.js.map\ndist/domain/reducer-legacy.d.ts\ndist/domain/reducer-legacy.d.ts.map\ndist/domain/reducer-legacy.js\ndist/domain/reducer-legacy.js.map\ndist/domain/reducer-lifecycle.d.ts\ndist/domain/reducer-lifecycle.d.ts.map\ndist/domain/reducer-lifecycle.js\ndist/domain/reducer-lifecycle.js.map\ndist/domain/reducer-replay.d.ts\ndist/domain/reducer-replay.d.ts.map\ndist/domain/reducer-replay.js\ndist/domain/reducer-replay.js.map\ndist/domain/reducer-retained-admission.d.ts\ndist/domain/reducer-retained-admission.d.ts.map\ndist/domain/reducer-retained-admission.js\ndist/domain/reducer-retained-admission.js.map\ndist/domain/reducer-run-graph.d.ts\ndist/domain/reducer-run-graph.d.ts.map\ndist/domain/reducer-run-graph.js\ndist/domain/reducer-run-graph.js.map\ndist/domain/reducer-runtime.d.ts\ndist/domain/reducer-runtime.d.ts.map\ndist/domain/reducer-runtime.js\ndist/domain/reducer-runtime.js.map\ndist/domain/reducer-support.d.ts\ndist/domain/reducer-support.d.ts.map\ndist/domain/reducer-support.js\ndist/domain/reducer-support.js.map\ndist/domain/reducer.d.ts\ndist/domain/reducer.d.ts.map\ndist/domain/reducer.js\ndist/domain/reducer.js.map\ndist/domain/run-contracts.d.ts\ndist/domain/run-contracts.d.ts.map\ndist/domain/run-contracts.js\ndist/domain/run-contracts.js.map\ndist/domain/run-interactions.d.ts\ndist/domain/run-interactions.d.ts.map\ndist/domain/run-interactions.js\ndist/domain/run-interactions.js.map\ndist/domain/run-usage.d.ts\ndist/domain/run-usage.d.ts.map\ndist/domain/run-usage.js\ndist/domain/run-usage.js.map\ndist/domain/runtime-diagnostics.d.ts\ndist/domain/runtime-diagnostics.d.ts.map\ndist/domain/runtime-diagnostics.js\ndist/domain/runtime-diagnostics.js.map\ndist/domain/runtime-events.d.ts\ndist/domain/runtime-events.d.ts.map\ndist/domain/runtime-events.js\ndist/domain/runtime-events.js.map\ndist/domain/runtime-projection.d.ts\ndist/domain/runtime-projection.d.ts.map\ndist/domain/runtime-projection.js\ndist/domain/runtime-projection.js.map\ndist/domain/secret-sanitizer.d.ts\ndist/domain/secret-sanitizer.d.ts.map\ndist/domain/secret-sanitizer.js\ndist/domain/secret-sanitizer.js.map\ndist/domain/state.d.ts\ndist/domain/state.d.ts.map\ndist/domain/state.js\ndist/domain/state.js.map\ndist/domain/terminal-sanitizer.d.ts\ndist/domain/terminal-sanitizer.d.ts.map\ndist/domain/terminal-sanitizer.js\ndist/domain/terminal-sanitizer.js.map\ndist/domain/text.d.ts\ndist/domain/text.d.ts.map\ndist/domain/text.js\ndist/domain/text.js.map\ndist/eval/calibration.d.ts\ndist/eval/calibration.d.ts.map\ndist/eval/calibration.js\ndist/eval/calibration.js.map\ndist/eval/campaigns.d.ts\ndist/eval/campaigns.d.ts.map\ndist/eval/campaigns.js\ndist/eval/campaigns.js.map\ndist/eval/cases.d.ts\ndist/eval/cases.d.ts.map\ndist/eval/cases.js\ndist/eval/cases.js.map\ndist/eval/execution.d.ts\ndist/eval/execution.d.ts.map\ndist/eval/execution.js\ndist/eval/execution.js.map\ndist/eval/fixtures.d.ts\ndist/eval/fixtures.d.ts.map\ndist/eval/fixtures.js\ndist/eval/fixtures.js.map\ndist/eval/product-path.d.ts\ndist/eval/product-path.d.ts.map\ndist/eval/product-path.js\ndist/eval/product-path.js.map\ndist/eval/record-builder.d.ts\ndist/eval/record-builder.d.ts.map\ndist/eval/record-builder.js\ndist/eval/record-builder.js.map\ndist/eval/records.d.ts\ndist/eval/records.d.ts.map\ndist/eval/records.js\ndist/eval/records.js.map\ndist/eval/release-decision.d.ts\ndist/eval/release-decision.d.ts.map\ndist/eval/release-decision.js\ndist/eval/release-decision.js.map\ndist/eval/release-markers.d.ts\ndist/eval/release-markers.d.ts.map\ndist/eval/release-markers.js\ndist/eval/release-markers.js.map\ndist/eval/runner.d.ts\ndist/eval/runner.d.ts.map\ndist/eval/runner.js\ndist/eval/runner.js.map\ndist/eval/types.d.ts\ndist/eval/types.d.ts.map\ndist/eval/types.js\ndist/eval/types.js.map\ndist/index.d.ts\ndist/index.d.ts.map\ndist/index.js\ndist/index.js.map\ndist/installed-package-version.d.ts\ndist/installed-package-version.d.ts.map\ndist/installed-package-version.js\ndist/installed-package-version.js.map\ndist/ports/clock.d.ts\ndist/ports/clock.d.ts.map\ndist/ports/clock.js\ndist/ports/clock.js.map\ndist/ports/connection-lifecycle.d.ts\ndist/ports/connection-lifecycle.d.ts.map\ndist/ports/connection-lifecycle.js\ndist/ports/connection-lifecycle.js.map\ndist/ports/credentials.d.ts\ndist/ports/credentials.d.ts.map\ndist/ports/credentials.js\ndist/ports/credentials.js.map\ndist/ports/effect-storage.d.ts\ndist/ports/effect-storage.d.ts.map\ndist/ports/effect-storage.js\ndist/ports/effect-storage.js.map\ndist/ports/execution.d.ts\ndist/ports/execution.d.ts.map\ndist/ports/execution.js\ndist/ports/execution.js.map\ndist/ports/ids.d.ts\ndist/ports/ids.d.ts.map\ndist/ports/ids.js\ndist/ports/ids.js.map\ndist/ports/native-interactive-execution.d.ts\ndist/ports/native-interactive-execution.d.ts.map\ndist/ports/native-interactive-execution.js\ndist/ports/native-interactive-execution.js.map\ndist/ports/native-terminal-transport.d.ts\ndist/ports/native-terminal-transport.d.ts.map\ndist/ports/native-terminal-transport.js\ndist/ports/native-terminal-transport.js.map\ndist/ports/storage.d.ts\ndist/ports/storage.d.ts.map\ndist/ports/storage.js\ndist/ports/storage.js.map\ndist/startup/chunks/analysis-comparison-facts-4HBRMPC5.js\ndist/startup/chunks/analysis-comparison-facts-4HBRMPC5.js.map\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js.map\ndist/startup/chunks/chunk-26WJ3D3U.js\ndist/startup/chunks/chunk-26WJ3D3U.js.map\ndist/startup/chunks/chunk-2B6P3EZQ.js\ndist/startup/chunks/chunk-2B6P3EZQ.js.map\ndist/startup/chunks/chunk-3SLVNOQZ.js\ndist/startup/chunks/chunk-3SLVNOQZ.js.map\ndist/startup/chunks/chunk-4GTWJJDM.js\ndist/startup/chunks/chunk-4GTWJJDM.js.map\ndist/startup/chunks/chunk-5LULVGCK.js\ndist/startup/chunks/chunk-5LULVGCK.js.map\ndist/startup/chunks/chunk-67SGXJUO.js\ndist/startup/chunks/chunk-67SGXJUO.js.map\ndist/startup/chunks/chunk-6G7QKB6J.js\ndist/startup/chunks/chunk-6G7QKB6J.js.map\ndist/startup/chunks/chunk-AUQCJYW5.js\ndist/startup/chunks/chunk-AUQCJYW5.js.map\ndist/startup/chunks/chunk-BFMMIDTZ.js\ndist/startup/chunks/chunk-BFMMIDTZ.js.map\ndist/startup/chunks/chunk-BGO6DSSS.js\ndist/startup/chunks/chunk-BGO6DSSS.js.map\ndist/startup/chunks/chunk-BO5OWTBZ.js\ndist/startup/chunks/chunk-BO5OWTBZ.js.map\ndist/startup/chunks/chunk-CBH5A2GJ.js\ndist/startup/chunks/chunk-CBH5A2GJ.js.map\ndist/startup/chunks/chunk-CS5FUFHS.js\ndist/startup/chunks/chunk-CS5FUFHS.js.map\ndist/startup/chunks/chunk-D3IM3CS6.js\ndist/startup/chunks/chunk-D3IM3CS6.js.map\ndist/startup/chunks/chunk-DCHT46BU.js\ndist/startup/chunks/chunk-DCHT46BU.js.map\ndist/startup/chunks/chunk-DLR6FLQV.js\ndist/startup/chunks/chunk-DLR6FLQV.js.map\ndist/startup/chunks/chunk-EG7UPV4Q.js\ndist/startup/chunks/chunk-EG7UPV4Q.js.map\ndist/startup/chunks/chunk-EMP3DK5W.js\ndist/startup/chunks/chunk-EMP3DK5W.js.map\ndist/startup/chunks/chunk-EZFTDPNQ.js\ndist/startup/chunks/chunk-EZFTDPNQ.js.map\ndist/startup/chunks/chunk-H6G73VXZ.js\ndist/startup/chunks/chunk-H6G73VXZ.js.map\ndist/startup/chunks/chunk-HLJ57SGD.js\ndist/startup/chunks/chunk-HLJ57SGD.js.map\ndist/startup/chunks/chunk-HLP7TC7Z.js\ndist/startup/chunks/chunk-HLP7TC7Z.js.map\ndist/startup/chunks/chunk-JAKKUJKI.js\ndist/startup/chunks/chunk-JAKKUJKI.js.map\ndist/startup/chunks/chunk-L2HDP2QD.js\ndist/startup/chunks/chunk-L2HDP2QD.js.map\ndist/startup/chunks/chunk-LPK6XAHA.js\ndist/startup/chunks/chunk-LPK6XAHA.js.map\ndist/startup/chunks/chunk-PAPTIOCL.js\ndist/startup/chunks/chunk-PAPTIOCL.js.map\ndist/startup/chunks/chunk-PXRVFPRL.js\ndist/startup/chunks/chunk-PXRVFPRL.js.map\ndist/startup/chunks/chunk-Q3LDIHCH.js\ndist/startup/chunks/chunk-Q3LDIHCH.js.map\ndist/startup/chunks/chunk-QSPEMKTL.js\ndist/startup/chunks/chunk-QSPEMKTL.js.map\ndist/startup/chunks/chunk-SZE3RHE6.js\ndist/startup/chunks/chunk-SZE3RHE6.js.map\ndist/startup/chunks/chunk-UDYGU3OR.js\ndist/startup/chunks/chunk-UDYGU3OR.js.map\ndist/startup/chunks/chunk-UTHORCP6.js\ndist/startup/chunks/chunk-UTHORCP6.js.map\ndist/startup/chunks/chunk-V7LWVMBP.js\ndist/startup/chunks/chunk-V7LWVMBP.js.map\ndist/startup/chunks/chunk-V7ZXNCA7.js\ndist/startup/chunks/chunk-V7ZXNCA7.js.map\ndist/startup/chunks/chunk-VCOQDTVF.js\ndist/startup/chunks/chunk-VCOQDTVF.js.map\ndist/startup/chunks/chunk-VRWZ5M2N.js\ndist/startup/chunks/chunk-VRWZ5M2N.js.map\ndist/startup/chunks/chunk-VTNLVERY.js\ndist/startup/chunks/chunk-VTNLVERY.js.map\ndist/startup/chunks/configuration-wizard-DGU4QOC6.js\ndist/startup/chunks/configuration-wizard-DGU4QOC6.js.map\ndist/startup/chunks/production-composition-5YSIRRBV.js\ndist/startup/chunks/production-composition-5YSIRRBV.js.map\ndist/startup/chunks/production-connection-providers-O7T54RL3.js\ndist/startup/chunks/production-connection-providers-O7T54RL3.js.map\ndist/startup/chunks/production-connections-GMFNYZ3Z.js\ndist/startup/chunks/production-connections-GMFNYZ3Z.js.map\ndist/startup/chunks/profile-connection-dispatch-KC4YZ42X.js\ndist/startup/chunks/profile-connection-dispatch-KC4YZ42X.js.map\ndist/startup/chunks/supervisor-control-F4IMJYTH.js\ndist/startup/chunks/supervisor-control-F4IMJYTH.js.map\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js.map\ndist/startup/chunks/trace-store-FHTNGCPR.js\ndist/startup/chunks/trace-store-FHTNGCPR.js.map\ndist/startup/chunks/ui-dispatch-EYGVLSE3.js\ndist/startup/chunks/ui-dispatch-EYGVLSE3.js.map\ndist/startup/durable-runtime.d.ts\ndist/startup/durable-runtime.d.ts.map\ndist/startup/durable-runtime.js\ndist/startup/durable-runtime.js.map\ndist/startup/preview-runtime.d.ts\ndist/startup/preview-runtime.d.ts.map\ndist/startup/preview-runtime.js\ndist/startup/preview-runtime.js.map\ndist/startup/terminal-runtime.d.ts\ndist/startup/terminal-runtime.d.ts.map\ndist/startup/terminal-runtime.js\ndist/startup/terminal-runtime.js.map\ndist/startup/terminal-signal-latch.d.ts\ndist/startup/terminal-signal-latch.d.ts.map\ndist/startup/terminal-signal-latch.js\ndist/startup/terminal-signal-latch.js.map\ndist/testing/deterministic-backend.d.ts\ndist/testing/deterministic-backend.d.ts.map\ndist/testing/deterministic-backend.js\ndist/testing/deterministic-backend.js.map\ndist/testing/product-demo-fixture.d.ts\ndist/testing/product-demo-fixture.d.ts.map\ndist/testing/product-demo-fixture.js\ndist/testing/product-demo-fixture.js.map\ndist/testing/runtime-contract-fixtures.d.ts\ndist/testing/runtime-contract-fixtures.d.ts.map\ndist/testing/runtime-contract-fixtures.js\ndist/testing/runtime-contract-fixtures.js.map\ndist/testing/supervision-fixture.d.ts\ndist/testing/supervision-fixture.d.ts.map\ndist/testing/supervision-fixture.js\ndist/testing/supervision-fixture.js.map\ndist/testing/supervision-ui-fixture.d.ts\ndist/testing/supervision-ui-fixture.d.ts.map\ndist/testing/supervision-ui-fixture.js\ndist/testing/supervision-ui-fixture.js.map\ndist/version.d.ts\ndist/version.d.ts.map\ndist/version.js\ndist/version.js.map\ndist/views/headless/bounded-output.d.ts\ndist/views/headless/bounded-output.d.ts.map\ndist/views/headless/bounded-output.js\ndist/views/headless/bounded-output.js.map\ndist/views/headless/protocol-limits.d.ts\ndist/views/headless/protocol-limits.d.ts.map\ndist/views/headless/protocol-limits.js\ndist/views/headless/protocol-limits.js.map\ndist/views/headless/protocol.d.ts\ndist/views/headless/protocol.d.ts.map\ndist/views/headless/protocol.js\ndist/views/headless/protocol.js.map\ndist/views/headless/rpc-automation-commands.d.ts\ndist/views/headless/rpc-automation-commands.d.ts.map\ndist/views/headless/rpc-automation-commands.js\ndist/views/headless/rpc-automation-commands.js.map\ndist/views/headless/rpc-errors.d.ts\ndist/views/headless/rpc-errors.d.ts.map\ndist/views/headless/rpc-errors.js\ndist/views/headless/rpc-errors.js.map\ndist/views/headless/rpc-interaction-commands.d.ts\ndist/views/headless/rpc-interaction-commands.d.ts.map\ndist/views/headless/rpc-interaction-commands.js\ndist/views/headless/rpc-interaction-commands.js.map\ndist/views/headless/rpc-parser.d.ts\ndist/views/headless/rpc-parser.d.ts.map\ndist/views/headless/rpc-parser.js\ndist/views/headless/rpc-parser.js.map\ndist/views/headless/rpc-types.d.ts\ndist/views/headless/rpc-types.d.ts.map\ndist/views/headless/rpc-types.js\ndist/views/headless/rpc-types.js.map\ndist/views/headless/rpc.d.ts\ndist/views/headless/rpc.d.ts.map\ndist/views/headless/rpc.js\ndist/views/headless/rpc.js.map\ndist/views/shared/analysis-model-call-presentation.d.ts\ndist/views/shared/analysis-model-call-presentation.d.ts.map\ndist/views/shared/analysis-model-call-presentation.js\ndist/views/shared/analysis-model-call-presentation.js.map\ndist/views/shared/analysis-presentation.d.ts\ndist/views/shared/analysis-presentation.d.ts.map\ndist/views/shared/analysis-presentation.js\ndist/views/shared/analysis-presentation.js.map\ndist/views/shared/appearance.d.ts\ndist/views/shared/appearance.d.ts.map\ndist/views/shared/appearance.js\ndist/views/shared/appearance.js.map\ndist/views/shared/canonical.d.ts\ndist/views/shared/canonical.d.ts.map\ndist/views/shared/canonical.js\ndist/views/shared/canonical.js.map\ndist/views/shared/command-registry.d.ts\ndist/views/shared/command-registry.d.ts.map\ndist/views/shared/command-registry.js\ndist/views/shared/command-registry.js.map\ndist/views/shared/command-table.d.ts\ndist/views/shared/command-table.d.ts.map\ndist/views/shared/command-table.js\ndist/views/shared/command-table.js.map\ndist/views/shared/comparison-presentation.d.ts\ndist/views/shared/comparison-presentation.d.ts.map\ndist/views/shared/comparison-presentation.js\ndist/views/shared/comparison-presentation.js.map\ndist/views/shared/connection-lifecycle.d.ts\ndist/views/shared/connection-lifecycle.d.ts.map\ndist/views/shared/connection-lifecycle.js\ndist/views/shared/connection-lifecycle.js.map\ndist/views/shared/duration.d.ts\ndist/views/shared/duration.d.ts.map\ndist/views/shared/duration.js\ndist/views/shared/duration.js.map\ndist/views/shared/environment-presentation.d.ts\ndist/views/shared/environment-presentation.d.ts.map\ndist/views/shared/environment-presentation.js\ndist/views/shared/environment-presentation.js.map\ndist/views/shared/headless-commands.d.ts\ndist/views/shared/headless-commands.d.ts.map\ndist/views/shared/headless-commands.js\ndist/views/shared/headless-commands.js.map\ndist/views/shared/intents.d.ts\ndist/views/shared/intents.d.ts.map\ndist/views/shared/intents.js\ndist/views/shared/intents.js.map\ndist/views/shared/models.d.ts\ndist/views/shared/models.d.ts.map\ndist/views/shared/models.js\ndist/views/shared/models.js.map\ndist/views/shared/native-interactive-actions.d.ts\ndist/views/shared/native-interactive-actions.d.ts.map\ndist/views/shared/native-interactive-actions.js\ndist/views/shared/native-interactive-actions.js.map\ndist/views/shared/plain-accessibility.d.ts\ndist/views/shared/plain-accessibility.d.ts.map\ndist/views/shared/plain-accessibility.js\ndist/views/shared/plain-accessibility.js.map\ndist/views/shared/sanitize.d.ts\ndist/views/shared/sanitize.d.ts.map\ndist/views/shared/sanitize.js\ndist/views/shared/sanitize.js.map\ndist/views/shared/semantic-activity-limit.d.ts\ndist/views/shared/semantic-activity-limit.d.ts.map\ndist/views/shared/semantic-activity-limit.js\ndist/views/shared/semantic-activity-limit.js.map\ndist/views/shared/semantic-activity.d.ts\ndist/views/shared/semantic-activity.d.ts.map\ndist/views/shared/semantic-activity.js\ndist/views/shared/semantic-activity.js.map\ndist/views/shared/semantic-details.d.ts\ndist/views/shared/semantic-details.d.ts.map\ndist/views/shared/semantic-details.js\ndist/views/shared/semantic-details.js.map\ndist/views/shared/semantic-graph-edges.d.ts\ndist/views/shared/semantic-graph-edges.d.ts.map\ndist/views/shared/semantic-graph-edges.js\ndist/views/shared/semantic-graph-edges.js.map\ndist/views/shared/semantic-graph-filters.d.ts\ndist/views/shared/semantic-graph-filters.d.ts.map\ndist/views/shared/semantic-graph-filters.js\ndist/views/shared/semantic-graph-filters.js.map\ndist/views/shared/semantic-graph-nodes.d.ts\ndist/views/shared/semantic-graph-nodes.d.ts.map\ndist/views/shared/semantic-graph-nodes.js\ndist/views/shared/semantic-graph-nodes.js.map\ndist/views/shared/semantic-graph.d.ts\ndist/views/shared/semantic-graph.d.ts.map\ndist/views/shared/semantic-graph.js\ndist/views/shared/semantic-graph.js.map\ndist/views/shared/semantic-projection.d.ts\ndist/views/shared/semantic-projection.d.ts.map\ndist/views/shared/semantic-projection.js\ndist/views/shared/semantic-projection.js.map\ndist/views/shared/semantic-query-scope.d.ts\ndist/views/shared/semantic-query-scope.d.ts.map\ndist/views/shared/semantic-query-scope.js\ndist/views/shared/semantic-query-scope.js.map\ndist/views/shared/semantic-query-types.d.ts\ndist/views/shared/semantic-query-types.d.ts.map\ndist/views/shared/semantic-query-types.js\ndist/views/shared/semantic-query-types.js.map\ndist/views/shared/usage-projection.d.ts\ndist/views/shared/usage-projection.d.ts.map\ndist/views/shared/usage-projection.js\ndist/views/shared/usage-projection.js.map\ndist/views/tui/activity-browser.d.ts\ndist/views/tui/activity-browser.d.ts.map\ndist/views/tui/activity-browser.js\ndist/views/tui/activity-browser.js.map\ndist/views/tui/activity-document.d.ts\ndist/views/tui/activity-document.d.ts.map\ndist/views/tui/activity-document.js\ndist/views/tui/activity-document.js.map\ndist/views/tui/activity.d.ts\ndist/views/tui/activity.d.ts.map\ndist/views/tui/activity.js\ndist/views/tui/activity.js.map\ndist/views/tui/analysis.d.ts\ndist/views/tui/analysis.d.ts.map\ndist/views/tui/analysis.js\ndist/views/tui/analysis.js.map\ndist/views/tui/autocomplete-guard.d.ts\ndist/views/tui/autocomplete-guard.d.ts.map\ndist/views/tui/autocomplete-guard.js\ndist/views/tui/autocomplete-guard.js.map\ndist/views/tui/automation-overlay-workflow.d.ts\ndist/views/tui/automation-overlay-workflow.d.ts.map\ndist/views/tui/automation-overlay-workflow.js\ndist/views/tui/automation-overlay-workflow.js.map\ndist/views/tui/automation-rule-panel.d.ts\ndist/views/tui/automation-rule-panel.d.ts.map\ndist/views/tui/automation-rule-panel.js\ndist/views/tui/automation-rule-panel.js.map\ndist/views/tui/automation-rule-presentation.d.ts\ndist/views/tui/automation-rule-presentation.d.ts.map\ndist/views/tui/automation-rule-presentation.js\ndist/views/tui/automation-rule-presentation.js.map\ndist/views/tui/automation-rule-response-editor.d.ts\ndist/views/tui/automation-rule-response-editor.d.ts.map\ndist/views/tui/automation-rule-response-editor.js\ndist/views/tui/automation-rule-response-editor.js.map\ndist/views/tui/command-palette.d.ts\ndist/views/tui/command-palette.d.ts.map\ndist/views/tui/command-palette.js\ndist/views/tui/command-palette.js.map\ndist/views/tui/comparison.d.ts\ndist/views/tui/comparison.d.ts.map\ndist/views/tui/comparison.js\ndist/views/tui/comparison.js.map\ndist/views/tui/composer-view.d.ts\ndist/views/tui/composer-view.d.ts.map\ndist/views/tui/composer-view.js\ndist/views/tui/composer-view.js.map\ndist/views/tui/configuration-credential.d.ts\ndist/views/tui/configuration-credential.d.ts.map\ndist/views/tui/configuration-credential.js\ndist/views/tui/configuration-credential.js.map\ndist/views/tui/configuration-presenters.d.ts\ndist/views/tui/configuration-presenters.d.ts.map\ndist/views/tui/configuration-presenters.js\ndist/views/tui/configuration-presenters.js.map\ndist/views/tui/configuration-responsive-text.d.ts\ndist/views/tui/configuration-responsive-text.d.ts.map\ndist/views/tui/configuration-responsive-text.js\ndist/views/tui/configuration-responsive-text.js.map\ndist/views/tui/configuration-review.d.ts\ndist/views/tui/configuration-review.d.ts.map\ndist/views/tui/configuration-review.js\ndist/views/tui/configuration-review.js.map\ndist/views/tui/configuration-wizard-presentation.d.ts\ndist/views/tui/configuration-wizard-presentation.d.ts.map\ndist/views/tui/configuration-wizard-presentation.js\ndist/views/tui/configuration-wizard-presentation.js.map\ndist/views/tui/configuration-wizard.d.ts\ndist/views/tui/configuration-wizard.d.ts.map\ndist/views/tui/configuration-wizard.js\ndist/views/tui/configuration-wizard.js.map\ndist/views/tui/connection-metadata-editor-actions.d.ts\ndist/views/tui/connection-metadata-editor-actions.d.ts.map\ndist/views/tui/connection-metadata-editor-actions.js\ndist/views/tui/connection-metadata-editor-actions.js.map\ndist/views/tui/connection-metadata-editor-inputs.d.ts\ndist/views/tui/connection-metadata-editor-inputs.d.ts.map\ndist/views/tui/connection-metadata-editor-inputs.js\ndist/views/tui/connection-metadata-editor-inputs.js.map\ndist/views/tui/connection-metadata-editor-model.d.ts\ndist/views/tui/connection-metadata-editor-model.d.ts.map\ndist/views/tui/connection-metadata-editor-model.js\ndist/views/tui/connection-metadata-editor-model.js.map\ndist/views/tui/connection-metadata-editor-presentation.d.ts\ndist/views/tui/connection-metadata-editor-presentation.d.ts.map\ndist/views/tui/connection-metadata-editor-presentation.js\ndist/views/tui/connection-metadata-editor-presentation.js.map\ndist/views/tui/connection-metadata-editor-rendering.d.ts\ndist/views/tui/connection-metadata-editor-rendering.d.ts.map\ndist/views/tui/connection-metadata-editor-rendering.js\ndist/views/tui/connection-metadata-editor-rendering.js.map\ndist/views/tui/connection-metadata-editor.d.ts\ndist/views/tui/connection-metadata-editor.d.ts.map\ndist/views/tui/connection-metadata-editor.js\ndist/views/tui/connection-metadata-editor.js.map\ndist/views/tui/connection-overlay-workflow.d.ts\ndist/views/tui/connection-overlay-workflow.d.ts.map\ndist/views/tui/connection-overlay-workflow.js\ndist/views/tui/connection-overlay-workflow.js.map\ndist/views/tui/connection-setup-actions.d.ts\ndist/views/tui/connection-setup-actions.d.ts.map\ndist/views/tui/connection-setup-actions.js\ndist/views/tui/connection-setup-actions.js.map\ndist/views/tui/connection-setup-rendering.d.ts\ndist/views/tui/connection-setup-rendering.d.ts.map\ndist/views/tui/connection-setup-rendering.js\ndist/views/tui/connection-setup-rendering.js.map\ndist/views/tui/connection-setup.d.ts\ndist/views/tui/connection-setup.d.ts.map\ndist/views/tui/connection-setup.js\ndist/views/tui/connection-setup.js.map\ndist/views/tui/conversation-dialogs.d.ts\ndist/views/tui/conversation-dialogs.d.ts.map\ndist/views/tui/conversation-dialogs.js\ndist/views/tui/conversation-dialogs.js.map\ndist/views/tui/conversation-overlay-actions.d.ts\ndist/views/tui/conversation-overlay-actions.d.ts.map\ndist/views/tui/conversation-overlay-actions.js\ndist/views/tui/conversation-overlay-actions.js.map\ndist/views/tui/conversation-overlay-helpers.d.ts\ndist/views/tui/conversation-overlay-helpers.d.ts.map\ndist/views/tui/conversation-overlay-helpers.js\ndist/views/tui/conversation-overlay-helpers.js.map\ndist/views/tui/conversation-overlays.d.ts\ndist/views/tui/conversation-overlays.d.ts.map\ndist/views/tui/conversation-overlays.js\ndist/views/tui/conversation-overlays.js.map\ndist/views/tui/details.d.ts\ndist/views/tui/details.d.ts.map\ndist/views/tui/details.js\ndist/views/tui/details.js.map\ndist/views/tui/dynamic-autocomplete.d.ts\ndist/views/tui/dynamic-autocomplete.d.ts.map\ndist/views/tui/dynamic-autocomplete.js\ndist/views/tui/dynamic-autocomplete.js.map\ndist/views/tui/entity-browser-layout.d.ts\ndist/views/tui/entity-browser-layout.d.ts.map\ndist/views/tui/entity-browser-layout.js\ndist/views/tui/entity-browser-layout.js.map\ndist/views/tui/entity-browser.d.ts\ndist/views/tui/entity-browser.d.ts.map\ndist/views/tui/entity-browser.js\ndist/views/tui/entity-browser.js.map\ndist/views/tui/execution-target.d.ts\ndist/views/tui/execution-target.d.ts.map\ndist/views/tui/execution-target.js\ndist/views/tui/execution-target.js.map\ndist/views/tui/focused-surface.d.ts\ndist/views/tui/focused-surface.d.ts.map\ndist/views/tui/focused-surface.js\ndist/views/tui/focused-surface.js.map\ndist/views/tui/fork-preview.d.ts\ndist/views/tui/fork-preview.d.ts.map\ndist/views/tui/fork-preview.js\ndist/views/tui/fork-preview.js.map\ndist/views/tui/graph.d.ts\ndist/views/tui/graph.d.ts.map\ndist/views/tui/graph.js\ndist/views/tui/graph.js.map\ndist/views/tui/help.d.ts\ndist/views/tui/help.d.ts.map\ndist/views/tui/help.js\ndist/views/tui/help.js.map\ndist/views/tui/interaction-automation-response.d.ts\ndist/views/tui/interaction-automation-response.d.ts.map\ndist/views/tui/interaction-automation-response.js\ndist/views/tui/interaction-automation-response.js.map\ndist/views/tui/interaction-decisions.d.ts\ndist/views/tui/interaction-decisions.d.ts.map\ndist/views/tui/interaction-decisions.js\ndist/views/tui/interaction-decisions.js.map\ndist/views/tui/interaction-input-response.d.ts\ndist/views/tui/interaction-input-response.d.ts.map\ndist/views/tui/interaction-input-response.js\ndist/views/tui/interaction-input-response.js.map\ndist/views/tui/interaction-presentation.d.ts\ndist/views/tui/interaction-presentation.d.ts.map\ndist/views/tui/interaction-presentation.js\ndist/views/tui/interaction-presentation.js.map\ndist/views/tui/interaction.d.ts\ndist/views/tui/interaction.d.ts.map\ndist/views/tui/interaction.js\ndist/views/tui/interaction.js.map\ndist/views/tui/keyboard.d.ts\ndist/views/tui/keyboard.d.ts.map\ndist/views/tui/keyboard.js\ndist/views/tui/keyboard.js.map\ndist/views/tui/layout.d.ts\ndist/views/tui/layout.d.ts.map\ndist/views/tui/layout.js\ndist/views/tui/layout.js.map\ndist/views/tui/measurement-display.d.ts\ndist/views/tui/measurement-display.d.ts.map\ndist/views/tui/measurement-display.js\ndist/views/tui/measurement-display.js.map\ndist/views/tui/modal-coordinator.d.ts\ndist/views/tui/modal-coordinator.d.ts.map\ndist/views/tui/modal-coordinator.js\ndist/views/tui/modal-coordinator.js.map\ndist/views/tui/profile-compatibility.d.ts\ndist/views/tui/profile-compatibility.d.ts.map\ndist/views/tui/profile-compatibility.js\ndist/views/tui/profile-compatibility.js.map\ndist/views/tui/profile-editor-actions.d.ts\ndist/views/tui/profile-editor-actions.d.ts.map\ndist/views/tui/profile-editor-actions.js\ndist/views/tui/profile-editor-actions.js.map\ndist/views/tui/profile-editor-rendering.d.ts\ndist/views/tui/profile-editor-rendering.d.ts.map\ndist/views/tui/profile-editor-rendering.js\ndist/views/tui/profile-editor-rendering.js.map\ndist/views/tui/profile-editor.d.ts\ndist/views/tui/profile-editor.d.ts.map\ndist/views/tui/profile-editor.js\ndist/views/tui/profile-editor.js.map\ndist/views/tui/safe-markdown.d.ts\ndist/views/tui/safe-markdown.d.ts.map\ndist/views/tui/safe-markdown.js\ndist/views/tui/safe-markdown.js.map\ndist/views/tui/secret-input.d.ts\ndist/views/tui/secret-input.d.ts.map\ndist/views/tui/secret-input.js\ndist/views/tui/secret-input.js.map\ndist/views/tui/selector.d.ts\ndist/views/tui/selector.d.ts.map\ndist/views/tui/selector.js\ndist/views/tui/selector.js.map\ndist/views/tui/supervisor-actions.d.ts\ndist/views/tui/supervisor-actions.d.ts.map\ndist/views/tui/supervisor-actions.js\ndist/views/tui/supervisor-actions.js.map\ndist/views/tui/terminal-app.d.ts\ndist/views/tui/terminal-app.d.ts.map\ndist/views/tui/terminal-app.js\ndist/views/tui/terminal-app.js.map\ndist/views/tui/terminal-chrome.d.ts\ndist/views/tui/terminal-chrome.d.ts.map\ndist/views/tui/terminal-chrome.js\ndist/views/tui/terminal-chrome.js.map\ndist/views/tui/terminal-command-controller.d.ts\ndist/views/tui/terminal-command-controller.d.ts.map\ndist/views/tui/terminal-command-controller.js\ndist/views/tui/terminal-command-controller.js.map\ndist/views/tui/terminal-compatibility.d.ts\ndist/views/tui/terminal-compatibility.d.ts.map\ndist/views/tui/terminal-compatibility.js\ndist/views/tui/terminal-compatibility.js.map\ndist/views/tui/terminal-drafts.d.ts\ndist/views/tui/terminal-drafts.d.ts.map\ndist/views/tui/terminal-drafts.js\ndist/views/tui/terminal-drafts.js.map\ndist/views/tui/terminal-identity.d.ts\ndist/views/tui/terminal-identity.d.ts.map\ndist/views/tui/terminal-identity.js\ndist/views/tui/terminal-identity.js.map\ndist/views/tui/terminal-input-controller.d.ts\ndist/views/tui/terminal-input-controller.d.ts.map\ndist/views/tui/terminal-input-controller.js\ndist/views/tui/terminal-input-controller.js.map\ndist/views/tui/terminal-interaction-controller.d.ts\ndist/views/tui/terminal-interaction-controller.d.ts.map\ndist/views/tui/terminal-interaction-controller.js\ndist/views/tui/terminal-interaction-controller.js.map\ndist/views/tui/terminal-overlays.d.ts\ndist/views/tui/terminal-overlays.d.ts.map\ndist/views/tui/terminal-overlays.js\ndist/views/tui/terminal-overlays.js.map\ndist/views/tui/terminal-shell.d.ts\ndist/views/tui/terminal-shell.d.ts.map\ndist/views/tui/terminal-shell.js\ndist/views/tui/terminal-shell.js.map\ndist/views/tui/terminal-surface-overlays.d.ts\ndist/views/tui/terminal-surface-overlays.d.ts.map\ndist/views/tui/terminal-surface-overlays.js\ndist/views/tui/terminal-surface-overlays.js.map\ndist/views/tui/terminal-usage.d.ts\ndist/views/tui/terminal-usage.d.ts.map\ndist/views/tui/terminal-usage.js\ndist/views/tui/terminal-usage.js.map\ndist/views/tui/theme.d.ts\ndist/views/tui/theme.d.ts.map\ndist/views/tui/theme.js\ndist/views/tui/theme.js.map\ndist/views/tui/transcript.d.ts\ndist/views/tui/transcript.d.ts.map\ndist/views/tui/transcript.js\ndist/views/tui/transcript.js.map\nLICENSE\npackage.json\nREADME.md\nTHIRD_PARTY_LICENSES.json\nTHIRD_PARTY_NOTICES.md\n\u001b[94mTarball Details\u001b[39m\n/tmp/braid-live-pack-eV8ASJ/tangle-network-braid-0.3.0.tgz\n", - "stderr": "", - "durationMs": 993, - "timedOut": false, - "cleanupOk": true, - "termination": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": true, - "initialTree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } - } - }, - "install": { - "command": "npm", - "args": [ - "install", - "--no-audit", - "--no-fund", - "/tmp/braid-live-pack-eV8ASJ/tangle-network-braid-0.3.0.tgz" - ], - "code": 0, - "signal": null, - "stdout": "\nadded 68 packages in 5s\n", - "stderr": "npm warn deprecated koffi@3.1.4: Unstable Windows builds\nnpm warn allow-scripts 2 packages have install scripts not yet covered by allowScripts:\nnpm warn allow-scripts @dataiku/uv@0.12.0 (postinstall: node install.cjs)\nnpm warn allow-scripts koffi@3.1.4 (install: node ./cnoke.cjs -P . -D src/koffi --prebuild --release)\nnpm warn allow-scripts\nnpm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts ` to allow.\n", - "durationMs": 5311, - "timedOut": false, - "cleanupOk": true, - "termination": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": true, - "initialTree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } - } - }, - "version": { - "command": "/home/drew/.nvm/versions/node/v24.18.0/bin/node", - "args": [ - "/tmp/braid-live-install-bKXPm2/node_modules/@tangle-network/braid/dist/bin/braid.js", - "--version" - ], - "code": 0, - "signal": null, - "stdout": "0.3.0\n", - "stderr": "", - "durationMs": 47, - "timedOut": false, - "cleanupOk": true, - "termination": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": true, - "initialTree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } - } - }, - "artifact": { - "tarball": "tangle-network-braid-0.3.0.tgz", - "sha256": "a3fefc1e5e23b80e643a8d6bbc407e2eafb792ce9f89da0012b8a51cfbac6325", - "binary": "node_modules/@tangle-network/braid/dist/bin/braid.js" - }, - "provider": { - "package": "@tangle-network/agent-provider-cli-bridge", - "capabilities": { - "profile": { - "namedProfiles": false, - "systemPrompt": { - "replace": false, - "append": false - }, - "instructions": true, - "tools": true, - "permissions": true, - "mcp": true, - "subagents": true, - "resources": { - "files": true, - "instructions": true, - "tools": true, - "skills": true, - "agents": true, - "commands": true - }, - "hooks": false, - "modes": true, - "runtimeUpdate": false, - "validation": false - }, - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true - }, - "sessions": { - "continue": true, - "list": false, - "messages": false - }, - "retainedControl": { - "exactRunIdentity": true, - "resultIdentity": true, - "eventIdentity": true, - "cancellationIdempotency": true - }, - "workspace": { - "read": false, - "write": false, - "exec": false, - "git": false, - "upload": false, - "download": false - }, - "branching": { - "checkpoint": false, - "fork": false - }, - "placement": true, - "usage": true, - "confidential": false, - "observation": { - "identity": true, - "lifecycle": true, - "endpoint": true, - "placement": true, - "resources": false, - "resourceUse": false, - "modelUsage": true, - "computeBilling": false, - "accountUsage": false - } - } - }, - "analysis": { - "claim": "packed-analysis-readiness-only", - "python": { - "status": "ready", - "readiness": "ready" - }, - "ask": { - "readiness": "ready", - "status": "engine-configured", - "diagnostics": [] - } - }, - "credentialState": { - "configured": true, - "facility": "encrypted-headless", - "targetCount": 4, - "storedCount": 4, - "removedCount": 4 - }, - "error": { - "code": "LIVE_TARGET_FAILED", - "message": "At least one packed live target was failed", - "exitCode": 1, - "details": { - "target": { - "label": "claude-code sonnet", - "target": "claude-code/sonnet", - "profile": { - "path": ".braid/profiles/profile-claude-code-sonnet.json", - "harness": "claude-code", - "model": "sonnet" - }, - "connection": { - "id": "connection-live-cli-bridge", - "kind": "cli-bridge", - "endpoint": "http://127.0.0.1:3355", - "credentialConfigured": true - }, - "providerCapabilities": { - "profile": { - "namedProfiles": false, - "systemPrompt": { - "replace": false, - "append": false - }, - "instructions": true, - "tools": true, - "permissions": true, - "mcp": true, - "subagents": true, - "resources": { - "files": true, - "instructions": true, - "tools": true, - "skills": true, - "agents": true, - "commands": true - }, - "hooks": false, - "modes": true, - "runtimeUpdate": false, - "validation": false - }, - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true - }, - "sessions": { - "continue": true, - "list": false, - "messages": false - }, - "retainedControl": { - "exactRunIdentity": true, - "resultIdentity": true, - "eventIdentity": true, - "cancellationIdempotency": true - }, - "workspace": { - "read": false, - "write": false, - "exec": false, - "git": false, - "upload": false, - "download": false - }, - "branching": { - "checkpoint": false, - "fork": false + "activeCapabilities": { + "view": { + "conversation.create": { + "available": true, + "source": "application" }, - "placement": true, - "usage": true, - "confidential": false, - "observation": { - "identity": true, - "lifecycle": true, - "endpoint": true, - "placement": true, - "resources": false, - "resourceUse": false, - "modelUsage": true, - "computeBilling": false, - "accountUsage": false - } - }, - "requests": [ - { - "version": 1, - "requestId": "init-claude-code-sonnet", - "command": "initialize", - "params": { - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", - "subscribe": true - } + "conversation.open": { + "available": true, + "source": "application" }, - { - "version": 1, - "requestId": "send-claude-code-sonnet", - "operationId": "op-live-send-claude-code-sonnet", - "command": "send", - "params": { - "conversationId": "conv-1", - "branchId": "branch-1", - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK" - } + "run.runner": { + "available": true, + "source": "application" }, - { - "version": 1, - "requestId": "cancel-send-claude-code-sonnet", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "command": "send", - "params": { - "conversationId": "conv-1", - "branchId": "branch-1", - "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." - } + "run.model": { + "available": true, + "source": "application" }, - { - "version": 1, - "requestId": "cancel-claude-code-sonnet", - "operationId": "op-live-cancel-claude-code-sonnet", - "command": "cancel_run", - "params": { - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "reason": "live packed smoke cancellation" - } - } - ], - "operation": "cli-bridge.target-smoke", - "credentialLifecycle": { - "configured": true, - "stored": true, - "removed": true, - "facility": "encrypted-headless" - }, - "initialize": { - "version": 1, - "type": "ack", - "requestId": "init-claude-code-sonnet", - "revision": 4, - "command": "initialize" - }, - "conversationId": "conv-1", - "branchId": "branch-1", - "initialCapabilities": { - "view": { - "conversation.create": { - "available": true, - "source": "application" - }, - "conversation.open": { - "available": true, - "source": "application" - }, - "run.runner": { - "available": true, - "source": "application" - }, - "run.model": { - "available": true, - "source": "application" - }, - "run.effort": { - "available": true, - "source": "application" - }, - "conversation.branch": { - "available": true, - "source": "application" - }, - "conversation.clone": { - "available": true, - "source": "application" - }, - "conversation.fork": { - "available": true, - "source": "application" - }, - "analysis.ask": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "analysis.recipe": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" - }, - "analysis.compare": { - "available": false, - "source": "application", - "reason": "Two completed or failed runs are required for comparison" - }, - "interaction.respond": { - "available": false, - "source": "runtime", - "reason": "Interaction response is not exposed by the current runtime adapter" - }, - "interaction.automation": { - "available": false, - "source": "application", - "reason": "Interaction automation requires the shared response contract" - }, - "run.interactive": { - "available": false, - "source": "application", - "reason": "Native terminal mode requires an interactive TUI and a supported provider" - }, - "run.attach": { - "available": false, - "source": "application", - "reason": "Native terminal attachment requires an interactive TUI and a retained session" - }, - "supervisor.worker.attach": { - "available": false, - "source": "runtime", - "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" - }, - "export.create": { - "available": true, - "source": "application" - }, - "analysis.cancel": { - "available": false, - "source": "application", - "reason": "There is no running analysis to cancel" - }, - "application.quit": { - "available": true, - "source": "local" - }, - "help.read": { - "available": true, - "source": "local" - }, - "profile.select": { - "available": true, - "source": "application" - }, - "connection.select": { - "available": true, - "source": "application" - }, - "settings.open": { - "available": true, - "source": "application" - }, - "activity.read": { - "available": true, - "source": "local" - }, - "graph.read": { - "available": true, - "source": "local" - }, - "details.read": { - "available": true, - "source": "local" - }, - "supervisor.refresh": { - "available": true, - "source": "runtime" - }, - "supervisor.worker.steer": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to steer" - }, - "supervisor.worker.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervised worker to cancel" - }, - "supervisor.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no running supervisor to cancel" - }, - "draft.write": { - "available": true, - "source": "application" - }, - "run.send": { - "available": true, - "source": "provider" - }, - "run.cancel": { - "available": false, - "source": "runtime", - "reason": "There is no active run to cancel" - }, - "run.queue": { - "available": false, - "source": "provider", - "reason": "There is no active run" - }, - "run.steer": { - "available": false, - "source": "provider", - "reason": "There is no active run" - }, - "run.detach": { - "available": false, - "source": "provider", - "reason": "There is no active run" - }, - "run.reconnect": { - "available": false, - "source": "provider", - "reason": "There is no recoverable run to reconnect" - }, - "run.reconcile": { - "available": false, - "source": "provider", - "reason": "There is no recoverable run to reconcile" - } + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" }, - "analysisAsk": { + "analysis.ask": { "available": false, "source": "application", "reason": "Complete or fail a run before analyzing it" }, - "run": {} - }, - "send": { - "version": 1, - "type": "ack", - "requestId": "send-claude-code-sonnet", - "operationId": "op-live-send-claude-code-sonnet", - "revision": 4, - "replayed": false, - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "admission": { - "version": 1, - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "turnId": "turn-df965174-25ce-4080-ad08-32247f7bb757", - "operationId": "op-live-send-claude-code-sonnet", - "conversationId": "conv-1", - "branchId": "branch-1", - "admittedAt": "2026-08-29T00:20:55.662Z", - "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", - "requested": { - "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK", - "profile": { - "name": "Braid live claude-code/sonnet", - "description": "Opt-in packed CLI Bridge smoke profile", - "version": "0.1.0", - "model": { - "default": "sonnet", - "reasoningEffort": "none" - }, - "harness": "claude-code" - }, - "connectionId": "connection-live-cli-bridge", - "interactions": {}, - "model": "sonnet", - "runner": "claude-code" - }, - "capabilities": { - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true - }, - "sessions": { - "continue": true, - "messages": false - }, - "controls": { - "cancel": true, - "steer": false, - "queue": true, - "status": true, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": true, + "source": "runtime" + }, + "run.queue": { + "available": true, + "source": "provider" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": true, + "source": "provider" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect while another run is active" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile while another run is active" + } + }, + "analysisAsk": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "run": {} + }, + "normal": { + "status": "completed", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "run": { + "id": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "turnId": "turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7", + "operationId": "op-live-send-codex-default", + "status": "completed", + "startedAt": "2026-08-29T18:31:40.343Z", + "updatedAt": "2026-08-29T18:31:45.318Z", + "terminalAt": "2026-08-29T18:31:45.318Z", + "durationMs": 4975, + "inputTokens": 14611, + "outputTokens": 13, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "codex/default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "environmentId": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "controlRef": { + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "executionId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "requestDigest": "sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92" + }, + "materializationDigest": "b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f", + "cursor": "2:0", + "cursorCommittedSequence": 12, + "contentBytes": 73, + "receipt": { + "version": 1, + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "turnId": "turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7", + "operationId": "op-live-send-codex-default", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:40.334Z", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK", + "profile": { + "name": "Braid live codex/default", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "default", + "reasoningEffort": "none" + }, + "harness": "codex" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "default", + "runner": "codex" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, "recreate": true }, "events": { @@ -5373,6 +6100,11 @@ "eventIdentity": true, "cancellationIdempotency": true }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, "workspace": { "read": false, "write": false, @@ -5402,130 +6134,1080 @@ } }, "provider": "cli-bridge", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", "materializationReceipt": { "provider": "cli-bridge", "backend": "environment-provider", "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", "lifecycle": "retained-session", "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", - "model": "sonnet", - "route": "claude-code/sonnet", - "runner": "claude-code", - "providerRunId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe", + "model": "default", + "route": "codex/default", + "runner": "codex", + "providerRunId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", "retainedControl": "exact-after-dispatch" }, "admissionStatus": "admitted", - "requestDigest": "c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b", - "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", - "materializationDigest": "fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356", - "digest": "3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345" - }, - "command": "send" + "requestDigest": "7bfdff7fd48d40cd22a04810b00655357d2a50b295f4f8d5598c4b8de8169414", + "capabilitiesDigest": "7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a", + "materializationDigest": "b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f", + "digest": "4036280ea47d6ff6f7538e8a19ebaa7711e7c0e5dc5cbd6d26a9e5888cf33372" + } }, - "activeCapabilities": { - "view": { - "conversation.create": { - "available": true, - "source": "application" - }, - "conversation.open": { - "available": true, - "source": "application" - }, - "run.runner": { - "available": true, - "source": "application" - }, - "run.model": { - "available": true, - "source": "application" - }, - "run.effort": { - "available": true, - "source": "application" - }, - "conversation.branch": { - "available": true, - "source": "application" - }, - "conversation.clone": { - "available": true, - "source": "application" - }, - "conversation.fork": { - "available": true, - "source": "application" - }, - "analysis.ask": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" + "assistant": { + "id": "message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95", + "role": "assistant", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "status": "complete", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "parts": [ + { + "id": "op-live-send-codex-default:text", + "kind": "text", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "sourceEventId": "run-b587bde4-4bed-4a81-a459-06378d0649d1:final" + } + ] + }, + "finalText": "LIVE_BRAID_CODEX-DEFAULT_OK", + "marker": "LIVE_BRAID_CODEX-DEFAULT_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK", + "lastError": null + }, + "cancel": { + "prompt": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-codex-default", + "operationId": "op-live-cancel-send-codex-default", + "revision": 14, + "replayed": false, + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "admission": { + "version": 1, + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "turnId": "turn-7a284784-424e-49e7-96bd-9ada0b91ad98", + "operationId": "op-live-cancel-send-codex-default", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:45.905Z", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "requested": { + "text": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live codex/default", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "default", + "reasoningEffort": "none" + }, + "harness": "codex" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "default", + "runner": "codex" }, - "analysis.recipe": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } }, - "analysis.compare": { - "available": false, - "source": "application", - "reason": "Two completed or failed runs are required for comparison" + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe", + "model": "default", + "route": "codex/default", + "runner": "codex", + "providerRunId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "retainedControl": "exact-after-dispatch" }, - "interaction.respond": { - "available": false, - "source": "runtime", - "reason": "Interaction response is not exposed by the current runtime adapter" + "admissionStatus": "admitted", + "requestDigest": "4285c54f9240543634df5864c168c184f4152bc6bce6469ad27f38f65a490c87", + "capabilitiesDigest": "7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a", + "materializationDigest": "3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4", + "digest": "caca568134be09f5d0b484931e1d015d75b267449f21ec889c7b8db9a11a2eb8" + }, + "command": "send" + }, + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "activeRun": { + "id": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "turnId": "turn-7a284784-424e-49e7-96bd-9ada0b91ad98", + "operationId": "op-live-cancel-send-codex-default", + "status": "streaming", + "startedAt": "2026-08-29T18:31:45.913Z", + "updatedAt": "2026-08-29T18:31:45.913Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "materializationDigest": "3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-codex-default", + "revision": 26, + "operationId": "op-live-cancel-codex-default", + "command": "cancel_run", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "run": { + "id": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "turnId": "turn-7a284784-424e-49e7-96bd-9ada0b91ad98", + "operationId": "op-live-cancel-send-codex-default", + "status": "cancelled", + "startedAt": "2026-08-29T18:31:45.913Z", + "updatedAt": "2026-08-29T18:31:48.615Z", + "terminalAt": "2026-08-29T18:31:48.586Z", + "durationMs": 2673, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "completeness": "complete", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "environmentId": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "controlRef": { + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "executionId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "requestDigest": "sha256:19b06a5d8d19107753be0bf00aeebe9d73a8bb39c0aea823833ddbbc9d3fb680" + }, + "materializationDigest": "3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4", + "cursor": "3:0", + "cursorCommittedSequence": 25 + }, + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": false, + "advertisedByBraid": false, + "advertised": false, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "semanticAssertions": { + "cancel": "verified", + "interaction": "reported-unavailable" + }, + "targetProof": { + "key": "codex-default", + "harness": "codex", + "model": "default", + "route": "codex/default", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "materializationDigest": "b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f" + }, + "runIds": [ + "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84" + ], + "finalState": { + "version": 1, + "type": "state", + "requestId": "final-state-codex-default", + "revision": 28, + "projection": "full", + "state": { + "schemaVersion": 2, + "revision": 28, + "sequence": 28, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe", + "conversationId": "conv-1", + "branchId": "branch-1", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "updatedAt": "2026-08-29T18:31:45.913Z" + } + ], + "profile": { + "name": "Braid live codex/default", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "default", + "reasoningEffort": "none" }, - "interaction.automation": { - "available": false, - "source": "application", - "reason": "Interaction automation requires the shared response contract" + "harness": "codex" + }, + "runConfiguration": { + "profileName": "Braid live codex/default", + "runner": "codex", + "model": "default", + "effort": "none", + "connectionId": "connection-live-cli-bridge", + "overrides": {} + }, + "draft": "", + "messages": [ + { + "id": "message-13bba3e5-fbfb-49ef-b253-6eeea02342c8", + "role": "user", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK", + "status": "complete", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "parts": [ + { + "id": "part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8", + "kind": "text", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK" + } + ] }, - "run.interactive": { - "available": false, - "source": "application", - "reason": "Native terminal mode requires an interactive TUI and a supported provider" + { + "id": "message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95", + "role": "assistant", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "status": "complete", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "parts": [ + { + "id": "op-live-send-codex-default:text", + "kind": "text", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "sourceEventId": "run-b587bde4-4bed-4a81-a459-06378d0649d1:final" + } + ] }, - "run.attach": { - "available": false, - "source": "application", - "reason": "Native terminal attachment requires an interactive TUI and a retained session" + { + "id": "message-39cd9f56-e300-416f-8e1a-a15e2951db5c", + "role": "user", + "text": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "status": "complete", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "parts": [ + { + "id": "part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c", + "kind": "text", + "text": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + ] }, - "supervisor.worker.attach": { - "available": false, - "source": "runtime", - "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + { + "id": "message-18abac99-6c0b-43a2-85ce-8bc7938de902", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "parts": [] + } + ], + "runs": [ + { + "id": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "turnId": "turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7", + "operationId": "op-live-send-codex-default", + "status": "completed", + "startedAt": "2026-08-29T18:31:40.343Z", + "updatedAt": "2026-08-29T18:31:45.318Z", + "terminalAt": "2026-08-29T18:31:45.318Z", + "durationMs": 4975, + "inputTokens": 14611, + "outputTokens": 13, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "codex/default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "environmentId": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "controlRef": { + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "executionId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "requestDigest": "sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92" + }, + "materializationDigest": "b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f", + "cursor": "2:0", + "cursorCommittedSequence": 12, + "contentBytes": 73 }, - "export.create": { - "available": true, - "source": "application" + { + "id": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "turnId": "turn-7a284784-424e-49e7-96bd-9ada0b91ad98", + "operationId": "op-live-cancel-send-codex-default", + "status": "cancelled", + "startedAt": "2026-08-29T18:31:45.913Z", + "updatedAt": "2026-08-29T18:31:48.615Z", + "terminalAt": "2026-08-29T18:31:48.586Z", + "durationMs": 2673, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "completeness": "complete", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "environmentId": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "controlRef": { + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "executionId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "requestDigest": "sha256:19b06a5d8d19107753be0bf00aeebe9d73a8bb39c0aea823833ddbbc9d3fb680" + }, + "materializationDigest": "3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4", + "cursor": "3:0", + "cursorCommittedSequence": 25 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 2, + "input": 14611, + "output": 13, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 2, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 2, + "unknownLatencySources": 2 }, - "analysis.cancel": { - "available": false, - "source": "application", - "reason": "There is no running analysis to cancel" + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 }, - "application.quit": { - "available": true, - "source": "local" + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 }, - "help.read": { - "available": true, - "source": "local" + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:31:40.056Z", + "updatedAt": "2026-08-29T18:31:46.528Z" + } + ], + "interactions": [], + "queue": [], + "activeRunId": null, + "focusedRunId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "activeRuns": [], + "lastError": null + }, + "view": { + "revision": 28, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe", + "profileName": "Braid live codex/default", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "runner": "codex", + "model": "default", + "effort": "none", + "runOverrides": {}, + "connection": "Live local CLI Bridge", + "conversationId": "conv-1", + "conversationTitle": "New conversation", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "active": true, + "updatedAt": "2026-08-29T18:31:45.913Z" + } + ], + "branch": "branch-1", + "status": "cancelled", + "statusText": "cancelled", + "queueCount": 0, + "queue": [], + "messages": [ + { + "id": "message-13bba3e5-fbfb-49ef-b253-6eeea02342c8", + "role": "user", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK", + "status": "complete", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "parts": [ + { + "id": "part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8", + "kind": "text", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK" + } + ] }, - "profile.select": { - "available": true, - "source": "application" + { + "id": "message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95", + "role": "assistant", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "status": "complete", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "parts": [ + { + "id": "op-live-send-codex-default:text", + "kind": "text", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "sourceEventId": "run-b587bde4-4bed-4a81-a459-06378d0649d1:final" + } + ] }, - "connection.select": { - "available": true, - "source": "application" + { + "id": "message-39cd9f56-e300-416f-8e1a-a15e2951db5c", + "role": "user", + "text": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "status": "complete", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "parts": [ + { + "id": "part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c", + "kind": "text", + "text": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line." + } + ] }, - "settings.open": { + { + "id": "message-18abac99-6c0b-43a2-85ce-8bc7938de902", + "role": "assistant", + "text": "", + "status": "cancelled", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "parts": [] + } + ], + "hiddenMessageCount": 0, + "runs": [ + { + "id": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "turnId": "turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-live-send-codex-default", + "status": "completed", + "profileName": "Braid live codex/default", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "model": "codex/default", + "effort": "none", + "cursor": "2:0", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "usage": { + "input": 14611, + "output": 13, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "codex/default", + "elapsedMs": 4975 + }, + "runner": "codex", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "completeness": "complete", + "contentBytes": 73 + }, + { + "id": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "turnId": "turn-7a284784-424e-49e7-96bd-9ada0b91ad98", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-live-cancel-send-codex-default", + "status": "cancelled", + "profileName": "Braid live codex/default", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "model": "default", + "effort": "none", + "cursor": "3:0", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "requestedSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "usage": { + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "default", + "elapsedMs": 2673 + }, + "runner": "codex", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "completeness": "complete" + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 2, + "input": 14611, + "output": 13, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 2, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 2, + "unknownLatencySources": 2 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:31:40.056Z", + "updatedAt": "2026-08-29T18:31:46.528Z" + } + ], + "focusedRunId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "interactions": [], + "activity": [ + { + "id": "run:run-b587bde4-4bed-4a81-a459-06378d0649d1", + "kind": "run", + "title": "run run-b587bde4-4bed-4a81-a459-06378d0649d1", + "status": "completed", + "elapsedMs": 4975, + "startedAt": "2026-08-29T18:31:40.343Z", + "occurredAt": "2026-08-29T18:31:40.343Z", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "entityType": "run", + "entityId": "run-b587bde4-4bed-4a81-a459-06378d0649d1" + }, + { + "id": "activity:run-b587bde4-4bed-4a81-a459-06378d0649d1:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "completed", + "detail": "profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "occurredAt": "2026-08-29T18:31:45.318Z", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "entityType": "run", + "entityId": "run-b587bde4-4bed-4a81-a459-06378d0649d1" + }, + { + "id": "run:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "kind": "run", + "title": "run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "status": "cancelled", + "elapsedMs": 2673, + "startedAt": "2026-08-29T18:31:45.913Z", + "occurredAt": "2026-08-29T18:31:45.913Z", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "entityType": "run", + "entityId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84" + }, + { + "id": "environment:environment-dac2619b2ba7b4d5e584e97540d65d48", + "kind": "environment", + "title": "cli-bridge execution", + "status": "complete", + "detail": "local-process · local · explicit", + "startedAt": "2026-08-29T18:31:40.056Z", + "occurredAt": "2026-08-29T18:31:46.528Z", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "entityType": "environment", + "entityId": "environment-dac2619b2ba7b4d5e584e97540d65d48" + }, + { + "id": "activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "cancelled", + "detail": "profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "occurredAt": "2026-08-29T18:31:48.615Z", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "entityType": "run", + "entityId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84" + }, + { + "id": "activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:control:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "live packed smoke cancellation", + "occurredAt": "2026-08-29T18:31:48.615Z", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "entityType": "run", + "entityId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84" + }, + { + "id": "activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:status:local:cancelled", + "kind": "system", + "title": "cancelled", + "status": "cancelled", + "detail": "RUNTIME_STATUS", + "occurredAt": "2026-08-29T18:31:48.615Z", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "entityType": "run", + "entityId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84" + }, + { + "id": "activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:control.ack:local:cancel", + "kind": "system", + "title": "cancel", + "status": "cancelled", + "detail": "accepted", + "occurredAt": "2026-08-29T18:31:48.615Z", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "entityType": "run", + "entityId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84" + } + ], + "graph": [ + { + "id": "conv-1", + "type": "conversation", + "title": "New conversation", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-29T18:31:39.634Z" + }, + { + "id": "branch-1", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conv-1" + ], + "startedAt": "2026-08-29T18:31:39.634Z" + }, + { + "id": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "type": "environment", + "title": "cli-bridge execution", + "status": "complete", + "depth": 4, + "edgeLabel": "attached", + "parentIds": [ + "run:run-b587bde4-4bed-4a81-a459-06378d0649d1", + "run:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84" + ], + "runner": "cli-bridge", + "startedAt": "2026-08-29T18:31:40.056Z" + }, + { + "id": "turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7", + "type": "turn", + "title": "Turn", + "status": "complete", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:31:40.343Z" + }, + { + "id": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "type": "run", + "title": "Run", + "status": "completed", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7" + ], + "runner": "codex", + "elapsedMs": 4975, + "startedAt": "2026-08-29T18:31:40.343Z" + }, + { + "id": "turn-7a284784-424e-49e7-96bd-9ada0b91ad98", + "type": "turn", + "title": "Turn", + "status": "cancelled", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:31:45.913Z" + }, + { + "id": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "type": "run", + "title": "Run", + "status": "cancelled", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-7a284784-424e-49e7-96bd-9ada0b91ad98" + ], + "runner": "codex", + "elapsedMs": 2673, + "startedAt": "2026-08-29T18:31:45.913Z" + } + ], + "graphQuery": "", + "entityDetails": [ + { + "entityType": "environment", + "entityId": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "title": "cli-bridge execution", + "status": "ready", + "lines": [ + "provider: cli-bridge", + "execution: local-process · local", + "provider environment: cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ", + "connection: connection-live-cli-bridge", + "lifecycle: ready · retained · cleanup explicit", + "continuity: session", + "runtime endpoint host: 127.0.0.1", + "placement: requested not specified · verified unavailable", + "machine: unavailable · physical IP is not exposed", + "created: 2026-08-29T18:31:40.056Z", + "observed: 2026-08-29T18:31:46.528Z", + "unavailable: cli-subscription-and-quota:not-exposed-by-provider", + "unavailable: effective-resources:not-exposed-by-provider", + "unavailable: machine-specs:not-exposed-by-provider", + "unavailable: runtime-cpu-memory-usage:not-exposed-by-provider" + ] + } + ], + "details": { + "title": "run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "fields": [ + { + "label": "status", + "value": "cancelled" + }, + { + "label": "input tokens", + "value": "0" + }, + { + "label": "output tokens", + "value": "0" + }, + { + "label": "model", + "value": "default" + } + ] + }, + "capabilities": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": true, + "source": "application" + }, + "analysis.recipe": { + "available": true, + "source": "application" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { "available": true, "source": "application" }, @@ -5565,458 +7247,7776 @@ "source": "application" }, "run.send": { - "available": false, - "source": "application", - "reason": "A run is already active" + "available": true, + "source": "provider" }, "run.cancel": { - "available": true, - "source": "runtime" + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" }, "run.queue": { - "available": true, - "source": "provider" + "available": false, + "source": "provider", + "reason": "There is no active run" }, "run.steer": { "available": false, "source": "provider", - "reason": "The current runtime does not report steering support" + "reason": "There is no active run" }, "run.detach": { - "available": true, - "source": "provider" + "available": false, + "source": "provider", + "reason": "There is no active run" }, "run.reconnect": { "available": false, "source": "provider", - "reason": "Detach the active run before reconnecting it" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "Detach the active run before reconciling it" + "reason": "There is no recoverable run to reconcile" } }, - "analysisAsk": { - "available": false, - "source": "application", - "reason": "Complete or fail a run before analyzing it" + "draft": "", + "selectedSurface": "transcript", + "appearance": { + "color": "none", + "highContrast": false, + "reducedMotion": false + } + } + }, + "shutdown": { + "version": 1, + "type": "ack", + "requestId": "shutdown-codex-default", + "revision": 28, + "operationId": "op-live-shutdown-codex-default", + "command": "shutdown" + }, + "operationEvidence": { + "normal": { + "status": "completed", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "run": { + "id": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "turnId": "turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7", + "operationId": "op-live-send-codex-default", + "status": "completed", + "startedAt": "2026-08-29T18:31:40.343Z", + "updatedAt": "2026-08-29T18:31:45.318Z", + "terminalAt": "2026-08-29T18:31:45.318Z", + "durationMs": 4975, + "inputTokens": 14611, + "outputTokens": 13, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "codex/default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "environmentId": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "controlRef": { + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "executionId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "requestDigest": "sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92" + }, + "materializationDigest": "b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f", + "cursor": "2:0", + "cursorCommittedSequence": 12, + "contentBytes": 73, + "receipt": { + "version": 1, + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "turnId": "turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7", + "operationId": "op-live-send-codex-default", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:40.334Z", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK", + "profile": { + "name": "Braid live codex/default", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "codex" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "default", + "runner": "codex" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe", + "model": "default", + "route": "codex/default", + "runner": "codex", + "providerRunId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "7bfdff7fd48d40cd22a04810b00655357d2a50b295f4f8d5598c4b8de8169414", + "capabilitiesDigest": "7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a", + "materializationDigest": "b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f", + "digest": "4036280ea47d6ff6f7538e8a19ebaa7711e7c0e5dc5cbd6d26a9e5888cf33372" + } + }, + "assistant": { + "id": "message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95", + "role": "assistant", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "status": "complete", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "parts": [ + { + "id": "op-live-send-codex-default:text", + "kind": "text", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "sourceEventId": "run-b587bde4-4bed-4a81-a459-06378d0649d1:final" + } + ] + }, + "finalText": "LIVE_BRAID_CODEX-DEFAULT_OK", + "marker": "LIVE_BRAID_CODEX-DEFAULT_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK", + "lastError": null + }, + "cancel": { + "prompt": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "cancel-send-codex-default", + "operationId": "op-live-cancel-send-codex-default", + "revision": 14, + "replayed": false, + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "admission": { + "version": 1, + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "turnId": "turn-7a284784-424e-49e7-96bd-9ada0b91ad98", + "operationId": "op-live-cancel-send-codex-default", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:45.905Z", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "requested": { + "text": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live codex/default", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "codex" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "default", + "runner": "codex" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe", + "model": "default", + "route": "codex/default", + "runner": "codex", + "providerRunId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "4285c54f9240543634df5864c168c184f4152bc6bce6469ad27f38f65a490c87", + "capabilitiesDigest": "7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a", + "materializationDigest": "3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4", + "digest": "caca568134be09f5d0b484931e1d015d75b267449f21ec889c7b8db9a11a2eb8" + }, + "command": "send" + }, + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "activeRun": { + "id": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "turnId": "turn-7a284784-424e-49e7-96bd-9ada0b91ad98", + "operationId": "op-live-cancel-send-codex-default", + "status": "streaming", + "startedAt": "2026-08-29T18:31:45.913Z", + "updatedAt": "2026-08-29T18:31:45.913Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "materializationDigest": "3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "cancel-codex-default", + "revision": 26, + "operationId": "op-live-cancel-codex-default", + "command": "cancel_run", + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "run": { + "id": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "turnId": "turn-7a284784-424e-49e7-96bd-9ada0b91ad98", + "operationId": "op-live-cancel-send-codex-default", + "status": "cancelled", + "startedAt": "2026-08-29T18:31:45.913Z", + "updatedAt": "2026-08-29T18:31:48.615Z", + "terminalAt": "2026-08-29T18:31:48.586Z", + "durationMs": 2673, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "completeness": "complete", + "providerSessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "environmentId": "environment-dac2619b2ba7b4d5e584e97540d65d48", + "controlRef": { + "runId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ", + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "executionId": "run-bc48f7a9-3049-465e-8b4d-ec27159b2e84", + "requestDigest": "sha256:19b06a5d8d19107753be0bf00aeebe9d73a8bb39c0aea823833ddbbc9d3fb680" + }, + "materializationDigest": "3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4", + "cursor": "3:0", + "cursorCommittedSequence": 25 + }, + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": false, + "advertisedByBraid": false, + "advertised": false, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "targetProof": { + "key": "codex-default", + "harness": "codex", + "model": "default", + "route": "codex/default", + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "materializationDigest": "b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f" + } + }, + "operationReceipt": { + "operation": "cli-bridge.target-smoke", + "packed": true, + "runId": "run-b587bde4-4bed-4a81-a459-06378d0649d1", + "status": "passed" + }, + "status": "passed", + "stderr": "", + "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-codex-default\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-codex-default\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:39.634Z\"}],\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"runConfiguration\":{\"profileName\":\"Braid live codex/default\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:39.634Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:39.634Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-codex-default\",\"operationId\":\"op-live-send-codex-default\",\"revision\":4,\"replayed\":false,\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"admission\":{\"version\":1,\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"operationId\":\"op-live-send-codex-default\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:40.334Z\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"default\",\"runner\":\"codex\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":false},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"model\":\"default\",\"route\":\"codex/default\",\"runner\":\"codex\",\"providerRunId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"7bfdff7fd48d40cd22a04810b00655357d2a50b295f4f8d5598c4b8de8169414\",\"capabilitiesDigest\":\"7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a\",\"materializationDigest\":\"b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f\",\"digest\":\"4036280ea47d6ff6f7538e8a19ebaa7711e7c0e5dc5cbd6d26a9e5888cf33372\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"admission\":{\"version\":1,\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"operationId\":\"op-live-send-codex-default\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:40.334Z\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"default\",\"runner\":\"codex\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":false},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"model\":\"default\",\"route\":\"codex/default\",\"runner\":\"codex\",\"providerRunId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"7bfdff7fd48d40cd22a04810b00655357d2a50b295f4f8d5598c4b8de8169414\",\"capabilitiesDigest\":\"7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a\",\"materializationDigest\":\"b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f\",\"digest\":\"4036280ea47d6ff6f7538e8a19ebaa7711e7c0e5dc5cbd6d26a9e5888cf33372\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-codex-default-a4318861508d4e85324dccc2\",\"operationId\":\"op-live-send-codex-default\",\"effectKind\":\"run.execute\",\"requestDigest\":\"a4318861508d4e85324dccc2e7657e54207e3a82eb42e474e3c172ebfbcdb98a\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T18:31:40.355Z\",\"updatedAt\":\"2026-08-29T18:31:40.355Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-codex-default\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"runId\":\"retained-intent-run:cd8d3efd40e5b2296cf02155102e815407f6921b9046e1d991bcf534671ce908\",\"requestedProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"requestDigest\":\"sha256:cd8d3efd40e5b2296cf02155102e815407f6921b9046e1d991bcf534671ce908\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-codex-default\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:40.343Z\"}],\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"runConfiguration\":{\"profileName\":\"Braid live codex/default\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[]}],\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"updatedAt\":\"2026-08-29T18:31:40.343Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"materializationDigest\":\"b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"focusedRunId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"activeRuns\":[{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:40.343Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"running\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"default\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\"},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"focusedRunId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"kind\":\"run\",\"title\":\"run run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"status\":\"running\",\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"occurredAt\":\"2026-08-29T18:31:40.343Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"activity:run-b587bde4-4bed-4a81-a459-06378d0649d1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:40.343Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\"],\"runner\":\"codex\",\"startedAt\":\"2026-08-29T18:31:40.343Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"default\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect while another run is active\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile while another run is active\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-codex-default\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestDigest\":\"sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-codex-default\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"source\":{\"eventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:40.983Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T18:31:40.983Z\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\"},\"controlRef\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestDigest\":\"sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92\"},\"provider\":{\"eventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:40.983Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"source\":{\"eventId\":\"2:0\",\"providerSequence\":2,\"cursor\":\"2:0\",\"receivedAt\":\"2026-08-29T18:31:45.249Z\"},\"part\":{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"2:0\"},\"delta\":\"LIVE_BRAID_CODEX-DEFAULT_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"source\":{\"eventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T18:31:45.318Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"usage\":{\"input\":14611,\"output\":13,\"usdKnown\":false,\"model\":\"codex/default\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-codex-default-a4318861508d4e85324dccc2\",\"operationId\":\"op-live-send-codex-default\",\"effectKind\":\"run.execute\",\"requestDigest\":\"a4318861508d4e85324dccc2e7657e54207e3a82eb42e474e3c172ebfbcdb98a\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T18:31:40.355Z\",\"updatedAt\":\"2026-08-29T18:31:45.339Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-codex-default\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:40.343Z\"}],\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"runConfiguration\":{\"profileName\":\"Braid live codex/default\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]}],\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"updatedAt\":\"2026-08-29T18:31:45.318Z\",\"terminalAt\":\"2026-08-29T18:31:45.318Z\",\"durationMs\":4975,\"inputTokens\":14611,\"outputTokens\":13,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"controlRef\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestDigest\":\"sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92\"},\"materializationDigest\":\"b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":73}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":14611,\"output\":13,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:40.983Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:40.343Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"codex/default\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":14611,\"output\":13,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"elapsedMs\":4975},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"completeness\":\"complete\",\"contentBytes\":73}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":14611,\"output\":13,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:40.983Z\"}],\"focusedRunId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"kind\":\"run\",\"title\":\"run run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"status\":\"completed\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"occurredAt\":\"2026-08-29T18:31:40.343Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"environment:environment-dac2619b2ba7b4d5e584e97540d65d48\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:40.056Z\",\"occurredAt\":\"2026-08-29T18:31:40.983Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\"},{\"id\":\"activity:run-b587bde4-4bed-4a81-a459-06378d0649d1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:45.318Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:40.056Z\"},{\"id\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\"],\"runner\":\"codex\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:40.056Z\",\"observed: 2026-08-29T18:31:40.983Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"14611\"},{\"label\":\"output tokens\",\"value\":\"13\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"model\",\"value\":\"codex/default\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-codex-default\",\"operationId\":\"op-live-cancel-send-codex-default\",\"revision\":14,\"replayed\":false,\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"admission\":{\"version\":1,\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"operationId\":\"op-live-cancel-send-codex-default\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:45.905Z\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"requested\":{\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"default\",\"runner\":\"codex\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":false},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"model\":\"default\",\"route\":\"codex/default\",\"runner\":\"codex\",\"providerRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"4285c54f9240543634df5864c168c184f4152bc6bce6469ad27f38f65a490c87\",\"capabilitiesDigest\":\"7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a\",\"materializationDigest\":\"3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4\",\"digest\":\"caca568134be09f5d0b484931e1d015d75b267449f21ec889c7b8db9a11a2eb8\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"operationId\":\"op-live-cancel-send-codex-default\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T18:31:45.905Z\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"requested\":{\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"default\",\"runner\":\"codex\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":false},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"contextTransfer\":{\"freshSession\":true,\"requestIdempotency\":true,\"lookup\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"provider-owned\",\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"model\":\"default\",\"route\":\"codex/default\",\"runner\":\"codex\",\"providerRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"4285c54f9240543634df5864c168c184f4152bc6bce6469ad27f38f65a490c87\",\"capabilitiesDigest\":\"7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a\",\"materializationDigest\":\"3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4\",\"digest\":\"caca568134be09f5d0b484931e1d015d75b267449f21ec889c7b8db9a11a2eb8\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-codex-default-f4764a1ddbad9e7948c313ac\",\"operationId\":\"op-live-cancel-send-codex-default\",\"effectKind\":\"run.execute\",\"requestDigest\":\"f4764a1ddbad9e7948c313ac4a0c6c61dade489fd6e9eb899128e7115e77b0a2\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T18:31:45.923Z\",\"updatedAt\":\"2026-08-29T18:31:45.923Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-codex-default\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"runId\":\"retained-intent-run:8951666125083ca0d622b8178d436f5e07991c6c111f64c276843ee326d1dfcc\",\"requestedProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"requestDigest\":\"sha256:8951666125083ca0d622b8178d436f5e07991c6c111f64c276843ee326d1dfcc\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-codex-default\",\"revision\":16,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":16,\"sequence\":16,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:45.913Z\"}],\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"runConfiguration\":{\"profileName\":\"Braid live codex/default\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]},{\"id\":\"message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[{\"id\":\"part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-18abac99-6c0b-43a2-85ce-8bc7938de902\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[]}],\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"updatedAt\":\"2026-08-29T18:31:45.318Z\",\"terminalAt\":\"2026-08-29T18:31:45.318Z\",\"durationMs\":4975,\"inputTokens\":14611,\"outputTokens\":13,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"controlRef\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestDigest\":\"sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92\"},\"materializationDigest\":\"b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":73},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"operationId\":\"op-live-cancel-send-codex-default\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T18:31:45.913Z\",\"updatedAt\":\"2026-08-29T18:31:45.913Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"materializationDigest\":\"3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":14611,\"output\":13,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:40.983Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"focusedRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"activeRuns\":[{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":16,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:45.913Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]},{\"id\":\"message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[{\"id\":\"part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-18abac99-6c0b-43a2-85ce-8bc7938de902\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"codex/default\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":14611,\"output\":13,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"elapsedMs\":4975},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"completeness\":\"complete\",\"contentBytes\":73},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-codex-default\",\"status\":\"running\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"default\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\"},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":14611,\"output\":13,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:40.983Z\"}],\"activeRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"focusedRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"kind\":\"run\",\"title\":\"run run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"status\":\"completed\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"occurredAt\":\"2026-08-29T18:31:40.343Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"environment:environment-dac2619b2ba7b4d5e584e97540d65d48\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:40.056Z\",\"occurredAt\":\"2026-08-29T18:31:40.983Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\"},{\"id\":\"activity:run-b587bde4-4bed-4a81-a459-06378d0649d1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:45.318Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"run:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"kind\":\"run\",\"title\":\"run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"status\":\"running\",\"startedAt\":\"2026-08-29T18:31:45.913Z\",\"occurredAt\":\"2026-08-29T18:31:45.913Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:45.913Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:40.056Z\"},{\"id\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\"],\"runner\":\"codex\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:45.913Z\"},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-7a284784-424e-49e7-96bd-9ada0b91ad98\"],\"runner\":\"codex\",\"startedAt\":\"2026-08-29T18:31:45.913Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:40.056Z\",\"observed: 2026-08-29T18:31:40.983Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"default\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect while another run is active\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile while another run is active\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-codex-default\",\"revision\":26,\"operationId\":\"op-live-cancel-codex-default\",\"command\":\"cancel_run\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"control\":\"cancel\",\"outcome\":\"accepted\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"control\":{\"operationId\":\"op-live-cancel-codex-default\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"control\":{\"operationId\":\"op-live-cancel-codex-default\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-codex-default-c2806ef6d086feac783a640f\",\"operationId\":\"op-live-cancel-codex-default\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"c2806ef6d086feac783a640fc7d543ac3858614f3793d13833841b260ec09a14\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T18:31:45.998Z\",\"updatedAt\":\"2026-08-29T18:31:45.998Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-codex-default\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"requestDigest\":\"sha256:19b06a5d8d19107753be0bf00aeebe9d73a8bb39c0aea823833ddbbc9d3fb680\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-codex-default\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"source\":{\"eventId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:46.528Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T18:31:45.630Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T18:31:46.528Z\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\"},\"controlRef\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"requestDigest\":\"sha256:19b06a5d8d19107753be0bf00aeebe9d73a8bb39c0aea823833ddbbc9d3fb680\"},\"provider\":{\"eventId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T18:31:46.528Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"run.status.changed\",\"payload\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"source\":{\"eventId\":\"3:0\",\"providerSequence\":2,\"cursor\":\"3:0\",\"receivedAt\":\"2026-08-29T18:31:48.586Z\"},\"value\":{\"kind\":\"run.status.changed\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"status\":\"cancelled\",\"detail\":\"RUNTIME_STATUS\",\"provider\":{\"eventId\":\"3:0\",\"providerSequence\":2,\"cursor\":\"3:0\",\"receivedAt\":\"2026-08-29T18:31:48.586Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-codex-default-c2806ef6d086feac783a640f\",\"operationId\":\"op-live-cancel-codex-default\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"c2806ef6d086feac783a640fc7d543ac3858614f3793d13833841b260ec09a14\",\"kind\":\"custom\",\"status\":\"acknowledged\",\"attempt\":1,\"outcomeDigest\":\"f430d9c9c101fec536eed9da90bf212be94a7c138332862d1e9774b1266d9187\",\"createdAt\":\"2026-08-29T18:31:45.998Z\",\"updatedAt\":\"2026-08-29T18:31:48.601Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"control\":{\"operationId\":\"op-live-cancel-codex-default\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"control\":\"cancel\",\"status\":\"accepted\",\"detail\":\"CONTROL_DETAIL\"}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-codex-default\",\"revision\":27,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":27,\"sequence\":27,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:45.913Z\"}],\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"runConfiguration\":{\"profileName\":\"Braid live codex/default\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]},{\"id\":\"message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[{\"id\":\"part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-18abac99-6c0b-43a2-85ce-8bc7938de902\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[]}],\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"updatedAt\":\"2026-08-29T18:31:45.318Z\",\"terminalAt\":\"2026-08-29T18:31:45.318Z\",\"durationMs\":4975,\"inputTokens\":14611,\"outputTokens\":13,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"controlRef\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestDigest\":\"sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92\"},\"materializationDigest\":\"b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":73},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"operationId\":\"op-live-cancel-send-codex-default\",\"status\":\"cancelled\",\"startedAt\":\"2026-08-29T18:31:45.913Z\",\"updatedAt\":\"2026-08-29T18:31:48.615Z\",\"terminalAt\":\"2026-08-29T18:31:48.586Z\",\"durationMs\":2673,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"controlRef\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"requestDigest\":\"sha256:19b06a5d8d19107753be0bf00aeebe9d73a8bb39c0aea823833ddbbc9d3fb680\"},\"materializationDigest\":\"3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4\",\"cursor\":\"3:0\",\"cursorCommittedSequence\":25}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":14611,\"output\":13,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:46.528Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":27,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:45.913Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]},{\"id\":\"message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[{\"id\":\"part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-18abac99-6c0b-43a2-85ce-8bc7938de902\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"codex/default\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":14611,\"output\":13,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"elapsedMs\":4975},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"completeness\":\"complete\",\"contentBytes\":73},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-codex-default\",\"status\":\"cancelled\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"default\",\"effort\":\"none\",\"cursor\":\"3:0\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\",\"elapsedMs\":2673},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"completeness\":\"complete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":14611,\"output\":13,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:46.528Z\"}],\"focusedRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"kind\":\"run\",\"title\":\"run run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"status\":\"completed\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"occurredAt\":\"2026-08-29T18:31:40.343Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"activity:run-b587bde4-4bed-4a81-a459-06378d0649d1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:45.318Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"run:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"kind\":\"run\",\"title\":\"run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"status\":\"cancelled\",\"elapsedMs\":2673,\"startedAt\":\"2026-08-29T18:31:45.913Z\",\"occurredAt\":\"2026-08-29T18:31:45.913Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"environment:environment-dac2619b2ba7b4d5e584e97540d65d48\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:40.056Z\",\"occurredAt\":\"2026-08-29T18:31:46.528Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:status:local:cancelled\",\"kind\":\"system\",\"title\":\"cancelled\",\"status\":\"cancelled\",\"detail\":\"RUNTIME_STATUS\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"run:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:40.056Z\"},{\"id\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\"],\"runner\":\"codex\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:45.913Z\"},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-7a284784-424e-49e7-96bd-9ada0b91ad98\"],\"runner\":\"codex\",\"elapsedMs\":2673,\"startedAt\":\"2026-08-29T18:31:45.913Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:40.056Z\",\"observed: 2026-08-29T18:31:46.528Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"fields\":[{\"label\":\"status\",\"value\":\"cancelled\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"default\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-codex-default-f4764a1ddbad9e7948c313ac\",\"operationId\":\"op-live-cancel-send-codex-default\",\"effectKind\":\"run.execute\",\"requestDigest\":\"f4764a1ddbad9e7948c313ac4a0c6c61dade489fd6e9eb899128e7115e77b0a2\",\"kind\":\"send\",\"status\":\"failed\",\"attempt\":1,\"outcomeDigest\":\"d24c82d38b67b87e0cedfdb94e744a756b05cf549010c2c2bc224235561005cb\",\"createdAt\":\"2026-08-29T18:31:45.923Z\",\"updatedAt\":\"2026-08-29T18:31:48.630Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-codex-default\",\"revision\":28,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":28,\"sequence\":28,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:45.913Z\"}],\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"runConfiguration\":{\"profileName\":\"Braid live codex/default\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]},{\"id\":\"message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[{\"id\":\"part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-18abac99-6c0b-43a2-85ce-8bc7938de902\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[]}],\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"updatedAt\":\"2026-08-29T18:31:45.318Z\",\"terminalAt\":\"2026-08-29T18:31:45.318Z\",\"durationMs\":4975,\"inputTokens\":14611,\"outputTokens\":13,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"controlRef\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestDigest\":\"sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92\"},\"materializationDigest\":\"b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":73},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"operationId\":\"op-live-cancel-send-codex-default\",\"status\":\"cancelled\",\"startedAt\":\"2026-08-29T18:31:45.913Z\",\"updatedAt\":\"2026-08-29T18:31:48.615Z\",\"terminalAt\":\"2026-08-29T18:31:48.586Z\",\"durationMs\":2673,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"controlRef\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"requestDigest\":\"sha256:19b06a5d8d19107753be0bf00aeebe9d73a8bb39c0aea823833ddbbc9d3fb680\"},\"materializationDigest\":\"3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4\",\"cursor\":\"3:0\",\"cursorCommittedSequence\":25}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":14611,\"output\":13,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:46.528Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":28,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:45.913Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]},{\"id\":\"message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[{\"id\":\"part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-18abac99-6c0b-43a2-85ce-8bc7938de902\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"codex/default\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":14611,\"output\":13,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"elapsedMs\":4975},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"completeness\":\"complete\",\"contentBytes\":73},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-codex-default\",\"status\":\"cancelled\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"default\",\"effort\":\"none\",\"cursor\":\"3:0\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\",\"elapsedMs\":2673},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"completeness\":\"complete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":14611,\"output\":13,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:46.528Z\"}],\"focusedRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"kind\":\"run\",\"title\":\"run run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"status\":\"completed\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"occurredAt\":\"2026-08-29T18:31:40.343Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"activity:run-b587bde4-4bed-4a81-a459-06378d0649d1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:45.318Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"run:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"kind\":\"run\",\"title\":\"run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"status\":\"cancelled\",\"elapsedMs\":2673,\"startedAt\":\"2026-08-29T18:31:45.913Z\",\"occurredAt\":\"2026-08-29T18:31:45.913Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"environment:environment-dac2619b2ba7b4d5e584e97540d65d48\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:40.056Z\",\"occurredAt\":\"2026-08-29T18:31:46.528Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:status:local:cancelled\",\"kind\":\"system\",\"title\":\"cancelled\",\"status\":\"cancelled\",\"detail\":\"RUNTIME_STATUS\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"run:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:40.056Z\"},{\"id\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\"],\"runner\":\"codex\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:45.913Z\"},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-7a284784-424e-49e7-96bd-9ada0b91ad98\"],\"runner\":\"codex\",\"elapsedMs\":2673,\"startedAt\":\"2026-08-29T18:31:45.913Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:40.056Z\",\"observed: 2026-08-29T18:31:46.528Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"fields\":[{\"label\":\"status\",\"value\":\"cancelled\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"default\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"final-state-codex-default\",\"revision\":28,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":28,\"sequence\":28,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T18:31:45.913Z\"}],\"profile\":{\"name\":\"Braid live codex/default\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"default\",\"reasoningEffort\":\"none\"},\"harness\":\"codex\"},\"runConfiguration\":{\"profileName\":\"Braid live codex/default\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]},{\"id\":\"message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[{\"id\":\"part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-18abac99-6c0b-43a2-85ce-8bc7938de902\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[]}],\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"updatedAt\":\"2026-08-29T18:31:45.318Z\",\"terminalAt\":\"2026-08-29T18:31:45.318Z\",\"durationMs\":4975,\"inputTokens\":14611,\"outputTokens\":13,\"tokensKnown\":true,\"usdKnown\":false,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"controlRef\":{\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestDigest\":\"sha256:01fae8892b65b7b2cdae1a55ce8d539f867cfd6740b553ea73c66b926b935c92\"},\"materializationDigest\":\"b76ec68ef56bd6ac6ee2faf225b643a3bce4157e4df440ec600bf54b739c682f\",\"cursor\":\"2:0\",\"cursorCommittedSequence\":12,\"contentBytes\":73},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"operationId\":\"op-live-cancel-send-codex-default\",\"status\":\"cancelled\",\"startedAt\":\"2026-08-29T18:31:45.913Z\",\"updatedAt\":\"2026-08-29T18:31:48.615Z\",\"terminalAt\":\"2026-08-29T18:31:48.586Z\",\"durationMs\":2673,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\",\"provider\":\"cli-bridge\",\"runner\":\"codex\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"controlRef\":{\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"sessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"executionId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"requestDigest\":\"sha256:19b06a5d8d19107753be0bf00aeebe9d73a8bb39c0aea823833ddbbc9d3fb680\"},\"materializationDigest\":\"3e486e93bca69d0da608fbb33cf96f2bd9bcf1443dec134a19ed699ef6521be4\",\"cursor\":\"3:0\",\"cursorCommittedSequence\":25}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":14611,\"output\":13,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:46.528Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":28,\"workspace\":\"/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-638eab96-0ae5-4148-a3c4-239e314d37fe\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"runner\":\"codex\",\"model\":\"default\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T18:31:45.913Z\"}],\"branch\":\"branch-1\",\"status\":\"cancelled\",\"statusText\":\"cancelled\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"part-message-13bba3e5-fbfb-49ef-b253-6eeea02342c8\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK\"}]},{\"id\":\"message-a76e307c-6ed7-46d1-8a8b-6dd6d57aed95\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"status\":\"complete\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"parts\":[{\"id\":\"op-live-send-codex-default:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CODEX-DEFAULT_OK\",\"sourceEventId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1:final\"}]},{\"id\":\"message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[{\"id\":\"part-message-39cd9f56-e300-416f-8e1a-a15e2951db5c\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-18abac99-6c0b-43a2-85ce-8bc7938de902\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"cancelled\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"turnId\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-codex-default\",\"status\":\"completed\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"codex/default\",\"effort\":\"none\",\"cursor\":\"2:0\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":14611,\"output\":13,\"tokenStatus\":\"complete\",\"costStatus\":\"unknown\",\"model\":\"codex/default\",\"elapsedMs\":4975},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"completeness\":\"complete\",\"contentBytes\":73},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"turnId\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-codex-default\",\"status\":\"cancelled\",\"profileName\":\"Braid live codex/default\",\"profileDigest\":\"6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"model\":\"default\",\"effort\":\"none\",\"cursor\":\"3:0\",\"providerSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"requestedSessionId\":\"session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"default\",\"elapsedMs\":2673},\"runner\":\"codex\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"completeness\":\"complete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":14611,\"output\":13,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":2,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"providerEnvironmentId\":\"cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T18:31:40.056Z\",\"updatedAt\":\"2026-08-29T18:31:46.528Z\"}],\"focusedRunId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"kind\":\"run\",\"title\":\"run run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"status\":\"completed\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\",\"occurredAt\":\"2026-08-29T18:31:40.343Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"activity:run-b587bde4-4bed-4a81-a459-06378d0649d1:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:45.318Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"run\",\"entityId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\"},{\"id\":\"run:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"kind\":\"run\",\"title\":\"run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"status\":\"cancelled\",\"elapsedMs\":2673,\"startedAt\":\"2026-08-29T18:31:45.913Z\",\"occurredAt\":\"2026-08-29T18:31:45.913Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"environment:environment-dac2619b2ba7b4d5e584e97540d65d48\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T18:31:40.056Z\",\"occurredAt\":\"2026-08-29T18:31:46.528Z\",\"runId\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"cancelled\",\"detail\":\"profile 6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:status:local:cancelled\",\"kind\":\"system\",\"title\":\"cancelled\",\"status\":\"cancelled\",\"detail\":\"RUNTIME_STATUS\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"},{\"id\":\"activity:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"cancelled\",\"detail\":\"accepted\",\"occurredAt\":\"2026-08-29T18:31:48.615Z\",\"runId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"entityType\":\"run\",\"entityId\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T18:31:39.634Z\"},{\"id\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"run:run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T18:31:40.056Z\"},{\"id\":\"turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"run-b587bde4-4bed-4a81-a459-06378d0649d1\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-ef35fd70-d192-4a39-84bb-4415ef9fd6a7\"],\"runner\":\"codex\",\"elapsedMs\":4975,\"startedAt\":\"2026-08-29T18:31:40.343Z\"},{\"id\":\"turn-7a284784-424e-49e7-96bd-9ada0b91ad98\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"cancelled\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T18:31:45.913Z\"},{\"id\":\"run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"cancelled\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-7a284784-424e-49e7-96bd-9ada0b91ad98\"],\"runner\":\"codex\",\"elapsedMs\":2673,\"startedAt\":\"2026-08-29T18:31:45.913Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-dac2619b2ba7b4d5e584e97540d65d48\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"provider environment: cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6OGYyYjlkMmU5NjM1MWFhYzM0N2YxODNjZjY3OWRmYzY2MGM5ZmU5OTA0YWE5OGNlN2NmNDgwNGNmMWZkMTU0MSIsIkhNV3FPNDUwMTdzQ2thT2g4QlBmTnlvMktzVUw2anZ3S0pkQS1jRy1NOUkiXQ\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T18:31:40.056Z\",\"observed: 2026-08-29T18:31:46.528Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-bc48f7a9-3049-465e-8b4d-ec27159b2e84\",\"fields\":[{\"label\":\"status\",\"value\":\"cancelled\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"default\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"shutdown-codex-default\",\"revision\":28,\"operationId\":\"op-live-shutdown-codex-default\",\"command\":\"shutdown\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-live-shutdown-codex-default\"}}}}\n", + "process": { + "processIdentity": { + "instanceId": "850c878b-35b6-4db3-a669-184befe6cddd", + "pid": 3360326, + "startedAt": 1788028299145 + }, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 3360326 + ], + "roots": [ + 3360326 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "natural": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 3360326 + ], + "roots": [ + 3360326 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": 0, + "signal": null + } + }, + "providerSessionCleanup": { + "attempted": 1, + "closed": 0, + "alreadyAbsent": 1, + "released": 1, + "complete": true, + "results": [ + { + "sessionId": "session-braid-run-b587bde4-4bed-4a81-a459-06378d0649d1", + "status": 404, + "closed": false, + "alreadyAbsent": true, + "released": true + } + ] + } + } + ], + "releaseProofs": [ + { + "requirementId": "LIVE-01", + "operation": "cli-bridge.pi.conformance", + "target": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash" + }, + "status": "passed", + "packed": true, + "runId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "measurement": { + "kind": "scalar", + "name": "LIVE-01", + "unit": "successful-packed-live-operation", + "value": 1 + } + }, + { + "requirementId": "LIVE-02", + "operation": "cli-bridge.codex.cross-runner-handoff", + "target": { + "key": "codex-default", + "harness": "codex", + "model": "default" + }, + "status": "passed", + "packed": true, + "runId": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "measurement": { + "kind": "scalar", + "name": "LIVE-02", + "unit": "successful-packed-live-operation", + "value": 1 + } + }, + { + "requirementId": "LIVE-03", + "operation": "cli-bridge.interactive-protocol", + "target": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash" + }, + "status": "passed", + "packed": true, + "runId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "measurement": { + "kind": "scalar", + "name": "LIVE-03", + "unit": "successful-packed-live-operation", + "value": 1 + } + }, + { + "requirementId": "LIVE-04", + "operation": "cli-bridge.restart-reconciliation", + "target": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash" + }, + "status": "passed", + "packed": true, + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "measurement": { + "kind": "scalar", + "name": "LIVE-04", + "unit": "successful-packed-live-operation", + "value": 1 + } + }, + { + "requirementId": "LIVE-05", + "operation": "cli-bridge.runner-conformance", + "target": { + "key": "glm-5.2", + "harness": "opencode", + "provider": "zai-coding-plan", + "model": "glm-5.2" + }, + "status": "passed", + "packed": true, + "runId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "measurement": { + "kind": "scalar", + "name": "LIVE-05", + "unit": "successful-packed-live-operation", + "value": 1 + } + }, + { + "requirementId": "LIVE-05", + "operation": "cli-bridge.runner-conformance", + "target": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash" + }, + "status": "passed", + "packed": true, + "runId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "measurement": { + "kind": "scalar", + "name": "LIVE-05", + "unit": "successful-packed-live-operation", + "value": 1 + } + }, + { + "requirementId": "LIVE-05", + "operation": "cli-bridge.runner-conformance", + "target": { + "key": "codex-default", + "harness": "codex", + "model": "default" + }, + "status": "passed", + "packed": true, + "runId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "measurement": { + "kind": "scalar", + "name": "LIVE-05", + "unit": "successful-packed-live-operation", + "value": 1 + } + } + ], + "releaseOperations": [ + { + "requirementId": "LIVE-01", + "operation": "cli-bridge.pi.conformance", + "target": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash" + }, + "status": "passed", + "packed": true, + "runId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "evidence": { + "normal": { + "status": "completed", + "runId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "run": { + "id": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "turnId": "turn-aa016e7b-2412-45bf-b2ff-e29ee1e958a0", + "operationId": "op-pi-conformance-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T18:31:50.519Z", + "updatedAt": "2026-08-29T18:31:54.914Z", + "terminalAt": "2026-08-29T18:31:54.914Z", + "durationMs": 4395, + "inputTokens": 1010, + "outputTokens": 62, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "reasoningTokens": 37, + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "environmentId": "environment-ed65d533989e52f78ed3eb645bfa6e0c", + "controlRef": { + "runId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6OTk3NGU4MzhmMzM3MGRhNTcwZmJiZjU5YjkzYTJmOTI5NzMwNjEwZTQ1M2FkZTU1OThiNTQwZGZmNjQzMTNjYSIsIlJJdVRlbTl1RmcyY09JckV5YThvek9jY3lNeFMyWmdRRHZoSVZWUk5jM0EiXQ", + "sessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "executionId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "requestDigest": "sha256:e8c4674c10b4dfd7c60a4a7ce37fcf9f6726f69306524c172cbc6ee238ec5833" + }, + "materializationDigest": "ab7a5ec158e8ea520fc39080fffdd6d3f41ef5381a2fae8ecd673bc2b38c56c8", + "cursor": "76", + "cursorCommittedSequence": 87, + "contentBytes": 543, + "receipt": { + "version": 1, + "runId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "turnId": "turn-aa016e7b-2412-45bf-b2ff-e29ee1e958a0", + "operationId": "op-pi-conformance-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:50.510Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "nativeContinuation": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "interactions": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-fcd73619-9473-48f4-a74b-bf3b21edb8e7", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "d312ea2746034ed1afecae6cd29c5bf0579bbf89f459afaff1dd5dbbbf4245ab", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "ab7a5ec158e8ea520fc39080fffdd6d3f41ef5381a2fae8ecd673bc2b38c56c8", + "digest": "e44d2ebb2b0d81c15c6e070e0d729f4b1bb47a8a805ef41a7531497259083228" + } + }, + "assistant": { + "id": "message-2b4f7016-2842-4076-90b1-de21fff41387", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "parts": [ + { + "id": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af:message:0:reasoning", + "kind": "reasoning", + "text": "The user is asking me to output only a specific token with no punctuation or explanation. This appears to be a system test or verification request. Let me just output the token as requested.", + "sourceEventId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af:70" + }, + { + "id": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af:message:1:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af:final" + } + ] + }, + "finalText": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "marker": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "lastError": null + }, + "cancel": { + "prompt": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "pi-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-pi-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "revision": 89, + "replayed": false, + "runId": "run-c6b28502-f70b-468c-bff0-76104ef01722", + "admission": { + "version": 1, + "runId": "run-c6b28502-f70b-468c-bff0-76104ef01722", + "turnId": "turn-f8a36c30-f035-48af-b7e4-eb6bef7ebdba", + "operationId": "op-pi-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:55.601Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "nativeContinuation": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "interactions": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "providerSessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-fcd73619-9473-48f4-a74b-bf3b21edb8e7", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-c6b28502-f70b-468c-bff0-76104ef01722", + "retainedControl": "exact-after-dispatch" + }, + "nativeContextBoundaryProof": { + "runId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6OTk3NGU4MzhmMzM3MGRhNTcwZmJiZjU5YjkzYTJmOTI5NzMwNjEwZTQ1M2FkZTU1OThiNTQwZGZmNjQzMTNjYSIsIlJJdVRlbTl1RmcyY09JckV5YThvek9jY3lNeFMyWmdRRHZoSVZWUk5jM0EiXQ", + "sessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "executionId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "requestDigest": "sha256:e8c4674c10b4dfd7c60a4a7ce37fcf9f6726f69306524c172cbc6ee238ec5833", + "boundary": { + "kind": "revision", + "revision": "pi:61ea9297-d4ce-496c-852f-a59bd834c104:2" + }, + "observedAt": "2026-08-29T18:31:54.840Z" + }, + "admissionStatus": "admitted", + "requestDigest": "a7b519f24435c63ae3ee10efe5da7744733936c6a1131572e8391411e151e706", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "b9411273ff6861eeba78ee33bf3c4b33b7292a91cd75c39aebc146254888e3af", + "digest": "3722433432e9815ba502525e57b8837447809594df15205b277813924a0347fa" + }, + "command": "send" + }, + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-c6b28502-f70b-468c-bff0-76104ef01722", + "activeRun": { + "id": "run-c6b28502-f70b-468c-bff0-76104ef01722", + "turnId": "turn-f8a36c30-f035-48af-b7e4-eb6bef7ebdba", + "operationId": "op-pi-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "streaming", + "startedAt": "2026-08-29T18:31:55.610Z", + "updatedAt": "2026-08-29T18:31:55.610Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "materializationDigest": "b9411273ff6861eeba78ee33bf3c4b33b7292a91cd75c39aebc146254888e3af" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "pi-conformance-cancel-pi-tangle-router-deepseek-v4-flash", + "revision": 106, + "operationId": "op-pi-conformance-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "runId": "run-c6b28502-f70b-468c-bff0-76104ef01722", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "run": { + "id": "run-c6b28502-f70b-468c-bff0-76104ef01722", + "turnId": "turn-f8a36c30-f035-48af-b7e4-eb6bef7ebdba", + "operationId": "op-pi-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T18:31:55.610Z", + "updatedAt": "2026-08-29T18:31:56.688Z", + "terminalAt": "2026-08-29T18:31:56.688Z", + "durationMs": 1078, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "completeness": "complete", + "providerSessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "environmentId": "environment-ed65d533989e52f78ed3eb645bfa6e0c", + "controlRef": { + "runId": "run-c6b28502-f70b-468c-bff0-76104ef01722", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6OTk3NGU4MzhmMzM3MGRhNTcwZmJiZjU5YjkzYTJmOTI5NzMwNjEwZTQ1M2FkZTU1OThiNTQwZGZmNjQzMTNjYSIsIlJJdVRlbTl1RmcyY09JckV5YThvek9jY3lNeFMyWmdRRHZoSVZWUk5jM0EiXQ", + "sessionId": "session-braid-run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "executionId": "run-c6b28502-f70b-468c-bff0-76104ef01722", + "requestDigest": "sha256:ba26771378bbe0c1d58d4a5fec1ddcc4037dcbd1787ce28fb256d27eabd56cc3" + }, + "materializationDigest": "b9411273ff6861eeba78ee33bf3c4b33b7292a91cd75c39aebc146254888e3af", + "cursor": "5", + "cursorCommittedSequence": 104, + "contentBytes": 14 + }, + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": true, + "advertisedByBraid": false, + "advertised": false, + "provider": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "targetProof": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runId": "run-845a200e-f2c8-4800-80d1-30c5f18dc1af", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "materializationDigest": "ab7a5ec158e8ea520fc39080fffdd6d3f41ef5381a2fae8ecd673bc2b38c56c8" + } + } + }, + { + "requirementId": "LIVE-02", + "operation": "cli-bridge.codex.cross-runner-handoff", + "target": { + "key": "codex-default", + "harness": "codex", + "model": "default" + }, + "status": "passed", + "packed": true, + "runId": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "evidence": { + "sourceRunner": "pi", + "destinationRunner": "codex", + "sourceProvider": "tangle-router", + "sourceRun": { + "id": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "turnId": "turn-07fb8c44-1ec1-47cd-9e35-5f26da5ba3c1", + "operationId": "op-codex-cross-runner-handoff-source-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T18:31:59.149Z", + "updatedAt": "2026-08-29T18:32:06.821Z", + "terminalAt": "2026-08-29T18:32:06.821Z", + "durationMs": 7672, + "inputTokens": 1013, + "outputTokens": 30, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "reasoningTokens": 0, + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-10176367-7bcd-4881-b164-1311e4431a9d", + "environmentId": "environment-bb5bce9ca64e8d25b0c402084ad8cab7", + "controlRef": { + "runId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MWU1MzcxNzdiNzNmZTIxN2Q3MDVkMmJhOTY4MmRkM2Q5ZDEwZDEwYjJmNWYyODU3ODAwZmM0ODUxNTJlOWQ5MiIsInhWVXNvSVRNaFF6cHI0NFowWUJmVGdjQ1ZTWl9PQTZXRk1USGVnQkgwbUUiXQ", + "sessionId": "session-braid-run-10176367-7bcd-4881-b164-1311e4431a9d", + "executionId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "requestDigest": "sha256:b51a1720388396717a2614576dd8ce3f64dfa8de1a74b3b840d73ebcbd8e5856" + }, + "materializationDigest": "faabb0a303987ddff008991ec732a5232d876783f54b424c8d9b418037e26dd5", + "cursor": "51", + "cursorCommittedSequence": 62, + "contentBytes": 208, + "receipt": { + "version": 1, + "runId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "turnId": "turn-07fb8c44-1ec1-47cd-9e35-5f26da5ba3c1", + "operationId": "op-codex-cross-runner-handoff-source-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:31:59.135Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_HANDOFF_SOURCE_OK", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "interactions": { + "kinds": "[depth-limited]", + "answerFieldTypes": "[depth-limited]", + "responseScopes": "[depth-limited]", + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-10176367-7bcd-4881-b164-1311e4431a9d", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-10176367-7bcd-4881-b164-1311e4431a9d", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-e7df2b83-df02-46ed-baac-de95826d9a75", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "869eebf7e07cd3f9e63dc050cd77719abd95838a967d3ec422ea7347ee77329c", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "faabb0a303987ddff008991ec732a5232d876783f54b424c8d9b418037e26dd5", + "digest": "e4614fdf983de149060e25289a3542f2028b593040c8e077f98f4c761279210d" + } + }, + "destinationRun": { + "id": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "turnId": "turn-10f22304-d306-4424-90f7-ce13ca57a6ab", + "operationId": "operation-588fa3008ef24c12b2a1911ba57be31274fabae4a911889e", + "status": "completed", + "startedAt": "2026-08-29T18:32:08.200Z", + "updatedAt": "2026-08-29T18:32:22.121Z", + "terminalAt": "2026-08-29T18:32:22.121Z", + "durationMs": 13921, + "inputTokens": 14723, + "outputTokens": 15, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "codex/default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "completeness": "complete", + "providerSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "environmentId": "environment-2670734595aa9d8835adde09df96278e", + "controlRef": { + "runId": "run-handoff-16a21baeb4bb8fc08af591896fd88335", + "provider": "cli-bridge", + "environmentId": "environment-handoff-16a21baeb4bb8fc08af591896fd88335", + "sessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "executionId": "execution-handoff-16a21baeb4bb8fc08af591896fd88335", + "requestDigest": "sha256:55e1500ee9e12ffb621bc64c59065773227f3ef3fd937a1dfbd776c5ee517bab" + }, + "materializationDigest": "14c244d45f3b361282eedcb860384c26960ce295337721913c9ba7769199138e", + "cursor": "2:0", + "cursorCommittedSequence": 77, + "contentBytes": 89, + "receipt": { + "version": 1, + "runId": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "turnId": "turn-10f22304-d306-4424-90f7-ce13ca57a6ab", + "operationId": "operation-588fa3008ef24c12b2a1911ba57be31274fabae4a911889e", + "conversationId": "conv-1", + "branchId": "branch-028682fe57a02ae1238fab5232ebda5f", + "admittedAt": "2026-08-29T18:32:08.199Z", + "profileDigest": "cacd611307b6fc338eb0b04bf568333ff6b6079673a73a4739edc9350eae65bf", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_HANDOFF_OK", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "default", + "reasoningEffort": "none" + }, + "harness": "codex" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "default", + "runner": "codex", + "contextPlanDigest": "sha256:9e7260138b5fbcf6b9f18c86e8235f609bdbabb2e6a45614f312bd50975a782b" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "environmentId": "environment-handoff-16a21baeb4bb8fc08af591896fd88335", + "providerSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-e7df2b83-df02-46ed-baac-de95826d9a75", + "model": "default", + "route": "codex/default", + "runner": "codex", + "environmentId": "environment-handoff-16a21baeb4bb8fc08af591896fd88335", + "providerRunId": "execution-handoff-16a21baeb4bb8fc08af591896fd88335", + "retainedControl": "exact-after-dispatch" + }, + "contextTransfer": { + "planDigest": "sha256:9e7260138b5fbcf6b9f18c86e8235f609bdbabb2e6a45614f312bd50975a782b", + "sourceRunId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "destinationRunId": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "destinationSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "acceptedAt": "2026-08-29T18:32:07.640Z" + }, + "admissionStatus": "admitted", + "requestDigest": "4cd0a6cf04ea8ae4b5e030859f2ecbb09d82bcf918d453f6e43db99c4f32a01f", + "capabilitiesDigest": "7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a", + "materializationDigest": "14c244d45f3b361282eedcb860384c26960ce295337721913c9ba7769199138e", + "digest": "74f9f1a6ae3eab48b79cda38e9447bab2c58d525ec376088f67080df59277e41" + } + }, + "sourceUsage": { + "inputTokens": 1013, + "outputTokens": 30 + }, + "destinationUsage": { + "inputTokens": 14723, + "outputTokens": 15 + }, + "sourceRunId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "destinationRunId": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "sourceProviderSessionId": "session-braid-run-10176367-7bcd-4881-b164-1311e4431a9d", + "destinationProviderSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "sourceMessageId": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "sourceBoundary": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "destinationBranchId": "branch-028682fe57a02ae1238fab5232ebda5f", + "planDigest": "69483da4e05095661921965a4ee207aad1bd81a9212758094cffc2d62992db3f", + "contextPlanDigest": "72648eb3a3f57936a9930f6beacef7e5cc100b3be6d1a15e242b44b3000bce90", + "providerSession": "new", + "acceptance": { + "required": false + }, + "transfer": { + "sourceRunId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "sourceMessageId": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "contextDigest": "sha256:65a47203791f43eed080932f67014366a80945567b131dd8e6a3eef1470b207c", + "planDigest": "sha256:9e7260138b5fbcf6b9f18c86e8235f609bdbabb2e6a45614f312bd50975a782b", + "forkPlanDigest": "69483da4e05095661921965a4ee207aad1bd81a9212758094cffc2d62992db3f", + "transfer": { + "planDigest": "sha256:9e7260138b5fbcf6b9f18c86e8235f609bdbabb2e6a45614f312bd50975a782b", + "sourceRunId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "destinationRunId": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "destinationSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "acceptedAt": "2026-08-29T18:32:07.640Z" + } + }, + "plan": { + "kind": "cross-runner", + "operationId": "op-codex-cross-runner-handoff-fork-pi-tangle-router-deepseek-v4-flash-codex-default", + "sourceConversationId": "conv-1", + "sourceBranchId": "branch-1", + "throughMessageId": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "destinationBranchId": "branch-028682fe57a02ae1238fab5232ebda5f", + "context": { + "sourceRunId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "sourceBoundary": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "destinationRunner": "codex", + "messages": [ + { + "id": "message-25a60803-1e7c-456e-bdc9-e7fff0d78428", + "role": "user", + "parts": [ + "[depth-limited]" + ] + }, + { + "id": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "role": "assistant", + "parts": [ + "[depth-limited]" + ] + } + ], + "omittedPartIds": [], + "transformedPartIds": [], + "complete": true, + "tokenEstimate": 140, + "digest": "72648eb3a3f57936a9930f6beacef7e5cc100b3be6d1a15e242b44b3000bce90" + }, + "portableContextPlan": { + "planId": "context-plan-ec7c4c7baefae74254abb732020ea249", + "source": { + "source": { + "runId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "messageId": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MWU1MzcxNzdiNzNmZTIxN2Q3MDVkMmJhOTY4MmRkM2Q5ZDEwZDEwYjJmNWYyODU3ODAwZmM0ODUxNTJlOWQ5MiIsInhWVXNvSVRNaFF6cHI0NFowWUJmVGdjQ1ZTWl9PQTZXRk1USGVnQkgwbUUiXQ", + "sessionId": "session-braid-run-10176367-7bcd-4881-b164-1311e4431a9d", + "executionId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "requestDigest": "sha256:b51a1720388396717a2614576dd8ce3f64dfa8de1a74b3b840d73ebcbd8e5856", + "branchId": "branch-1" + }, + "completeness": "complete", + "messages": [ + { + "id": "message-25a60803-1e7c-456e-bdc9-e7fff0d78428", + "role": "user", + "parts": "[depth-limited]", + "timestamp": "2026-08-29T18:31:59.149Z" + }, + { + "id": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "role": "assistant", + "parts": "[depth-limited]", + "timestamp": "2026-08-29T18:31:59.149Z" + } + ], + "attachments": [], + "digest": "sha256:65a47203791f43eed080932f67014366a80945567b131dd8e6a3eef1470b207c" + }, + "destination": { + "runner": "codex", + "provider": "cli-bridge", + "environmentId": "environment-handoff-16a21baeb4bb8fc08af591896fd88335", + "sessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "runId": "run-handoff-16a21baeb4bb8fc08af591896fd88335", + "executionId": "execution-handoff-16a21baeb4bb8fc08af591896fd88335", + "model": "default", + "profileDigest": "sha256:cacd611307b6fc338eb0b04bf568333ff6b6079673a73a4739edc9350eae65bf" + }, + "messages": [ + { + "messageId": "message-25a60803-1e7c-456e-bdc9-e7fff0d78428", + "action": "include", + "parts": [ + "[depth-limited]" + ] + }, + { + "messageId": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "action": "include", + "parts": [ + "[depth-limited]" + ] + } + ], + "context": { + "source": { + "runId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "messageId": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MWU1MzcxNzdiNzNmZTIxN2Q3MDVkMmJhOTY4MmRkM2Q5ZDEwZDEwYjJmNWYyODU3ODAwZmM0ODUxNTJlOWQ5MiIsInhWVXNvSVRNaFF6cHI0NFowWUJmVGdjQ1ZTWl9PQTZXRk1USGVnQkgwbUUiXQ", + "sessionId": "session-braid-run-10176367-7bcd-4881-b164-1311e4431a9d", + "executionId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "requestDigest": "sha256:b51a1720388396717a2614576dd8ce3f64dfa8de1a74b3b840d73ebcbd8e5856", + "branchId": "branch-1" + }, + "completeness": "complete", + "messages": [ + { + "id": "message-25a60803-1e7c-456e-bdc9-e7fff0d78428", + "role": "user", + "parts": "[depth-limited]", + "timestamp": "2026-08-29T18:31:59.149Z" + }, + { + "id": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "role": "assistant", + "parts": "[depth-limited]", + "timestamp": "2026-08-29T18:31:59.149Z" + } + ], + "attachments": [], + "digest": "sha256:65a47203791f43eed080932f67014366a80945567b131dd8e6a3eef1470b207c" + }, + "estimatedTokens": 311, + "requiresAcceptance": false, + "digest": "sha256:9e7260138b5fbcf6b9f18c86e8235f609bdbabb2e6a45614f312bd50975a782b" + }, + "sourceRunId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "sourceEnvironmentId": "environment-bb5bce9ca64e8d25b0c402084ad8cab7", + "destinationEnvironmentId": "environment-handoff-16a21baeb4bb8fc08af591896fd88335", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_HANDOFF_OK", + "environment": "new", + "providerSession": "new", + "checkpoint": "none", + "allowed": true, + "digest": "69483da4e05095661921965a4ee207aad1bd81a9212758094cffc2d62992db3f" + }, + "execution": { + "id": "branch-028682fe57a02ae1238fab5232ebda5f", + "conversationId": "conv-1", + "source": { + "conversationId": "conv-1", + "branchId": "branch-1", + "throughMessageId": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "throughTurnId": "turn-07fb8c44-1ec1-47cd-9e35-5f26da5ba3c1" + }, + "overrides": { + "runner": "codex", + "model": "default", + "effort": "none" + }, + "environmentId": "environment-handoff-73bc996f3abbc602bf4e4d0e7de38d45", + "draftId": "draft-6bf8708eec5a6006a1f63f9eaccabb45", + "queueId": "queue-6bf8708eec5a6006a1f63f9eaccabb45", + "tipMessageId": "message-c45b0aa1-d83c-4565-9f7b-b44e128d7b9c", + "status": "active", + "createdAt": "2026-08-29T18:32:07.670Z", + "updatedAt": "2026-08-29T18:32:07.670Z" + }, + "destinationAdmission": { + "version": 1, + "type": "event", + "sequence": 70, + "revision": 70, + "event": { + "sequence": 70, + "revision": 70, + "kind": "run.requested", + "payload": { + "runId": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_HANDOFF_OK", + "admission": { + "version": 1, + "runId": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "turnId": "turn-10f22304-d306-4424-90f7-ce13ca57a6ab", + "operationId": "operation-588fa3008ef24c12b2a1911ba57be31274fabae4a911889e", + "conversationId": "conv-1", + "branchId": "branch-028682fe57a02ae1238fab5232ebda5f", + "admittedAt": "2026-08-29T18:32:08.199Z", + "profileDigest": "cacd611307b6fc338eb0b04bf568333ff6b6079673a73a4739edc9350eae65bf", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_HANDOFF_OK", + "profile": "[depth-limited]", + "connectionId": "connection-live-cli-bridge", + "interactions": "[depth-limited]", + "model": "default", + "runner": "codex", + "contextPlanDigest": "sha256:9e7260138b5fbcf6b9f18c86e8235f609bdbabb2e6a45614f312bd50975a782b" + }, + "capabilities": { + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "controls": "[depth-limited]", + "events": "[depth-limited]", + "usage": true, + "environment": "[depth-limited]" + }, + "provider": "cli-bridge", + "requestedSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "environmentId": "environment-handoff-16a21baeb4bb8fc08af591896fd88335", + "providerSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-e7df2b83-df02-46ed-baac-de95826d9a75", + "model": "default", + "route": "codex/default", + "runner": "codex", + "environmentId": "environment-handoff-16a21baeb4bb8fc08af591896fd88335", + "providerRunId": "execution-handoff-16a21baeb4bb8fc08af591896fd88335", + "retainedControl": "exact-after-dispatch" + }, + "contextTransfer": { + "planDigest": "sha256:9e7260138b5fbcf6b9f18c86e8235f609bdbabb2e6a45614f312bd50975a782b", + "sourceRunId": "run-10176367-7bcd-4881-b164-1311e4431a9d", + "destinationRunId": "run-d02512d1-9094-4c7e-a9e6-7cfca06e1d8b", + "destinationSessionId": "session-handoff-16a21baeb4bb8fc08af591896fd88335", + "acceptedAt": "2026-08-29T18:32:07.640Z" + }, + "admissionStatus": "admitted", + "requestDigest": "4cd0a6cf04ea8ae4b5e030859f2ecbb09d82bcf918d453f6e43db99c4f32a01f", + "capabilitiesDigest": "7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a", + "materializationDigest": "14c244d45f3b361282eedcb860384c26960ce295337721913c9ba7769199138e", + "digest": "74f9f1a6ae3eab48b79cda38e9447bab2c58d525ec376088f67080df59277e41" + }, + "status": "admitted" + } + } + }, + "destinationPrompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_HANDOFF_OK", + "destinationMarker": "LIVE_BRAID_CODEX-DEFAULT_HANDOFF_OK", + "destinationMarkerObserved": true + } + }, + { + "requirementId": "LIVE-03", + "operation": "cli-bridge.interactive-protocol", + "target": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash" + }, + "status": "passed", + "packed": true, + "runId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "evidence": { + "runId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "interactionId": "interaction-893fe85f3df3f2bbabff5c4859e0adf1e04ac9f40bf5094e", + "interaction": { + "runId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "interactionId": "interaction-893fe85f3df3f2bbabff5c4859e0adf1e04ac9f40bf5094e", + "request": { + "id": "interaction-893fe85f3df3f2bbabff5c4859e0adf1e04ac9f40bf5094e", + "kind": "permission", + "title": "Permission: read", + "answerSpec": { + "fields": [ + { + "type": "select", + "name": "grant", + "label": "Decision", + "required": true, + "options": "[depth-limited]" + } + ] + }, + "responseScopes": [ + "interaction" + ] + } + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "interactive-protocol-2976b912-0875-4685-beca-15f502f3c4ea-respond-pi-tangle-router-deepseek-v4-flash", + "revision": 52, + "operationId": "op-interactive-protocol-2976b912-0875-4685-beca-15f502f3c4ea-respond-pi-tangle-router-deepseek-v4-flash", + "command": "respond_interaction", + "runId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "control": "respond_interaction", + "outcome": "accepted", + "replayed": false + }, + "staleDuplicate": { + "version": 1, + "type": "error", + "requestId": "interactive-protocol-2976b912-0875-4685-beca-15f502f3c4ea-duplicate-pi-tangle-router-deepseek-v4-flash", + "code": "INTERACTION_STALE", + "message": "The interaction is already declined", + "retryable": false + }, + "providerProgress": { + "kind": "run.provider.event", + "sequence": 55, + "revision": 55, + "providerSequence": 39, + "cursor": "38" + }, + "postResponseStatus": "streaming", + "cleanupCancel": { + "version": 1, + "type": "ack", + "requestId": "interactive-protocol-2976b912-0875-4685-beca-15f502f3c4ea-cleanup-cancel-pi-tangle-router-deepseek-v4-flash", + "revision": 66, + "operationId": "op-interactive-protocol-2976b912-0875-4685-beca-15f502f3c4ea-cleanup-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "runId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "terminalRun": { + "id": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "turnId": "turn-521175b9-ab8e-49ed-901b-94cd2d153b41", + "operationId": "op-interactive-protocol-2976b912-0875-4685-beca-15f502f3c4ea-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T18:32:24.308Z", + "updatedAt": "2026-08-29T18:32:29.494Z", + "terminalAt": "2026-08-29T18:32:29.494Z", + "durationMs": 5186, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "environmentId": "environment-ec3003bcd850e11e9f5410b921741b1f", + "controlRef": { + "runId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6MGQwN2I2YzZmZDNjNjBkNDY1ZWU4MTNlYWU3NjhkMWZlZmMxNTc3MTlhNmZmMzllYWJjZjllMTdkNTY0MWUzMSIsIi1nblhtZzFsWFZXdHg4WXg5Qy1UX1NhQ3dRNnN3LTktQkNhSnlVZl80R3ciXQ", + "sessionId": "session-braid-run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "executionId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "requestDigest": "sha256:4b09e9a8c22127eff1b1e6be192ab838fea1a8bb40ee3f5ad595ae971e2d5ea9" + }, + "materializationDigest": "8dc8b7d82e3c2c974583fe8a8cb2e49e4383eb6170577d875744d0fe51aa38ea", + "cursor": "44", + "cursorCommittedSequence": 61, + "contentBytes": 1279, + "receipt": { + "version": 1, + "runId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "turnId": "turn-521175b9-ab8e-49ed-901b-94cd2d153b41", + "operationId": "op-interactive-protocol-2976b912-0875-4685-beca-15f502f3c4ea-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:32:24.278Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "Use the read tool now to read ./interaction-proof-pi-tangle-router-deepseek-v4-flash.txt. Do not guess its contents or answer without the tool call. After the permission response, report what happened.", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": { + "namedProfiles": false, + "systemPrompt": "[depth-limited]", + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": "[depth-limited]", + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "interactions": { + "kinds": "[depth-limited]", + "answerFieldTypes": "[depth-limited]", + "responseScopes": "[depth-limited]", + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-2976b912-0875-4685-beca-15f502f3c4ea", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-e1b63c49-7e18-4f57-b0db-d85826bd911c", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "6252db037fdd3d61713180c451f0d7f0b422b8210dd242c9a5ed7eec8153b2f4", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "8dc8b7d82e3c2c974583fe8a8cb2e49e4383eb6170577d875744d0fe51aa38ea", + "digest": "c70c9360ef5f3d4c819bced981fd804ec1e596b8b820a03d4e2f019c0e42ff52" + } + }, + "interactionStatus": "declined", + "responseOutcome": "declined", + "usage": { + "terminalStatus": "aborted", + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "settled": false, + "reason": "The interactive proof cancels after provider progress" + } + } + }, + { + "requirementId": "LIVE-04", + "operation": "cli-bridge.restart-reconciliation", + "target": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash" + }, + "status": "passed", + "packed": true, + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "evidence": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "forcedProcess": { + "processIdentity": { + "instanceId": "6a521ccb-7f16-4b0b-b9d0-e222e56dca7a", + "pid": 3387645, + "startedAt": 1788028351286 + }, + "termination": { + "strategy": "process-group", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": true, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 3387645 + ], + "roots": [ + 3387645 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "term", + "termSignal": { + "method": "process-group", + "sent": true + }, + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "natural": { + "cleanupStatus": "forced-exit", + "exited": true, + "descendantsExited": true, + "descendantsVerified": true + }, + "exit": { + "code": null, + "signal": "SIGTERM" + } + }, + "oldProcess": { + "instanceId": "6a521ccb-7f16-4b0b-b9d0-e222e56dca7a", + "pid": 3387645, + "startedAt": 1788028351286 + }, + "newProcess": { + "instanceId": "45ee97af-03b6-4d66-b7ef-4877790b61f9", + "pid": 3388666, + "startedAt": 1788028356602 + }, + "activeModel": { + "admission": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "requestId": "restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "responseIndex": 2, + "revision": 4 + }, + "state": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "activeRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "status": "streaming", + "responseIndex": 8, + "revision": 8 + }, + "progress": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "kind": "run.part.updated", + "responseIndex": 18, + "sequence": 18, + "revision": 18, + "providerSequence": 8, + "cursor": "7" + } + }, + "activeStream": { + "version": 1, + "type": "event", + "sequence": 18, + "revision": 18, + "event": { + "sequence": 18, + "revision": 18, + "kind": "run.part.updated", + "payload": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "source": { + "eventId": "run-bd391962-dada-4972-998f-f4138190c24f:7", + "providerSequence": 8, + "cursor": "7", + "receivedAt": "2026-08-29T18:32:36.369Z" + }, + "part": { + "id": "run-bd391962-dada-4972-998f-f4138190c24f:message:0:text", + "kind": "text", + "text": "", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:7" + } + } + } + }, + "streamedState": { + "version": 1, + "type": "state", + "requestId": "restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-state-streamed-pi-tangle-router-deepseek-v4-flash", + "revision": 20, + "projection": "full", + "state": { + "schemaVersion": 2, + "revision": 20, + "sequence": 20, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-223d11c4-cc13-450e-9986-033597482a25", + "conversationId": "conv-1", + "branchId": "branch-1", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "updatedAt": "2026-08-29T18:32:32.612Z" + } + ], + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "runConfiguration": { + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "connectionId": "connection-live-cli-bridge", + "overrides": {} + }, + "draft": "", + "messages": [ + { + "id": "message-9edf9877-e45e-4de0-8e1b-fca53d84a0c6", + "role": "user", + "text": "Do not use tools. Reply directly with LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART, then count from 1 to 1000 with one integer per line.", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + }, + { + "id": "message-2b7305c3-247a-4532-a2bf-bc4b475ceacc", + "role": "assistant", + "text": "LIVE", + "status": "streaming", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + } + ], + "runs": [ + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "turnId": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "status": "streaming", + "startedAt": "2026-08-29T18:32:32.612Z", + "updatedAt": "2026-08-29T18:32:36.395Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "environmentId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "controlRef": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "sessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "executionId": "run-bd391962-dada-4972-998f-f4138190c24f", + "requestDigest": "sha256:66cfc8aec5c2a0b3cdf1dbd540fcfb2bdbc7b8ecd15ea641d480c1a144499cdd" + }, + "materializationDigest": "a09e9826f20161d49b1bb8d176ba1959e635cc80319caee5392e5a19f4bf7319", + "cursor": "9", + "cursorCommittedSequence": 20, + "contentBytes": 4 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:32:32.272Z", + "updatedAt": "2026-08-29T18:32:34.385Z" + } + ], + "interactions": [], + "queue": [], + "activeRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "focusedRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "activeRuns": [ + { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "conversationId": "conv-1", + "branchId": "branch-1" + } + ], + "lastError": null + }, + "view": { + "revision": 20, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-223d11c4-cc13-450e-9986-033597482a25", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "runOverrides": {}, + "connection": "Live local CLI Bridge", + "conversationId": "conv-1", + "conversationTitle": "New conversation", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "active": true, + "updatedAt": "2026-08-29T18:32:32.612Z" + } + ], + "branch": "branch-1", + "status": "running", + "statusText": "streaming", + "queueCount": 0, + "queue": [], + "messages": [ + { + "id": "message-9edf9877-e45e-4de0-8e1b-fca53d84a0c6", + "role": "user", + "text": "Do not use tools. Reply directly with LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART, then count from 1 to 1000 with one integer per line.", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + }, + { + "id": "message-2b7305c3-247a-4532-a2bf-bc4b475ceacc", + "role": "assistant", + "text": "LIVE", + "status": "streaming", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + } + ], + "hiddenMessageCount": 0, + "runs": [ + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "turnId": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "status": "running", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "model": "deepseek-v4-flash", + "effort": "none", + "cursor": "9", + "providerSessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "usage": { + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash" + }, + "runner": "pi", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "completeness": "incomplete", + "contentBytes": 4 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:32:32.272Z", + "updatedAt": "2026-08-29T18:32:34.385Z" + } + ], + "activeRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "focusedRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "interactions": [], + "activity": [ + { + "id": "run:run-bd391962-dada-4972-998f-f4138190c24f", + "kind": "run", + "title": "run run-bd391962-dada-4972-998f-f4138190c24f", + "status": "running", + "startedAt": "2026-08-29T18:32:32.612Z", + "occurredAt": "2026-08-29T18:32:32.612Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "environment:environment-d324f6bdb5f854a75f9b2ffb629b5001", + "kind": "environment", + "title": "cli-bridge execution", + "status": "complete", + "detail": "local-process · local · explicit", + "startedAt": "2026-08-29T18:32:32.272Z", + "occurredAt": "2026-08-29T18:32:34.385Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "environment", + "entityId": "environment-d324f6bdb5f854a75f9b2ffb629b5001" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "running", + "detail": "profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "occurredAt": "2026-08-29T18:32:36.395Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:starting", + "kind": "system", + "title": "starting", + "status": "running", + "occurredAt": "2026-08-29T18:32:36.395Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:starting", + "kind": "system", + "title": "starting", + "status": "running", + "occurredAt": "2026-08-29T18:32:36.395Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "running", + "occurredAt": "2026-08-29T18:32:36.395Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:4", + "kind": "system", + "title": "event raw", + "status": "running", + "detail": "sequence 5", + "occurredAt": "2026-08-29T18:32:36.395Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:4", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:5", + "kind": "system", + "title": "event raw", + "status": "running", + "detail": "sequence 6", + "occurredAt": "2026-08-29T18:32:36.395Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:5", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:6", + "kind": "system", + "title": "event raw", + "status": "running", + "detail": "sequence 7", + "occurredAt": "2026-08-29T18:32:36.395Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:6", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + } + ], + "graph": [ + { + "id": "conv-1", + "type": "conversation", + "title": "New conversation", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-29T18:32:31.802Z" + }, + { + "id": "branch-1", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conv-1" + ], + "startedAt": "2026-08-29T18:32:31.802Z" + }, + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "type": "environment", + "title": "cli-bridge execution", + "status": "complete", + "depth": 4, + "edgeLabel": "attached", + "parentIds": [ + "run:run-bd391962-dada-4972-998f-f4138190c24f" + ], + "runner": "cli-bridge", + "startedAt": "2026-08-29T18:32:32.272Z" + }, + { + "id": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "type": "turn", + "title": "Turn", + "status": "running", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:32:32.612Z" + }, + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "type": "run", + "title": "Run", + "status": "running", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e" + ], + "runner": "pi", + "startedAt": "2026-08-29T18:32:32.612Z" + } + ], + "graphQuery": "", + "entityDetails": [ + { + "entityType": "environment", + "entityId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "title": "cli-bridge execution", + "status": "ready", + "lines": [ + "provider: cli-bridge", + "execution: local-process · local", + "provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "connection: connection-live-cli-bridge", + "lifecycle: ready · retained · cleanup explicit", + "continuity: session", + "runtime endpoint host: 127.0.0.1", + "placement: requested not specified · verified unavailable", + "machine: unavailable · physical IP is not exposed", + "created: 2026-08-29T18:32:32.272Z", + "observed: 2026-08-29T18:32:34.385Z", + "unavailable: cli-subscription-and-quota:not-exposed-by-provider", + "unavailable: effective-resources:not-exposed-by-provider", + "unavailable: machine-specs:not-exposed-by-provider", + "unavailable: runtime-cpu-memory-usage:not-exposed-by-provider" + ] + } + ], + "details": { + "title": "run run-bd391962-dada-4972-998f-f4138190c24f", + "fields": [ + { + "label": "status", + "value": "streaming" + }, + { + "label": "input tokens", + "value": "0" + }, + { + "label": "output tokens", + "value": "0" + }, + { + "label": "model", + "value": "deepseek-v4-flash" + } + ] + }, + "capabilities": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": true, + "source": "runtime" + }, + "run.queue": { + "available": true, + "source": "provider" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": true, + "source": "provider" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect while another run is active" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile while another run is active" + } + }, + "draft": "", + "selectedSurface": "transcript", + "appearance": { + "color": "none", + "highContrast": false, + "reducedMotion": false + } + } + }, + "detachedEvent": { + "version": 1, + "type": "event", + "sequence": 26, + "revision": 26, + "event": { + "sequence": 26, + "revision": 26, + "kind": "run.detached", + "payload": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "status": "detached", + "completeness": "streaming", + "cursor": "9", + "detail": "CONTROL_ACKNOWLEDGED" + } + } + }, + "detachedState": { + "version": 1, + "type": "state", + "requestId": "restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-state-detached-pi-tangle-router-deepseek-v4-flash", + "revision": 26, + "projection": "full", + "state": { + "schemaVersion": 2, + "revision": 26, + "sequence": 26, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-223d11c4-cc13-450e-9986-033597482a25", + "conversationId": "conv-1", + "branchId": "branch-1", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "updatedAt": "2026-08-29T18:32:32.612Z" + } + ], + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "runConfiguration": { + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "connectionId": "connection-live-cli-bridge", + "overrides": {} + }, + "draft": "", + "messages": [ + { + "id": "message-9edf9877-e45e-4de0-8e1b-fca53d84a0c6", + "role": "user", + "text": "Do not use tools. Reply directly with LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART, then count from 1 to 1000 with one integer per line.", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + }, + { + "id": "message-2b7305c3-247a-4532-a2bf-bc4b475ceacc", + "role": "assistant", + "text": "LIVE", + "status": "streaming", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + } + ], + "runs": [ + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "turnId": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "status": "detached", + "startedAt": "2026-08-29T18:32:32.612Z", + "updatedAt": "2026-08-29T18:32:36.494Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "environmentId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "controlRef": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "sessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "executionId": "run-bd391962-dada-4972-998f-f4138190c24f", + "requestDigest": "sha256:66cfc8aec5c2a0b3cdf1dbd540fcfb2bdbc7b8ecd15ea641d480c1a144499cdd" + }, + "materializationDigest": "a09e9826f20161d49b1bb8d176ba1959e635cc80319caee5392e5a19f4bf7319", + "cursor": "9", + "cursorCommittedSequence": 20, + "contentBytes": 4 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:32:32.272Z", + "updatedAt": "2026-08-29T18:32:34.385Z" + } + ], + "interactions": [], + "queue": [], + "activeRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "focusedRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "activeRuns": [ + { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "conversationId": "conv-1", + "branchId": "branch-1" + } + ], + "lastError": null + }, + "view": { + "revision": 26, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-223d11c4-cc13-450e-9986-033597482a25", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "runOverrides": {}, + "connection": "Live local CLI Bridge", + "conversationId": "conv-1", + "conversationTitle": "New conversation", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "active": true, + "updatedAt": "2026-08-29T18:32:32.612Z" + } + ], + "branch": "branch-1", + "status": "detached", + "statusText": "detached", + "queueCount": 0, + "queue": [], + "messages": [ + { + "id": "message-9edf9877-e45e-4de0-8e1b-fca53d84a0c6", + "role": "user", + "text": "Do not use tools. Reply directly with LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART, then count from 1 to 1000 with one integer per line.", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + }, + { + "id": "message-2b7305c3-247a-4532-a2bf-bc4b475ceacc", + "role": "assistant", + "text": "LIVE", + "status": "streaming", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + } + ], + "hiddenMessageCount": 0, + "runs": [ + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "turnId": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "status": "detached", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "model": "deepseek-v4-flash", + "effort": "none", + "cursor": "9", + "providerSessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "usage": { + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash" + }, + "runner": "pi", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "completeness": "incomplete", + "contentBytes": 4 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:32:32.272Z", + "updatedAt": "2026-08-29T18:32:34.385Z" + } + ], + "activeRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "focusedRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "interactions": [], + "activity": [ + { + "id": "run:run-bd391962-dada-4972-998f-f4138190c24f", + "kind": "run", + "title": "run run-bd391962-dada-4972-998f-f4138190c24f", + "status": "detached", + "startedAt": "2026-08-29T18:32:32.612Z", + "occurredAt": "2026-08-29T18:32:32.612Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "environment:environment-d324f6bdb5f854a75f9b2ffb629b5001", + "kind": "environment", + "title": "cli-bridge execution", + "status": "complete", + "detail": "local-process · local · explicit", + "startedAt": "2026-08-29T18:32:32.272Z", + "occurredAt": "2026-08-29T18:32:34.385Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "environment", + "entityId": "environment-d324f6bdb5f854a75f9b2ffb629b5001" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "detached", + "detail": "profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:starting", + "kind": "system", + "title": "starting", + "status": "detached", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:starting", + "kind": "system", + "title": "starting", + "status": "detached", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "detached", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:control:local:detach", + "kind": "system", + "title": "detach", + "status": "detached", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:control.ack:local:detach", + "kind": "system", + "title": "detach", + "status": "detached", + "detail": "accepted", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:lifecycle:local:detached", + "kind": "system", + "title": "detached", + "status": "detached", + "detail": "CONTROL_ACKNOWLEDGED", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:4", + "kind": "system", + "title": "event raw", + "status": "detached", + "detail": "sequence 5", + "occurredAt": "2026-08-29T18:32:36.494Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:4", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:5", + "kind": "system", + "title": "event raw", + "status": "detached", + "detail": "sequence 6", + "occurredAt": "2026-08-29T18:32:36.494Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:5", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:6", + "kind": "system", + "title": "event raw", + "status": "detached", + "detail": "sequence 7", + "occurredAt": "2026-08-29T18:32:36.494Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:6", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + } + ], + "graph": [ + { + "id": "conv-1", + "type": "conversation", + "title": "New conversation", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-29T18:32:31.802Z" + }, + { + "id": "branch-1", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conv-1" + ], + "startedAt": "2026-08-29T18:32:31.802Z" + }, + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "type": "environment", + "title": "cli-bridge execution", + "status": "complete", + "depth": 4, + "edgeLabel": "attached", + "parentIds": [ + "run:run-bd391962-dada-4972-998f-f4138190c24f" + ], + "runner": "cli-bridge", + "startedAt": "2026-08-29T18:32:32.272Z" + }, + { + "id": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "type": "turn", + "title": "Turn", + "status": "complete", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:32:32.612Z" + }, + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "type": "run", + "title": "Run", + "status": "detached", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e" + ], + "runner": "pi", + "startedAt": "2026-08-29T18:32:32.612Z" + } + ], + "graphQuery": "", + "entityDetails": [ + { + "entityType": "environment", + "entityId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "title": "cli-bridge execution", + "status": "ready", + "lines": [ + "provider: cli-bridge", + "execution: local-process · local", + "provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "connection: connection-live-cli-bridge", + "lifecycle: ready · retained · cleanup explicit", + "continuity: session", + "runtime endpoint host: 127.0.0.1", + "placement: requested not specified · verified unavailable", + "machine: unavailable · physical IP is not exposed", + "created: 2026-08-29T18:32:32.272Z", + "observed: 2026-08-29T18:32:34.385Z", + "unavailable: cli-subscription-and-quota:not-exposed-by-provider", + "unavailable: effective-resources:not-exposed-by-provider", + "unavailable: machine-specs:not-exposed-by-provider", + "unavailable: runtime-cpu-memory-usage:not-exposed-by-provider" + ] + } + ], + "details": { + "title": "run run-bd391962-dada-4972-998f-f4138190c24f", + "fields": [ + { + "label": "status", + "value": "detached" + }, + { + "label": "input tokens", + "value": "0" + }, + { + "label": "output tokens", + "value": "0" + }, + { + "label": "model", + "value": "deepseek-v4-flash" + } + ] + }, + "capabilities": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report queued input support" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report detach support" + }, + "run.reconnect": { + "available": true, + "source": "provider" + }, + "run.reconcile": { + "available": true, + "source": "provider" + } + }, + "draft": "", + "selectedSurface": "transcript", + "appearance": { + "color": "none", + "highContrast": false, + "reducedMotion": false + } + } + }, + "savedCursor": "9", + "savedProviderSequence": 10, + "savedCursorBoundary": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "kind": "run.part.updated", + "responseIndex": 20, + "sequence": 20, + "revision": 20, + "cursor": "9", + "providerSequence": 10 + }, + "reopenedState": { + "version": 1, + "type": "state", + "requestId": "restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-state-reopened-pi-tangle-router-deepseek-v4-flash", + "revision": 26, + "projection": "full", + "state": { + "schemaVersion": 2, + "revision": 26, + "sequence": 26, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-223d11c4-cc13-450e-9986-033597482a25", + "conversationId": "conv-1", + "branchId": "branch-1", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "updatedAt": "2026-08-29T18:32:32.612Z" + } + ], + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "runConfiguration": { + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "connectionId": "connection-live-cli-bridge", + "overrides": {} + }, + "draft": "", + "messages": [ + { + "id": "message-9edf9877-e45e-4de0-8e1b-fca53d84a0c6", + "role": "user", + "text": "Do not use tools. Reply directly with LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART, then count from 1 to 1000 with one integer per line.", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + }, + { + "id": "message-2b7305c3-247a-4532-a2bf-bc4b475ceacc", + "role": "assistant", + "text": "LIVE", + "status": "streaming", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + } + ], + "runs": [ + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "turnId": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "status": "detached", + "startedAt": "2026-08-29T18:32:32.612Z", + "updatedAt": "2026-08-29T18:32:36.494Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "environmentId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "controlRef": { + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "executionId": "run-bd391962-dada-4972-998f-f4138190c24f", + "provider": "cli-bridge", + "requestDigest": "sha256:66cfc8aec5c2a0b3cdf1dbd540fcfb2bdbc7b8ecd15ea641d480c1a144499cdd", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "sessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f" + }, + "materializationDigest": "a09e9826f20161d49b1bb8d176ba1959e635cc80319caee5392e5a19f4bf7319", + "cursor": "9", + "cursorCommittedSequence": 20, + "contentBytes": 4 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:32:32.272Z", + "updatedAt": "2026-08-29T18:32:34.385Z" + } + ], + "interactions": [], + "queue": [], + "activeRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "focusedRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "activeRuns": [ + { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "conversationId": "conv-1", + "branchId": "branch-1" + } + ], + "lastError": null + }, + "view": { + "revision": 26, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-223d11c4-cc13-450e-9986-033597482a25", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "runOverrides": {}, + "connection": "Live local CLI Bridge", + "conversationId": "conv-1", + "conversationTitle": "New conversation", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "active": true, + "updatedAt": "2026-08-29T18:32:32.612Z" + } + ], + "branch": "branch-1", + "status": "detached", + "statusText": "detached", + "queueCount": 0, + "queue": [], + "messages": [ + { + "id": "message-9edf9877-e45e-4de0-8e1b-fca53d84a0c6", + "role": "user", + "text": "Do not use tools. Reply directly with LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART, then count from 1 to 1000 with one integer per line.", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + }, + { + "id": "message-2b7305c3-247a-4532-a2bf-bc4b475ceacc", + "role": "assistant", + "text": "LIVE", + "status": "streaming", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + } + ], + "hiddenMessageCount": 0, + "runs": [ + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "turnId": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "status": "detached", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "model": "deepseek-v4-flash", + "effort": "none", + "cursor": "9", + "providerSessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "usage": { + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash" + }, + "runner": "pi", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "completeness": "incomplete", + "contentBytes": 4 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 1, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:32:32.272Z", + "updatedAt": "2026-08-29T18:32:34.385Z" + } + ], + "activeRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "focusedRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "interactions": [], + "activity": [ + { + "id": "run:run-bd391962-dada-4972-998f-f4138190c24f", + "kind": "run", + "title": "run run-bd391962-dada-4972-998f-f4138190c24f", + "status": "detached", + "startedAt": "2026-08-29T18:32:32.612Z", + "occurredAt": "2026-08-29T18:32:32.612Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "environment:environment-d324f6bdb5f854a75f9b2ffb629b5001", + "kind": "environment", + "title": "cli-bridge execution", + "status": "complete", + "detail": "local-process · local · explicit", + "startedAt": "2026-08-29T18:32:32.272Z", + "occurredAt": "2026-08-29T18:32:34.385Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "environment", + "entityId": "environment-d324f6bdb5f854a75f9b2ffb629b5001" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "detached", + "detail": "profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:starting", + "kind": "system", + "title": "starting", + "status": "detached", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:starting", + "kind": "system", + "title": "starting", + "status": "detached", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "detached", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:control:local:detach", + "kind": "system", + "title": "detach", + "status": "detached", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:control.ack:local:detach", + "kind": "system", + "title": "detach", + "status": "detached", + "detail": "accepted", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:lifecycle:local:detached", + "kind": "system", + "title": "detached", + "status": "detached", + "detail": "CONTROL_ACKNOWLEDGED", + "occurredAt": "2026-08-29T18:32:36.494Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:4", + "kind": "system", + "title": "event raw", + "status": "detached", + "detail": "sequence 5", + "occurredAt": "2026-08-29T18:32:36.494Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:4", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:5", + "kind": "system", + "title": "event raw", + "status": "detached", + "detail": "sequence 6", + "occurredAt": "2026-08-29T18:32:36.494Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:5", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:6", + "kind": "system", + "title": "event raw", + "status": "detached", + "detail": "sequence 7", + "occurredAt": "2026-08-29T18:32:36.494Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:6", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + } + ], + "graph": [ + { + "id": "conv-1", + "type": "conversation", + "title": "New conversation", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-29T18:32:31.802Z" + }, + { + "id": "branch-1", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conv-1" + ], + "startedAt": "2026-08-29T18:32:31.802Z" + }, + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "type": "environment", + "title": "cli-bridge execution", + "status": "complete", + "depth": 4, + "edgeLabel": "attached", + "parentIds": [ + "run:run-bd391962-dada-4972-998f-f4138190c24f" + ], + "runner": "cli-bridge", + "startedAt": "2026-08-29T18:32:32.272Z" + }, + { + "id": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "type": "turn", + "title": "Turn", + "status": "complete", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:32:32.612Z" + }, + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "type": "run", + "title": "Run", + "status": "detached", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e" + ], + "runner": "pi", + "startedAt": "2026-08-29T18:32:32.612Z" + } + ], + "graphQuery": "", + "entityDetails": [ + { + "entityType": "environment", + "entityId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "title": "cli-bridge execution", + "status": "ready", + "lines": [ + "provider: cli-bridge", + "execution: local-process · local", + "provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "connection: connection-live-cli-bridge", + "lifecycle: ready · retained · cleanup explicit", + "continuity: session", + "runtime endpoint host: 127.0.0.1", + "placement: requested not specified · verified unavailable", + "machine: unavailable · physical IP is not exposed", + "created: 2026-08-29T18:32:32.272Z", + "observed: 2026-08-29T18:32:34.385Z", + "unavailable: cli-subscription-and-quota:not-exposed-by-provider", + "unavailable: effective-resources:not-exposed-by-provider", + "unavailable: machine-specs:not-exposed-by-provider", + "unavailable: runtime-cpu-memory-usage:not-exposed-by-provider" + ] + } + ], + "details": { + "title": "run run-bd391962-dada-4972-998f-f4138190c24f", + "fields": [ + { + "label": "status", + "value": "detached" + }, + { + "label": "input tokens", + "value": "0" + }, + { + "label": "output tokens", + "value": "0" + }, + { + "label": "model", + "value": "deepseek-v4-flash" + } + ] + }, + "capabilities": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.recipe": { + "available": false, + "source": "application", + "reason": "Complete or fail a run before analyzing it" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": false, + "source": "application", + "reason": "A run is already active" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report queued input support" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report steering support" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "The current runtime does not report detach support" + }, + "run.reconnect": { + "available": true, + "source": "provider" + }, + "run.reconcile": { + "available": true, + "source": "provider" + } + }, + "draft": "", + "selectedSurface": "transcript", + "appearance": { + "color": "none", + "highContrast": false, + "reducedMotion": false + } + } + }, + "detach": { + "version": 1, + "type": "ack", + "requestId": "restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-detach-pi-tangle-router-deepseek-v4-flash", + "revision": 24, + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-detach-pi-tangle-router-deepseek-v4-flash", + "command": "detach", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "control": "detach", + "outcome": "accepted", + "replayed": false + }, + "reconnect": { + "version": 1, + "type": "ack", + "requestId": "restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-reconnect-pi-tangle-router-deepseek-v4-flash", + "revision": 2059, + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-reconnect-pi-tangle-router-deepseek-v4-flash", + "command": "reconnect" + }, + "reconnectBoundary": { + "version": 1, + "type": "event", + "sequence": 27, + "revision": 27, + "event": { + "sequence": 27, + "revision": 27, + "kind": "run.reconnecting", + "payload": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "status": "reconnecting", + "completeness": "streaming", + "cursor": "9" + } + } + }, + "replayEvent": { + "version": 1, + "type": "event", + "sequence": 28, + "revision": 28, + "event": { + "sequence": 28, + "revision": 28, + "kind": "run.part.updated", + "payload": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "source": { + "eventId": "run-bd391962-dada-4972-998f-f4138190c24f:10", + "providerSequence": 11, + "cursor": "10", + "receivedAt": "2026-08-29T18:32:42.959Z" + }, + "part": { + "id": "run-bd391962-dada-4972-998f-f4138190c24f:message:0:text", + "kind": "text", + "text": "LIVE_B", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:10" + }, + "delta": "_" + } + } + }, + "terminalReceipts": [ + { + "session": "45ee97af-03b6-4d66-b7ef-4877790b61f9", + "responseIndex": 2035, + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "sequence": 2059, + "revision": 2059, + "status": "completed", + "providerEventId": "run-bd391962-dada-4972-998f-f4138190c24f:final", + "providerSequence": 2042, + "cursor": null + } + ], + "finalState": { + "version": 1, + "type": "state", + "requestId": "restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-state-poll-0-pi-tangle-router-deepseek-v4-flash", + "revision": 2059, + "projection": "full", + "state": { + "schemaVersion": 2, + "revision": 2059, + "sequence": 2059, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-223d11c4-cc13-450e-9986-033597482a25", + "conversationId": "conv-1", + "branchId": "branch-1", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "updatedAt": "2026-08-29T18:32:32.612Z" + } + ], + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": { + "default": "deepseek-v4-flash", + "provider": "tangle-router", + "reasoningEffort": "none" + }, + "harness": "pi" + }, + "runConfiguration": { + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "connectionId": "connection-live-cli-bridge", + "overrides": {} + }, + "draft": "", + "messages": [ + { + "id": "message-9edf9877-e45e-4de0-8e1b-fca53d84a0c6", + "role": "user", + "text": "Do not use tools. Reply directly with LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART, then count from 1 to 1000 with one integer per line.", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + }, + { + "id": "message-2b7305c3-247a-4532-a2bf-bc4b475ceacc", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n153\n154\n155\n156\n157\n158\n159\n160\n161\n162\n163\n164\n165\n166\n167\n168\n169\n170\n171\n172\n173\n174\n175\n176\n177\n178\n179\n180\n181\n182\n183\n184\n185\n186\n187\n188\n189\n190\n191\n192\n193\n194\n195\n196\n197\n198\n199\n200\n201\n202\n203\n204\n205\n206\n207\n208\n209\n210\n211\n212\n213\n214\n215\n216\n217\n218\n219\n220\n221\n222\n223\n224\n225\n226\n227\n228\n229\n230\n231\n232\n233\n234\n235\n236\n237\n238\n239\n240\n241\n242\n243\n244\n245\n246\n247\n248\n249\n250\n251\n252\n253\n254\n255\n256\n257\n258\n259\n260\n261\n262\n263\n264\n265\n266\n267\n268\n269\n270\n271\n272\n273\n274\n275\n276\n277\n278\n279\n280\n281\n282\n283\n284\n285\n286\n287\n288\n289\n290\n291\n292\n293\n294\n295\n296\n297\n298\n299\n300\n301\n302\n303\n304\n305\n306\n307\n308\n309\n310\n311\n312\n313\n314\n315\n316\n317\n318\n319\n320\n321\n322\n323\n324\n325\n326\n327\n328\n329\n330\n331\n332\n333\n334\n335\n336\n337\n338\n339\n340\n341\n342\n343\n344\n345\n346\n347\n348\n349\n350\n351\n352\n353\n354\n355\n356\n357\n358\n359\n360\n361\n362\n363\n364\n365\n366\n367\n368\n369\n370\n371\n372\n373\n374\n375\n376\n377\n378\n379\n380\n381\n382\n383\n384\n385\n386\n387\n388\n389\n390\n391\n392\n393\n394\n395\n396\n397\n398\n399\n400\n401\n402\n403\n404\n405\n406\n407\n408\n409\n410\n411\n412\n413\n414\n415\n416\n417\n418\n419\n420\n421\n422\n423\n424\n425\n426\n427\n428\n429\n430\n431\n432\n433\n434\n435\n436\n437\n438\n439\n440\n441\n442\n443\n444\n445\n446\n447\n448\n449\n450\n451\n452\n453\n454\n455\n456\n457\n458\n459\n460\n461\n462\n463\n464\n465\n466\n467\n468\n469\n470\n471\n472\n473\n474\n475\n476\n477\n478\n479\n480\n481\n482\n483\n484\n485\n486\n487\n488\n489\n490\n491\n492\n493\n494\n495\n496\n497\n498\n499\n500\n501\n502\n503\n504\n505\n506\n507\n508\n509\n510\n511\n512\n513\n514\n515\n516\n517\n518\n519\n520\n521\n522\n523\n524\n525\n526\n527\n528\n529\n530\n531\n532\n533\n534\n535\n536\n537\n538\n539\n540\n541\n542\n543\n544\n545\n546\n547\n548\n549\n550\n551\n552\n553\n554\n555\n556\n557\n558\n559\n560\n561\n562\n563\n564\n565\n566\n567\n568\n569\n570\n571\n572\n573\n574\n575\n576\n577\n578\n579\n580\n581\n582\n583\n584\n585\n586\n587\n588\n589\n590\n591\n592\n593\n594\n595\n596\n597\n598\n599\n600\n601\n602\n603\n604\n605\n606\n607\n608\n609\n610\n611\n612\n613\n614\n615\n616\n617\n618\n619\n620\n621\n622\n623\n624\n625\n626\n627\n628\n629\n630\n631\n632\n633\n634\n635\n636\n637\n638\n639\n640\n641\n642\n643\n644\n645\n646\n647\n648\n649\n650\n651\n652\n653\n654\n655\n656\n657\n658\n659\n660\n661\n662\n663\n664\n665\n666\n667\n668\n669\n670\n671\n672\n673\n674\n675\n676\n677\n678\n679\n680\n681\n682\n683\n684\n685\n686\n687\n688\n689\n690\n691\n692\n693\n694\n695\n696\n697\n698\n699\n700\n701\n702\n703\n704\n705\n706\n707\n708\n709\n710\n711\n712\n713\n714\n715\n716\n717\n718\n719\n720\n721\n722\n723\n724\n725\n726\n727\n728\n729\n730\n731\n732\n733\n734\n735\n736\n737\n738\n739\n740\n741\n742\n743\n744\n745\n746\n747\n748\n749\n750\n751\n752\n753\n754\n755\n756\n757\n758\n759\n760\n761\n762\n763\n764\n765\n766\n767\n768\n769\n770\n771\n772\n773\n774\n775\n776\n777\n778\n779\n780\n781\n782\n783\n784\n785\n786\n787\n788\n789\n790\n791\n792\n793\n794\n795\n796\n797\n798\n799\n800\n801\n802\n803\n804\n805\n806\n807\n808\n809\n810\n811\n812\n813\n814\n815\n816\n817\n818\n819\n820\n821\n822\n823\n824\n825\n826\n827\n828\n829\n830\n831\n832\n833\n834\n835\n836\n837\n838\n839\n840\n841\n842\n843\n844\n845\n846\n847\n848\n849\n850\n851\n852\n853\n854\n855\n856\n857\n858\n859\n860\n861\n862\n863\n864\n865\n866\n867\n868\n869\n870\n871\n872\n873\n874\n875\n876\n877\n878\n879\n880\n881\n882\n883\n884\n885\n886\n887\n888\n889\n890\n891\n892\n893\n894\n895\n896\n897\n898\n899\n900\n901\n902\n903\n904\n905\n906\n907\n908\n909\n910\n911\n912\n913\n914\n915\n916\n917\n918\n919\n920\n921\n922\n923\n924\n925\n926\n927\n928\n929\n930\n931\n932\n933\n934\n935\n936\n937\n938\n939\n940\n941\n942\n943\n944\n945\n946\n947\n948\n949\n950\n951\n952\n953\n954\n955\n956\n957\n958\n959\n960\n961\n962\n963\n964\n965\n966\n967\n968\n969\n970\n971\n972\n973\n974\n975\n976\n977\n978\n979\n980\n981\n982\n983\n984\n985\n986\n987\n988\n989\n990\n991\n992\n993\n994\n995\n996\n997\n998\n999\n1000", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + } + ], + "runs": [ + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "turnId": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T18:32:32.612Z", + "updatedAt": "2026-08-29T18:33:04.464Z", + "terminalAt": "2026-08-29T18:33:04.464Z", + "durationMs": 31852, + "inputTokens": 1022, + "outputTokens": 2028, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "reasoningTokens": 0, + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "environmentId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "controlRef": { + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "executionId": "run-bd391962-dada-4972-998f-f4138190c24f", + "provider": "cli-bridge", + "requestDigest": "sha256:66cfc8aec5c2a0b3cdf1dbd540fcfb2bdbc7b8ecd15ea641d480c1a144499cdd", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "sessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f" + }, + "materializationDigest": "a09e9826f20161d49b1bb8d176ba1959e635cc80319caee5392e5a19f4bf7319", + "cursor": "2040", + "cursorCommittedSequence": 2058, + "contentBytes": 11861 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 1022, + "output": 2028, + "reasoning": 0, + "tokenStatus": "complete", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:32:32.272Z", + "updatedAt": "2026-08-29T18:32:34.385Z" + } + ], + "interactions": [], + "queue": [], + "activeRunId": null, + "focusedRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "activeRuns": [], + "lastError": null + }, + "view": { + "revision": 2059, + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-223d11c4-cc13-450e-9986-033597482a25", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "runner": "pi", + "model": "deepseek-v4-flash", + "effort": "none", + "runOverrides": {}, + "connection": "Live local CLI Bridge", + "conversationId": "conv-1", + "conversationTitle": "New conversation", + "conversations": [ + { + "id": "conv-1", + "title": "New conversation", + "branchId": "branch-1", + "archived": false, + "active": true, + "updatedAt": "2026-08-29T18:32:32.612Z" + } + ], + "branch": "branch-1", + "status": "completed", + "statusText": "completed", + "queueCount": 0, + "queue": [], + "messages": [ + { + "id": "message-9edf9877-e45e-4de0-8e1b-fca53d84a0c6", + "role": "user", + "text": "Do not use tools. Reply directly with LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART, then count from 1 to 1000 with one integer per line.", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + }, + { + "id": "message-2b7305c3-247a-4532-a2bf-bc4b475ceacc", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_RESTART\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n153\n154\n155\n156\n157\n158\n159\n160\n161\n162\n163\n164\n165\n166\n167\n168\n169\n170\n171\n172\n173\n174\n175\n176\n177\n178\n179\n180\n181\n182\n183\n184\n185\n186\n187\n188\n189\n190\n191\n192\n193\n194\n195\n196\n197\n198\n199\n200\n201\n202\n203\n204\n205\n206\n207\n208\n209\n210\n211\n212\n213\n214\n215\n216\n217\n218\n219\n220\n221\n222\n223\n224\n225\n226\n227\n228\n229\n230\n231\n232\n233\n234\n235\n236\n237\n238\n239\n240\n241\n242\n243\n244\n245\n246\n247\n248\n249\n250\n251\n252\n253\n254\n255\n256\n257\n258\n259\n260\n261\n262\n263\n264\n265\n266\n267\n268\n269\n270\n271\n272\n273\n274\n275\n276\n277\n278\n279\n280\n281\n282\n283\n284\n285\n286\n287\n288\n289\n290\n291\n292\n293\n294\n295\n296\n297\n298\n299\n300\n301\n302\n303\n304\n305\n306\n307\n308\n309\n310\n311\n312\n313\n314\n315\n316\n317\n318\n319\n320\n321\n322\n323\n324\n325\n326\n327\n328\n329\n330\n331\n332\n333\n334\n335\n336\n337\n338\n339\n340\n341\n342\n343\n344\n345\n346\n347\n348\n349\n350\n351\n352\n353\n354\n355\n356\n357\n358\n359\n360\n361\n362\n363\n364\n365\n366\n367\n368\n369\n370\n371\n372\n373\n374\n375\n376\n377\n378\n379\n380\n381\n382\n383\n384\n385\n386\n387\n388\n389\n390\n391\n392\n393\n394\n395\n396\n397\n398\n399\n400\n401\n402\n403\n404\n405\n406\n407\n408\n409\n410\n411\n412\n413\n414\n415\n416\n417\n418\n419\n420\n421\n422\n423\n424\n425\n426\n427\n428\n429\n430\n431\n432\n433\n434\n435\n436\n437\n438\n439\n440\n441\n442\n443\n444\n445\n446\n447\n448\n449\n450\n451\n452\n453\n454\n455\n456\n457\n458\n459\n460\n461\n462\n463\n464\n465\n466\n467\n468\n469\n470\n471\n472\n473\n474\n475\n476\n477\n478\n479\n480\n481\n482\n483\n484\n485\n486\n487\n488\n489\n490\n491\n492\n493\n494\n495\n496\n497\n498\n499\n500\n501\n502\n503\n504\n505\n506\n507\n508\n509\n510\n511\n512\n513\n514\n515\n516\n517\n518\n519\n520\n521\n522\n523\n524\n525\n526\n527\n528\n529\n530\n531\n532\n533\n534\n535\n536\n537\n538\n539\n540\n541\n542\n543\n544\n545\n546\n547\n548\n549\n550\n551\n552\n553\n554\n555\n556\n557\n558\n559\n560\n561\n562\n563\n564\n565\n566\n567\n568\n569\n570\n571\n572\n573\n574\n575\n576\n577\n578\n579\n580\n581\n582\n583\n584\n585\n586\n587\n588\n589\n590\n591\n592\n593\n594\n595\n596\n597\n598\n599\n600\n601\n602\n603\n604\n605\n606\n607\n608\n609\n610\n611\n612\n613\n614\n615\n616\n617\n618\n619\n620\n621\n622\n623\n624\n625\n626\n627\n628\n629\n630\n631\n632\n633\n634\n635\n636\n637\n638\n639\n640\n641\n642\n643\n644\n645\n646\n647\n648\n649\n650\n651\n652\n653\n654\n655\n656\n657\n658\n659\n660\n661\n662\n663\n664\n665\n666\n667\n668\n669\n670\n671\n672\n673\n674\n675\n676\n677\n678\n679\n680\n681\n682\n683\n684\n685\n686\n687\n688\n689\n690\n691\n692\n693\n694\n695\n696\n697\n698\n699\n700\n701\n702\n703\n704\n705\n706\n707\n708\n709\n710\n711\n712\n713\n714\n715\n716\n717\n718\n719\n720\n721\n722\n723\n724\n725\n726\n727\n728\n729\n730\n731\n732\n733\n734\n735\n736\n737\n738\n739\n740\n741\n742\n743\n744\n745\n746\n747\n748\n749\n750\n751\n752\n753\n754\n755\n756\n757\n758\n759\n760\n761\n762\n763\n764\n765\n766\n767\n768\n769\n770\n771\n772\n773\n774\n775\n776\n777\n778\n779\n780\n781\n782\n783\n784\n785\n786\n787\n788\n789\n790\n791\n792\n793\n794\n795\n796\n797\n798\n799\n800\n801\n802\n803\n804\n805\n806\n807\n808\n809\n810\n811\n812\n813\n814\n815\n816\n817\n818\n819\n820\n821\n822\n823\n824\n825\n826\n827\n828\n829\n830\n831\n832\n833\n834\n835\n836\n837\n838\n839\n840\n841\n842\n843\n844\n845\n846\n847\n848\n849\n850\n851\n852\n853\n854\n855\n856\n857\n858\n859\n860\n861\n862\n863\n864\n865\n866\n867\n868\n869\n870\n871\n872\n873\n874\n875\n876\n877\n878\n879\n880\n881\n882\n883\n884\n885\n886\n887\n888\n889\n890\n891\n892\n893\n894\n895\n896\n897\n898\n899\n900\n901\n902\n903\n904\n905\n906\n907\n908\n909\n910\n911\n912\n913\n914\n915\n916\n917\n918\n919\n920\n921\n922\n923\n924\n925\n926\n927\n928\n929\n930\n931\n932\n933\n934\n935\n936\n937\n938\n939\n940\n941\n942\n943\n944\n945\n946\n947\n948\n949\n950\n951\n952\n953\n954\n955\n956\n957\n958\n959\n960\n961\n962\n963\n964\n965\n966\n967\n968\n969\n970\n971\n972\n973\n974\n975\n976\n977\n978\n979\n980\n981\n982\n983\n984\n985\n986\n987\n988\n989\n990\n991\n992\n993\n994\n995\n996\n997\n998\n999\n1000", + "status": "complete", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "parts": [ + "[depth-limited]" + ] + } + ], + "hiddenMessageCount": 0, + "runs": [ + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "turnId": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "conversationId": "conv-1", + "branchId": "branch-1", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "profileName": "Braid live pi/tangle-router/deepseek-v4-flash", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "model": "pi/tangle-router/deepseek-v4-flash", + "effort": "none", + "cursor": "2040", + "providerSessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "usage": { + "input": 1022, + "output": 2028, + "reasoning": 0, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "elapsedMs": 31852 + }, + "runner": "pi", + "provider": "cli-bridge", + "connectionId": "connection-live-cli-bridge", + "connection": "Live local CLI Bridge", + "environmentId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "completeness": "complete", + "contentBytes": 11861 + } + ], + "sessionUsage": { + "turns": { + "sourceCount": 1, + "input": 1022, + "output": 2028, + "reasoning": 0, + "tokenStatus": "complete", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 1, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 1, + "unknownLatencySources": 1 + }, + "analyses": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "delegated": { + "sourceCount": 0, + "input": 0, + "output": 0, + "tokenStatus": "unknown", + "costStatus": "unknown", + "unknownTokenSources": 0, + "unknownCostSources": 0, + "callStatus": "unknown", + "latencyStatus": "unknown", + "unknownCallSources": 0, + "unknownLatencySources": 0 + }, + "attribution": "complete" + }, + "environments": [ + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "connectionId": "connection-live-cli-bridge", + "kind": "local-process", + "provider": "cli-bridge", + "providerEnvironmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "lifecycle": "ready", + "lifecycleMode": "retained", + "cleanup": "explicit", + "continuity": "session", + "location": "local", + "runtimeEndpointHost": "127.0.0.1", + "unavailableTelemetry": [ + "cli-subscription-and-quota:not-exposed-by-provider", + "effective-resources:not-exposed-by-provider", + "machine-specs:not-exposed-by-provider", + "runtime-cpu-memory-usage:not-exposed-by-provider" + ], + "createdAt": "2026-08-29T18:32:32.272Z", + "updatedAt": "2026-08-29T18:32:34.385Z" + } + ], + "focusedRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "interactions": [], + "activity": [ + { + "id": "run:run-bd391962-dada-4972-998f-f4138190c24f", + "kind": "run", + "title": "run run-bd391962-dada-4972-998f-f4138190c24f", + "status": "completed", + "elapsedMs": 31852, + "startedAt": "2026-08-29T18:32:32.612Z", + "occurredAt": "2026-08-29T18:32:32.612Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "environment:environment-d324f6bdb5f854a75f9b2ffb629b5001", + "kind": "environment", + "title": "cli-bridge execution", + "status": "complete", + "detail": "local-process · local · explicit", + "startedAt": "2026-08-29T18:32:32.272Z", + "occurredAt": "2026-08-29T18:32:34.385Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "environment", + "entityId": "environment-d324f6bdb5f854a75f9b2ffb629b5001" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:admission:local:admitted", + "kind": "system", + "title": "admitted", + "status": "completed", + "detail": "profile 2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "occurredAt": "2026-08-29T18:33:04.464Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:starting", + "kind": "system", + "title": "starting", + "status": "completed", + "occurredAt": "2026-08-29T18:33:04.464Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:starting", + "kind": "system", + "title": "starting", + "status": "completed", + "occurredAt": "2026-08-29T18:33:04.464Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:streaming", + "kind": "system", + "title": "streaming", + "status": "completed", + "occurredAt": "2026-08-29T18:33:04.464Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:control:local:detach", + "kind": "system", + "title": "detach", + "status": "completed", + "occurredAt": "2026-08-29T18:33:04.464Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:control.ack:local:detach", + "kind": "system", + "title": "detach", + "status": "completed", + "detail": "accepted", + "occurredAt": "2026-08-29T18:33:04.464Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:lifecycle:local:detached", + "kind": "system", + "title": "detached", + "status": "completed", + "detail": "CONTROL_ACKNOWLEDGED", + "occurredAt": "2026-08-29T18:33:04.464Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:lifecycle:local:reconnecting", + "kind": "system", + "title": "reconnecting", + "status": "completed", + "detail": "9", + "occurredAt": "2026-08-29T18:33:04.464Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "activity:run-bd391962-dada-4972-998f-f4138190c24f:status:local:running", + "kind": "system", + "title": "running", + "status": "completed", + "occurredAt": "2026-08-29T18:33:04.464Z", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:4", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 5", + "occurredAt": "2026-08-29T18:33:04.464Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:4", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:5", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 6", + "occurredAt": "2026-08-29T18:33:04.464Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:5", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:6", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 7", + "occurredAt": "2026-08-29T18:33:04.464Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:6", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:2036", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 2037", + "occurredAt": "2026-08-29T18:33:04.464Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:2036", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:2037", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 2038", + "occurredAt": "2026-08-29T18:33:04.464Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:2037", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:2038", + "kind": "system", + "title": "event model-processing", + "status": "completed", + "detail": "sequence 2039", + "occurredAt": "2026-08-29T18:33:04.464Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:2038", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + }, + { + "id": "event:run-bd391962-dada-4972-998f-f4138190c24f:run-bd391962-dada-4972-998f-f4138190c24f:2039", + "kind": "system", + "title": "event raw", + "status": "completed", + "detail": "sequence 2040", + "occurredAt": "2026-08-29T18:33:04.464Z", + "sourceEventId": "run-bd391962-dada-4972-998f-f4138190c24f:2039", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "entityType": "run", + "entityId": "run-bd391962-dada-4972-998f-f4138190c24f" + } + ], + "graph": [ + { + "id": "conv-1", + "type": "conversation", + "title": "New conversation", + "status": "complete", + "depth": 0, + "edgeLabel": "attached", + "startedAt": "2026-08-29T18:32:31.802Z" + }, + { + "id": "branch-1", + "type": "branch", + "title": "Main", + "status": "complete", + "depth": 1, + "edgeLabel": "attached", + "parentIds": [ + "conversation:conv-1" + ], + "startedAt": "2026-08-29T18:32:31.802Z" + }, + { + "id": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "type": "environment", + "title": "cli-bridge execution", + "status": "complete", + "depth": 4, + "edgeLabel": "attached", + "parentIds": [ + "run:run-bd391962-dada-4972-998f-f4138190c24f" + ], + "runner": "cli-bridge", + "startedAt": "2026-08-29T18:32:32.272Z" + }, + { + "id": "turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e", + "type": "turn", + "title": "Turn", + "status": "complete", + "depth": 2, + "edgeLabel": "continued", + "parentIds": [ + "branch:branch-1" + ], + "startedAt": "2026-08-29T18:32:32.612Z" + }, + { + "id": "run-bd391962-dada-4972-998f-f4138190c24f", + "type": "run", + "title": "Run", + "status": "completed", + "depth": 3, + "edgeLabel": "attached", + "parentIds": [ + "turn:turn-f16c4b1b-c97e-4beb-8c63-0a3119fb107e" + ], + "runner": "pi", + "elapsedMs": 31852, + "startedAt": "2026-08-29T18:32:32.612Z" + } + ], + "graphQuery": "", + "entityDetails": [ + { + "entityType": "environment", + "entityId": "environment-d324f6bdb5f854a75f9b2ffb629b5001", + "title": "cli-bridge execution", + "status": "ready", + "lines": [ + "provider: cli-bridge", + "execution: local-process · local", + "provider environment: cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "connection: connection-live-cli-bridge", + "lifecycle: ready · retained · cleanup explicit", + "continuity: session", + "runtime endpoint host: 127.0.0.1", + "placement: requested not specified · verified unavailable", + "machine: unavailable · physical IP is not exposed", + "created: 2026-08-29T18:32:32.272Z", + "observed: 2026-08-29T18:32:34.385Z", + "unavailable: cli-subscription-and-quota:not-exposed-by-provider", + "unavailable: effective-resources:not-exposed-by-provider", + "unavailable: machine-specs:not-exposed-by-provider", + "unavailable: runtime-cpu-memory-usage:not-exposed-by-provider" + ] + } + ], + "details": { + "title": "run run-bd391962-dada-4972-998f-f4138190c24f", + "fields": [ + { + "label": "status", + "value": "completed" + }, + { + "label": "input tokens", + "value": "1022" + }, + { + "label": "output tokens", + "value": "2028" + }, + { + "label": "token measurement", + "value": "complete" + }, + { + "label": "model", + "value": "pi/tangle-router/deepseek-v4-flash" + } + ] + }, + "capabilities": { + "conversation.create": { + "available": true, + "source": "application" + }, + "conversation.open": { + "available": true, + "source": "application" + }, + "run.runner": { + "available": true, + "source": "application" + }, + "run.model": { + "available": true, + "source": "application" + }, + "run.effort": { + "available": true, + "source": "application" + }, + "conversation.branch": { + "available": true, + "source": "application" + }, + "conversation.clone": { + "available": true, + "source": "application" + }, + "conversation.fork": { + "available": true, + "source": "application" + }, + "analysis.ask": { + "available": true, + "source": "application" + }, + "analysis.recipe": { + "available": true, + "source": "application" + }, + "analysis.compare": { + "available": false, + "source": "application", + "reason": "Two completed or failed runs are required for comparison" + }, + "interaction.respond": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "interaction.automation": { + "available": false, + "source": "application", + "reason": "Interaction automation requires the shared response contract" + }, + "run.interactive": { + "available": false, + "source": "application", + "reason": "Native terminal mode requires an interactive TUI and a supported provider" + }, + "run.attach": { + "available": false, + "source": "application", + "reason": "Native terminal attachment requires an interactive TUI and a retained session" + }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, + "export.create": { + "available": true, + "source": "application" + }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, + "application.quit": { + "available": true, + "source": "local" + }, + "help.read": { + "available": true, + "source": "local" + }, + "profile.select": { + "available": true, + "source": "application" + }, + "connection.select": { + "available": true, + "source": "application" + }, + "settings.open": { + "available": true, + "source": "application" + }, + "activity.read": { + "available": true, + "source": "local" + }, + "graph.read": { + "available": true, + "source": "local" + }, + "details.read": { + "available": true, + "source": "local" + }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, + "draft.write": { + "available": true, + "source": "application" + }, + "run.send": { + "available": true, + "source": "provider" + }, + "run.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no active run to cancel" + }, + "run.queue": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.steer": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.detach": { + "available": false, + "source": "provider", + "reason": "There is no active run" + }, + "run.reconnect": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconnect" + }, + "run.reconcile": { + "available": false, + "source": "provider", + "reason": "There is no recoverable run to reconcile" + } + }, + "draft": "", + "selectedSurface": "transcript", + "appearance": { + "color": "none", + "highContrast": false, + "reducedMotion": false + } + } + }, + "restartProof": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "savedCursor": "9", + "savedProviderSequence": 10, + "providerSessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f", + "controlRef": { + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6YmJjOTE1NjNkOGI4ODlkZWZjOWQxOTZiY2M4YmVmM2Q4YTUwMmNjMTA0YmYwOTUyMzdiZjAzZjdmMjQ0YTQwNSIsInlYQnhIMDNUTXZhUXh4ZHB6TkRWNy1oSy16aVZXeTRhb0tfaDAwSWVuZkEiXQ", + "executionId": "run-bd391962-dada-4972-998f-f4138190c24f", + "provider": "cli-bridge", + "requestDigest": "sha256:66cfc8aec5c2a0b3cdf1dbd540fcfb2bdbc7b8ecd15ea641d480c1a144499cdd", + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "sessionId": "session-braid-run-bd391962-dada-4972-998f-f4138190c24f" + }, + "process": { + "oldPid": 3387645, + "newPid": 3388666, + "oldProcessInstanceId": "6a521ccb-7f16-4b0b-b9d0-e222e56dca7a", + "newProcessInstanceId": "45ee97af-03b6-4d66-b7ef-4877790b61f9", + "signal": "SIGTERM", + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 3387645 + ], + "roots": [ + 3387645 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "cleanupStatus": "term" + }, + "activeModel": { + "admission": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "requestId": "restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-send-pi-tangle-router-deepseek-v4-flash", + "responseIndex": 2, + "revision": 4 + }, + "state": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "activeRunId": "run-bd391962-dada-4972-998f-f4138190c24f", + "status": "streaming", + "responseIndex": 8, + "revision": 8 + }, + "progress": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "kind": "run.part.updated", + "responseIndex": 18, + "sequence": 18, + "revision": 18, + "providerSequence": 8, + "cursor": "7" + } + }, + "savedCursorBoundary": { + "kind": "run.part.updated", + "responseIndex": 20, + "sequence": 20, + "revision": 20, + "cursor": "9", + "providerSequence": 10 + }, + "reconnect": { + "requestId": "restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-reconnect-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-restart-reconciliation-223d11c4-cc13-450e-9986-033597482a25-reconnect-pi-tangle-router-deepseek-v4-flash", + "ackRevision": 2059, + "boundary": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "kind": "run.reconnecting", + "responseIndex": 3, + "sequence": 27, + "revision": 27, + "savedCursor": "9" + }, + "replay": { + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "kind": "run.part.updated", + "responseIndex": 4, + "sequence": 28, + "revision": 28, + "providerSequence": 11, + "cursor": "10" + } + }, + "terminal": { + "deliveryCount": 1, + "receipt": { + "session": "45ee97af-03b6-4d66-b7ef-4877790b61f9", + "responseIndex": 2035, + "runId": "run-bd391962-dada-4972-998f-f4138190c24f", + "sequence": 2059, + "revision": 2059, + "status": "completed", + "providerEventId": "run-bd391962-dada-4972-998f-f4138190c24f:final", + "providerSequence": 2042, + "cursor": null + }, + "durableRevision": 2059, + "durableCursor": "2040" + } + }, + "usage": { + "inputTokens": 1022, + "outputTokens": 2028 + }, + "statePath": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-223d11c4-cc13-450e-9986-033597482a25/braid.sqlite", + "endpoint": "http://127.0.0.1:3344", + "resubmitted": false + } + }, + { + "requirementId": "LIVE-05", + "operation": "cli-bridge.runner-conformance", + "target": { + "key": "glm-5.2", + "harness": "opencode", + "provider": "zai-coding-plan", + "model": "glm-5.2" + }, + "status": "passed", + "packed": true, + "runId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "evidence": { + "normal": { + "status": "completed", + "runId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "run": { + "id": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "turnId": "turn-eb3a5109-f39a-4855-9097-5418bc2ef817", + "operationId": "op-runner-conformance-send-glm-5.2", + "status": "completed", + "startedAt": "2026-08-29T18:33:07.254Z", + "updatedAt": "2026-08-29T18:33:12.119Z", + "terminalAt": "2026-08-29T18:33:12.119Z", + "durationMs": 4865, + "inputTokens": 7209, + "outputTokens": 49, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "opencode/zai-coding-plan/glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "environmentId": "environment-c5f3b043607d4b48bd5f6ef1d633995c", + "controlRef": { + "runId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "provider": "cli-bridge", + "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmY1ZGI5OTU2ODI2MDk3MmE1NGFkOTZmZDUzYTA0NWY5ZTQ0Y2MwNzc2MDVhZDJiOTExZGI5NmQzYzk0Y2E2MDIiLCJETXdqcDhkVWZ5aTFsVWlMdC1QM1FMWDlleGZKZ1pJeEhocndyV29hTnJvIl0", + "sessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "executionId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "requestDigest": "sha256:c1d44afa3dd4f7f158dffc1337e9bb0fea0fd6e3b981c7174cd769e7c3bf3bd8" + }, + "materializationDigest": "e553ffd0ee98ae80dac1c103d8f501ca0ac17ec85a327cb55b909e7bb44d77fc", + "cursor": "2:0", + "cursorCommittedSequence": 12, + "contentBytes": 61, + "receipt": { + "version": 1, + "runId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "turnId": "turn-eb3a5109-f39a-4855-9097-5418bc2ef817", + "operationId": "op-runner-conformance-send-glm-5.2", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:33:07.240Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", + "profile": { + "name": "Braid live opencode/zai-coding-plan/glm-5.2", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "opencode" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "glm-5.2", + "runner": "opencode" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-d5a4bc88-fa1f-42f2-b472-e5d6c8c53ff3", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "40e40badb645f83cc3db4ce13c774bd8dceca2cedc05a350e556a8300f9b214e", + "capabilitiesDigest": "b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6", + "materializationDigest": "e553ffd0ee98ae80dac1c103d8f501ca0ac17ec85a327cb55b909e7bb44d77fc", + "digest": "b6a7aa72fb16f74786369a5ea9b9d3223bba69291318388ee75a06bf5ed9eb08" + } + }, + "assistant": { + "id": "message-fb846034-03c9-4135-bda1-fdfed093a5be", + "role": "assistant", + "text": "LIVE_BRAID_GLM-5_2_OK", + "status": "complete", + "runId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "parts": [ + { + "id": "op-runner-conformance-send-glm-5.2:text", + "kind": "text", + "text": "LIVE_BRAID_GLM-5_2_OK", + "sourceEventId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e:final" + } + ] + }, + "finalText": "LIVE_BRAID_GLM-5_2_OK", + "marker": "LIVE_BRAID_GLM-5_2_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_GLM-5_2_OK", + "lastError": null + }, + "cancel": { + "prompt": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "runner-conformance-cancel-send-glm-5.2", + "operationId": "op-runner-conformance-cancel-send-glm-5.2", + "revision": 14, + "replayed": false, + "runId": "run-478987f0-5f07-411b-acd2-9b0166672c42", + "admission": { + "version": 1, + "runId": "run-478987f0-5f07-411b-acd2-9b0166672c42", + "turnId": "turn-def886b1-2c2b-4a1e-9897-c680d961e0d6", + "operationId": "op-runner-conformance-cancel-send-glm-5.2", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:33:12.989Z", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "requested": { + "text": "For LIVE_BRAID_GLM-5_2_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live opencode/zai-coding-plan/glm-5.2", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "opencode" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "glm-5.2", + "runner": "opencode" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "providerSessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-opencode-zai-coding-plan-glm-5-2-d5a4bc88-fa1f-42f2-b472-e5d6c8c53ff3", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runner": "opencode", + "providerRunId": "run-478987f0-5f07-411b-acd2-9b0166672c42", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "ca4c641f44178f593e1683753d84af698aa9ebb98cb9afda4a6ca1e2ccc4948b", + "capabilitiesDigest": "b2460314693e3192955c8d5e6905858d6eb7456a6448e6c3c78223e7edcd4dc6", + "materializationDigest": "36ce4db181d49248f36ecbf332b9a055eda108d7799b79da52e31af57fce553d", + "digest": "5d2136eaf2871276b0a7ed4f8605207304d9181e341025e5899512456a157122" + }, + "command": "send" + }, + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-478987f0-5f07-411b-acd2-9b0166672c42", + "activeRun": { + "id": "run-478987f0-5f07-411b-acd2-9b0166672c42", + "turnId": "turn-def886b1-2c2b-4a1e-9897-c680d961e0d6", + "operationId": "op-runner-conformance-cancel-send-glm-5.2", + "status": "streaming", + "startedAt": "2026-08-29T18:33:12.998Z", + "updatedAt": "2026-08-29T18:33:12.998Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "materializationDigest": "36ce4db181d49248f36ecbf332b9a055eda108d7799b79da52e31af57fce553d" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "runner-conformance-cancel-glm-5.2", + "revision": 26, + "operationId": "op-runner-conformance-cancel-glm-5.2", + "command": "cancel_run", + "runId": "run-478987f0-5f07-411b-acd2-9b0166672c42", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "run": { + "id": "run-478987f0-5f07-411b-acd2-9b0166672c42", + "turnId": "turn-def886b1-2c2b-4a1e-9897-c680d961e0d6", + "operationId": "op-runner-conformance-cancel-send-glm-5.2", + "status": "aborted", + "startedAt": "2026-08-29T18:33:12.998Z", + "updatedAt": "2026-08-29T18:33:13.962Z", + "terminalAt": "2026-08-29T18:33:13.962Z", + "durationMs": 964, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "glm-5.2", + "provider": "cli-bridge", + "runner": "opencode", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "completeness": "complete", + "providerSessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "environmentId": "environment-c5f3b043607d4b48bd5f6ef1d633995c", + "controlRef": { + "runId": "run-478987f0-5f07-411b-acd2-9b0166672c42", + "provider": "cli-bridge", + "environmentId": "cb1.WyJvcGVuY29kZSIsIm9wZW5jb2RlL3phaS1jb2RpbmctcGxhbi9nbG0tNS4yIiwic2hhMjU2OmY1ZGI5OTU2ODI2MDk3MmE1NGFkOTZmZDUzYTA0NWY5ZTQ0Y2MwNzc2MDVhZDJiOTExZGI5NmQzYzk0Y2E2MDIiLCJETXdqcDhkVWZ5aTFsVWlMdC1QM1FMWDlleGZKZ1pJeEhocndyV29hTnJvIl0", + "sessionId": "session-braid-run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "executionId": "run-478987f0-5f07-411b-acd2-9b0166672c42", + "requestDigest": "sha256:1f9bb32573ff64a69b1fa85f1b8ace5bb5a01684d35d88f2244eca85f51ed264" + }, + "materializationDigest": "36ce4db181d49248f36ecbf332b9a055eda108d7799b79da52e31af57fce553d", + "contentBytes": 14 + }, + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": false, + "advertisedByBraid": false, + "advertised": false, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "targetProof": { + "key": "glm-5.2", + "harness": "opencode", + "provider": "zai-coding-plan", + "model": "glm-5.2", + "route": "opencode/zai-coding-plan/glm-5.2", + "runId": "run-ea3615c3-933c-43d4-b559-c263ae172d7e", + "profileDigest": "b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd", + "materializationDigest": "e553ffd0ee98ae80dac1c103d8f501ca0ac17ec85a327cb55b909e7bb44d77fc" + } + } + }, + { + "requirementId": "LIVE-05", + "operation": "cli-bridge.runner-conformance", + "target": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash" + }, + "status": "passed", + "packed": true, + "runId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "evidence": { + "normal": { + "status": "completed", + "runId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "run": { + "id": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "turnId": "turn-5a851004-aabe-44c2-91d1-8138740263d9", + "operationId": "op-runner-conformance-send-pi-tangle-router-deepseek-v4-flash", + "status": "completed", + "startedAt": "2026-08-29T18:33:17.051Z", + "updatedAt": "2026-08-29T18:33:21.544Z", + "terminalAt": "2026-08-29T18:33:21.544Z", + "durationMs": 4493, + "inputTokens": 1006, + "outputTokens": 36, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "reasoningTokens": 11, + "costStatus": "unknown", + "model": "pi/tangle-router/deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "environmentId": "environment-ae218b2583a1db50b16b5448dcf65c73", + "controlRef": { + "runId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NWM2NzY5NjEyOTUxYzI4YTVhZGI0YTdhYjcwY2U2ZTgxOWZlYzVjYTdiOGUwMmY0MjNmM2Y4OGQ3YzhiN2IyYyIsIlVyeDJTZmZrMHVrZEpnQzBEMHdSSzh4WWNzT0RnOGRpVXAwOXNKYlhORkUiXQ", + "sessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "executionId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "requestDigest": "sha256:963b88ad80ffaac36b9a5ae6423d3bd268f0ca9ef7cad67b01049305837e60fa" + }, + "materializationDigest": "ac68099e1030fbdd9bf14c3ffdfbe5aa02207ac7e90b106a6df94ae0c8edff47", + "cursor": "50", + "cursorCommittedSequence": 61, + "contentBytes": 263, + "receipt": { + "version": 1, + "runId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "turnId": "turn-5a851004-aabe-44c2-91d1-8138740263d9", + "operationId": "op-runner-conformance-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:33:17.042Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "nativeContinuation": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "interactions": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a6597134-25ae-408b-9978-f3d8216715bb", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "11efc502774d952c8622c2a2352a2a57a656b329a88bf5c3e6a682b2b1f3913c", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "ac68099e1030fbdd9bf14c3ffdfbe5aa02207ac7e90b106a6df94ae0c8edff47", + "digest": "7ee644d424245abad2fc25ec0c9e3757a9c9c1f72e3d017348aa8374ff710a89" + } + }, + "assistant": { + "id": "message-d63dd4c4-cf58-460c-82ca-8e42b3d64053", + "role": "assistant", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "status": "complete", + "runId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "parts": [ + { + "id": "run-be080a09-aa58-4fdb-802e-580c7d37cfba:message:0:reasoning", + "kind": "reasoning", + "text": "The user wants me to output only a specific token.", + "sourceEventId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba:44" + }, + { + "id": "run-be080a09-aa58-4fdb-802e-580c7d37cfba:message:1:text", + "kind": "text", + "text": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "sourceEventId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba:final" + } + ] + }, + "finalText": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "marker": "LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_OK", + "lastError": null + }, + "cancel": { + "prompt": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "runner-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "operationId": "op-runner-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "revision": 63, + "replayed": false, + "runId": "run-58f7359a-5f8c-4914-a97c-8331c16a1e02", + "admission": { + "version": 1, + "runId": "run-58f7359a-5f8c-4914-a97c-8331c16a1e02", + "turnId": "turn-ca9750ab-3efa-4daf-a258-74fb8f1f5950", + "operationId": "op-runner-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:33:22.505Z", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "requested": { + "text": "For LIVE_BRAID_PI-TANGLE-ROUTER-DEEPSEEK-V4-FLASH_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live pi/tangle-router/deepseek-v4-flash", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "pi" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": { + "permission": true + }, + "model": "deepseek-v4-flash", + "runner": "pi" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "nativeContinuation": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "interactions": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "providerSessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-pi-tangle-router-deepseek-v4-flash-a6597134-25ae-408b-9978-f3d8216715bb", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runner": "pi", + "providerRunId": "run-58f7359a-5f8c-4914-a97c-8331c16a1e02", + "retainedControl": "exact-after-dispatch" + }, + "nativeContextBoundaryProof": { + "runId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NWM2NzY5NjEyOTUxYzI4YTVhZGI0YTdhYjcwY2U2ZTgxOWZlYzVjYTdiOGUwMmY0MjNmM2Y4OGQ3YzhiN2IyYyIsIlVyeDJTZmZrMHVrZEpnQzBEMHdSSzh4WWNzT0RnOGRpVXAwOXNKYlhORkUiXQ", + "sessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "executionId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "requestDigest": "sha256:963b88ad80ffaac36b9a5ae6423d3bd268f0ca9ef7cad67b01049305837e60fa", + "boundary": { + "kind": "revision", + "revision": "pi:6c111f69-5bc4-4e89-b80d-948d54350712:2" + }, + "observedAt": "2026-08-29T18:33:21.448Z" + }, + "admissionStatus": "admitted", + "requestDigest": "1f87441cfb76a6c6590a3321528e8c92fe502bc1e30968247bd17d28107c73c5", + "capabilitiesDigest": "87fad3fc4f85aeb0204d71af98d4fbe18722d84f8b76aa3416fb9d4d20584626", + "materializationDigest": "4989dd6d89b3724eac441b74bebf78437d6504a041cbd600e75d2803c85d322c", + "digest": "5bb8947360af136b700501caf564764bf8d1d1c73540fd927d075cc6e9fd9576" + }, + "command": "send" + }, + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-58f7359a-5f8c-4914-a97c-8331c16a1e02", + "activeRun": { + "id": "run-58f7359a-5f8c-4914-a97c-8331c16a1e02", + "turnId": "turn-ca9750ab-3efa-4daf-a258-74fb8f1f5950", + "operationId": "op-runner-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "streaming", + "startedAt": "2026-08-29T18:33:22.516Z", + "updatedAt": "2026-08-29T18:33:22.516Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "materializationDigest": "4989dd6d89b3724eac441b74bebf78437d6504a041cbd600e75d2803c85d322c" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "runner-conformance-cancel-pi-tangle-router-deepseek-v4-flash", + "revision": 80, + "operationId": "op-runner-conformance-cancel-pi-tangle-router-deepseek-v4-flash", + "command": "cancel_run", + "runId": "run-58f7359a-5f8c-4914-a97c-8331c16a1e02", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "run": { + "id": "run-58f7359a-5f8c-4914-a97c-8331c16a1e02", + "turnId": "turn-ca9750ab-3efa-4daf-a258-74fb8f1f5950", + "operationId": "op-runner-conformance-cancel-send-pi-tangle-router-deepseek-v4-flash", + "status": "aborted", + "startedAt": "2026-08-29T18:33:22.516Z", + "updatedAt": "2026-08-29T18:33:24.072Z", + "terminalAt": "2026-08-29T18:33:24.072Z", + "durationMs": 1556, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "deepseek-v4-flash", + "provider": "cli-bridge", + "runner": "pi", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "completeness": "complete", + "providerSessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "environmentId": "environment-ae218b2583a1db50b16b5448dcf65c73", + "controlRef": { + "runId": "run-58f7359a-5f8c-4914-a97c-8331c16a1e02", + "provider": "cli-bridge", + "environmentId": "cb1.WyJwaSIsInBpL3RhbmdsZS1yb3V0ZXIvZGVlcHNlZWstdjQtZmxhc2giLCJzaGEyNTY6NWM2NzY5NjEyOTUxYzI4YTVhZGI0YTdhYjcwY2U2ZTgxOWZlYzVjYTdiOGUwMmY0MjNmM2Y4OGQ3YzhiN2IyYyIsIlVyeDJTZmZrMHVrZEpnQzBEMHdSSzh4WWNzT0RnOGRpVXAwOXNKYlhORkUiXQ", + "sessionId": "session-braid-run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "executionId": "run-58f7359a-5f8c-4914-a97c-8331c16a1e02", + "requestDigest": "sha256:92ce6b32f335ce0fc1bf99b4f9415bd77d0a406860acbbdfe423911c0247e625" + }, + "materializationDigest": "4989dd6d89b3724eac441b74bebf78437d6504a041cbd600e75d2803c85d322c", + "cursor": "5", + "cursorCommittedSequence": 78, + "contentBytes": 14 + }, + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": true, + "advertisedByBraid": false, + "advertised": false, + "provider": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "targetProof": { + "key": "pi-tangle-router-deepseek-v4-flash", + "harness": "pi", + "provider": "tangle-router", + "model": "deepseek-v4-flash", + "route": "pi/tangle-router/deepseek-v4-flash", + "runId": "run-be080a09-aa58-4fdb-802e-580c7d37cfba", + "profileDigest": "2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a", + "materializationDigest": "ac68099e1030fbdd9bf14c3ffdfbe5aa02207ac7e90b106a6df94ae0c8edff47" + } + } + }, + { + "requirementId": "LIVE-05", + "operation": "cli-bridge.runner-conformance", + "target": { + "key": "codex-default", + "harness": "codex", + "model": "default" + }, + "status": "passed", + "packed": true, + "runId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "evidence": { + "normal": { + "status": "completed", + "runId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "run": { + "id": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "turnId": "turn-72ccae6a-31f4-49c5-907d-457a222503b8", + "operationId": "op-runner-conformance-send-codex-default", + "status": "completed", + "startedAt": "2026-08-29T18:33:27.133Z", + "updatedAt": "2026-08-29T18:33:33.125Z", + "terminalAt": "2026-08-29T18:33:33.125Z", + "durationMs": 5992, + "inputTokens": 14632, + "outputTokens": 13, + "tokensKnown": true, + "usdKnown": false, + "tokenStatus": "complete", + "costStatus": "unknown", + "model": "codex/default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "completeness": "complete", + "providerSessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "environmentId": "environment-e65a6f287da5ef40810a059930ffd61b", + "controlRef": { + "runId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6YjVmOWNlYWJmMWU1ZmFiYjJhMjcyNjI5MmJkMDU1ZjZiOTZkNWMzODQ0Mjk3ODc5ZGMyNWFkZDNjYzA3NjJmNiIsImV6cjdVUlVoa0NmRlRsNFQ1ZGJZUWtNNlRCRnZPc2xXNk5rVWFwSUUtSnciXQ", + "sessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "executionId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "requestDigest": "sha256:064a747702ece5ed1e2464357abf94fc75784f0a5eced50a059f6acde936cc30" + }, + "materializationDigest": "3a46ef18bd114b3469028125e6b239ebf58390ed6e452d5858b3fc4de7b2dbe5", + "cursor": "2:0", + "cursorCommittedSequence": 12, + "contentBytes": 73, + "receipt": { + "version": 1, + "runId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "turnId": "turn-72ccae6a-31f4-49c5-907d-457a222503b8", + "operationId": "op-runner-conformance-send-codex-default", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:33:27.117Z", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "requested": { + "text": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK", + "profile": { + "name": "Braid live codex/default", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "codex" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "default", + "runner": "codex" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "providerSessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-02b0aac2-16d0-44e3-a72b-70f3de0d0080", + "model": "default", + "route": "codex/default", + "runner": "codex", + "providerRunId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "a156a6835f353061dd5ba846487e703843f2b80835163fd1ef4017450ae8ff01", + "capabilitiesDigest": "7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a", + "materializationDigest": "3a46ef18bd114b3469028125e6b239ebf58390ed6e452d5858b3fc4de7b2dbe5", + "digest": "797f8b60010f17ff8084a32e094b3ffff5a6f3c2cbfa0a33e84303a1f8b447fb" + } + }, + "assistant": { + "id": "message-aa317d50-df19-4766-99a5-fc06f427ea4d", + "role": "assistant", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "status": "complete", + "runId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "parts": [ + { + "id": "op-runner-conformance-send-codex-default:text", + "kind": "text", + "text": "LIVE_BRAID_CODEX-DEFAULT_OK", + "sourceEventId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0:final" + } + ] + }, + "finalText": "LIVE_BRAID_CODEX-DEFAULT_OK", + "marker": "LIVE_BRAID_CODEX-DEFAULT_OK", + "markerObserved": true, + "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CODEX-DEFAULT_OK", + "lastError": null + }, + "cancel": { + "prompt": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "send": { + "version": 1, + "type": "ack", + "requestId": "runner-conformance-cancel-send-codex-default", + "operationId": "op-runner-conformance-cancel-send-codex-default", + "revision": 14, + "replayed": false, + "runId": "run-97b4e8b8-62a6-4a02-9f7c-b2052ff235e5", + "admission": { + "version": 1, + "runId": "run-97b4e8b8-62a6-4a02-9f7c-b2052ff235e5", + "turnId": "turn-cac2f5b1-5403-49e2-9281-afcdb1b1e2a5", + "operationId": "op-runner-conformance-cancel-send-codex-default", + "conversationId": "conv-1", + "branchId": "branch-1", + "admittedAt": "2026-08-29T18:33:34.473Z", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "requested": { + "text": "For LIVE_BRAID_CODEX-DEFAULT_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", + "profile": { + "name": "Braid live codex/default", + "description": "Opt-in packed CLI Bridge smoke profile", + "version": "0.1.0", + "model": "[depth-limited]", + "harness": "codex" + }, + "connectionId": "connection-live-cli-bridge", + "interactions": {}, + "model": "default", + "runner": "codex" + }, + "capabilities": { + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "messages": false + }, + "controls": { + "cancel": true, + "steer": false, + "queue": true, + "status": true, + "recreate": true + }, + "events": { + "stableIdentity": true, + "sequence": true, + "cursor": true + }, + "usage": true, + "environment": { + "profile": "[depth-limited]", + "streaming": "[depth-limited]", + "sessions": "[depth-limited]", + "retainedControl": "[depth-limited]", + "contextTransfer": "[depth-limited]", + "workspace": "[depth-limited]", + "branching": "[depth-limited]", + "placement": true, + "usage": true, + "confidential": false, + "observation": "[depth-limited]" + } + }, + "provider": "cli-bridge", + "requestedSessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "providerSessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "materializationReceipt": { + "provider": "cli-bridge", + "backend": "environment-provider", + "connectionId": "connection-live-cli-bridge", + "sessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "lifecycle": "retained-session", + "cleanup": "explicit", + "portableContext": "provider-owned", + "workspace": "/tmp/braid-live-targets-ABQ0I5/workspace-codex-default-02b0aac2-16d0-44e3-a72b-70f3de0d0080", + "model": "default", + "route": "codex/default", + "runner": "codex", + "providerRunId": "run-97b4e8b8-62a6-4a02-9f7c-b2052ff235e5", + "retainedControl": "exact-after-dispatch" + }, + "admissionStatus": "admitted", + "requestDigest": "30649bbcbd5b3e0a99e6bf622af8169a0b937d2c4cf79ebf40b84d669782849f", + "capabilitiesDigest": "7986011fd2c78c8c952ee8a2a2a9ad3ccce87022acf06d66630323da74a7739a", + "materializationDigest": "17b4f04c7ecc4260e95f5e118a54fa04b510667527f60bb898cf9377d59b65aa", + "digest": "5244c170817f44ca6fb1c75b3370f328536727eed616717038fb4666398fdf1f" + }, + "command": "send" + }, + "advertisedByProvider": true, + "advertisedByNormalAdmission": true, + "advertisedByNormalRun": false, + "advertisedByRun": true, + "advertised": true, + "runId": "run-97b4e8b8-62a6-4a02-9f7c-b2052ff235e5", + "activeRun": { + "id": "run-97b4e8b8-62a6-4a02-9f7c-b2052ff235e5", + "turnId": "turn-cac2f5b1-5403-49e2-9281-afcdb1b1e2a5", + "operationId": "op-runner-conformance-cancel-send-codex-default", + "status": "streaming", + "startedAt": "2026-08-29T18:33:34.490Z", + "updatedAt": "2026-08-29T18:33:34.490Z", + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "completeness": "incomplete", + "providerSessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "materializationDigest": "17b4f04c7ecc4260e95f5e118a54fa04b510667527f60bb898cf9377d59b65aa" + }, + "response": { + "version": 1, + "type": "ack", + "requestId": "runner-conformance-cancel-codex-default", + "revision": 26, + "operationId": "op-runner-conformance-cancel-codex-default", + "command": "cancel_run", + "runId": "run-97b4e8b8-62a6-4a02-9f7c-b2052ff235e5", + "control": "cancel", + "outcome": "accepted", + "replayed": false + }, + "run": { + "id": "run-97b4e8b8-62a6-4a02-9f7c-b2052ff235e5", + "turnId": "turn-cac2f5b1-5403-49e2-9281-afcdb1b1e2a5", + "operationId": "op-runner-conformance-cancel-send-codex-default", + "status": "cancelled", + "startedAt": "2026-08-29T18:33:34.490Z", + "updatedAt": "2026-08-29T18:33:35.853Z", + "terminalAt": "2026-08-29T18:33:35.815Z", + "durationMs": 1325, + "inputTokens": 0, + "outputTokens": 0, + "tokensKnown": false, + "usdKnown": false, + "tokenStatus": "unknown", + "costStatus": "unknown", + "model": "default", + "provider": "cli-bridge", + "runner": "codex", + "connectionId": "connection-live-cli-bridge", + "requestedSessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "completeness": "complete", + "providerSessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "environmentId": "environment-e65a6f287da5ef40810a059930ffd61b", + "controlRef": { + "runId": "run-97b4e8b8-62a6-4a02-9f7c-b2052ff235e5", + "provider": "cli-bridge", + "environmentId": "cb1.WyJjb2RleCIsImNvZGV4L2RlZmF1bHQiLCJzaGEyNTY6YjVmOWNlYWJmMWU1ZmFiYjJhMjcyNjI5MmJkMDU1ZjZiOTZkNWMzODQ0Mjk3ODc5ZGMyNWFkZDNjYzA3NjJmNiIsImV6cjdVUlVoa0NmRlRsNFQ1ZGJZUWtNNlRCRnZPc2xXNk5rVWFwSUUtSnciXQ", + "sessionId": "session-braid-run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "executionId": "run-97b4e8b8-62a6-4a02-9f7c-b2052ff235e5", + "requestDigest": "sha256:1a607716c063b15c2a429c717219eb306b3a39c30b7e758ddb02fde5c1b8454d" + }, + "materializationDigest": "17b4f04c7ecc4260e95f5e118a54fa04b510667527f60bb898cf9377d59b65aa", + "cursor": "2:0", + "cursorCommittedSequence": 25 + }, + "attemptedRun": true, + "status": "verified" + }, + "interaction": { + "status": "reported-unavailable", + "advertisedByProvider": false, + "advertisedByBraid": false, + "advertised": false, + "braid": { + "available": false, + "source": "runtime", + "reason": "Interaction response is not exposed by the current runtime adapter" + }, + "attempted": false + }, + "targetProof": { + "key": "codex-default", + "harness": "codex", + "model": "default", + "route": "codex/default", + "runId": "run-4a4f19bb-5fd6-4340-88a1-cf0fda1fa7e0", + "profileDigest": "6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8", + "materializationDigest": "3a46ef18bd114b3469028125e6b239ebf58390ed6e452d5858b3fc4de7b2dbe5" + } + } + } + ], + "bridge": { + "initialHealth": { + "ok": false, + "error": "fetch failed" + }, + "launch": { + "requested": true, + "directory": "/home/drew/code/cli-bridge-braid-context-transfer-20260829", + "command": "pnpm start", + "health": { + "status": 200, + "ok": true, + "body": { + "status": "ok", + "cached_verdicts": false, + "oldest_probed_at": "2026-08-29T18:31:11.670Z", + "backends": [ + { + "name": "codex", + "state": "ready", + "version": "codex-cli 0.150.1", + "probed_at": "2026-08-29T18:31:11.670Z", + "cached": false + }, + { + "name": "opencode", + "state": "ready", + "version": "1.18.18", + "probed_at": "2026-08-29T18:31:11.670Z", + "cached": false + }, + { + "name": "pi", + "state": "ready", + "version": "0.83.0", + "probed_at": "2026-08-29T18:31:11.670Z", + "cached": false + } + ], + "admission": { + "active": 0, + "live": 0, + "stale": 0, + "unbound": 0, + "oldestHeldMs": null, + "reclaimed": 0, + "queued": 0, + "maxActive": 8, + "maxQueue": 16, + "reservedActive": 2, + "bulkMaxActive": 6, + "activeByClass": { + "reserved": 0, + "bulk": 0 + }, + "queuedByClass": { + "reserved": 0, + "bulk": 0 + } + }, + "executor": { + "in_flight": 0, + "max": 4, + "queued": 0, + "acquire_deadline_ms": 60000, + "max_acquire_deadline_ms": 900000, + "acquires": 0, + "timeouts": 0, + "scoped_host": { + "in_flight": 0, + "max": 4, + "queued": 0, + "acquire_deadline_ms": 60000, + "max_acquire_deadline_ms": 900000, + "acquires": 3, + "timeouts": 0, + "reserved": 2, + "bulk_in_flight": 0, + "bulk_max": 2, + "queued_reserved": 0, + "queued_bulk": 0 + } + }, + "memory": { + "heap_used_bytes": 65372936, + "heap_total_bytes": 108605440, + "heap_limit_bytes": 4496293888, + "heap_used_pct": 1.5, + "rss_bytes": 170426368, + "external_bytes": 6985484, + "runs_retained": 0, + "run_replay_bytes": 0 + }, + "ts": "2026-08-29T18:31:11.670Z" + }, + "text": "{\"status\":\"ok\",\"cached_verdicts\":false,\"oldest_probed_at\":\"2026-08-29T18:31:11.670Z\",\"backends\":[{\"name\":\"codex\",\"state\":\"ready\",\"version\":\"codex-cli 0.150.1\",\"probed_at\":\"2026-08-29T18:31:11.670Z\",\"cached\":false},{\"name\":\"opencode\",\"state\":\"ready\",\"version\":\"1.18.18\",\"probed_at\":\"2026-08-29T18:31:11.670Z\",\"cached\":false},{\"name\":\"pi\",\"state\":\"ready\",\"version\":\"0.83.0\",\"probed_at\":\"2026-08-29T18:31:11.670Z\",\"cached\":false}],\"admission\":{\"active\":0,\"live\":0,\"stale\":0,\"unbound\":0,\"oldestHeldMs\":null,\"reclaimed\":0,\"queued\":0,\"maxActive\":8,\"maxQueue\":16,\"reservedActive\":2,\"bulkMaxActive\":6,\"activeByClass\":{\"reserved\":0,\"bulk\":0},\"queuedByClass\":{\"reserved\":0,\"bulk\":0}},\"executor\":{\"in_flight\":0,\"max\":4,\"queued\":0,\"acquire_deadline_ms\":60000,\"max_acquire_deadline_ms\":900000,\"acquires\":0,\"timeouts\":0,\"scoped_host\":{\"in_flight\":0,\"max\":4,\"queued\":0,\"acquire_deadline_ms\":60000,\"max_acquire_deadline_ms\":900000,\"acquires\":3,\"timeouts\":0,\"reserved\":2,\"bulk_in_flight\":0,\"bulk_max\":2,\"queued_reserved\":0,\"queued_bulk\":0}},\"memory\":{\"heap_used_bytes\":65372936,\"heap_total_bytes\":108605440,\"heap_limit_bytes\":4496293888,\"heap_used_pct\":1.5,\"rss_bytes\":170426368,\"external_bytes\":6985484,\"runs_retained\":0,\"run_replay_bytes\":0},\"ts\":\"2026-08-29T18:31:11.670Z\"}" + }, + "process": { + "stdout": "[cli-bridge] listening on http://127.0.0.1:3344 (host=127.0.0.1)\n[cli-bridge] backends: opencode, pi, codex\n[cli-bridge] bearer: required\n[cli-bridge] host admission: maxActive=8 maxQueue=16/class reservedActive=2 (bulk ceiling 6) queueTimeoutMs=30000 bulkQueueTimeoutMs=240000\n[cli-bridge] reserved-lane clients: pr-reviewer\n[cli-bridge] traces: /tmp/braid-bridge-final-exact.MwB7Kx/traces/spans.jsonl (max 16777216 bytes × 2 files)\n[cli-bridge] jail default: fs-jail root=/.agent-home\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"harness\":\"opencode\",\"provider\":\"zai-coding-plan\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:33518b13903a532eb86c9ead586aaca152a17eb02e4e8e276d6a7afebe608005\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"harness\":\"opencode\",\"provider\":\"zai-coding-plan\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:33518b13903a532eb86c9ead586aaca152a17eb02e4e8e276d6a7afebe608005\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:cacd611307b6fc338eb0b04bf568333ff6b6079673a73a4739edc9350eae65bf\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"harness\":\"opencode\",\"provider\":\"zai-coding-plan\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:33518b13903a532eb86c9ead586aaca152a17eb02e4e8e276d6a7afebe608005\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"harness\":\"opencode\",\"provider\":\"zai-coding-plan\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:33518b13903a532eb86c9ead586aaca152a17eb02e4e8e276d6a7afebe608005\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] SIGTERM — shutting down\n", + "stderr": "(node:3342141) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n\u001b[2m$ tsx src/server.ts\u001b[22m\n(node:3342156) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:3342172) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n[cli-bridge] admission maxActive=8 exceeds scoped-executor concurrency=4: the executor is the real ceiling. Lower BRIDGE_HOST_CHAT_MAX_ACTIVE or raise CLI_BRIDGE_SCOPE_MAX_CONCURRENCY so one gate owns the limit.\n", + "termination": { + "strategy": "process-group", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": true, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 3342141, + 3342155, + 3342156, + 3342172 + ], + "roots": [ + 3342141 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "term", + "termSignal": { + "method": "process-group", + "sent": true + }, + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": null, + "signal": "SIGTERM" + } + } + }, + "runtimeContract": { + "status": 200, + "ok": true, + "body": { + "name": "cli-bridge", + "version": "0.3.0", + "scheme": "bridge//", + "capabilities": { + "profileMaterialization": "cli-bridge.profile-materialization.v2", + "usageCostProvenance": "cli-bridge.usage-cost.v1", + "runtimeAttachments": { + "mcp": true + } + }, + "backends": [ + "codex", + "opencode", + "pi" + ], + "endpoints": [ + "/health", + "/v1/models", + "/v1/chat/completions", + "/v1/sessions", + "/v1/capabilities", + "/v1/context-transfers", + "/v1/context-transfers/:operationId", + "/v1/context-transfer-environments/:environmentId", + "/v1/sessions/:id/turns", + "/v1/sessions/:id/input", + "/v1/sessions/:id/events", + "/v1/sessions/:id/status", + "/v1/sessions/:id/transcript", + "/v1/sessions/:id/steer", + "/v1/sessions/:id/cancel", + "/v1/sessions/:id/detach", + "/v1/sessions/:id/close", + "/v1/runs/:id", + "/v1/runs/:id/events", + "/v1/runs/:id/cancel", + "/v1/runs/:runId/interactions/:interactionId/respond", + "/cad/render", + "/images/generate" + ] + }, + "text": "{\"name\":\"cli-bridge\",\"version\":\"0.3.0\",\"scheme\":\"bridge//\",\"capabilities\":{\"profileMaterialization\":\"cli-bridge.profile-materialization.v2\",\"usageCostProvenance\":\"cli-bridge.usage-cost.v1\",\"runtimeAttachments\":{\"mcp\":true}},\"backends\":[\"codex\",\"opencode\",\"pi\"],\"endpoints\":[\"/health\",\"/v1/models\",\"/v1/chat/completions\",\"/v1/sessions\",\"/v1/capabilities\",\"/v1/context-transfers\",\"/v1/context-transfers/:operationId\",\"/v1/context-transfer-environments/:environmentId\",\"/v1/sessions/:id/turns\",\"/v1/sessions/:id/input\",\"/v1/sessions/:id/events\",\"/v1/sessions/:id/status\",\"/v1/sessions/:id/transcript\",\"/v1/sessions/:id/steer\",\"/v1/sessions/:id/cancel\",\"/v1/sessions/:id/detach\",\"/v1/sessions/:id/close\",\"/v1/runs/:id\",\"/v1/runs/:id/events\",\"/v1/runs/:id/cancel\",\"/v1/runs/:runId/interactions/:interactionId/respond\",\"/cad/render\",\"/images/generate\"]}" + }, + "models": { + "status": 200, + "ok": true, + "body": { + "object": "list", + "data": [ + { + "id": "codex/default", + "object": "model", + "backend": "codex" + }, + { + "id": "codex/gpt-5-codex", + "object": "model", + "backend": "codex" + }, + { + "id": "codex/gpt-5.4", + "object": "model", + "backend": "codex" + }, + { + "id": "codex/gpt-5.5", + "object": "model", + "backend": "codex" + }, + { + "id": "opencode/deepseek/deepseek-v4-flash", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/deepseek/deepseek-v4-flash-vision-exp", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/deepseek/deepseek-v4-pro", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/kimi-for-coding/k3", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/kimi-for-coding/k3-256k", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/kimi-for-coding/kimi-for-coding", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/kimi-for-coding/kimi-for-coding-highspeed", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-4.7", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5-turbo", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.2", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.2-highspeed", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.3", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.3-flash", + "object": "model", + "backend": "opencode" + }, + { + "id": "opencode/zai-coding-plan/glm-5.3-highspeed", + "object": "model", + "backend": "opencode" + }, + { + "id": "pi/deepseek/deepseek-v4-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/deepseek/deepseek-v4-pro", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/kimi-for-coding-oauth/kimi-for-coding", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/moonshot/kimi-k2-thinking", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/moonshot/kimi-k2.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.3-codex-spark", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.4", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.4-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.6-luna", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.6-sol", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/openai-codex/gpt-5.6-terra", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/claude-haiku-4-5-20251001", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/claude-opus-4-6", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/claude-sonnet-4-6", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/deepseek-v4-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/deepseek-v4-pro", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/deepseek/deepseek-chat", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/fireworks/deepseek-v4-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gemini-2.5-flash-lite", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gemini-3-pro-preview", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/glm-5.2", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-4o-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-5-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-5.4", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/gpt-5.4-mini", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/groq/llama-3.1-8b-instant", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/moonshotai/kimi-k2.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/openai/gpt-5.6-luna", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/tangle-router/openrouter/auto", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5-code", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5-turbo", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-coding-paas/glm-5.1", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-air", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-airx", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.5-x", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.6", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.7", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.7-flash", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-4.7-flashx", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5-code", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5-turbo", + "object": "model", + "backend": "pi" + }, + { + "id": "pi/zai-glm/glm-5.1", + "object": "model", + "backend": "pi" + } + ] + }, + "text": "{\"object\":\"list\",\"data\":[{\"id\":\"codex/default\",\"object\":\"model\",\"backend\":\"codex\"},{\"id\":\"codex/gpt-5-codex\",\"object\":\"model\",\"backend\":\"codex\"},{\"id\":\"codex/gpt-5.4\",\"object\":\"model\",\"backend\":\"codex\"},{\"id\":\"codex/gpt-5.5\",\"object\":\"model\",\"backend\":\"codex\"},{\"id\":\"opencode/deepseek/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/deepseek/deepseek-v4-flash-vision-exp\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/deepseek/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/k3\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/k3-256k\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/kimi-for-coding\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/kimi-for-coding/kimi-for-coding-highspeed\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-4.7\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5-turbo\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.2\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.2-highspeed\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.3\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.3-flash\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"opencode/zai-coding-plan/glm-5.3-highspeed\",\"object\":\"model\",\"backend\":\"opencode\"},{\"id\":\"pi/deepseek/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/deepseek/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/kimi-for-coding-oauth/kimi-for-coding\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/moonshot/kimi-k2-thinking\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/moonshot/kimi-k2.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.3-codex-spark\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.4\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.4-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-luna\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-sol\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/openai-codex/gpt-5.6-terra\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-haiku-4-5-20251001\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-opus-4-6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/claude-sonnet-4-6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek-v4-pro\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/deepseek/deepseek-chat\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/fireworks/deepseek-v4-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gemini-2.5-flash-lite\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gemini-3-pro-preview\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/glm-5.2\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-4o-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5.4\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/gpt-5.4-mini\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/groq/llama-3.1-8b-instant\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/moonshotai/kimi-k2.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/openai/gpt-5.6-luna\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/tangle-router/openrouter/auto\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5-code\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5-turbo\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-coding-paas/glm-5.1\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-air\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-airx\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.5-x\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.6\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7-flash\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-4.7-flashx\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5-code\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5-turbo\",\"object\":\"model\",\"backend\":\"pi\"},{\"id\":\"pi/zai-glm/glm-5.1\",\"object\":\"model\",\"backend\":\"pi\"}]}" + }, + "requiredHealth": { + "status": 200, + "ok": true, + "body": { + "status": "ok", + "cached_verdicts": true, + "oldest_probed_at": "2026-08-29T18:31:11.670Z", + "backends": [ + { + "name": "codex", + "state": "ready", + "version": "codex-cli 0.150.1", + "probed_at": "2026-08-29T18:31:11.670Z", + "cached": true + }, + { + "name": "opencode", + "state": "ready", + "version": "1.18.18", + "probed_at": "2026-08-29T18:31:11.670Z", + "cached": true + }, + { + "name": "pi", + "state": "ready", + "version": "0.83.0", + "probed_at": "2026-08-29T18:31:11.670Z", + "cached": true + } + ], + "admission": { + "active": 0, + "live": 0, + "stale": 0, + "unbound": 0, + "oldestHeldMs": null, + "reclaimed": 0, + "queued": 0, + "maxActive": 8, + "maxQueue": 16, + "reservedActive": 2, + "bulkMaxActive": 6, + "activeByClass": { + "reserved": 0, + "bulk": 0 + }, + "queuedByClass": { + "reserved": 0, + "bulk": 0 + } + }, + "executor": { + "in_flight": 0, + "max": 4, + "queued": 0, + "acquire_deadline_ms": 60000, + "max_acquire_deadline_ms": 900000, + "acquires": 0, + "timeouts": 0, + "scoped_host": { + "in_flight": 0, + "max": 4, + "queued": 0, + "acquire_deadline_ms": 60000, + "max_acquire_deadline_ms": 900000, + "acquires": 6, + "timeouts": 0, + "reserved": 2, + "bulk_in_flight": 0, + "bulk_max": 2, + "queued_reserved": 0, + "queued_bulk": 0 + } + }, + "memory": { + "heap_used_bytes": 51738568, + "heap_total_bytes": 191283200, + "heap_limit_bytes": 4496293888, + "heap_used_pct": 1.2, + "rss_bytes": 186155008, + "external_bytes": 6502601, + "runs_retained": 0, + "run_replay_bytes": 0 + }, + "ts": "2026-08-29T18:31:15.478Z" + }, + "text": "{\"status\":\"ok\",\"cached_verdicts\":true,\"oldest_probed_at\":\"2026-08-29T18:31:11.670Z\",\"backends\":[{\"name\":\"codex\",\"state\":\"ready\",\"version\":\"codex-cli 0.150.1\",\"probed_at\":\"2026-08-29T18:31:11.670Z\",\"cached\":true},{\"name\":\"opencode\",\"state\":\"ready\",\"version\":\"1.18.18\",\"probed_at\":\"2026-08-29T18:31:11.670Z\",\"cached\":true},{\"name\":\"pi\",\"state\":\"ready\",\"version\":\"0.83.0\",\"probed_at\":\"2026-08-29T18:31:11.670Z\",\"cached\":true}],\"admission\":{\"active\":0,\"live\":0,\"stale\":0,\"unbound\":0,\"oldestHeldMs\":null,\"reclaimed\":0,\"queued\":0,\"maxActive\":8,\"maxQueue\":16,\"reservedActive\":2,\"bulkMaxActive\":6,\"activeByClass\":{\"reserved\":0,\"bulk\":0},\"queuedByClass\":{\"reserved\":0,\"bulk\":0}},\"executor\":{\"in_flight\":0,\"max\":4,\"queued\":0,\"acquire_deadline_ms\":60000,\"max_acquire_deadline_ms\":900000,\"acquires\":0,\"timeouts\":0,\"scoped_host\":{\"in_flight\":0,\"max\":4,\"queued\":0,\"acquire_deadline_ms\":60000,\"max_acquire_deadline_ms\":900000,\"acquires\":6,\"timeouts\":0,\"reserved\":2,\"bulk_in_flight\":0,\"bulk_max\":2,\"queued_reserved\":0,\"queued_bulk\":0}},\"memory\":{\"heap_used_bytes\":51738568,\"heap_total_bytes\":191283200,\"heap_limit_bytes\":4496293888,\"heap_used_pct\":1.2,\"rss_bytes\":186155008,\"external_bytes\":6502601,\"runs_retained\":0,\"run_replay_bytes\":0},\"ts\":\"2026-08-29T18:31:15.478Z\"}" + }, + "advertisedModels": [ + "codex/default", + "codex/gpt-5-codex", + "codex/gpt-5.4", + "codex/gpt-5.5", + "opencode/deepseek/deepseek-v4-flash", + "opencode/deepseek/deepseek-v4-flash-vision-exp", + "opencode/deepseek/deepseek-v4-pro", + "opencode/kimi-for-coding/k3", + "opencode/kimi-for-coding/k3-256k", + "opencode/kimi-for-coding/kimi-for-coding", + "opencode/kimi-for-coding/kimi-for-coding-highspeed", + "opencode/zai-coding-plan/glm-4.7", + "opencode/zai-coding-plan/glm-5-turbo", + "opencode/zai-coding-plan/glm-5.2", + "opencode/zai-coding-plan/glm-5.2-highspeed", + "opencode/zai-coding-plan/glm-5.3", + "opencode/zai-coding-plan/glm-5.3-flash", + "opencode/zai-coding-plan/glm-5.3-highspeed", + "pi/deepseek/deepseek-v4-flash", + "pi/deepseek/deepseek-v4-pro", + "pi/kimi-for-coding-oauth/kimi-for-coding", + "pi/moonshot/kimi-k2-thinking", + "pi/moonshot/kimi-k2.5", + "pi/openai-codex/gpt-5.3-codex-spark", + "pi/openai-codex/gpt-5.4", + "pi/openai-codex/gpt-5.4-mini", + "pi/openai-codex/gpt-5.5", + "pi/openai-codex/gpt-5.6-luna", + "pi/openai-codex/gpt-5.6-sol", + "pi/openai-codex/gpt-5.6-terra", + "pi/tangle-router/claude-haiku-4-5-20251001", + "pi/tangle-router/claude-opus-4-6", + "pi/tangle-router/claude-sonnet-4-6", + "pi/tangle-router/deepseek-v4-flash", + "pi/tangle-router/deepseek-v4-pro", + "pi/tangle-router/deepseek/deepseek-chat", + "pi/tangle-router/fireworks/deepseek-v4-flash", + "pi/tangle-router/gemini-2.5-flash-lite", + "pi/tangle-router/gemini-3-pro-preview", + "pi/tangle-router/glm-5.2", + "pi/tangle-router/gpt-4o-mini", + "pi/tangle-router/gpt-5-mini", + "pi/tangle-router/gpt-5.4", + "pi/tangle-router/gpt-5.4-mini", + "pi/tangle-router/groq/llama-3.1-8b-instant", + "pi/tangle-router/moonshotai/kimi-k2.5", + "pi/tangle-router/openai/gpt-5.6-luna", + "pi/tangle-router/openrouter/auto", + "pi/zai-coding-paas/glm-5", + "pi/zai-coding-paas/glm-5-code", + "pi/zai-coding-paas/glm-5-turbo", + "pi/zai-coding-paas/glm-5.1", + "pi/zai-glm/glm-4.5", + "pi/zai-glm/glm-4.5-air", + "pi/zai-glm/glm-4.5-airx", + "pi/zai-glm/glm-4.5-flash", + "pi/zai-glm/glm-4.5-x", + "pi/zai-glm/glm-4.6", + "pi/zai-glm/glm-4.7", + "pi/zai-glm/glm-4.7-flash", + "pi/zai-glm/glm-4.7-flashx", + "pi/zai-glm/glm-5", + "pi/zai-glm/glm-5-code", + "pi/zai-glm/glm-5-turbo", + "pi/zai-glm/glm-5.1" + ], + "missingTargets": [], + "selectedTargets": [ + { + "key": "glm-5.2", + "label": "GLM 5.2", + "modelId": "opencode/zai-coding-plan/glm-5.2" + }, + { + "key": "pi-tangle-router-deepseek-v4-flash", + "label": "Pi with Tangle Router DeepSeek V4 Flash", + "modelId": "pi/tangle-router/deepseek-v4-flash" + }, + { + "key": "codex-default", + "label": "Codex default", + "modelId": "codex/default" + } + ] + }, + "selectedTargets": [ + { + "key": "glm-5.2", + "label": "GLM 5.2", + "modelId": "opencode/zai-coding-plan/glm-5.2" + }, + { + "key": "pi-tangle-router-deepseek-v4-flash", + "label": "Pi with Tangle Router DeepSeek V4 Flash", + "modelId": "pi/tangle-router/deepseek-v4-flash" + }, + { + "key": "codex-default", + "label": "Codex default", + "modelId": "codex/default" + } + ], + "temp": { + "packRoot": "/tmp/braid-live-pack-FH1bzh", + "installRoot": "/tmp/braid-live-install-LwdJOl" + }, + "build": { + "command": "pnpm", + "args": [ + "run", + "build" + ], + "code": 0, + "signal": null, + "stdout": "", + "stderr": "\u001b[2m$ node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/build-startup.mjs\u001b[22m\n", + "durationMs": 1667, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "packCommand": { + "command": "pnpm", + "args": [ + "pack", + "--pack-destination", + "/tmp/braid-live-pack-FH1bzh" + ], + "code": 0, + "signal": null, + "stdout": "package: @tangle-network/braid@0.3.0\n\u001b[94mTarball Contents\u001b[39m\ndist/adapters/agent-interface/harness-runtime.d.ts\ndist/adapters/agent-interface/harness-runtime.d.ts.map\ndist/adapters/agent-interface/harness-runtime.js\ndist/adapters/agent-interface/harness-runtime.js.map\ndist/adapters/agent-interface/interaction-runtime.d.ts\ndist/adapters/agent-interface/interaction-runtime.d.ts.map\ndist/adapters/agent-interface/interaction-runtime.js\ndist/adapters/agent-interface/interaction-runtime.js.map\ndist/adapters/agent-interface/module-url.d.ts\ndist/adapters/agent-interface/module-url.d.ts.map\ndist/adapters/agent-interface/module-url.js\ndist/adapters/agent-interface/module-url.js.map\ndist/adapters/agent-interface/profile-runtime.d.ts\ndist/adapters/agent-interface/profile-runtime.d.ts.map\ndist/adapters/agent-interface/profile-runtime.js\ndist/adapters/agent-interface/profile-runtime.js.map\ndist/adapters/analysis/agent-eval-version.d.ts\ndist/adapters/analysis/agent-eval-version.d.ts.map\ndist/adapters/analysis/agent-eval-version.js\ndist/adapters/analysis/agent-eval-version.js.map\ndist/adapters/analysis/citations.d.ts\ndist/adapters/analysis/citations.d.ts.map\ndist/adapters/analysis/citations.js\ndist/adapters/analysis/citations.js.map\ndist/adapters/analysis/eval-analyst.d.ts\ndist/adapters/analysis/eval-analyst.d.ts.map\ndist/adapters/analysis/eval-analyst.js\ndist/adapters/analysis/eval-analyst.js.map\ndist/adapters/analysis/managed-analysis-runtime.d.ts\ndist/adapters/analysis/managed-analysis-runtime.d.ts.map\ndist/adapters/analysis/managed-analysis-runtime.js\ndist/adapters/analysis/managed-analysis-runtime.js.map\ndist/adapters/analysis/model-execution-scope.d.ts\ndist/adapters/analysis/model-execution-scope.d.ts.map\ndist/adapters/analysis/model-execution-scope.js\ndist/adapters/analysis/model-execution-scope.js.map\ndist/adapters/analysis/production-analysis-analyst.d.ts\ndist/adapters/analysis/production-analysis-analyst.d.ts.map\ndist/adapters/analysis/production-analysis-analyst.js\ndist/adapters/analysis/production-analysis-analyst.js.map\ndist/adapters/analysis/python-runner.d.ts\ndist/adapters/analysis/python-runner.d.ts.map\ndist/adapters/analysis/python-runner.js\ndist/adapters/analysis/python-runner.js.map\ndist/adapters/analysis/question-analyst.d.ts\ndist/adapters/analysis/question-analyst.d.ts.map\ndist/adapters/analysis/question-analyst.js\ndist/adapters/analysis/question-analyst.js.map\ndist/adapters/analysis/runtime-model-owner.d.ts\ndist/adapters/analysis/runtime-model-owner.d.ts.map\ndist/adapters/analysis/runtime-model-owner.js\ndist/adapters/analysis/runtime-model-owner.js.map\ndist/adapters/analysis/runtime-retained-model-call.d.ts\ndist/adapters/analysis/runtime-retained-model-call.d.ts.map\ndist/adapters/analysis/runtime-retained-model-call.js\ndist/adapters/analysis/runtime-retained-model-call.js.map\ndist/adapters/analysis/trace-analysis-adapter.d.ts\ndist/adapters/analysis/trace-analysis-adapter.d.ts.map\ndist/adapters/analysis/trace-analysis-adapter.js\ndist/adapters/analysis/trace-analysis-adapter.js.map\ndist/adapters/analysis/trace-event-projection.d.ts\ndist/adapters/analysis/trace-event-projection.d.ts.map\ndist/adapters/analysis/trace-event-projection.js\ndist/adapters/analysis/trace-event-projection.js.map\ndist/adapters/analysis/trace-store.d.ts\ndist/adapters/analysis/trace-store.d.ts.map\ndist/adapters/analysis/trace-store.js\ndist/adapters/analysis/trace-store.js.map\ndist/adapters/connections/aws-nitro-root-g1.d.ts\ndist/adapters/connections/aws-nitro-root-g1.d.ts.map\ndist/adapters/connections/aws-nitro-root-g1.js\ndist/adapters/connections/aws-nitro-root-g1.js.map\ndist/adapters/connections/cli-bridge-health.d.ts\ndist/adapters/connections/cli-bridge-health.d.ts.map\ndist/adapters/connections/cli-bridge-health.js\ndist/adapters/connections/cli-bridge-health.js.map\ndist/adapters/connections/cli-bridge-model-route.d.ts\ndist/adapters/connections/cli-bridge-model-route.d.ts.map\ndist/adapters/connections/cli-bridge-model-route.js\ndist/adapters/connections/cli-bridge-model-route.js.map\ndist/adapters/connections/cli-bridge-model-validation.d.ts\ndist/adapters/connections/cli-bridge-model-validation.d.ts.map\ndist/adapters/connections/cli-bridge-model-validation.js\ndist/adapters/connections/cli-bridge-model-validation.js.map\ndist/adapters/connections/nitro-confidential-attestation.d.ts\ndist/adapters/connections/nitro-confidential-attestation.d.ts.map\ndist/adapters/connections/nitro-confidential-attestation.js\ndist/adapters/connections/nitro-confidential-attestation.js.map\ndist/adapters/connections/production-connection-credentials.d.ts\ndist/adapters/connections/production-connection-credentials.d.ts.map\ndist/adapters/connections/production-connection-credentials.js\ndist/adapters/connections/production-connection-credentials.js.map\ndist/adapters/connections/production-connection-endpoints.d.ts\ndist/adapters/connections/production-connection-endpoints.d.ts.map\ndist/adapters/connections/production-connection-endpoints.js\ndist/adapters/connections/production-connection-endpoints.js.map\ndist/adapters/connections/production-connection-health.d.ts\ndist/adapters/connections/production-connection-health.d.ts.map\ndist/adapters/connections/production-connection-health.js\ndist/adapters/connections/production-connection-health.js.map\ndist/adapters/connections/production-connection-providers.d.ts\ndist/adapters/connections/production-connection-providers.d.ts.map\ndist/adapters/connections/production-connection-providers.js\ndist/adapters/connections/production-connection-providers.js.map\ndist/adapters/connections/production-connection-types.d.ts\ndist/adapters/connections/production-connection-types.d.ts.map\ndist/adapters/connections/production-connection-types.js\ndist/adapters/connections/production-connection-types.js.map\ndist/adapters/connections/production-connections.d.ts\ndist/adapters/connections/production-connections.d.ts.map\ndist/adapters/connections/production-connections.js\ndist/adapters/connections/production-connections.js.map\ndist/adapters/connections/tangle-retained-control-lookup.d.ts\ndist/adapters/connections/tangle-retained-control-lookup.d.ts.map\ndist/adapters/connections/tangle-retained-control-lookup.js\ndist/adapters/connections/tangle-retained-control-lookup.js.map\ndist/adapters/credentials/headless-key.d.ts\ndist/adapters/credentials/headless-key.d.ts.map\ndist/adapters/credentials/headless-key.js\ndist/adapters/credentials/headless-key.js.map\ndist/adapters/credentials/headless-store.d.ts\ndist/adapters/credentials/headless-store.d.ts.map\ndist/adapters/credentials/headless-store.js\ndist/adapters/credentials/headless-store.js.map\ndist/adapters/credentials/memory.d.ts\ndist/adapters/credentials/memory.d.ts.map\ndist/adapters/credentials/memory.js\ndist/adapters/credentials/memory.js.map\ndist/adapters/credentials/os.d.ts\ndist/adapters/credentials/os.d.ts.map\ndist/adapters/credentials/os.js\ndist/adapters/credentials/os.js.map\ndist/adapters/persistence/posix-at.d.ts\ndist/adapters/persistence/posix-at.d.ts.map\ndist/adapters/persistence/posix-at.js\ndist/adapters/persistence/posix-at.js.map\ndist/adapters/persistence/safe-file-descriptor.d.ts\ndist/adapters/persistence/safe-file-descriptor.d.ts.map\ndist/adapters/persistence/safe-file-descriptor.js\ndist/adapters/persistence/safe-file-descriptor.js.map\ndist/adapters/persistence/safe-file-io.d.ts\ndist/adapters/persistence/safe-file-io.d.ts.map\ndist/adapters/persistence/safe-file-io.js\ndist/adapters/persistence/safe-file-io.js.map\ndist/adapters/persistence/safe-file.d.ts\ndist/adapters/persistence/safe-file.d.ts.map\ndist/adapters/persistence/safe-file.js\ndist/adapters/persistence/safe-file.js.map\ndist/adapters/runtime/agent-runtime-execution.d.ts\ndist/adapters/runtime/agent-runtime-execution.d.ts.map\ndist/adapters/runtime/agent-runtime-execution.js\ndist/adapters/runtime/agent-runtime-execution.js.map\ndist/adapters/runtime/agent-runtime-version.d.ts\ndist/adapters/runtime/agent-runtime-version.d.ts.map\ndist/adapters/runtime/agent-runtime-version.js\ndist/adapters/runtime/agent-runtime-version.js.map\ndist/adapters/runtime/cli-bridge-context-transfer.d.ts\ndist/adapters/runtime/cli-bridge-context-transfer.d.ts.map\ndist/adapters/runtime/cli-bridge-context-transfer.js\ndist/adapters/runtime/cli-bridge-context-transfer.js.map\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts\ndist/adapters/runtime/cli-bridge-retained-execution.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-execution.js\ndist/adapters/runtime/cli-bridge-retained-execution.js.map\ndist/adapters/runtime/cli-bridge-retained-run.d.ts\ndist/adapters/runtime/cli-bridge-retained-run.d.ts.map\ndist/adapters/runtime/cli-bridge-retained-run.js\ndist/adapters/runtime/cli-bridge-retained-run.js.map\ndist/adapters/runtime/execution-observation-source.d.ts\ndist/adapters/runtime/execution-observation-source.d.ts.map\ndist/adapters/runtime/execution-observation-source.js\ndist/adapters/runtime/execution-observation-source.js.map\ndist/adapters/runtime/lazy-execution.d.ts\ndist/adapters/runtime/lazy-execution.d.ts.map\ndist/adapters/runtime/lazy-execution.js\ndist/adapters/runtime/lazy-execution.js.map\ndist/adapters/runtime/mode-routing-execution.d.ts\ndist/adapters/runtime/mode-routing-execution.d.ts.map\ndist/adapters/runtime/mode-routing-execution.js\ndist/adapters/runtime/mode-routing-execution.js.map\ndist/adapters/runtime/native-interactive-run-broker.d.ts\ndist/adapters/runtime/native-interactive-run-broker.d.ts.map\ndist/adapters/runtime/native-interactive-run-broker.js\ndist/adapters/runtime/native-interactive-run-broker.js.map\ndist/adapters/runtime/prepared-execution.d.ts\ndist/adapters/runtime/prepared-execution.d.ts.map\ndist/adapters/runtime/prepared-execution.js\ndist/adapters/runtime/prepared-execution.js.map\ndist/adapters/runtime/production-backend-common.d.ts\ndist/adapters/runtime/production-backend-common.d.ts.map\ndist/adapters/runtime/production-backend-common.js\ndist/adapters/runtime/production-backend-common.js.map\ndist/adapters/runtime/production-backend-resolver.d.ts\ndist/adapters/runtime/production-backend-resolver.d.ts.map\ndist/adapters/runtime/production-backend-resolver.js\ndist/adapters/runtime/production-backend-resolver.js.map\ndist/adapters/runtime/production-cli-bridge-backend.d.ts\ndist/adapters/runtime/production-cli-bridge-backend.d.ts.map\ndist/adapters/runtime/production-cli-bridge-backend.js\ndist/adapters/runtime/production-cli-bridge-backend.js.map\ndist/adapters/runtime/production-tangle-inference-backend.d.ts\ndist/adapters/runtime/production-tangle-inference-backend.d.ts.map\ndist/adapters/runtime/production-tangle-inference-backend.js\ndist/adapters/runtime/production-tangle-inference-backend.js.map\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts\ndist/adapters/runtime/production-tangle-sandbox-backend.d.ts.map\ndist/adapters/runtime/production-tangle-sandbox-backend.js\ndist/adapters/runtime/production-tangle-sandbox-backend.js.map\ndist/adapters/runtime/retained-execution-contract.d.ts\ndist/adapters/runtime/retained-execution-contract.d.ts.map\ndist/adapters/runtime/retained-execution-contract.js\ndist/adapters/runtime/retained-execution-contract.js.map\ndist/adapters/runtime/retained-execution-projection.d.ts\ndist/adapters/runtime/retained-execution-projection.d.ts.map\ndist/adapters/runtime/retained-execution-projection.js\ndist/adapters/runtime/retained-execution-projection.js.map\ndist/adapters/runtime/retained-execution-state.d.ts\ndist/adapters/runtime/retained-execution-state.d.ts.map\ndist/adapters/runtime/retained-execution-state.js\ndist/adapters/runtime/retained-execution-state.js.map\ndist/adapters/runtime/retained-execution-stream.d.ts\ndist/adapters/runtime/retained-execution-stream.d.ts.map\ndist/adapters/runtime/retained-execution-stream.js\ndist/adapters/runtime/retained-execution-stream.js.map\ndist/adapters/runtime/retained-execution.d.ts\ndist/adapters/runtime/retained-execution.d.ts.map\ndist/adapters/runtime/retained-execution.js\ndist/adapters/runtime/retained-execution.js.map\ndist/adapters/runtime/retained-native-continuation.d.ts\ndist/adapters/runtime/retained-native-continuation.d.ts.map\ndist/adapters/runtime/retained-native-continuation.js\ndist/adapters/runtime/retained-native-continuation.js.map\ndist/adapters/runtime/sandbox-account-observation.d.ts\ndist/adapters/runtime/sandbox-account-observation.d.ts.map\ndist/adapters/runtime/sandbox-account-observation.js\ndist/adapters/runtime/sandbox-account-observation.js.map\ndist/adapters/runtime/sandbox-instance-observation.d.ts\ndist/adapters/runtime/sandbox-instance-observation.d.ts.map\ndist/adapters/runtime/sandbox-instance-observation.js\ndist/adapters/runtime/sandbox-instance-observation.js.map\ndist/adapters/runtime/sandbox-observation-types.d.ts\ndist/adapters/runtime/sandbox-observation-types.d.ts.map\ndist/adapters/runtime/sandbox-observation-types.js\ndist/adapters/runtime/sandbox-observation-types.js.map\ndist/adapters/runtime/sandbox-observation.d.ts\ndist/adapters/runtime/sandbox-observation.d.ts.map\ndist/adapters/runtime/sandbox-observation.js\ndist/adapters/runtime/sandbox-observation.js.map\ndist/adapters/runtime/supervisor-control.d.ts\ndist/adapters/runtime/supervisor-control.d.ts.map\ndist/adapters/runtime/supervisor-control.js\ndist/adapters/runtime/supervisor-control.js.map\ndist/adapters/runtime/supervisor-watch.d.ts\ndist/adapters/runtime/supervisor-watch.d.ts.map\ndist/adapters/runtime/supervisor-watch.js\ndist/adapters/runtime/supervisor-watch.js.map\ndist/adapters/runtime/tangle-retained-execution.d.ts\ndist/adapters/runtime/tangle-retained-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-execution.js\ndist/adapters/runtime/tangle-retained-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts\ndist/adapters/runtime/tangle-retained-interactive-contract.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-contract.js\ndist/adapters/runtime/tangle-retained-interactive-contract.js.map\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts\ndist/adapters/runtime/tangle-retained-interactive-execution.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-execution.js\ndist/adapters/runtime/tangle-retained-interactive-execution.js.map\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts\ndist/adapters/runtime/tangle-retained-interactive-projection.d.ts.map\ndist/adapters/runtime/tangle-retained-interactive-projection.js\ndist/adapters/runtime/tangle-retained-interactive-projection.js.map\ndist/adapters/runtime/tangle-retained-run.d.ts\ndist/adapters/runtime/tangle-retained-run.d.ts.map\ndist/adapters/runtime/tangle-retained-run.js\ndist/adapters/runtime/tangle-retained-run.js.map\ndist/adapters/runtime/tangle-sandbox-retention.d.ts\ndist/adapters/runtime/tangle-sandbox-retention.d.ts.map\ndist/adapters/runtime/tangle-sandbox-retention.js\ndist/adapters/runtime/tangle-sandbox-retention.js.map\ndist/adapters/runtime/unavailable-execution.d.ts\ndist/adapters/runtime/unavailable-execution.d.ts.map\ndist/adapters/runtime/unavailable-execution.js\ndist/adapters/runtime/unavailable-execution.js.map\ndist/adapters/storage/memory-base.d.ts\ndist/adapters/storage/memory-base.d.ts.map\ndist/adapters/storage/memory-base.js\ndist/adapters/storage/memory-base.js.map\ndist/adapters/storage/memory-effects.d.ts\ndist/adapters/storage/memory-effects.d.ts.map\ndist/adapters/storage/memory-effects.js\ndist/adapters/storage/memory-effects.js.map\ndist/adapters/storage/memory-journal.d.ts\ndist/adapters/storage/memory-journal.d.ts.map\ndist/adapters/storage/memory-journal.js\ndist/adapters/storage/memory-journal.js.map\ndist/adapters/storage/memory-maintenance.d.ts\ndist/adapters/storage/memory-maintenance.d.ts.map\ndist/adapters/storage/memory-maintenance.js\ndist/adapters/storage/memory-maintenance.js.map\ndist/adapters/storage/memory-operations.d.ts\ndist/adapters/storage/memory-operations.d.ts.map\ndist/adapters/storage/memory-operations.js\ndist/adapters/storage/memory-operations.js.map\ndist/adapters/storage/memory-retention.d.ts\ndist/adapters/storage/memory-retention.d.ts.map\ndist/adapters/storage/memory-retention.js\ndist/adapters/storage/memory-retention.js.map\ndist/adapters/storage/memory.d.ts\ndist/adapters/storage/memory.d.ts.map\ndist/adapters/storage/memory.js\ndist/adapters/storage/memory.js.map\ndist/adapters/storage/sqlite-base.d.ts\ndist/adapters/storage/sqlite-base.d.ts.map\ndist/adapters/storage/sqlite-base.js\ndist/adapters/storage/sqlite-base.js.map\ndist/adapters/storage/sqlite-bound-open.d.ts\ndist/adapters/storage/sqlite-bound-open.d.ts.map\ndist/adapters/storage/sqlite-bound-open.js\ndist/adapters/storage/sqlite-bound-open.js.map\ndist/adapters/storage/sqlite-content.d.ts\ndist/adapters/storage/sqlite-content.d.ts.map\ndist/adapters/storage/sqlite-content.js\ndist/adapters/storage/sqlite-content.js.map\ndist/adapters/storage/sqlite-crypto.d.ts\ndist/adapters/storage/sqlite-crypto.d.ts.map\ndist/adapters/storage/sqlite-crypto.js\ndist/adapters/storage/sqlite-crypto.js.map\ndist/adapters/storage/sqlite-driver.d.ts\ndist/adapters/storage/sqlite-driver.d.ts.map\ndist/adapters/storage/sqlite-driver.js\ndist/adapters/storage/sqlite-driver.js.map\ndist/adapters/storage/sqlite-effects.d.ts\ndist/adapters/storage/sqlite-effects.d.ts.map\ndist/adapters/storage/sqlite-effects.js\ndist/adapters/storage/sqlite-effects.js.map\ndist/adapters/storage/sqlite-errors.d.ts\ndist/adapters/storage/sqlite-errors.d.ts.map\ndist/adapters/storage/sqlite-errors.js\ndist/adapters/storage/sqlite-errors.js.map\ndist/adapters/storage/sqlite-initialization.d.ts\ndist/adapters/storage/sqlite-initialization.d.ts.map\ndist/adapters/storage/sqlite-initialization.js\ndist/adapters/storage/sqlite-initialization.js.map\ndist/adapters/storage/sqlite-journal.d.ts\ndist/adapters/storage/sqlite-journal.d.ts.map\ndist/adapters/storage/sqlite-journal.js\ndist/adapters/storage/sqlite-journal.js.map\ndist/adapters/storage/sqlite-lifecycle.d.ts\ndist/adapters/storage/sqlite-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-lifecycle.js\ndist/adapters/storage/sqlite-lifecycle.js.map\ndist/adapters/storage/sqlite-maintenance.d.ts\ndist/adapters/storage/sqlite-maintenance.d.ts.map\ndist/adapters/storage/sqlite-maintenance.js\ndist/adapters/storage/sqlite-maintenance.js.map\ndist/adapters/storage/sqlite-operations.d.ts\ndist/adapters/storage/sqlite-operations.d.ts.map\ndist/adapters/storage/sqlite-operations.js\ndist/adapters/storage/sqlite-operations.js.map\ndist/adapters/storage/sqlite-paths.d.ts\ndist/adapters/storage/sqlite-paths.d.ts.map\ndist/adapters/storage/sqlite-paths.js\ndist/adapters/storage/sqlite-paths.js.map\ndist/adapters/storage/sqlite-projection.d.ts\ndist/adapters/storage/sqlite-projection.d.ts.map\ndist/adapters/storage/sqlite-projection.js\ndist/adapters/storage/sqlite-projection.js.map\ndist/adapters/storage/sqlite-queue.d.ts\ndist/adapters/storage/sqlite-queue.d.ts.map\ndist/adapters/storage/sqlite-queue.js\ndist/adapters/storage/sqlite-queue.js.map\ndist/adapters/storage/sqlite-recovery.d.ts\ndist/adapters/storage/sqlite-recovery.d.ts.map\ndist/adapters/storage/sqlite-recovery.js\ndist/adapters/storage/sqlite-recovery.js.map\ndist/adapters/storage/sqlite-redaction.d.ts\ndist/adapters/storage/sqlite-redaction.d.ts.map\ndist/adapters/storage/sqlite-redaction.js\ndist/adapters/storage/sqlite-redaction.js.map\ndist/adapters/storage/sqlite-rows.d.ts\ndist/adapters/storage/sqlite-rows.d.ts.map\ndist/adapters/storage/sqlite-rows.js\ndist/adapters/storage/sqlite-rows.js.map\ndist/adapters/storage/sqlite-schema.d.ts\ndist/adapters/storage/sqlite-schema.d.ts.map\ndist/adapters/storage/sqlite-schema.js\ndist/adapters/storage/sqlite-schema.js.map\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts\ndist/adapters/storage/sqlite-state-snapshot-codec.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-codec.js\ndist/adapters/storage/sqlite-state-snapshot-codec.js.map\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts\ndist/adapters/storage/sqlite-state-snapshot-keys.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-keys.js\ndist/adapters/storage/sqlite-state-snapshot-keys.js.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js\ndist/adapters/storage/sqlite-state-snapshot-lifecycle.js.map\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts\ndist/adapters/storage/sqlite-state-snapshot-read.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-read.js\ndist/adapters/storage/sqlite-state-snapshot-read.js.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts\ndist/adapters/storage/sqlite-state-snapshot-transaction.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-transaction.js\ndist/adapters/storage/sqlite-state-snapshot-transaction.js.map\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts\ndist/adapters/storage/sqlite-state-snapshot-types.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-types.js\ndist/adapters/storage/sqlite-state-snapshot-types.js.map\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts\ndist/adapters/storage/sqlite-state-snapshot-write.d.ts.map\ndist/adapters/storage/sqlite-state-snapshot-write.js\ndist/adapters/storage/sqlite-state-snapshot-write.js.map\ndist/adapters/storage/sqlite-state-snapshots.d.ts\ndist/adapters/storage/sqlite-state-snapshots.d.ts.map\ndist/adapters/storage/sqlite-state-snapshots.js\ndist/adapters/storage/sqlite-state-snapshots.js.map\ndist/adapters/storage/sqlite-types.d.ts\ndist/adapters/storage/sqlite-types.d.ts.map\ndist/adapters/storage/sqlite-types.js\ndist/adapters/storage/sqlite-types.js.map\ndist/adapters/storage/sqlite.d.ts\ndist/adapters/storage/sqlite.d.ts.map\ndist/adapters/storage/sqlite.js\ndist/adapters/storage/sqlite.js.map\ndist/adapters/storage/storage-validation.d.ts\ndist/adapters/storage/storage-validation.d.ts.map\ndist/adapters/storage/storage-validation.js\ndist/adapters/storage/storage-validation.js.map\ndist/adapters/tui/alternate-screen-terminal.d.ts\ndist/adapters/tui/alternate-screen-terminal.d.ts.map\ndist/adapters/tui/alternate-screen-terminal.js\ndist/adapters/tui/alternate-screen-terminal.js.map\ndist/adapters/tui/application-ui-controller.d.ts\ndist/adapters/tui/application-ui-controller.d.ts.map\ndist/adapters/tui/application-ui-controller.js\ndist/adapters/tui/application-ui-controller.js.map\ndist/adapters/tui/native-terminal-transport.d.ts\ndist/adapters/tui/native-terminal-transport.d.ts.map\ndist/adapters/tui/native-terminal-transport.js\ndist/adapters/tui/native-terminal-transport.js.map\ndist/adapters/tui/profile-connection-dispatch.d.ts\ndist/adapters/tui/profile-connection-dispatch.d.ts.map\ndist/adapters/tui/profile-connection-dispatch.js\ndist/adapters/tui/profile-connection-dispatch.js.map\ndist/adapters/tui/ui-automation-command.d.ts\ndist/adapters/tui/ui-automation-command.d.ts.map\ndist/adapters/tui/ui-automation-command.js\ndist/adapters/tui/ui-automation-command.js.map\ndist/adapters/tui/ui-automation-dispatch.d.ts\ndist/adapters/tui/ui-automation-dispatch.d.ts.map\ndist/adapters/tui/ui-automation-dispatch.js\ndist/adapters/tui/ui-automation-dispatch.js.map\ndist/adapters/tui/ui-capabilities.d.ts\ndist/adapters/tui/ui-capabilities.d.ts.map\ndist/adapters/tui/ui-capabilities.js\ndist/adapters/tui/ui-capabilities.js.map\ndist/adapters/tui/ui-command-dispatch.d.ts\ndist/adapters/tui/ui-command-dispatch.d.ts.map\ndist/adapters/tui/ui-command-dispatch.js\ndist/adapters/tui/ui-command-dispatch.js.map\ndist/adapters/tui/ui-conversation-dispatch.d.ts\ndist/adapters/tui/ui-conversation-dispatch.d.ts.map\ndist/adapters/tui/ui-conversation-dispatch.js\ndist/adapters/tui/ui-conversation-dispatch.js.map\ndist/adapters/tui/ui-core-dispatch.d.ts\ndist/adapters/tui/ui-core-dispatch.d.ts.map\ndist/adapters/tui/ui-core-dispatch.js\ndist/adapters/tui/ui-core-dispatch.js.map\ndist/adapters/tui/ui-dispatch-context.d.ts\ndist/adapters/tui/ui-dispatch-context.d.ts.map\ndist/adapters/tui/ui-dispatch-context.js\ndist/adapters/tui/ui-dispatch-context.js.map\ndist/adapters/tui/ui-dispatch-error.d.ts\ndist/adapters/tui/ui-dispatch-error.d.ts.map\ndist/adapters/tui/ui-dispatch-error.js\ndist/adapters/tui/ui-dispatch-error.js.map\ndist/adapters/tui/ui-dispatch.d.ts\ndist/adapters/tui/ui-dispatch.d.ts.map\ndist/adapters/tui/ui-dispatch.js\ndist/adapters/tui/ui-dispatch.js.map\ndist/adapters/tui/ui-entity-details.d.ts\ndist/adapters/tui/ui-entity-details.d.ts.map\ndist/adapters/tui/ui-entity-details.js\ndist/adapters/tui/ui-entity-details.js.map\ndist/adapters/tui/ui-fixtures.d.ts\ndist/adapters/tui/ui-fixtures.d.ts.map\ndist/adapters/tui/ui-fixtures.js\ndist/adapters/tui/ui-fixtures.js.map\ndist/adapters/tui/ui-headless-dispatch.d.ts\ndist/adapters/tui/ui-headless-dispatch.d.ts.map\ndist/adapters/tui/ui-headless-dispatch.js\ndist/adapters/tui/ui-headless-dispatch.js.map\ndist/adapters/tui/ui-intelligence-dispatch.d.ts\ndist/adapters/tui/ui-intelligence-dispatch.d.ts.map\ndist/adapters/tui/ui-intelligence-dispatch.js\ndist/adapters/tui/ui-intelligence-dispatch.js.map\ndist/adapters/tui/ui-intelligence-fixtures.d.ts\ndist/adapters/tui/ui-intelligence-fixtures.d.ts.map\ndist/adapters/tui/ui-intelligence-fixtures.js\ndist/adapters/tui/ui-intelligence-fixtures.js.map\ndist/adapters/tui/ui-intelligence-result-view.d.ts\ndist/adapters/tui/ui-intelligence-result-view.d.ts.map\ndist/adapters/tui/ui-intelligence-result-view.js\ndist/adapters/tui/ui-intelligence-result-view.js.map\ndist/adapters/tui/ui-interaction-receipt.d.ts\ndist/adapters/tui/ui-interaction-receipt.d.ts.map\ndist/adapters/tui/ui-interaction-receipt.js\ndist/adapters/tui/ui-interaction-receipt.js.map\ndist/adapters/tui/ui-projection.d.ts\ndist/adapters/tui/ui-projection.d.ts.map\ndist/adapters/tui/ui-projection.js\ndist/adapters/tui/ui-projection.js.map\ndist/adapters/tui/ui-semantic-state.d.ts\ndist/adapters/tui/ui-semantic-state.d.ts.map\ndist/adapters/tui/ui-semantic-state.js\ndist/adapters/tui/ui-semantic-state.js.map\ndist/adapters/tui/ui-subscriber-delivery.d.ts\ndist/adapters/tui/ui-subscriber-delivery.d.ts.map\ndist/adapters/tui/ui-subscriber-delivery.js\ndist/adapters/tui/ui-subscriber-delivery.js.map\ndist/adapters/tui/ui-view-model.d.ts\ndist/adapters/tui/ui-view-model.d.ts.map\ndist/adapters/tui/ui-view-model.js\ndist/adapters/tui/ui-view-model.js.map\ndist/app/action-host.d.ts\ndist/app/action-host.d.ts.map\ndist/app/action-host.js\ndist/app/action-host.js.map\ndist/app/action-serialization.d.ts\ndist/app/action-serialization.d.ts.map\ndist/app/action-serialization.js\ndist/app/action-serialization.js.map\ndist/app/analysis-comparison-contracts.d.ts\ndist/app/analysis-comparison-contracts.d.ts.map\ndist/app/analysis-comparison-contracts.js\ndist/app/analysis-comparison-contracts.js.map\ndist/app/analysis-comparison-evidence.d.ts\ndist/app/analysis-comparison-evidence.d.ts.map\ndist/app/analysis-comparison-evidence.js\ndist/app/analysis-comparison-evidence.js.map\ndist/app/analysis-comparison-facts.d.ts\ndist/app/analysis-comparison-facts.d.ts.map\ndist/app/analysis-comparison-facts.js\ndist/app/analysis-comparison-facts.js.map\ndist/app/analysis-comparison-graph.d.ts\ndist/app/analysis-comparison-graph.d.ts.map\ndist/app/analysis-comparison-graph.js\ndist/app/analysis-comparison-graph.js.map\ndist/app/analysis-comparison-lifecycle.d.ts\ndist/app/analysis-comparison-lifecycle.d.ts.map\ndist/app/analysis-comparison-lifecycle.js\ndist/app/analysis-comparison-lifecycle.js.map\ndist/app/analysis-comparison-record.d.ts\ndist/app/analysis-comparison-record.d.ts.map\ndist/app/analysis-comparison-record.js\ndist/app/analysis-comparison-record.js.map\ndist/app/analysis-comparison-request.d.ts\ndist/app/analysis-comparison-request.d.ts.map\ndist/app/analysis-comparison-request.js\ndist/app/analysis-comparison-request.js.map\ndist/app/analysis-comparison.d.ts\ndist/app/analysis-comparison.d.ts.map\ndist/app/analysis-comparison.js\ndist/app/analysis-comparison.js.map\ndist/app/analysis-execution-session.d.ts\ndist/app/analysis-execution-session.d.ts.map\ndist/app/analysis-execution-session.js\ndist/app/analysis-execution-session.js.map\ndist/app/analysis-execution-target.d.ts\ndist/app/analysis-execution-target.d.ts.map\ndist/app/analysis-execution-target.js\ndist/app/analysis-execution-target.js.map\ndist/app/analysis-graph-projector.d.ts\ndist/app/analysis-graph-projector.d.ts.map\ndist/app/analysis-graph-projector.js\ndist/app/analysis-graph-projector.js.map\ndist/app/analysis-lifecycle.d.ts\ndist/app/analysis-lifecycle.d.ts.map\ndist/app/analysis-lifecycle.js\ndist/app/analysis-lifecycle.js.map\ndist/app/analysis-model-call-records.d.ts\ndist/app/analysis-model-call-records.d.ts.map\ndist/app/analysis-model-call-records.js\ndist/app/analysis-model-call-records.js.map\ndist/app/analysis-operation.d.ts\ndist/app/analysis-operation.d.ts.map\ndist/app/analysis-operation.js\ndist/app/analysis-operation.js.map\ndist/app/analysis-persistence.d.ts\ndist/app/analysis-persistence.d.ts.map\ndist/app/analysis-persistence.js\ndist/app/analysis-persistence.js.map\ndist/app/analysis-promotion.d.ts\ndist/app/analysis-promotion.d.ts.map\ndist/app/analysis-promotion.js\ndist/app/analysis-promotion.js.map\ndist/app/analysis-request.d.ts\ndist/app/analysis-request.d.ts.map\ndist/app/analysis-request.js\ndist/app/analysis-request.js.map\ndist/app/analysis-result-mapper.d.ts\ndist/app/analysis-result-mapper.d.ts.map\ndist/app/analysis-result-mapper.js\ndist/app/analysis-result-mapper.js.map\ndist/app/analysis-retained-admission.d.ts\ndist/app/analysis-retained-admission.d.ts.map\ndist/app/analysis-retained-admission.js\ndist/app/analysis-retained-admission.js.map\ndist/app/analysis-service.d.ts\ndist/app/analysis-service.d.ts.map\ndist/app/analysis-service.js\ndist/app/analysis-service.js.map\ndist/app/analysis-source.d.ts\ndist/app/analysis-source.d.ts.map\ndist/app/analysis-source.js\ndist/app/analysis-source.js.map\ndist/app/analysis-types.d.ts\ndist/app/analysis-types.d.ts.map\ndist/app/analysis-types.js\ndist/app/analysis-types.js.map\ndist/app/application-guards.d.ts\ndist/app/application-guards.d.ts.map\ndist/app/application-guards.js\ndist/app/application-guards.js.map\ndist/app/application-interaction-actions.d.ts\ndist/app/application-interaction-actions.d.ts.map\ndist/app/application-interaction-actions.js\ndist/app/application-interaction-actions.js.map\ndist/app/application-lifecycle.d.ts\ndist/app/application-lifecycle.d.ts.map\ndist/app/application-lifecycle.js\ndist/app/application-lifecycle.js.map\ndist/app/application-options.d.ts\ndist/app/application-options.d.ts.map\ndist/app/application-options.js\ndist/app/application-options.js.map\ndist/app/application-port-builder.d.ts\ndist/app/application-port-builder.d.ts.map\ndist/app/application-port-builder.js\ndist/app/application-port-builder.js.map\ndist/app/application-port-runtime.d.ts\ndist/app/application-port-runtime.d.ts.map\ndist/app/application-port-runtime.js\ndist/app/application-port-runtime.js.map\ndist/app/application-ports.d.ts\ndist/app/application-ports.d.ts.map\ndist/app/application-ports.js\ndist/app/application-ports.js.map\ndist/app/application-runtime-wiring.d.ts\ndist/app/application-runtime-wiring.d.ts.map\ndist/app/application-runtime-wiring.js\ndist/app/application-runtime-wiring.js.map\ndist/app/application-support.d.ts\ndist/app/application-support.d.ts.map\ndist/app/application-support.js\ndist/app/application-support.js.map\ndist/app/application-transition.d.ts\ndist/app/application-transition.d.ts.map\ndist/app/application-transition.js\ndist/app/application-transition.js.map\ndist/app/application-types.d.ts\ndist/app/application-types.d.ts.map\ndist/app/application-types.js\ndist/app/application-types.js.map\ndist/app/application.d.ts\ndist/app/application.d.ts.map\ndist/app/application.js\ndist/app/application.js.map\ndist/app/automation-actions.d.ts\ndist/app/automation-actions.d.ts.map\ndist/app/automation-actions.js\ndist/app/automation-actions.js.map\ndist/app/automation-matching.d.ts\ndist/app/automation-matching.d.ts.map\ndist/app/automation-matching.js\ndist/app/automation-matching.js.map\ndist/app/automation-rule-audit.d.ts\ndist/app/automation-rule-audit.d.ts.map\ndist/app/automation-rule-audit.js\ndist/app/automation-rule-audit.js.map\ndist/app/automation-rule-persistence.d.ts\ndist/app/automation-rule-persistence.d.ts.map\ndist/app/automation-rule-persistence.js\ndist/app/automation-rule-persistence.js.map\ndist/app/automation-rule-store.d.ts\ndist/app/automation-rule-store.d.ts.map\ndist/app/automation-rule-store.js\ndist/app/automation-rule-store.js.map\ndist/app/automation-rule-types.d.ts\ndist/app/automation-rule-types.d.ts.map\ndist/app/automation-rule-types.js\ndist/app/automation-rule-types.js.map\ndist/app/automation-rule-update.d.ts\ndist/app/automation-rule-update.d.ts.map\ndist/app/automation-rule-update.js\ndist/app/automation-rule-update.js.map\ndist/app/automation-rule-validation.d.ts\ndist/app/automation-rule-validation.d.ts.map\ndist/app/automation-rule-validation.js\ndist/app/automation-rule-validation.js.map\ndist/app/automation-rules.d.ts\ndist/app/automation-rules.d.ts.map\ndist/app/automation-rules.js\ndist/app/automation-rules.js.map\ndist/app/composition-options.d.ts\ndist/app/composition-options.d.ts.map\ndist/app/composition-options.js\ndist/app/composition-options.js.map\ndist/app/composition.d.ts\ndist/app/composition.d.ts.map\ndist/app/composition.js\ndist/app/composition.js.map\ndist/app/configuration-action-transition.d.ts\ndist/app/configuration-action-transition.d.ts.map\ndist/app/configuration-action-transition.js\ndist/app/configuration-action-transition.js.map\ndist/app/configuration-session.d.ts\ndist/app/configuration-session.d.ts.map\ndist/app/configuration-session.js\ndist/app/configuration-session.js.map\ndist/app/connection-action-support.d.ts\ndist/app/connection-action-support.d.ts.map\ndist/app/connection-action-support.js\ndist/app/connection-action-support.js.map\ndist/app/connection-action-types.d.ts\ndist/app/connection-action-types.d.ts.map\ndist/app/connection-action-types.js\ndist/app/connection-action-types.js.map\ndist/app/connection-actions.d.ts\ndist/app/connection-actions.d.ts.map\ndist/app/connection-actions.js\ndist/app/connection-actions.js.map\ndist/app/connection-errors.d.ts\ndist/app/connection-errors.d.ts.map\ndist/app/connection-errors.js\ndist/app/connection-errors.js.map\ndist/app/connection-probe.d.ts\ndist/app/connection-probe.d.ts.map\ndist/app/connection-probe.js\ndist/app/connection-probe.js.map\ndist/app/connection-record-factory.d.ts\ndist/app/connection-record-factory.d.ts.map\ndist/app/connection-record-factory.js\ndist/app/connection-record-factory.js.map\ndist/app/connections.d.ts\ndist/app/connections.d.ts.map\ndist/app/connections.js\ndist/app/connections.js.map\ndist/app/control-effects.d.ts\ndist/app/control-effects.d.ts.map\ndist/app/control-effects.js\ndist/app/control-effects.js.map\ndist/app/conversation-branch-effects.d.ts\ndist/app/conversation-branch-effects.d.ts.map\ndist/app/conversation-branch-effects.js\ndist/app/conversation-branch-effects.js.map\ndist/app/conversation-branches.d.ts\ndist/app/conversation-branches.d.ts.map\ndist/app/conversation-branches.js\ndist/app/conversation-branches.js.map\ndist/app/conversation-composition.d.ts\ndist/app/conversation-composition.d.ts.map\ndist/app/conversation-composition.js\ndist/app/conversation-composition.js.map\ndist/app/conversation-context.d.ts\ndist/app/conversation-context.d.ts.map\ndist/app/conversation-context.js\ndist/app/conversation-context.js.map\ndist/app/conversation-drafts.d.ts\ndist/app/conversation-drafts.d.ts.map\ndist/app/conversation-drafts.js\ndist/app/conversation-drafts.js.map\ndist/app/conversation-exports.d.ts\ndist/app/conversation-exports.d.ts.map\ndist/app/conversation-exports.js\ndist/app/conversation-exports.js.map\ndist/app/conversation-import-analyses.d.ts\ndist/app/conversation-import-analyses.d.ts.map\ndist/app/conversation-import-analyses.js\ndist/app/conversation-import-analyses.js.map\ndist/app/conversation-import-builder.d.ts\ndist/app/conversation-import-builder.d.ts.map\ndist/app/conversation-import-builder.js\ndist/app/conversation-import-builder.js.map\ndist/app/conversation-import-document.d.ts\ndist/app/conversation-import-document.d.ts.map\ndist/app/conversation-import-document.js\ndist/app/conversation-import-document.js.map\ndist/app/conversation-import-graph.d.ts\ndist/app/conversation-import-graph.d.ts.map\ndist/app/conversation-import-graph.js\ndist/app/conversation-import-graph.js.map\ndist/app/conversation-import-messages.d.ts\ndist/app/conversation-import-messages.d.ts.map\ndist/app/conversation-import-messages.js\ndist/app/conversation-import-messages.js.map\ndist/app/conversation-import-runs.d.ts\ndist/app/conversation-import-runs.d.ts.map\ndist/app/conversation-import-runs.js\ndist/app/conversation-import-runs.js.map\ndist/app/conversation-import-validation.d.ts\ndist/app/conversation-import-validation.d.ts.map\ndist/app/conversation-import-validation.js\ndist/app/conversation-import-validation.js.map\ndist/app/conversation-import-values.d.ts\ndist/app/conversation-import-values.d.ts.map\ndist/app/conversation-import-values.js\ndist/app/conversation-import-values.js.map\ndist/app/conversation-imports.d.ts\ndist/app/conversation-imports.d.ts.map\ndist/app/conversation-imports.js\ndist/app/conversation-imports.js.map\ndist/app/conversation-lifecycle.d.ts\ndist/app/conversation-lifecycle.d.ts.map\ndist/app/conversation-lifecycle.js\ndist/app/conversation-lifecycle.js.map\ndist/app/conversation-operation-coordinator.d.ts\ndist/app/conversation-operation-coordinator.d.ts.map\ndist/app/conversation-operation-coordinator.js\ndist/app/conversation-operation-coordinator.js.map\ndist/app/conversation-records.d.ts\ndist/app/conversation-records.d.ts.map\ndist/app/conversation-records.js\ndist/app/conversation-records.js.map\ndist/app/conversation-support.d.ts\ndist/app/conversation-support.d.ts.map\ndist/app/conversation-support.js\ndist/app/conversation-support.js.map\ndist/app/conversation-types.d.ts\ndist/app/conversation-types.d.ts.map\ndist/app/conversation-types.js\ndist/app/conversation-types.js.map\ndist/app/conversation-visibility.d.ts\ndist/app/conversation-visibility.d.ts.map\ndist/app/conversation-visibility.js\ndist/app/conversation-visibility.js.map\ndist/app/conversations.d.ts\ndist/app/conversations.d.ts.map\ndist/app/conversations.js\ndist/app/conversations.js.map\ndist/app/default-profiles.d.ts\ndist/app/default-profiles.d.ts.map\ndist/app/default-profiles.js\ndist/app/default-profiles.js.map\ndist/app/durable-send.d.ts\ndist/app/durable-send.d.ts.map\ndist/app/durable-send.js\ndist/app/durable-send.js.map\ndist/app/effect-coordinator.d.ts\ndist/app/effect-coordinator.d.ts.map\ndist/app/effect-coordinator.js\ndist/app/effect-coordinator.js.map\ndist/app/effect-projection.d.ts\ndist/app/effect-projection.d.ts.map\ndist/app/effect-projection.js\ndist/app/effect-projection.js.map\ndist/app/effective-run-configuration.d.ts\ndist/app/effective-run-configuration.d.ts.map\ndist/app/effective-run-configuration.js\ndist/app/effective-run-configuration.js.map\ndist/app/errors.d.ts\ndist/app/errors.d.ts.map\ndist/app/errors.js\ndist/app/errors.js.map\ndist/app/fail-closed-journal.d.ts\ndist/app/fail-closed-journal.d.ts.map\ndist/app/fail-closed-journal.js\ndist/app/fail-closed-journal.js.map\ndist/app/intelligence-actions.d.ts\ndist/app/intelligence-actions.d.ts.map\ndist/app/intelligence-actions.js\ndist/app/intelligence-actions.js.map\ndist/app/interaction-automation-coordinator.d.ts\ndist/app/interaction-automation-coordinator.d.ts.map\ndist/app/interaction-automation-coordinator.js\ndist/app/interaction-automation-coordinator.js.map\ndist/app/interaction-controller.d.ts\ndist/app/interaction-controller.d.ts.map\ndist/app/interaction-controller.js\ndist/app/interaction-controller.js.map\ndist/app/interaction-effects.d.ts\ndist/app/interaction-effects.d.ts.map\ndist/app/interaction-effects.js\ndist/app/interaction-effects.js.map\ndist/app/interaction-request.d.ts\ndist/app/interaction-request.d.ts.map\ndist/app/interaction-request.js\ndist/app/interaction-request.js.map\ndist/app/interaction-response-replay.d.ts\ndist/app/interaction-response-replay.d.ts.map\ndist/app/interaction-response-replay.js\ndist/app/interaction-response-replay.js.map\ndist/app/interaction-response.d.ts\ndist/app/interaction-response.d.ts.map\ndist/app/interaction-response.js\ndist/app/interaction-response.js.map\ndist/app/journal.d.ts\ndist/app/journal.d.ts.map\ndist/app/journal.js\ndist/app/journal.js.map\ndist/app/legacy-cancel.d.ts\ndist/app/legacy-cancel.d.ts.map\ndist/app/legacy-cancel.js\ndist/app/legacy-cancel.js.map\ndist/app/operation-fingerprint.d.ts\ndist/app/operation-fingerprint.d.ts.map\ndist/app/operation-fingerprint.js\ndist/app/operation-fingerprint.js.map\ndist/app/operation-ledger.d.ts\ndist/app/operation-ledger.d.ts.map\ndist/app/operation-ledger.js\ndist/app/operation-ledger.js.map\ndist/app/production-composition.d.ts\ndist/app/production-composition.d.ts.map\ndist/app/production-composition.js\ndist/app/production-composition.js.map\ndist/app/profile-action-support.d.ts\ndist/app/profile-action-support.d.ts.map\ndist/app/profile-action-support.js\ndist/app/profile-action-support.js.map\ndist/app/profile-actions.d.ts\ndist/app/profile-actions.d.ts.map\ndist/app/profile-actions.js\ndist/app/profile-actions.js.map\ndist/app/profile-draft.d.ts\ndist/app/profile-draft.d.ts.map\ndist/app/profile-draft.js\ndist/app/profile-draft.js.map\ndist/app/profile-model-settings.d.ts\ndist/app/profile-model-settings.d.ts.map\ndist/app/profile-model-settings.js\ndist/app/profile-model-settings.js.map\ndist/app/profile-persistence.d.ts\ndist/app/profile-persistence.d.ts.map\ndist/app/profile-persistence.js\ndist/app/profile-persistence.js.map\ndist/app/profile-save-recovery.d.ts\ndist/app/profile-save-recovery.d.ts.map\ndist/app/profile-save-recovery.js\ndist/app/profile-save-recovery.js.map\ndist/app/profile-selection.d.ts\ndist/app/profile-selection.d.ts.map\ndist/app/profile-selection.js\ndist/app/profile-selection.js.map\ndist/app/profile-snapshots.d.ts\ndist/app/profile-snapshots.d.ts.map\ndist/app/profile-snapshots.js\ndist/app/profile-snapshots.js.map\ndist/app/profile-sources.d.ts\ndist/app/profile-sources.d.ts.map\ndist/app/profile-sources.js\ndist/app/profile-sources.js.map\ndist/app/profile-types.d.ts\ndist/app/profile-types.d.ts.map\ndist/app/profile-types.js\ndist/app/profile-types.js.map\ndist/app/profile-validation.d.ts\ndist/app/profile-validation.d.ts.map\ndist/app/profile-validation.js\ndist/app/profile-validation.js.map\ndist/app/profiles.d.ts\ndist/app/profiles.d.ts.map\ndist/app/profiles.js\ndist/app/profiles.js.map\ndist/app/provider-snapshot.d.ts\ndist/app/provider-snapshot.d.ts.map\ndist/app/provider-snapshot.js\ndist/app/provider-snapshot.js.map\ndist/app/provider-values.d.ts\ndist/app/provider-values.d.ts.map\ndist/app/provider-values.js\ndist/app/provider-values.js.map\ndist/app/run-admission-context.d.ts\ndist/app/run-admission-context.d.ts.map\ndist/app/run-admission-context.js\ndist/app/run-admission-context.js.map\ndist/app/run-admission-continuation.d.ts\ndist/app/run-admission-continuation.d.ts.map\ndist/app/run-admission-continuation.js\ndist/app/run-admission-continuation.js.map\ndist/app/run-admission-dispatch.d.ts\ndist/app/run-admission-dispatch.d.ts.map\ndist/app/run-admission-dispatch.js\ndist/app/run-admission-dispatch.js.map\ndist/app/run-admission-receipt.d.ts\ndist/app/run-admission-receipt.d.ts.map\ndist/app/run-admission-receipt.js\ndist/app/run-admission-receipt.js.map\ndist/app/run-admission-request.d.ts\ndist/app/run-admission-request.d.ts.map\ndist/app/run-admission-request.js\ndist/app/run-admission-request.js.map\ndist/app/run-admission-validation.d.ts\ndist/app/run-admission-validation.d.ts.map\ndist/app/run-admission-validation.js\ndist/app/run-admission-validation.js.map\ndist/app/run-admission.d.ts\ndist/app/run-admission.d.ts.map\ndist/app/run-admission.js\ndist/app/run-admission.js.map\ndist/app/run-continuation.d.ts\ndist/app/run-continuation.d.ts.map\ndist/app/run-continuation.js\ndist/app/run-continuation.js.map\ndist/app/run-controls.d.ts\ndist/app/run-controls.d.ts.map\ndist/app/run-controls.js\ndist/app/run-controls.js.map\ndist/app/run-event-mapper.d.ts\ndist/app/run-event-mapper.d.ts.map\ndist/app/run-event-mapper.js\ndist/app/run-event-mapper.js.map\ndist/app/run-execution-snapshot.d.ts\ndist/app/run-execution-snapshot.d.ts.map\ndist/app/run-execution-snapshot.js\ndist/app/run-execution-snapshot.js.map\ndist/app/run-execution.d.ts\ndist/app/run-execution.d.ts.map\ndist/app/run-execution.js\ndist/app/run-execution.js.map\ndist/app/run-ingestion.d.ts\ndist/app/run-ingestion.d.ts.map\ndist/app/run-ingestion.js\ndist/app/run-ingestion.js.map\ndist/app/run-ledger.d.ts\ndist/app/run-ledger.d.ts.map\ndist/app/run-ledger.js\ndist/app/run-ledger.js.map\ndist/app/run-recovery-context.d.ts\ndist/app/run-recovery-context.d.ts.map\ndist/app/run-recovery-context.js\ndist/app/run-recovery-context.js.map\ndist/app/run-replay.d.ts\ndist/app/run-replay.d.ts.map\ndist/app/run-replay.js\ndist/app/run-replay.js.map\ndist/app/run-status.d.ts\ndist/app/run-status.d.ts.map\ndist/app/run-status.js\ndist/app/run-status.js.map\ndist/app/run-stream-sanitizer.d.ts\ndist/app/run-stream-sanitizer.d.ts.map\ndist/app/run-stream-sanitizer.js\ndist/app/run-stream-sanitizer.js.map\ndist/app/runtime-selection.d.ts\ndist/app/runtime-selection.d.ts.map\ndist/app/runtime-selection.js\ndist/app/runtime-selection.js.map\ndist/app/shutdown-controller.d.ts\ndist/app/shutdown-controller.d.ts.map\ndist/app/shutdown-controller.js\ndist/app/shutdown-controller.js.map\ndist/app/storage-journal-support.d.ts\ndist/app/storage-journal-support.d.ts.map\ndist/app/storage-journal-support.js\ndist/app/storage-journal-support.js.map\ndist/app/storage-journal.d.ts\ndist/app/storage-journal.d.ts.map\ndist/app/storage-journal.js\ndist/app/storage-journal.js.map\ndist/app/supervisor-projection.d.ts\ndist/app/supervisor-projection.d.ts.map\ndist/app/supervisor-projection.js\ndist/app/supervisor-projection.js.map\ndist/app/supervisor-service.d.ts\ndist/app/supervisor-service.d.ts.map\ndist/app/supervisor-service.js\ndist/app/supervisor-service.js.map\ndist/app/unavailable-analyst.d.ts\ndist/app/unavailable-analyst.d.ts.map\ndist/app/unavailable-analyst.js\ndist/app/unavailable-analyst.js.map\ndist/bin/args.d.ts\ndist/bin/args.d.ts.map\ndist/bin/args.js\ndist/bin/args.js.map\ndist/bin/braid-runtime.d.ts\ndist/bin/braid-runtime.d.ts.map\ndist/bin/braid-runtime.js\ndist/bin/braid-runtime.js.map\ndist/bin/braid.d.ts\ndist/bin/braid.d.ts.map\ndist/bin/braid.js\ndist/bin/braid.js.map\ndist/bin/fixture-application.d.ts\ndist/bin/fixture-application.d.ts.map\ndist/bin/fixture-application.js\ndist/bin/fixture-application.js.map\ndist/bin/interface-runner.d.ts\ndist/bin/interface-runner.d.ts.map\ndist/bin/interface-runner.js\ndist/bin/interface-runner.js.map\ndist/bin/interface-signal-lifecycle.d.ts\ndist/bin/interface-signal-lifecycle.d.ts.map\ndist/bin/interface-signal-lifecycle.js\ndist/bin/interface-signal-lifecycle.js.map\ndist/bin/interface-state-recorder.d.ts\ndist/bin/interface-state-recorder.d.ts.map\ndist/bin/interface-state-recorder.js\ndist/bin/interface-state-recorder.js.map\ndist/bin/native-interactive-actions.d.ts\ndist/bin/native-interactive-actions.d.ts.map\ndist/bin/native-interactive-actions.js\ndist/bin/native-interactive-actions.js.map\ndist/bin/plain.d.ts\ndist/bin/plain.d.ts.map\ndist/bin/plain.js\ndist/bin/plain.js.map\ndist/bin/production-active-profile.d.ts\ndist/bin/production-active-profile.d.ts.map\ndist/bin/production-active-profile.js\ndist/bin/production-active-profile.js.map\ndist/bin/production-application.d.ts\ndist/bin/production-application.d.ts.map\ndist/bin/production-application.js\ndist/bin/production-application.js.map\ndist/bin/production-bridge-client.d.ts\ndist/bin/production-bridge-client.d.ts.map\ndist/bin/production-bridge-client.js\ndist/bin/production-bridge-client.js.map\ndist/bin/production-bridge-discovery.d.ts\ndist/bin/production-bridge-discovery.d.ts.map\ndist/bin/production-bridge-discovery.js\ndist/bin/production-bridge-discovery.js.map\ndist/bin/production-config-mutation-lock.d.ts\ndist/bin/production-config-mutation-lock.d.ts.map\ndist/bin/production-config-mutation-lock.js\ndist/bin/production-config-mutation-lock.js.map\ndist/bin/production-connection-action-options.d.ts\ndist/bin/production-connection-action-options.d.ts.map\ndist/bin/production-connection-action-options.js\ndist/bin/production-connection-action-options.js.map\ndist/bin/production-connection-actions.d.ts\ndist/bin/production-connection-actions.d.ts.map\ndist/bin/production-connection-actions.js\ndist/bin/production-connection-actions.js.map\ndist/bin/production-connection-catalog.d.ts\ndist/bin/production-connection-catalog.d.ts.map\ndist/bin/production-connection-catalog.js\ndist/bin/production-connection-catalog.js.map\ndist/bin/production-connection-credential-cleanup.d.ts\ndist/bin/production-connection-credential-cleanup.d.ts.map\ndist/bin/production-connection-credential-cleanup.js\ndist/bin/production-connection-credential-cleanup.js.map\ndist/bin/production-connection-credential-removal-record.d.ts\ndist/bin/production-connection-credential-removal-record.d.ts.map\ndist/bin/production-connection-credential-removal-record.js\ndist/bin/production-connection-credential-removal-record.js.map\ndist/bin/production-connection-removal.d.ts\ndist/bin/production-connection-removal.d.ts.map\ndist/bin/production-connection-removal.js\ndist/bin/production-connection-removal.js.map\ndist/bin/production-connection-replay.d.ts\ndist/bin/production-connection-replay.d.ts.map\ndist/bin/production-connection-replay.js\ndist/bin/production-connection-replay.js.map\ndist/bin/production-credential-context.d.ts\ndist/bin/production-credential-context.d.ts.map\ndist/bin/production-credential-context.js\ndist/bin/production-credential-context.js.map\ndist/bin/production-credential-reference.d.ts\ndist/bin/production-credential-reference.d.ts.map\ndist/bin/production-credential-reference.js\ndist/bin/production-credential-reference.js.map\ndist/bin/production-key-path.d.ts\ndist/bin/production-key-path.d.ts.map\ndist/bin/production-key-path.js\ndist/bin/production-key-path.js.map\ndist/bin/production-profile-projection.d.ts\ndist/bin/production-profile-projection.d.ts.map\ndist/bin/production-profile-projection.js\ndist/bin/production-profile-projection.js.map\ndist/bin/production-setup-credentials.d.ts\ndist/bin/production-setup-credentials.d.ts.map\ndist/bin/production-setup-credentials.js\ndist/bin/production-setup-credentials.js.map\ndist/bin/production-setup-discovery.d.ts\ndist/bin/production-setup-discovery.d.ts.map\ndist/bin/production-setup-discovery.js\ndist/bin/production-setup-discovery.js.map\ndist/bin/production-setup-persistence.d.ts\ndist/bin/production-setup-persistence.d.ts.map\ndist/bin/production-setup-persistence.js\ndist/bin/production-setup-persistence.js.map\ndist/bin/production-setup-transition.d.ts\ndist/bin/production-setup-transition.d.ts.map\ndist/bin/production-setup-transition.js\ndist/bin/production-setup-transition.js.map\ndist/bin/production-setup-types.d.ts\ndist/bin/production-setup-types.d.ts.map\ndist/bin/production-setup-types.js\ndist/bin/production-setup-types.js.map\ndist/bin/production-setup-validation.d.ts\ndist/bin/production-setup-validation.d.ts.map\ndist/bin/production-setup-validation.js\ndist/bin/production-setup-validation.js.map\ndist/bin/production-setup.d.ts\ndist/bin/production-setup.d.ts.map\ndist/bin/production-setup.js\ndist/bin/production-setup.js.map\ndist/bin/production-startup.d.ts\ndist/bin/production-startup.d.ts.map\ndist/bin/production-startup.js\ndist/bin/production-startup.js.map\ndist/bin/runtime-startup-options.d.ts\ndist/bin/runtime-startup-options.d.ts.map\ndist/bin/runtime-startup-options.js\ndist/bin/runtime-startup-options.js.map\ndist/bin/state-path.d.ts\ndist/bin/state-path.d.ts.map\ndist/bin/state-path.js\ndist/bin/state-path.js.map\ndist/domain/analysis-model-call.d.ts\ndist/domain/analysis-model-call.d.ts.map\ndist/domain/analysis-model-call.js\ndist/domain/analysis-model-call.js.map\ndist/domain/bounded-structured.d.ts\ndist/domain/bounded-structured.d.ts.map\ndist/domain/bounded-structured.js\ndist/domain/bounded-structured.js.map\ndist/domain/canonical-json.d.ts\ndist/domain/canonical-json.d.ts.map\ndist/domain/canonical-json.js\ndist/domain/canonical-json.js.map\ndist/domain/canonical.d.ts\ndist/domain/canonical.d.ts.map\ndist/domain/canonical.js\ndist/domain/canonical.js.map\ndist/domain/code-unit-order.d.ts\ndist/domain/code-unit-order.d.ts.map\ndist/domain/code-unit-order.js\ndist/domain/code-unit-order.js.map\ndist/domain/connection-removal.d.ts\ndist/domain/connection-removal.d.ts.map\ndist/domain/connection-removal.js\ndist/domain/connection-removal.js.map\ndist/domain/content-budget.d.ts\ndist/domain/content-budget.d.ts.map\ndist/domain/content-budget.js\ndist/domain/content-budget.js.map\ndist/domain/entities-base.d.ts\ndist/domain/entities-base.d.ts.map\ndist/domain/entities-base.js\ndist/domain/entities-base.js.map\ndist/domain/entities-core.d.ts\ndist/domain/entities-core.d.ts.map\ndist/domain/entities-core.js\ndist/domain/entities-core.js.map\ndist/domain/entities-graph.d.ts\ndist/domain/entities-graph.d.ts.map\ndist/domain/entities-graph.js\ndist/domain/entities-graph.js.map\ndist/domain/entities-interactions.d.ts\ndist/domain/entities-interactions.d.ts.map\ndist/domain/entities-interactions.js\ndist/domain/entities-interactions.js.map\ndist/domain/entities-messages.d.ts\ndist/domain/entities-messages.d.ts.map\ndist/domain/entities-messages.js\ndist/domain/entities-messages.js.map\ndist/domain/entities-runtime.d.ts\ndist/domain/entities-runtime.d.ts.map\ndist/domain/entities-runtime.js\ndist/domain/entities-runtime.js.map\ndist/domain/entities.d.ts\ndist/domain/entities.d.ts.map\ndist/domain/entities.js\ndist/domain/entities.js.map\ndist/domain/events-legacy.d.ts\ndist/domain/events-legacy.d.ts.map\ndist/domain/events-legacy.js\ndist/domain/events-legacy.js.map\ndist/domain/events.d.ts\ndist/domain/events.d.ts.map\ndist/domain/events.js\ndist/domain/events.js.map\ndist/domain/execution-observation.d.ts\ndist/domain/execution-observation.d.ts.map\ndist/domain/execution-observation.js\ndist/domain/execution-observation.js.map\ndist/domain/graph-records.d.ts\ndist/domain/graph-records.d.ts.map\ndist/domain/graph-records.js\ndist/domain/graph-records.js.map\ndist/domain/ids-core.d.ts\ndist/domain/ids-core.d.ts.map\ndist/domain/ids-core.js\ndist/domain/ids-core.js.map\ndist/domain/ids-types.d.ts\ndist/domain/ids-types.d.ts.map\ndist/domain/ids-types.js\ndist/domain/ids-types.js.map\ndist/domain/ids-values.d.ts\ndist/domain/ids-values.d.ts.map\ndist/domain/ids-values.js\ndist/domain/ids-values.js.map\ndist/domain/ids.d.ts\ndist/domain/ids.d.ts.map\ndist/domain/ids.js\ndist/domain/ids.js.map\ndist/domain/interaction-identity.d.ts\ndist/domain/interaction-identity.d.ts.map\ndist/domain/interaction-identity.js\ndist/domain/interaction-identity.js.map\ndist/domain/interaction-timeout.d.ts\ndist/domain/interaction-timeout.d.ts.map\ndist/domain/interaction-timeout.js\ndist/domain/interaction-timeout.js.map\ndist/domain/invariants-base.d.ts\ndist/domain/invariants-base.d.ts.map\ndist/domain/invariants-base.js\ndist/domain/invariants-base.js.map\ndist/domain/invariants-conversation.d.ts\ndist/domain/invariants-conversation.d.ts.map\ndist/domain/invariants-conversation.js\ndist/domain/invariants-conversation.js.map\ndist/domain/invariants-profile.d.ts\ndist/domain/invariants-profile.d.ts.map\ndist/domain/invariants-profile.js\ndist/domain/invariants-profile.js.map\ndist/domain/invariants-relations.d.ts\ndist/domain/invariants-relations.d.ts.map\ndist/domain/invariants-relations.js\ndist/domain/invariants-relations.js.map\ndist/domain/invariants-retained-admission.d.ts\ndist/domain/invariants-retained-admission.d.ts.map\ndist/domain/invariants-retained-admission.js\ndist/domain/invariants-retained-admission.js.map\ndist/domain/invariants-run.d.ts\ndist/domain/invariants-run.d.ts.map\ndist/domain/invariants-run.js\ndist/domain/invariants-run.js.map\ndist/domain/invariants-runtime.d.ts\ndist/domain/invariants-runtime.d.ts.map\ndist/domain/invariants-runtime.js\ndist/domain/invariants-runtime.js.map\ndist/domain/invariants-state.d.ts\ndist/domain/invariants-state.d.ts.map\ndist/domain/invariants-state.js\ndist/domain/invariants-state.js.map\ndist/domain/invariants.d.ts\ndist/domain/invariants.d.ts.map\ndist/domain/invariants.js\ndist/domain/invariants.js.map\ndist/domain/legacy-interaction-snapshot.d.ts\ndist/domain/legacy-interaction-snapshot.d.ts.map\ndist/domain/legacy-interaction-snapshot.js\ndist/domain/legacy-interaction-snapshot.js.map\ndist/domain/materialization-receipt.d.ts\ndist/domain/materialization-receipt.d.ts.map\ndist/domain/materialization-receipt.js\ndist/domain/materialization-receipt.js.map\ndist/domain/materialized-state-snapshot.d.ts\ndist/domain/materialized-state-snapshot.d.ts.map\ndist/domain/materialized-state-snapshot.js\ndist/domain/materialized-state-snapshot.js.map\ndist/domain/materialized-state.d.ts\ndist/domain/materialized-state.d.ts.map\ndist/domain/materialized-state.js\ndist/domain/materialized-state.js.map\ndist/domain/projection-checksum.d.ts\ndist/domain/projection-checksum.d.ts.map\ndist/domain/projection-checksum.js\ndist/domain/projection-checksum.js.map\ndist/domain/provider-values.d.ts\ndist/domain/provider-values.d.ts.map\ndist/domain/provider-values.js\ndist/domain/provider-values.js.map\ndist/domain/public-metadata.d.ts\ndist/domain/public-metadata.d.ts.map\ndist/domain/public-metadata.js\ndist/domain/public-metadata.js.map\ndist/domain/receipts.d.ts\ndist/domain/receipts.d.ts.map\ndist/domain/receipts.js\ndist/domain/receipts.js.map\ndist/domain/redaction.d.ts\ndist/domain/redaction.d.ts.map\ndist/domain/redaction.js\ndist/domain/redaction.js.map\ndist/domain/reducer-content.d.ts\ndist/domain/reducer-content.d.ts.map\ndist/domain/reducer-content.js\ndist/domain/reducer-content.js.map\ndist/domain/reducer-conversation-events.d.ts\ndist/domain/reducer-conversation-events.d.ts.map\ndist/domain/reducer-conversation-events.js\ndist/domain/reducer-conversation-events.js.map\ndist/domain/reducer-domain-events.d.ts\ndist/domain/reducer-domain-events.d.ts.map\ndist/domain/reducer-domain-events.js\ndist/domain/reducer-domain-events.js.map\ndist/domain/reducer-execution-observation.d.ts\ndist/domain/reducer-execution-observation.d.ts.map\ndist/domain/reducer-execution-observation.js\ndist/domain/reducer-execution-observation.js.map\ndist/domain/reducer-helpers.d.ts\ndist/domain/reducer-helpers.d.ts.map\ndist/domain/reducer-helpers.js\ndist/domain/reducer-helpers.js.map\ndist/domain/reducer-interactions.d.ts\ndist/domain/reducer-interactions.d.ts.map\ndist/domain/reducer-interactions.js\ndist/domain/reducer-interactions.js.map\ndist/domain/reducer-legacy.d.ts\ndist/domain/reducer-legacy.d.ts.map\ndist/domain/reducer-legacy.js\ndist/domain/reducer-legacy.js.map\ndist/domain/reducer-lifecycle.d.ts\ndist/domain/reducer-lifecycle.d.ts.map\ndist/domain/reducer-lifecycle.js\ndist/domain/reducer-lifecycle.js.map\ndist/domain/reducer-replay.d.ts\ndist/domain/reducer-replay.d.ts.map\ndist/domain/reducer-replay.js\ndist/domain/reducer-replay.js.map\ndist/domain/reducer-retained-admission.d.ts\ndist/domain/reducer-retained-admission.d.ts.map\ndist/domain/reducer-retained-admission.js\ndist/domain/reducer-retained-admission.js.map\ndist/domain/reducer-run-graph.d.ts\ndist/domain/reducer-run-graph.d.ts.map\ndist/domain/reducer-run-graph.js\ndist/domain/reducer-run-graph.js.map\ndist/domain/reducer-runtime.d.ts\ndist/domain/reducer-runtime.d.ts.map\ndist/domain/reducer-runtime.js\ndist/domain/reducer-runtime.js.map\ndist/domain/reducer-support.d.ts\ndist/domain/reducer-support.d.ts.map\ndist/domain/reducer-support.js\ndist/domain/reducer-support.js.map\ndist/domain/reducer.d.ts\ndist/domain/reducer.d.ts.map\ndist/domain/reducer.js\ndist/domain/reducer.js.map\ndist/domain/run-contracts.d.ts\ndist/domain/run-contracts.d.ts.map\ndist/domain/run-contracts.js\ndist/domain/run-contracts.js.map\ndist/domain/run-interactions.d.ts\ndist/domain/run-interactions.d.ts.map\ndist/domain/run-interactions.js\ndist/domain/run-interactions.js.map\ndist/domain/run-usage.d.ts\ndist/domain/run-usage.d.ts.map\ndist/domain/run-usage.js\ndist/domain/run-usage.js.map\ndist/domain/runtime-diagnostics.d.ts\ndist/domain/runtime-diagnostics.d.ts.map\ndist/domain/runtime-diagnostics.js\ndist/domain/runtime-diagnostics.js.map\ndist/domain/runtime-events.d.ts\ndist/domain/runtime-events.d.ts.map\ndist/domain/runtime-events.js\ndist/domain/runtime-events.js.map\ndist/domain/runtime-projection.d.ts\ndist/domain/runtime-projection.d.ts.map\ndist/domain/runtime-projection.js\ndist/domain/runtime-projection.js.map\ndist/domain/secret-sanitizer.d.ts\ndist/domain/secret-sanitizer.d.ts.map\ndist/domain/secret-sanitizer.js\ndist/domain/secret-sanitizer.js.map\ndist/domain/state.d.ts\ndist/domain/state.d.ts.map\ndist/domain/state.js\ndist/domain/state.js.map\ndist/domain/terminal-sanitizer.d.ts\ndist/domain/terminal-sanitizer.d.ts.map\ndist/domain/terminal-sanitizer.js\ndist/domain/terminal-sanitizer.js.map\ndist/domain/text.d.ts\ndist/domain/text.d.ts.map\ndist/domain/text.js\ndist/domain/text.js.map\ndist/eval/calibration.d.ts\ndist/eval/calibration.d.ts.map\ndist/eval/calibration.js\ndist/eval/calibration.js.map\ndist/eval/campaigns.d.ts\ndist/eval/campaigns.d.ts.map\ndist/eval/campaigns.js\ndist/eval/campaigns.js.map\ndist/eval/cases.d.ts\ndist/eval/cases.d.ts.map\ndist/eval/cases.js\ndist/eval/cases.js.map\ndist/eval/execution.d.ts\ndist/eval/execution.d.ts.map\ndist/eval/execution.js\ndist/eval/execution.js.map\ndist/eval/fixtures.d.ts\ndist/eval/fixtures.d.ts.map\ndist/eval/fixtures.js\ndist/eval/fixtures.js.map\ndist/eval/product-path.d.ts\ndist/eval/product-path.d.ts.map\ndist/eval/product-path.js\ndist/eval/product-path.js.map\ndist/eval/record-builder.d.ts\ndist/eval/record-builder.d.ts.map\ndist/eval/record-builder.js\ndist/eval/record-builder.js.map\ndist/eval/records.d.ts\ndist/eval/records.d.ts.map\ndist/eval/records.js\ndist/eval/records.js.map\ndist/eval/release-decision.d.ts\ndist/eval/release-decision.d.ts.map\ndist/eval/release-decision.js\ndist/eval/release-decision.js.map\ndist/eval/release-markers.d.ts\ndist/eval/release-markers.d.ts.map\ndist/eval/release-markers.js\ndist/eval/release-markers.js.map\ndist/eval/runner.d.ts\ndist/eval/runner.d.ts.map\ndist/eval/runner.js\ndist/eval/runner.js.map\ndist/eval/types.d.ts\ndist/eval/types.d.ts.map\ndist/eval/types.js\ndist/eval/types.js.map\ndist/index.d.ts\ndist/index.d.ts.map\ndist/index.js\ndist/index.js.map\ndist/installed-package-version.d.ts\ndist/installed-package-version.d.ts.map\ndist/installed-package-version.js\ndist/installed-package-version.js.map\ndist/ports/clock.d.ts\ndist/ports/clock.d.ts.map\ndist/ports/clock.js\ndist/ports/clock.js.map\ndist/ports/connection-lifecycle.d.ts\ndist/ports/connection-lifecycle.d.ts.map\ndist/ports/connection-lifecycle.js\ndist/ports/connection-lifecycle.js.map\ndist/ports/credentials.d.ts\ndist/ports/credentials.d.ts.map\ndist/ports/credentials.js\ndist/ports/credentials.js.map\ndist/ports/effect-storage.d.ts\ndist/ports/effect-storage.d.ts.map\ndist/ports/effect-storage.js\ndist/ports/effect-storage.js.map\ndist/ports/execution.d.ts\ndist/ports/execution.d.ts.map\ndist/ports/execution.js\ndist/ports/execution.js.map\ndist/ports/ids.d.ts\ndist/ports/ids.d.ts.map\ndist/ports/ids.js\ndist/ports/ids.js.map\ndist/ports/native-interactive-execution.d.ts\ndist/ports/native-interactive-execution.d.ts.map\ndist/ports/native-interactive-execution.js\ndist/ports/native-interactive-execution.js.map\ndist/ports/native-terminal-transport.d.ts\ndist/ports/native-terminal-transport.d.ts.map\ndist/ports/native-terminal-transport.js\ndist/ports/native-terminal-transport.js.map\ndist/ports/storage.d.ts\ndist/ports/storage.d.ts.map\ndist/ports/storage.js\ndist/ports/storage.js.map\ndist/startup/chunks/analysis-comparison-facts-I3OYGYE5.js\ndist/startup/chunks/analysis-comparison-facts-I3OYGYE5.js.map\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js\ndist/startup/chunks/analysis-comparison-record-VMUVZPUV.js.map\ndist/startup/chunks/chunk-2B6P3EZQ.js\ndist/startup/chunks/chunk-2B6P3EZQ.js.map\ndist/startup/chunks/chunk-2DHVQBG3.js\ndist/startup/chunks/chunk-2DHVQBG3.js.map\ndist/startup/chunks/chunk-3SLVNOQZ.js\ndist/startup/chunks/chunk-3SLVNOQZ.js.map\ndist/startup/chunks/chunk-4GTWJJDM.js\ndist/startup/chunks/chunk-4GTWJJDM.js.map\ndist/startup/chunks/chunk-5PAWXR2Q.js\ndist/startup/chunks/chunk-5PAWXR2Q.js.map\ndist/startup/chunks/chunk-6G7QKB6J.js\ndist/startup/chunks/chunk-6G7QKB6J.js.map\ndist/startup/chunks/chunk-7XGO5BXD.js\ndist/startup/chunks/chunk-7XGO5BXD.js.map\ndist/startup/chunks/chunk-A4OPONUD.js\ndist/startup/chunks/chunk-A4OPONUD.js.map\ndist/startup/chunks/chunk-AUQCJYW5.js\ndist/startup/chunks/chunk-AUQCJYW5.js.map\ndist/startup/chunks/chunk-B5RO4NKE.js\ndist/startup/chunks/chunk-B5RO4NKE.js.map\ndist/startup/chunks/chunk-C7EOPPW6.js\ndist/startup/chunks/chunk-C7EOPPW6.js.map\ndist/startup/chunks/chunk-DLR6FLQV.js\ndist/startup/chunks/chunk-DLR6FLQV.js.map\ndist/startup/chunks/chunk-ECJN6YKR.js\ndist/startup/chunks/chunk-ECJN6YKR.js.map\ndist/startup/chunks/chunk-EJNMDNTG.js\ndist/startup/chunks/chunk-EJNMDNTG.js.map\ndist/startup/chunks/chunk-END4OHSH.js\ndist/startup/chunks/chunk-END4OHSH.js.map\ndist/startup/chunks/chunk-GDBW3ONY.js\ndist/startup/chunks/chunk-GDBW3ONY.js.map\ndist/startup/chunks/chunk-ICSUOC5L.js\ndist/startup/chunks/chunk-ICSUOC5L.js.map\ndist/startup/chunks/chunk-JVFU2XN5.js\ndist/startup/chunks/chunk-JVFU2XN5.js.map\ndist/startup/chunks/chunk-LBHLC2S6.js\ndist/startup/chunks/chunk-LBHLC2S6.js.map\ndist/startup/chunks/chunk-LIQFLF7X.js\ndist/startup/chunks/chunk-LIQFLF7X.js.map\ndist/startup/chunks/chunk-NLHRVY4W.js\ndist/startup/chunks/chunk-NLHRVY4W.js.map\ndist/startup/chunks/chunk-PAPTIOCL.js\ndist/startup/chunks/chunk-PAPTIOCL.js.map\ndist/startup/chunks/chunk-PHF25LHJ.js\ndist/startup/chunks/chunk-PHF25LHJ.js.map\ndist/startup/chunks/chunk-PXRVFPRL.js\ndist/startup/chunks/chunk-PXRVFPRL.js.map\ndist/startup/chunks/chunk-RG4XF34O.js\ndist/startup/chunks/chunk-RG4XF34O.js.map\ndist/startup/chunks/chunk-S2GV43RS.js\ndist/startup/chunks/chunk-S2GV43RS.js.map\ndist/startup/chunks/chunk-TD2TPAGY.js\ndist/startup/chunks/chunk-TD2TPAGY.js.map\ndist/startup/chunks/chunk-UTHORCP6.js\ndist/startup/chunks/chunk-UTHORCP6.js.map\ndist/startup/chunks/chunk-V7LWVMBP.js\ndist/startup/chunks/chunk-V7LWVMBP.js.map\ndist/startup/chunks/chunk-V7ZXNCA7.js\ndist/startup/chunks/chunk-V7ZXNCA7.js.map\ndist/startup/chunks/chunk-VRWZ5M2N.js\ndist/startup/chunks/chunk-VRWZ5M2N.js.map\ndist/startup/chunks/chunk-VTNLVERY.js\ndist/startup/chunks/chunk-VTNLVERY.js.map\ndist/startup/chunks/chunk-X4CECC3O.js\ndist/startup/chunks/chunk-X4CECC3O.js.map\ndist/startup/chunks/chunk-XBKCXOJW.js\ndist/startup/chunks/chunk-XBKCXOJW.js.map\ndist/startup/chunks/chunk-Z3GH7NPB.js\ndist/startup/chunks/chunk-Z3GH7NPB.js.map\ndist/startup/chunks/chunk-ZOX5AIG5.js\ndist/startup/chunks/chunk-ZOX5AIG5.js.map\ndist/startup/chunks/chunk-ZUTIVWML.js\ndist/startup/chunks/chunk-ZUTIVWML.js.map\ndist/startup/chunks/configuration-wizard-CW4DGU64.js\ndist/startup/chunks/configuration-wizard-CW4DGU64.js.map\ndist/startup/chunks/production-composition-32ZB3SSV.js\ndist/startup/chunks/production-composition-32ZB3SSV.js.map\ndist/startup/chunks/production-connection-providers-WDIVTX5W.js\ndist/startup/chunks/production-connection-providers-WDIVTX5W.js.map\ndist/startup/chunks/production-connections-22QMPHBX.js\ndist/startup/chunks/production-connections-22QMPHBX.js.map\ndist/startup/chunks/profile-connection-dispatch-MQVRUHHD.js\ndist/startup/chunks/profile-connection-dispatch-MQVRUHHD.js.map\ndist/startup/chunks/supervisor-control-F4IMJYTH.js\ndist/startup/chunks/supervisor-control-F4IMJYTH.js.map\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js\ndist/startup/chunks/supervisor-watch-X6TXO6GN.js.map\ndist/startup/chunks/trace-store-7SBEF7ZG.js\ndist/startup/chunks/trace-store-7SBEF7ZG.js.map\ndist/startup/chunks/ui-dispatch-BX7VRXL7.js\ndist/startup/chunks/ui-dispatch-BX7VRXL7.js.map\ndist/startup/durable-runtime.d.ts\ndist/startup/durable-runtime.d.ts.map\ndist/startup/durable-runtime.js\ndist/startup/durable-runtime.js.map\ndist/startup/preview-runtime.d.ts\ndist/startup/preview-runtime.d.ts.map\ndist/startup/preview-runtime.js\ndist/startup/preview-runtime.js.map\ndist/startup/terminal-runtime.d.ts\ndist/startup/terminal-runtime.d.ts.map\ndist/startup/terminal-runtime.js\ndist/startup/terminal-runtime.js.map\ndist/startup/terminal-signal-latch.d.ts\ndist/startup/terminal-signal-latch.d.ts.map\ndist/startup/terminal-signal-latch.js\ndist/startup/terminal-signal-latch.js.map\ndist/testing/deterministic-backend.d.ts\ndist/testing/deterministic-backend.d.ts.map\ndist/testing/deterministic-backend.js\ndist/testing/deterministic-backend.js.map\ndist/testing/product-demo-fixture.d.ts\ndist/testing/product-demo-fixture.d.ts.map\ndist/testing/product-demo-fixture.js\ndist/testing/product-demo-fixture.js.map\ndist/testing/runtime-contract-fixtures.d.ts\ndist/testing/runtime-contract-fixtures.d.ts.map\ndist/testing/runtime-contract-fixtures.js\ndist/testing/runtime-contract-fixtures.js.map\ndist/testing/supervision-fixture.d.ts\ndist/testing/supervision-fixture.d.ts.map\ndist/testing/supervision-fixture.js\ndist/testing/supervision-fixture.js.map\ndist/testing/supervision-ui-fixture.d.ts\ndist/testing/supervision-ui-fixture.d.ts.map\ndist/testing/supervision-ui-fixture.js\ndist/testing/supervision-ui-fixture.js.map\ndist/version.d.ts\ndist/version.d.ts.map\ndist/version.js\ndist/version.js.map\ndist/views/headless/bounded-output.d.ts\ndist/views/headless/bounded-output.d.ts.map\ndist/views/headless/bounded-output.js\ndist/views/headless/bounded-output.js.map\ndist/views/headless/protocol-limits.d.ts\ndist/views/headless/protocol-limits.d.ts.map\ndist/views/headless/protocol-limits.js\ndist/views/headless/protocol-limits.js.map\ndist/views/headless/protocol.d.ts\ndist/views/headless/protocol.d.ts.map\ndist/views/headless/protocol.js\ndist/views/headless/protocol.js.map\ndist/views/headless/rpc-automation-commands.d.ts\ndist/views/headless/rpc-automation-commands.d.ts.map\ndist/views/headless/rpc-automation-commands.js\ndist/views/headless/rpc-automation-commands.js.map\ndist/views/headless/rpc-errors.d.ts\ndist/views/headless/rpc-errors.d.ts.map\ndist/views/headless/rpc-errors.js\ndist/views/headless/rpc-errors.js.map\ndist/views/headless/rpc-interaction-commands.d.ts\ndist/views/headless/rpc-interaction-commands.d.ts.map\ndist/views/headless/rpc-interaction-commands.js\ndist/views/headless/rpc-interaction-commands.js.map\ndist/views/headless/rpc-parser.d.ts\ndist/views/headless/rpc-parser.d.ts.map\ndist/views/headless/rpc-parser.js\ndist/views/headless/rpc-parser.js.map\ndist/views/headless/rpc-types.d.ts\ndist/views/headless/rpc-types.d.ts.map\ndist/views/headless/rpc-types.js\ndist/views/headless/rpc-types.js.map\ndist/views/headless/rpc.d.ts\ndist/views/headless/rpc.d.ts.map\ndist/views/headless/rpc.js\ndist/views/headless/rpc.js.map\ndist/views/shared/analysis-model-call-presentation.d.ts\ndist/views/shared/analysis-model-call-presentation.d.ts.map\ndist/views/shared/analysis-model-call-presentation.js\ndist/views/shared/analysis-model-call-presentation.js.map\ndist/views/shared/analysis-presentation.d.ts\ndist/views/shared/analysis-presentation.d.ts.map\ndist/views/shared/analysis-presentation.js\ndist/views/shared/analysis-presentation.js.map\ndist/views/shared/appearance.d.ts\ndist/views/shared/appearance.d.ts.map\ndist/views/shared/appearance.js\ndist/views/shared/appearance.js.map\ndist/views/shared/canonical.d.ts\ndist/views/shared/canonical.d.ts.map\ndist/views/shared/canonical.js\ndist/views/shared/canonical.js.map\ndist/views/shared/command-registry.d.ts\ndist/views/shared/command-registry.d.ts.map\ndist/views/shared/command-registry.js\ndist/views/shared/command-registry.js.map\ndist/views/shared/command-table.d.ts\ndist/views/shared/command-table.d.ts.map\ndist/views/shared/command-table.js\ndist/views/shared/command-table.js.map\ndist/views/shared/comparison-presentation.d.ts\ndist/views/shared/comparison-presentation.d.ts.map\ndist/views/shared/comparison-presentation.js\ndist/views/shared/comparison-presentation.js.map\ndist/views/shared/connection-lifecycle.d.ts\ndist/views/shared/connection-lifecycle.d.ts.map\ndist/views/shared/connection-lifecycle.js\ndist/views/shared/connection-lifecycle.js.map\ndist/views/shared/duration.d.ts\ndist/views/shared/duration.d.ts.map\ndist/views/shared/duration.js\ndist/views/shared/duration.js.map\ndist/views/shared/environment-presentation.d.ts\ndist/views/shared/environment-presentation.d.ts.map\ndist/views/shared/environment-presentation.js\ndist/views/shared/environment-presentation.js.map\ndist/views/shared/headless-commands.d.ts\ndist/views/shared/headless-commands.d.ts.map\ndist/views/shared/headless-commands.js\ndist/views/shared/headless-commands.js.map\ndist/views/shared/intents.d.ts\ndist/views/shared/intents.d.ts.map\ndist/views/shared/intents.js\ndist/views/shared/intents.js.map\ndist/views/shared/models.d.ts\ndist/views/shared/models.d.ts.map\ndist/views/shared/models.js\ndist/views/shared/models.js.map\ndist/views/shared/native-interactive-actions.d.ts\ndist/views/shared/native-interactive-actions.d.ts.map\ndist/views/shared/native-interactive-actions.js\ndist/views/shared/native-interactive-actions.js.map\ndist/views/shared/plain-accessibility.d.ts\ndist/views/shared/plain-accessibility.d.ts.map\ndist/views/shared/plain-accessibility.js\ndist/views/shared/plain-accessibility.js.map\ndist/views/shared/sanitize.d.ts\ndist/views/shared/sanitize.d.ts.map\ndist/views/shared/sanitize.js\ndist/views/shared/sanitize.js.map\ndist/views/shared/semantic-activity-limit.d.ts\ndist/views/shared/semantic-activity-limit.d.ts.map\ndist/views/shared/semantic-activity-limit.js\ndist/views/shared/semantic-activity-limit.js.map\ndist/views/shared/semantic-activity.d.ts\ndist/views/shared/semantic-activity.d.ts.map\ndist/views/shared/semantic-activity.js\ndist/views/shared/semantic-activity.js.map\ndist/views/shared/semantic-details.d.ts\ndist/views/shared/semantic-details.d.ts.map\ndist/views/shared/semantic-details.js\ndist/views/shared/semantic-details.js.map\ndist/views/shared/semantic-graph-edges.d.ts\ndist/views/shared/semantic-graph-edges.d.ts.map\ndist/views/shared/semantic-graph-edges.js\ndist/views/shared/semantic-graph-edges.js.map\ndist/views/shared/semantic-graph-filters.d.ts\ndist/views/shared/semantic-graph-filters.d.ts.map\ndist/views/shared/semantic-graph-filters.js\ndist/views/shared/semantic-graph-filters.js.map\ndist/views/shared/semantic-graph-nodes.d.ts\ndist/views/shared/semantic-graph-nodes.d.ts.map\ndist/views/shared/semantic-graph-nodes.js\ndist/views/shared/semantic-graph-nodes.js.map\ndist/views/shared/semantic-graph.d.ts\ndist/views/shared/semantic-graph.d.ts.map\ndist/views/shared/semantic-graph.js\ndist/views/shared/semantic-graph.js.map\ndist/views/shared/semantic-projection.d.ts\ndist/views/shared/semantic-projection.d.ts.map\ndist/views/shared/semantic-projection.js\ndist/views/shared/semantic-projection.js.map\ndist/views/shared/semantic-query-scope.d.ts\ndist/views/shared/semantic-query-scope.d.ts.map\ndist/views/shared/semantic-query-scope.js\ndist/views/shared/semantic-query-scope.js.map\ndist/views/shared/semantic-query-types.d.ts\ndist/views/shared/semantic-query-types.d.ts.map\ndist/views/shared/semantic-query-types.js\ndist/views/shared/semantic-query-types.js.map\ndist/views/shared/usage-projection.d.ts\ndist/views/shared/usage-projection.d.ts.map\ndist/views/shared/usage-projection.js\ndist/views/shared/usage-projection.js.map\ndist/views/tui/activity-browser.d.ts\ndist/views/tui/activity-browser.d.ts.map\ndist/views/tui/activity-browser.js\ndist/views/tui/activity-browser.js.map\ndist/views/tui/activity-document.d.ts\ndist/views/tui/activity-document.d.ts.map\ndist/views/tui/activity-document.js\ndist/views/tui/activity-document.js.map\ndist/views/tui/activity.d.ts\ndist/views/tui/activity.d.ts.map\ndist/views/tui/activity.js\ndist/views/tui/activity.js.map\ndist/views/tui/analysis.d.ts\ndist/views/tui/analysis.d.ts.map\ndist/views/tui/analysis.js\ndist/views/tui/analysis.js.map\ndist/views/tui/autocomplete-guard.d.ts\ndist/views/tui/autocomplete-guard.d.ts.map\ndist/views/tui/autocomplete-guard.js\ndist/views/tui/autocomplete-guard.js.map\ndist/views/tui/automation-overlay-workflow.d.ts\ndist/views/tui/automation-overlay-workflow.d.ts.map\ndist/views/tui/automation-overlay-workflow.js\ndist/views/tui/automation-overlay-workflow.js.map\ndist/views/tui/automation-rule-panel.d.ts\ndist/views/tui/automation-rule-panel.d.ts.map\ndist/views/tui/automation-rule-panel.js\ndist/views/tui/automation-rule-panel.js.map\ndist/views/tui/automation-rule-presentation.d.ts\ndist/views/tui/automation-rule-presentation.d.ts.map\ndist/views/tui/automation-rule-presentation.js\ndist/views/tui/automation-rule-presentation.js.map\ndist/views/tui/automation-rule-response-editor.d.ts\ndist/views/tui/automation-rule-response-editor.d.ts.map\ndist/views/tui/automation-rule-response-editor.js\ndist/views/tui/automation-rule-response-editor.js.map\ndist/views/tui/command-palette.d.ts\ndist/views/tui/command-palette.d.ts.map\ndist/views/tui/command-palette.js\ndist/views/tui/command-palette.js.map\ndist/views/tui/comparison.d.ts\ndist/views/tui/comparison.d.ts.map\ndist/views/tui/comparison.js\ndist/views/tui/comparison.js.map\ndist/views/tui/composer-view.d.ts\ndist/views/tui/composer-view.d.ts.map\ndist/views/tui/composer-view.js\ndist/views/tui/composer-view.js.map\ndist/views/tui/configuration-credential.d.ts\ndist/views/tui/configuration-credential.d.ts.map\ndist/views/tui/configuration-credential.js\ndist/views/tui/configuration-credential.js.map\ndist/views/tui/configuration-presenters.d.ts\ndist/views/tui/configuration-presenters.d.ts.map\ndist/views/tui/configuration-presenters.js\ndist/views/tui/configuration-presenters.js.map\ndist/views/tui/configuration-responsive-text.d.ts\ndist/views/tui/configuration-responsive-text.d.ts.map\ndist/views/tui/configuration-responsive-text.js\ndist/views/tui/configuration-responsive-text.js.map\ndist/views/tui/configuration-review.d.ts\ndist/views/tui/configuration-review.d.ts.map\ndist/views/tui/configuration-review.js\ndist/views/tui/configuration-review.js.map\ndist/views/tui/configuration-wizard-presentation.d.ts\ndist/views/tui/configuration-wizard-presentation.d.ts.map\ndist/views/tui/configuration-wizard-presentation.js\ndist/views/tui/configuration-wizard-presentation.js.map\ndist/views/tui/configuration-wizard.d.ts\ndist/views/tui/configuration-wizard.d.ts.map\ndist/views/tui/configuration-wizard.js\ndist/views/tui/configuration-wizard.js.map\ndist/views/tui/connection-metadata-editor-actions.d.ts\ndist/views/tui/connection-metadata-editor-actions.d.ts.map\ndist/views/tui/connection-metadata-editor-actions.js\ndist/views/tui/connection-metadata-editor-actions.js.map\ndist/views/tui/connection-metadata-editor-inputs.d.ts\ndist/views/tui/connection-metadata-editor-inputs.d.ts.map\ndist/views/tui/connection-metadata-editor-inputs.js\ndist/views/tui/connection-metadata-editor-inputs.js.map\ndist/views/tui/connection-metadata-editor-model.d.ts\ndist/views/tui/connection-metadata-editor-model.d.ts.map\ndist/views/tui/connection-metadata-editor-model.js\ndist/views/tui/connection-metadata-editor-model.js.map\ndist/views/tui/connection-metadata-editor-presentation.d.ts\ndist/views/tui/connection-metadata-editor-presentation.d.ts.map\ndist/views/tui/connection-metadata-editor-presentation.js\ndist/views/tui/connection-metadata-editor-presentation.js.map\ndist/views/tui/connection-metadata-editor-rendering.d.ts\ndist/views/tui/connection-metadata-editor-rendering.d.ts.map\ndist/views/tui/connection-metadata-editor-rendering.js\ndist/views/tui/connection-metadata-editor-rendering.js.map\ndist/views/tui/connection-metadata-editor.d.ts\ndist/views/tui/connection-metadata-editor.d.ts.map\ndist/views/tui/connection-metadata-editor.js\ndist/views/tui/connection-metadata-editor.js.map\ndist/views/tui/connection-overlay-workflow.d.ts\ndist/views/tui/connection-overlay-workflow.d.ts.map\ndist/views/tui/connection-overlay-workflow.js\ndist/views/tui/connection-overlay-workflow.js.map\ndist/views/tui/connection-setup-actions.d.ts\ndist/views/tui/connection-setup-actions.d.ts.map\ndist/views/tui/connection-setup-actions.js\ndist/views/tui/connection-setup-actions.js.map\ndist/views/tui/connection-setup-rendering.d.ts\ndist/views/tui/connection-setup-rendering.d.ts.map\ndist/views/tui/connection-setup-rendering.js\ndist/views/tui/connection-setup-rendering.js.map\ndist/views/tui/connection-setup.d.ts\ndist/views/tui/connection-setup.d.ts.map\ndist/views/tui/connection-setup.js\ndist/views/tui/connection-setup.js.map\ndist/views/tui/conversation-dialogs.d.ts\ndist/views/tui/conversation-dialogs.d.ts.map\ndist/views/tui/conversation-dialogs.js\ndist/views/tui/conversation-dialogs.js.map\ndist/views/tui/conversation-overlay-actions.d.ts\ndist/views/tui/conversation-overlay-actions.d.ts.map\ndist/views/tui/conversation-overlay-actions.js\ndist/views/tui/conversation-overlay-actions.js.map\ndist/views/tui/conversation-overlay-helpers.d.ts\ndist/views/tui/conversation-overlay-helpers.d.ts.map\ndist/views/tui/conversation-overlay-helpers.js\ndist/views/tui/conversation-overlay-helpers.js.map\ndist/views/tui/conversation-overlays.d.ts\ndist/views/tui/conversation-overlays.d.ts.map\ndist/views/tui/conversation-overlays.js\ndist/views/tui/conversation-overlays.js.map\ndist/views/tui/details.d.ts\ndist/views/tui/details.d.ts.map\ndist/views/tui/details.js\ndist/views/tui/details.js.map\ndist/views/tui/dynamic-autocomplete.d.ts\ndist/views/tui/dynamic-autocomplete.d.ts.map\ndist/views/tui/dynamic-autocomplete.js\ndist/views/tui/dynamic-autocomplete.js.map\ndist/views/tui/entity-browser-layout.d.ts\ndist/views/tui/entity-browser-layout.d.ts.map\ndist/views/tui/entity-browser-layout.js\ndist/views/tui/entity-browser-layout.js.map\ndist/views/tui/entity-browser.d.ts\ndist/views/tui/entity-browser.d.ts.map\ndist/views/tui/entity-browser.js\ndist/views/tui/entity-browser.js.map\ndist/views/tui/execution-target.d.ts\ndist/views/tui/execution-target.d.ts.map\ndist/views/tui/execution-target.js\ndist/views/tui/execution-target.js.map\ndist/views/tui/focused-surface.d.ts\ndist/views/tui/focused-surface.d.ts.map\ndist/views/tui/focused-surface.js\ndist/views/tui/focused-surface.js.map\ndist/views/tui/fork-preview.d.ts\ndist/views/tui/fork-preview.d.ts.map\ndist/views/tui/fork-preview.js\ndist/views/tui/fork-preview.js.map\ndist/views/tui/graph.d.ts\ndist/views/tui/graph.d.ts.map\ndist/views/tui/graph.js\ndist/views/tui/graph.js.map\ndist/views/tui/help.d.ts\ndist/views/tui/help.d.ts.map\ndist/views/tui/help.js\ndist/views/tui/help.js.map\ndist/views/tui/interaction-automation-response.d.ts\ndist/views/tui/interaction-automation-response.d.ts.map\ndist/views/tui/interaction-automation-response.js\ndist/views/tui/interaction-automation-response.js.map\ndist/views/tui/interaction-decisions.d.ts\ndist/views/tui/interaction-decisions.d.ts.map\ndist/views/tui/interaction-decisions.js\ndist/views/tui/interaction-decisions.js.map\ndist/views/tui/interaction-input-response.d.ts\ndist/views/tui/interaction-input-response.d.ts.map\ndist/views/tui/interaction-input-response.js\ndist/views/tui/interaction-input-response.js.map\ndist/views/tui/interaction-presentation.d.ts\ndist/views/tui/interaction-presentation.d.ts.map\ndist/views/tui/interaction-presentation.js\ndist/views/tui/interaction-presentation.js.map\ndist/views/tui/interaction.d.ts\ndist/views/tui/interaction.d.ts.map\ndist/views/tui/interaction.js\ndist/views/tui/interaction.js.map\ndist/views/tui/keyboard.d.ts\ndist/views/tui/keyboard.d.ts.map\ndist/views/tui/keyboard.js\ndist/views/tui/keyboard.js.map\ndist/views/tui/layout.d.ts\ndist/views/tui/layout.d.ts.map\ndist/views/tui/layout.js\ndist/views/tui/layout.js.map\ndist/views/tui/measurement-display.d.ts\ndist/views/tui/measurement-display.d.ts.map\ndist/views/tui/measurement-display.js\ndist/views/tui/measurement-display.js.map\ndist/views/tui/modal-coordinator.d.ts\ndist/views/tui/modal-coordinator.d.ts.map\ndist/views/tui/modal-coordinator.js\ndist/views/tui/modal-coordinator.js.map\ndist/views/tui/profile-compatibility.d.ts\ndist/views/tui/profile-compatibility.d.ts.map\ndist/views/tui/profile-compatibility.js\ndist/views/tui/profile-compatibility.js.map\ndist/views/tui/profile-editor-actions.d.ts\ndist/views/tui/profile-editor-actions.d.ts.map\ndist/views/tui/profile-editor-actions.js\ndist/views/tui/profile-editor-actions.js.map\ndist/views/tui/profile-editor-rendering.d.ts\ndist/views/tui/profile-editor-rendering.d.ts.map\ndist/views/tui/profile-editor-rendering.js\ndist/views/tui/profile-editor-rendering.js.map\ndist/views/tui/profile-editor.d.ts\ndist/views/tui/profile-editor.d.ts.map\ndist/views/tui/profile-editor.js\ndist/views/tui/profile-editor.js.map\ndist/views/tui/safe-markdown.d.ts\ndist/views/tui/safe-markdown.d.ts.map\ndist/views/tui/safe-markdown.js\ndist/views/tui/safe-markdown.js.map\ndist/views/tui/secret-input.d.ts\ndist/views/tui/secret-input.d.ts.map\ndist/views/tui/secret-input.js\ndist/views/tui/secret-input.js.map\ndist/views/tui/selector.d.ts\ndist/views/tui/selector.d.ts.map\ndist/views/tui/selector.js\ndist/views/tui/selector.js.map\ndist/views/tui/supervisor-actions.d.ts\ndist/views/tui/supervisor-actions.d.ts.map\ndist/views/tui/supervisor-actions.js\ndist/views/tui/supervisor-actions.js.map\ndist/views/tui/terminal-app.d.ts\ndist/views/tui/terminal-app.d.ts.map\ndist/views/tui/terminal-app.js\ndist/views/tui/terminal-app.js.map\ndist/views/tui/terminal-chrome.d.ts\ndist/views/tui/terminal-chrome.d.ts.map\ndist/views/tui/terminal-chrome.js\ndist/views/tui/terminal-chrome.js.map\ndist/views/tui/terminal-command-controller.d.ts\ndist/views/tui/terminal-command-controller.d.ts.map\ndist/views/tui/terminal-command-controller.js\ndist/views/tui/terminal-command-controller.js.map\ndist/views/tui/terminal-compatibility.d.ts\ndist/views/tui/terminal-compatibility.d.ts.map\ndist/views/tui/terminal-compatibility.js\ndist/views/tui/terminal-compatibility.js.map\ndist/views/tui/terminal-drafts.d.ts\ndist/views/tui/terminal-drafts.d.ts.map\ndist/views/tui/terminal-drafts.js\ndist/views/tui/terminal-drafts.js.map\ndist/views/tui/terminal-identity.d.ts\ndist/views/tui/terminal-identity.d.ts.map\ndist/views/tui/terminal-identity.js\ndist/views/tui/terminal-identity.js.map\ndist/views/tui/terminal-input-controller.d.ts\ndist/views/tui/terminal-input-controller.d.ts.map\ndist/views/tui/terminal-input-controller.js\ndist/views/tui/terminal-input-controller.js.map\ndist/views/tui/terminal-interaction-controller.d.ts\ndist/views/tui/terminal-interaction-controller.d.ts.map\ndist/views/tui/terminal-interaction-controller.js\ndist/views/tui/terminal-interaction-controller.js.map\ndist/views/tui/terminal-overlays.d.ts\ndist/views/tui/terminal-overlays.d.ts.map\ndist/views/tui/terminal-overlays.js\ndist/views/tui/terminal-overlays.js.map\ndist/views/tui/terminal-shell.d.ts\ndist/views/tui/terminal-shell.d.ts.map\ndist/views/tui/terminal-shell.js\ndist/views/tui/terminal-shell.js.map\ndist/views/tui/terminal-surface-overlays.d.ts\ndist/views/tui/terminal-surface-overlays.d.ts.map\ndist/views/tui/terminal-surface-overlays.js\ndist/views/tui/terminal-surface-overlays.js.map\ndist/views/tui/terminal-usage.d.ts\ndist/views/tui/terminal-usage.d.ts.map\ndist/views/tui/terminal-usage.js\ndist/views/tui/terminal-usage.js.map\ndist/views/tui/theme.d.ts\ndist/views/tui/theme.d.ts.map\ndist/views/tui/theme.js\ndist/views/tui/theme.js.map\ndist/views/tui/transcript.d.ts\ndist/views/tui/transcript.d.ts.map\ndist/views/tui/transcript.js\ndist/views/tui/transcript.js.map\nLICENSE\npackage.json\nREADME.md\nTHIRD_PARTY_LICENSES.json\nTHIRD_PARTY_NOTICES.md\n\u001b[94mTarball Details\u001b[39m\n/tmp/braid-live-pack-FH1bzh/tangle-network-braid-0.3.0.tgz\n", + "stderr": "", + "durationMs": 1064, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "install": { + "command": "npm", + "args": [ + "install", + "--no-audit", + "--no-fund", + "/tmp/braid-live-pack-FH1bzh/tangle-network-braid-0.3.0.tgz" + ], + "code": 0, + "signal": null, + "stdout": "\nadded 68 packages in 2s\n", + "stderr": "npm warn allow-scripts 2 packages have install scripts not yet covered by allowScripts:\nnpm warn allow-scripts @dataiku/uv@0.12.0 (postinstall: node install.cjs)\nnpm warn allow-scripts koffi@3.1.6 (install: node ./cnoke.cjs -P . -D src/koffi --prebuild --release)\nnpm warn allow-scripts\nnpm warn allow-scripts Run `npm approve-scripts --allow-scripts-pending` to review, or `npm approve-scripts ` to allow.\n", + "durationMs": 2142, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "version": { + "command": "/home/drew/.nvm/versions/node/v24.18.0/bin/node", + "args": [ + "/tmp/braid-live-install-LwdJOl/node_modules/@tangle-network/braid/dist/bin/braid.js", + "--version" + ], + "code": 0, + "signal": null, + "stdout": "0.3.0\n", + "stderr": "", + "durationMs": 58, + "timedOut": false, + "cleanupOk": true, + "termination": { + "strategy": "natural-exit", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": false, + "killSent": false, + "forcedKill": false, + "initialExited": true, + "initialTree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "natural-exit", + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + } + }, + "artifact": { + "tarball": "tangle-network-braid-0.3.0.tgz", + "sha256": "a531b3264d6f84b111fe4a6ef1de616ac13013359686e2f1e0e84d07859ae056", + "binary": "node_modules/@tangle-network/braid/dist/bin/braid.js" + }, + "provider": { + "package": "@tangle-network/agent-provider-cli-bridge", + "capabilitiesByBackend": { + "opencode": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": false, + "append": true + }, + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true }, - "run": {} + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false }, - "normal": { - "status": "completed", - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "run": { - "id": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "turnId": "turn-df965174-25ce-4080-ad08-32247f7bb757", - "operationId": "op-live-send-claude-code-sonnet", - "status": "completed", - "startedAt": "2026-08-29T00:20:55.674Z", - "updatedAt": "2026-08-29T00:21:02.681Z", - "terminalAt": "2026-08-29T00:21:02.681Z", - "durationMs": 7007, - "inputTokens": 2, - "outputTokens": 30, - "tokensKnown": true, - "usdKnown": true, - "tokenStatus": "complete", - "costUsd": 0.0985582, - "costStatus": "reported", - "model": "claude-code/sonnet", - "provider": "cli-bridge", - "runner": "claude-code", - "connectionId": "connection-live-cli-bridge", - "completeness": "complete", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "environmentId": "environment-bd696f804a820bccca863d4b312600d9", - "controlRef": { - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "provider": "cli-bridge", - "environmentId": "cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd", - "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "executionId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "requestDigest": "sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b" - }, - "materializationDigest": "fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356", - "cursor": "1:0", - "cursorCommittedSequence": 12, - "contentBytes": 83 - }, - "assistant": { - "id": "message-8d48ace7-c0fb-4669-8764-b66e64f597fa", - "role": "assistant", - "text": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", - "status": "complete", - "runId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "parts": [ - { - "id": "op-live-send-claude-code-sonnet:text", - "kind": "text", - "text": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", - "sourceEventId": "run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final" - } - ] - }, - "finalText": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", - "marker": "LIVE_BRAID_CLAUDE-CODE-SONNET_OK", - "markerObserved": true, - "prompt": "Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK" + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true }, - "cancel": { - "prompt": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", - "send": { - "version": 1, - "type": "ack", - "requestId": "cancel-send-claude-code-sonnet", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "revision": 14, - "replayed": false, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "admission": { - "version": 1, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "conversationId": "conv-1", - "branchId": "branch-1", - "admittedAt": "2026-08-29T00:21:04.446Z", - "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", - "requested": { - "text": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", - "profile": { - "name": "Braid live claude-code/sonnet", - "description": "Opt-in packed CLI Bridge smoke profile", - "version": "0.1.0", - "model": "[depth-limited]", - "harness": "claude-code" - }, - "connectionId": "connection-live-cli-bridge", - "interactions": {}, - "model": "sonnet", - "runner": "claude-code" - }, - "capabilities": { - "streaming": { - "live": true, - "replay": true, - "detach": true, - "turnIdempotency": true - }, - "sessions": { - "continue": true, - "messages": false - }, - "controls": { - "cancel": true, - "steer": false, - "queue": true, - "status": true, - "recreate": true - }, - "events": { - "stableIdentity": true, - "sequence": true, - "cursor": true - }, - "usage": true, - "environment": { - "profile": "[depth-limited]", - "streaming": "[depth-limited]", - "sessions": "[depth-limited]", - "retainedControl": "[depth-limited]", - "workspace": "[depth-limited]", - "branching": "[depth-limited]", - "placement": true, - "usage": true, - "confidential": false, - "observation": "[depth-limited]" - } - }, - "provider": "cli-bridge", - "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "materializationReceipt": { - "provider": "cli-bridge", - "backend": "environment-provider", - "connectionId": "connection-live-cli-bridge", - "sessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "lifecycle": "retained-session", - "cleanup": "explicit", - "portableContext": "unavailable", - "workspace": "/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet", - "model": "sonnet", - "route": "claude-code/sonnet", - "runner": "claude-code", - "providerRunId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "retainedControl": "exact-after-dispatch" - }, - "admissionStatus": "admitted", - "requestDigest": "95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f", - "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", - "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5", - "digest": "d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1" - }, - "command": "send" - }, - "advertisedByProvider": false, - "advertisedByNormalAdmission": true, - "advertisedByNormalRun": false, - "advertisedByRun": true, - "advertised": true, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "activeRun": { - "id": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "status": "streaming", - "startedAt": "2026-08-29T00:21:04.457Z", - "updatedAt": "2026-08-29T00:21:04.457Z", - "inputTokens": 0, - "outputTokens": 0, - "tokensKnown": false, - "usdKnown": false, - "tokenStatus": "unknown", - "costStatus": "unknown", - "model": "sonnet", - "provider": "cli-bridge", - "runner": "claude-code", - "connectionId": "connection-live-cli-bridge", - "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "completeness": "incomplete", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5" - }, - "response": { - "version": 1, - "type": "ack", - "requestId": "cancel-claude-code-sonnet", - "revision": 25, - "operationId": "op-live-cancel-claude-code-sonnet", - "command": "cancel_run", - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "control": "cancel", - "outcome": "unknown", - "replayed": false + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "pi": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": true }, - "attemptedRun": true, - "status": "advertised-but-not-terminal-cancelled" - }, - "interaction": { - "status": "reported-unavailable", - "advertisedByProvider": false, - "advertisedByBraid": false, - "advertised": false, - "braid": { - "available": false, - "source": "runtime", - "reason": "Interaction response is not exposed by the current runtime adapter" + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true }, - "attempted": false + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false }, - "error": { - "code": "LIVE_CAPABILITY_CONTRADICTION", - "message": "cancel capability reported advertised-but-not-terminal-cancelled; expected verified", - "exitCode": 1, - "details": { - "name": "cancel", - "status": "advertised-but-not-terminal-cancelled", - "advertised": true, - "capability": { - "prompt": "For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.", - "send": { - "version": 1, - "type": "ack", - "requestId": "cancel-send-claude-code-sonnet", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "revision": 14, - "replayed": false, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "admission": { - "version": 1, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "conversationId": "conv-1", - "branchId": "branch-1", - "admittedAt": "2026-08-29T00:21:04.446Z", - "profileDigest": "3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad", - "requested": "[depth-limited]", - "capabilities": "[depth-limited]", - "provider": "cli-bridge", - "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "materializationReceipt": "[depth-limited]", - "admissionStatus": "admitted", - "requestDigest": "95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f", - "capabilitiesDigest": "06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1", - "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5", - "digest": "d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1" - }, - "command": "send" - }, - "advertisedByProvider": false, - "advertisedByNormalAdmission": true, - "advertisedByNormalRun": false, - "advertisedByRun": true, - "advertised": true, - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "activeRun": { - "id": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "turnId": "turn-715e8029-7a28-4648-96ff-a1c5cbae523c", - "operationId": "op-live-cancel-send-claude-code-sonnet", - "status": "streaming", - "startedAt": "2026-08-29T00:21:04.457Z", - "updatedAt": "2026-08-29T00:21:04.457Z", - "inputTokens": 0, - "outputTokens": 0, - "tokensKnown": false, - "usdKnown": false, - "tokenStatus": "unknown", - "costStatus": "unknown", - "model": "sonnet", - "provider": "cli-bridge", - "runner": "claude-code", - "connectionId": "connection-live-cli-bridge", - "requestedSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "completeness": "incomplete", - "providerSessionId": "session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284", - "materializationDigest": "a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5" - }, - "response": { - "version": 1, - "type": "ack", - "requestId": "cancel-claude-code-sonnet", - "revision": 25, - "operationId": "op-live-cancel-claude-code-sonnet", - "command": "cancel_run", - "runId": "run-37d5acb2-481f-458b-b054-4f6e516968ed", - "control": "cancel", - "outcome": "unknown", - "replayed": false - }, - "attemptedRun": true, - "status": "advertised-but-not-terminal-cancelled" - } - } + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true }, - "status": "failed", - "stderr": "", - "stdout": "{\"version\":1,\"type\":\"ack\",\"requestId\":\"init-claude-code-sonnet\",\"revision\":4,\"command\":\"initialize\"}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"init-claude-code-sonnet\",\"revision\":4,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":4,\"sequence\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:53.785Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[],\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":null,\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":4,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:53.785Z\"}],\"branch\":\"branch-1\",\"status\":\"empty\",\"statusText\":\"ready for a message\",\"queueCount\":0,\"queue\":[],\"messages\":[],\"hiddenMessageCount\":0,\"runs\":[],\"sessionUsage\":{\"turns\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"activity\":[],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"send-claude-code-sonnet\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"revision\":4,\"replayed\":false,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"version\":1,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:20:55.662Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"digest\":\"3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":5,\"revision\":5,\"event\":{\"sequence\":5,\"revision\":5,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":6,\"revision\":6,\"event\":{\"sequence\":6,\"revision\":6,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"admission\":{\"version\":1,\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:20:55.662Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"c2ada85ce9e1f593ce7464639e676fe5120744aef0ab5a43d70a569a974f235b\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"digest\":\"3324a86d8909c68989234bcbe2bf731e2f9bcd48e517984240f9a5af90f5e345\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":7,\"revision\":7,\"event\":{\"sequence\":7,\"revision\":7,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-claude-code-sonnet-87321068a54f8558de6d48df\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"87321068a54f8558de6d48dfc4ff071df6baa38536027ebb340caefeeb9deac6\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:20:55.684Z\",\"updatedAt\":\"2026-08-29T00:20:55.684Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":8,\"revision\":8,\"event\":{\"sequence\":8,\"revision\":8,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"runId\":\"retained-intent-run:ab8d1d38943421a8bbfd85b56f698d10ca900a8f8d152a504a0ac7e3f9310f30\",\"requestedProfileDigest\":\"sha256:3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requestDigest\":\"sha256:ab8d1d38943421a8bbfd85b56f698d10ca900a8f8d152a504a0ac7e3f9310f30\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-claude-code-sonnet\",\"revision\":6,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":6,\"sequence\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:20:55.674Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"activeRuns\":[{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":6,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"running\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\"},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[],\"activeRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"startedAt\":\"2026-08-29T00:20:55.674Z\"}],\"graphQuery\":\"\",\"entityDetails\":[],\"details\":{\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.recipe\":{\"available\":false,\"source\":\"application\",\"reason\":\"Complete or fail a run before analyzing it\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":9,\"revision\":9,\"event\":{\"sequence\":9,\"revision\":9,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":10,\"revision\":10,\"event\":{\"sequence\":10,\"revision\":10,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-send-claude-code-sonnet\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":11,\"revision\":11,\"event\":{\"sequence\":11,\"revision\":11,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:20:57.505Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:20:57.505Z\"},\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"provider\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:20:57.505Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":12,\"revision\":12,\"event\":{\"sequence\":12,\"revision\":12,\"kind\":\"run.part.updated\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"1:0\",\"providerSequence\":2,\"cursor\":\"1:0\",\"receivedAt\":\"2026-08-29T00:21:00.866Z\"},\"part\":{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"1:0\"},\"delta\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_O\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":13,\"revision\":13,\"event\":{\"sequence\":13,\"revision\":13,\"kind\":\"run.finished\",\"payload\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"source\":{\"eventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\",\"providerSequence\":3,\"receivedAt\":\"2026-08-29T00:21:02.680Z\"},\"status\":\"completed\",\"completeness\":\"complete\",\"finalText\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"usage\":{\"input\":2,\"output\":30,\"costUsd\":0.0985582,\"model\":\"claude-code/sonnet\"},\"reason\":\"RUNTIME_FINAL_REASON\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":14,\"revision\":14,\"event\":{\"sequence\":14,\"revision\":14,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-send-claude-code-sonnet-87321068a54f8558de6d48df\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"87321068a54f8558de6d48dfc4ff071df6baa38536027ebb340caefeeb9deac6\",\"kind\":\"send\",\"status\":\"terminal\",\"attempt\":1,\"outcomeDigest\":\"b82069d6893c46ce5ac5dc805ef96d7f3999afb6c6ecd8ec2e4332ec92d0b067\",\"createdAt\":\"2026-08-29T00:20:55.684Z\",\"updatedAt\":\"2026-08-29T00:21:02.701Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"send-claude-code-sonnet\",\"revision\":14,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":14,\"sequence\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"activeRuns\":[],\"lastError\":null},\"view\":{\"revision\":14,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:20:55.674Z\"}],\"branch\":\"branch-1\",\"status\":\"completed\",\"statusText\":\"completed\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83}],\"sessionUsage\":{\"turns\":{\"sourceCount\":1,\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":1,\"unknownLatencySources\":1},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"focusedRunId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:20:57.505Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:20:57.505Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"fields\":[{\"label\":\"status\",\"value\":\"completed\"},{\"label\":\"input tokens\",\"value\":\"2\"},{\"label\":\"output tokens\",\"value\":\"30\"},{\"label\":\"token measurement\",\"value\":\"complete\"},{\"label\":\"cost measurement\",\"value\":\"reported\"},{\"label\":\"model\",\"value\":\"claude-code/sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconnect\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no recoverable run to reconcile\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"revision\":14,\"replayed\":false,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"version\":1,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:21:04.446Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\",\"digest\":\"d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1\"},\"command\":\"send\"}\n{\"version\":1,\"type\":\"event\",\"sequence\":15,\"revision\":15,\"event\":{\"sequence\":15,\"revision\":15,\"kind\":\"draft.changed\",\"payload\":{\"value\":{\"kind\":\"draft.changed\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":16,\"revision\":16,\"event\":{\"sequence\":16,\"revision\":16,\"kind\":\"run.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"admission\":{\"version\":1,\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"admittedAt\":\"2026-08-29T00:21:04.446Z\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requested\":{\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"connectionId\":\"connection-live-cli-bridge\",\"interactions\":{},\"model\":\"sonnet\",\"runner\":\"claude-code\"},\"capabilities\":{\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"messages\":false},\"controls\":{\"cancel\":true,\"steer\":false,\"queue\":true,\"status\":true,\"recreate\":true},\"events\":{\"stableIdentity\":true,\"sequence\":true,\"cursor\":true},\"usage\":true,\"environment\":{\"profile\":{\"namedProfiles\":false,\"systemPrompt\":{\"replace\":true,\"append\":true},\"instructions\":true,\"tools\":true,\"permissions\":true,\"mcp\":true,\"subagents\":true,\"resources\":{\"files\":true,\"instructions\":true,\"tools\":true,\"skills\":true,\"agents\":true,\"commands\":true},\"hooks\":false,\"modes\":true,\"runtimeUpdate\":false,\"validation\":false},\"streaming\":{\"live\":true,\"replay\":true,\"detach\":true,\"turnIdempotency\":true},\"sessions\":{\"continue\":true,\"list\":false,\"messages\":false},\"retainedControl\":{\"exactRunIdentity\":true,\"resultIdentity\":true,\"eventIdentity\":true,\"cancellationIdempotency\":true},\"workspace\":{\"read\":false,\"write\":false,\"exec\":false,\"git\":false,\"upload\":false,\"download\":false},\"branching\":{\"checkpoint\":false,\"fork\":false},\"placement\":true,\"usage\":true,\"confidential\":false,\"observation\":{\"identity\":true,\"lifecycle\":true,\"endpoint\":true,\"placement\":true,\"resources\":false,\"resourceUse\":false,\"modelUsage\":true,\"computeBilling\":false,\"accountUsage\":false}}},\"provider\":\"cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationReceipt\":{\"provider\":\"cli-bridge\",\"backend\":\"environment-provider\",\"connectionId\":\"connection-live-cli-bridge\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"lifecycle\":\"retained-session\",\"cleanup\":\"explicit\",\"portableContext\":\"unavailable\",\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"model\":\"sonnet\",\"route\":\"claude-code/sonnet\",\"runner\":\"claude-code\",\"providerRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"retainedControl\":\"exact-after-dispatch\"},\"admissionStatus\":\"admitted\",\"requestDigest\":\"95cbe8f73b043c4cf6190a460aebed1e495e0ca6d1845c63e270039621045e1f\",\"capabilitiesDigest\":\"06943c437c127bc659cf3f96a01734fd51852b7c74bfe5172285fbbed4231bd1\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\",\"digest\":\"d0d507ea5444085fff554392dfda32aac2cc7cf56157683490b88c91bcadc5f1\"},\"status\":\"admitted\"}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":17,\"revision\":17,\"event\":{\"sequence\":17,\"revision\":17,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-claude-code-sonnet-e5f36571f043cb843a861455\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"e5f36571f043cb843a86145559563c6deb2f514f3274456ba1b25013bb90023a\",\"kind\":\"send\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:21:04.466Z\",\"updatedAt\":\"2026-08-29T00:21:04.466Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":18,\"revision\":18,\"event\":{\"sequence\":18,\"revision\":18,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"intent\",\"provider\":\"cli-bridge\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"runId\":\"retained-intent-run:8bb3bcc8b1058253c5051a664a25e3c6af5f9932209834a5284b49f39f73313f\",\"requestedProfileDigest\":\"sha256:3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"requestDigest\":\"sha256:8bb3bcc8b1058253c5051a664a25e3c6af5f9932209834a5284b49f39f73313f\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"revision\":16,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":16,\"sequence\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"streaming\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:04.457Z\",\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"incomplete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\"}],\"lastError\":null},\"view\":{\"revision\":16,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"running\",\"statusText\":\"streaming\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"streaming\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"running\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\"},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"completeness\":\"incomplete\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:20:57.505Z\"}],\"activeRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:20:57.505Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"running\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"running\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"running\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"running\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:20:57.505Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"streaming\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":false,\"source\":\"application\",\"reason\":\"A run is already active\"},\"run.cancel\":{\"available\":true,\"source\":\"runtime\"},\"run.queue\":{\"available\":true,\"source\":\"provider\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"The current runtime does not report steering support\"},\"run.detach\":{\"available\":true,\"source\":\"provider\"},\"run.reconnect\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconnecting it\"},\"run.reconcile\":{\"available\":false,\"source\":\"provider\",\"reason\":\"Detach the active run before reconciling it\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"ack\",\"requestId\":\"cancel-claude-code-sonnet\",\"revision\":25,\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"command\":\"cancel_run\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"outcome\":\"unknown\",\"replayed\":false}\n{\"version\":1,\"type\":\"event\",\"sequence\":19,\"revision\":19,\"event\":{\"sequence\":19,\"revision\":19,\"kind\":\"run.control.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\",\"text\":\"[unavailable]\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":20,\"revision\":20,\"event\":{\"sequence\":20,\"revision\":20,\"kind\":\"run.cancel.requested\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"requested\",\"reason\":\"live packed smoke cancellation\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":21,\"revision\":21,\"event\":{\"sequence\":21,\"revision\":21,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-claude-code-sonnet-5515b6e8bbbfda20731ac558\",\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"5515b6e8bbbfda20731ac558c4952513a35ddfa7164a25a81e758a72c9aa690d\",\"kind\":\"custom\",\"status\":\"pending\",\"attempt\":1,\"createdAt\":\"2026-08-29T00:21:04.530Z\",\"updatedAt\":\"2026-08-29T00:21:04.530Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":22,\"revision\":22,\"event\":{\"sequence\":22,\"revision\":22,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"environment\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":23,\"revision\":23,\"event\":{\"sequence\":23,\"revision\":23,\"kind\":\"run.retained.admitted\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"value\":{\"kind\":\"run.retained.admitted\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"admission\":{\"phase\":\"dispatched\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"idempotencyKey\":\"[redacted]\",\"turnId\":\"op-live-cancel-send-claude-code-sonnet\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":24,\"revision\":24,\"event\":{\"sequence\":24,\"revision\":24,\"kind\":\"run.environment.observed\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"source\":{\"eventId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:21:06.253Z\"},\"value\":{\"kind\":\"run.environment.observed\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"observation\":{\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"createdAt\":\"2026-08-29T00:21:02.719Z\",\"unavailable\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"observedAt\":\"2026-08-29T00:21:06.253Z\"},\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"provider\":{\"eventId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed:execution-bound\",\"providerSequence\":1,\"receivedAt\":\"2026-08-29T00:21:06.253Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":25,\"revision\":25,\"event\":{\"sequence\":25,\"revision\":25,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-claude-code-sonnet-5515b6e8bbbfda20731ac558\",\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"effectKind\":\"run.control.cancel\",\"requestDigest\":\"5515b6e8bbbfda20731ac558c4952513a35ddfa7164a25a81e758a72c9aa690d\",\"kind\":\"custom\",\"status\":\"unknown\",\"attempt\":1,\"outcomeDigest\":\"d0751b0e8ce25e30d2d826f1285ade45916c988dc0790be969fe898e27675605\",\"createdAt\":\"2026-08-29T00:21:04.530Z\",\"updatedAt\":\"2026-08-29T00:21:06.328Z\"}}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":26,\"revision\":26,\"event\":{\"sequence\":26,\"revision\":26,\"kind\":\"run.control.acknowledged\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":{\"operationId\":\"op-live-cancel-claude-code-sonnet\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"control\":\"cancel\",\"status\":\"unknown\",\"detail\":\"CONTROL_OUTCOME_UNKNOWN\"}}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":27,\"revision\":27,\"event\":{\"sequence\":27,\"revision\":27,\"kind\":\"run.unknown\",\"payload\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"completeness\":\"unknown\",\"error\":\"Cancellation outcome could not be confirmed by the provider\"}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-claude-code-sonnet\",\"revision\":27,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":27,\"sequence\":27,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:06.347Z\",\"terminalAt\":\"2026-08-29T00:21:06.347Z\",\"durationMs\":1890,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"unknown\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[],\"lastError\":\"Cancellation outcome could not be confirmed by the provider\"},\"view\":{\"revision\":27,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"unknown\",\"statusText\":\"Cancellation outcome could not be confirmed by the provider\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"elapsedMs\":1890},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"unknown\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:21:06.253Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"unknown\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"unknown\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:lifecycle:local:unknown\",\"kind\":\"system\",\"title\":\"unknown\",\"status\":\"unknown\",\"detail\":\"Cancellation outcome could not be confirmed by the provider\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"unknown\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"unknown\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:21:06.253Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"unknown\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":true,\"source\":\"provider\"},\"run.reconcile\":{\"available\":true,\"source\":\"provider\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":28,\"revision\":28,\"event\":{\"sequence\":28,\"revision\":28,\"kind\":\"effect.upserted\",\"payload\":{\"value\":{\"kind\":\"effect.upserted\",\"effect\":{\"id\":\"effect-op-live-cancel-send-claude-code-sonnet-e5f36571f043cb843a861455\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"effectKind\":\"run.execute\",\"requestDigest\":\"e5f36571f043cb843a86145559563c6deb2f514f3274456ba1b25013bb90023a\",\"kind\":\"send\",\"status\":\"unknown\",\"attempt\":1,\"outcomeDigest\":\"d750ff0ec5ea61710ac8c366de9bad4d95a0636b9706f791721107881db4e8ac\",\"createdAt\":\"2026-08-29T00:21:04.466Z\",\"updatedAt\":\"2026-08-29T00:21:06.359Z\"}}}}}\n{\"version\":1,\"type\":\"state\",\"requestId\":\"cancel-send-claude-code-sonnet\",\"revision\":28,\"projection\":\"full\",\"state\":{\"schemaVersion\":2,\"revision\":28,\"sequence\":28,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"profile\":{\"name\":\"Braid live claude-code/sonnet\",\"description\":\"Opt-in packed CLI Bridge smoke profile\",\"version\":\"0.1.0\",\"model\":{\"default\":\"sonnet\",\"reasoningEffort\":\"none\"},\"harness\":\"claude-code\"},\"runConfiguration\":{\"profileName\":\"Braid live claude-code/sonnet\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"connectionId\":\"connection-live-cli-bridge\",\"overrides\":{}},\"draft\":\"\",\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"updatedAt\":\"2026-08-29T00:21:02.681Z\",\"terminalAt\":\"2026-08-29T00:21:02.681Z\",\"durationMs\":7007,\"inputTokens\":2,\"outputTokens\":30,\"tokensKnown\":true,\"usdKnown\":true,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"completeness\":\"complete\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestDigest\":\"sha256:4d8d2b6c60acc9adf61e64b30bc08dae981616e40e17d95bf93aa1a892e19f4b\"},\"materializationDigest\":\"fa89a32f8e716598aee3065a29fe5c2c24b7a77a31625dd2f20c7edc684db356\",\"cursor\":\"1:0\",\"cursorCommittedSequence\":12,\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"updatedAt\":\"2026-08-29T00:21:06.347Z\",\"terminalAt\":\"2026-08-29T00:21:06.347Z\",\"durationMs\":1890,\"inputTokens\":0,\"outputTokens\":0,\"tokensKnown\":false,\"usdKnown\":false,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"provider\":\"cli-bridge\",\"runner\":\"claude-code\",\"connectionId\":\"connection-live-cli-bridge\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"completeness\":\"unknown\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"controlRef\":{\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"provider\":\"cli-bridge\",\"environmentId\":\"cb1.WyJjbGF1ZGUtY29kZSIsImNsYXVkZS1jb2RlL3Nvbm5ldCIsInNoYTI1NjpjM2UyNmZjMzExMWE2NmNlNjc3N2NmMGYyMDM2ZGU2NTc1N2U3MzFmODU3NzVlMGNlOWMwMGI4ZDMyMWUxNGUxIiwiVTlreFJSdnJZMHhWSFlFS1E2c2s1X0R0Mi1XUTZGa3lNN3hOaGJfRkJiWSJd\",\"sessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"executionId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"requestDigest\":\"sha256:22cb85d74220465aa2c71a0cfc25aad8d9fcbe5bbe792a656966add93681e14c\"},\"materializationDigest\":\"a7b7a28d0cfdad016e5b05dc84f25013a9ec031660a89dcebfb4b3258232c3e5\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"interactions\":[],\"queue\":[],\"activeRunId\":null,\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"activeRuns\":[],\"lastError\":\"Cancellation outcome could not be confirmed by the provider\"},\"view\":{\"revision\":28,\"workspace\":\"/tmp/braid-live-targets-t25Lze/workspace-claude-code-sonnet\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"runner\":\"claude-code\",\"model\":\"sonnet\",\"effort\":\"none\",\"runOverrides\":{},\"connection\":\"Live local CLI Bridge\",\"conversationId\":\"conv-1\",\"conversationTitle\":\"New conversation\",\"conversations\":[{\"id\":\"conv-1\",\"title\":\"New conversation\",\"branchId\":\"branch-1\",\"archived\":false,\"active\":true,\"updatedAt\":\"2026-08-29T00:21:04.457Z\"}],\"branch\":\"branch-1\",\"status\":\"unknown\",\"statusText\":\"Cancellation outcome could not be confirmed by the provider\",\"queueCount\":0,\"queue\":[],\"messages\":[{\"id\":\"message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"role\":\"user\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"part-message-e9fc44ca-0678-41ed-bae6-36964fb9819a\",\"kind\":\"text\",\"text\":\"Output only this token, with no punctuation or explanation: LIVE_BRAID_CLAUDE-CODE-SONNET_OK\"}]},{\"id\":\"message-8d48ace7-c0fb-4669-8764-b66e64f597fa\",\"role\":\"assistant\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"status\":\"complete\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"parts\":[{\"id\":\"op-live-send-claude-code-sonnet:text\",\"kind\":\"text\",\"text\":\"LIVE_BRAID_CLAUDE-CODE-SONNET_OK\",\"sourceEventId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:final\"}]},{\"id\":\"message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"role\":\"user\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\",\"status\":\"complete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[{\"id\":\"part-message-8a926583-3905-4abf-bb1a-f598aa7af17d\",\"kind\":\"text\",\"text\":\"For LIVE_BRAID_CLAUDE-CODE-SONNET_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.\"}]},{\"id\":\"message-cbcfb896-562f-4f4f-97b2-18632c0b28f9\",\"role\":\"assistant\",\"text\":\"\",\"status\":\"incomplete\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"parts\":[]}],\"hiddenMessageCount\":0,\"runs\":[{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"turnId\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-send-claude-code-sonnet\",\"status\":\"completed\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"claude-code/sonnet\",\"effort\":\"none\",\"cursor\":\"1:0\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":2,\"output\":30,\"tokenStatus\":\"complete\",\"costUsd\":0.0985582,\"costStatus\":\"reported\",\"model\":\"claude-code/sonnet\",\"elapsedMs\":7007},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"complete\",\"contentBytes\":83},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"turnId\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"conversationId\":\"conv-1\",\"branchId\":\"branch-1\",\"operationId\":\"op-live-cancel-send-claude-code-sonnet\",\"status\":\"unknown\",\"profileName\":\"Braid live claude-code/sonnet\",\"profileDigest\":\"3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"model\":\"sonnet\",\"effort\":\"none\",\"providerSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"requestedSessionId\":\"session-braid-run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"usage\":{\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"model\":\"sonnet\",\"elapsedMs\":1890},\"runner\":\"claude-code\",\"provider\":\"cli-bridge\",\"connectionId\":\"connection-live-cli-bridge\",\"connection\":\"Live local CLI Bridge\",\"environmentId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"completeness\":\"unknown\"}],\"sessionUsage\":{\"turns\":{\"sourceCount\":2,\"input\":2,\"output\":30,\"tokenStatus\":\"unknown\",\"costUsd\":0.0985582,\"costStatus\":\"unknown\",\"unknownTokenSources\":1,\"unknownCostSources\":1,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":2,\"unknownLatencySources\":2},\"analyses\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"delegated\":{\"sourceCount\":0,\"input\":0,\"output\":0,\"tokenStatus\":\"unknown\",\"costStatus\":\"unknown\",\"unknownTokenSources\":0,\"unknownCostSources\":0,\"callStatus\":\"unknown\",\"latencyStatus\":\"unknown\",\"unknownCallSources\":0,\"unknownLatencySources\":0},\"attribution\":\"complete\"},\"environments\":[{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"connectionId\":\"connection-live-cli-bridge\",\"kind\":\"local-process\",\"provider\":\"cli-bridge\",\"lifecycle\":\"ready\",\"lifecycleMode\":\"retained\",\"cleanup\":\"explicit\",\"continuity\":\"session\",\"location\":\"local\",\"runtimeEndpointHost\":\"127.0.0.1\",\"unavailableTelemetry\":[\"cli-subscription-and-quota:not-exposed-by-provider\",\"effective-resources:not-exposed-by-provider\",\"machine-specs:not-exposed-by-provider\",\"runtime-cpu-memory-usage:not-exposed-by-provider\"],\"createdAt\":\"2026-08-29T00:20:53.953Z\",\"updatedAt\":\"2026-08-29T00:21:06.253Z\"}],\"focusedRunId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"interactions\":[],\"activity\":[{\"id\":\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"kind\":\"run\",\"title\":\"run run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"status\":\"completed\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"occurredAt\":\"2026-08-29T00:20:55.674Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"activity:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"completed\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:02.681Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"run\",\"entityId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\"},{\"id\":\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"kind\":\"run\",\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"status\":\"unknown\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\",\"occurredAt\":\"2026-08-29T00:21:04.457Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"environment:environment-bd696f804a820bccca863d4b312600d9\",\"kind\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"detail\":\"local-process · local · explicit\",\"startedAt\":\"2026-08-29T00:20:53.953Z\",\"occurredAt\":\"2026-08-29T00:21:06.253Z\",\"runId\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:admission:local:admitted\",\"kind\":\"system\",\"title\":\"admitted\",\"status\":\"unknown\",\"detail\":\"profile 3bc4f205846d8076324ecd69c1aa637404c2a627e3e41b84c13ade01f7e680ad\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"live packed smoke cancellation\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:control.ack:local:cancel\",\"kind\":\"system\",\"title\":\"cancel\",\"status\":\"unknown\",\"detail\":\"unknown\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"},{\"id\":\"activity:run-37d5acb2-481f-458b-b054-4f6e516968ed:lifecycle:local:unknown\",\"kind\":\"system\",\"title\":\"unknown\",\"status\":\"unknown\",\"detail\":\"Cancellation outcome could not be confirmed by the provider\",\"occurredAt\":\"2026-08-29T00:21:06.347Z\",\"runId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"entityType\":\"run\",\"entityId\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\"}],\"graph\":[{\"id\":\"conv-1\",\"type\":\"conversation\",\"title\":\"New conversation\",\"status\":\"complete\",\"depth\":0,\"edgeLabel\":\"attached\",\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"branch-1\",\"type\":\"branch\",\"title\":\"Main\",\"status\":\"complete\",\"depth\":1,\"edgeLabel\":\"attached\",\"parentIds\":[\"conversation:conv-1\"],\"startedAt\":\"2026-08-29T00:20:53.785Z\"},{\"id\":\"environment-bd696f804a820bccca863d4b312600d9\",\"type\":\"environment\",\"title\":\"cli-bridge execution\",\"status\":\"complete\",\"depth\":4,\"edgeLabel\":\"attached\",\"parentIds\":[\"run:run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"run:run-37d5acb2-481f-458b-b054-4f6e516968ed\"],\"runner\":\"cli-bridge\",\"startedAt\":\"2026-08-29T00:20:53.953Z\"},{\"id\":\"turn-df965174-25ce-4080-ad08-32247f7bb757\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"complete\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:20:55.674Z\"},{\"id\":\"run-18f2f108-be4e-44cf-8a5e-21e9b1e99284\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"completed\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-df965174-25ce-4080-ad08-32247f7bb757\"],\"runner\":\"claude-code\",\"elapsedMs\":7007,\"startedAt\":\"2026-08-29T00:20:55.674Z\",\"costUsd\":0.0985582},{\"id\":\"turn-715e8029-7a28-4648-96ff-a1c5cbae523c\",\"type\":\"turn\",\"title\":\"Turn\",\"status\":\"unknown\",\"depth\":2,\"edgeLabel\":\"continued\",\"parentIds\":[\"branch:branch-1\"],\"startedAt\":\"2026-08-29T00:21:04.457Z\"},{\"id\":\"run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"type\":\"run\",\"title\":\"Run\",\"status\":\"unknown\",\"depth\":3,\"edgeLabel\":\"attached\",\"parentIds\":[\"turn:turn-715e8029-7a28-4648-96ff-a1c5cbae523c\"],\"runner\":\"claude-code\",\"elapsedMs\":1890,\"startedAt\":\"2026-08-29T00:21:04.457Z\"}],\"graphQuery\":\"\",\"entityDetails\":[{\"entityType\":\"environment\",\"entityId\":\"environment-bd696f804a820bccca863d4b312600d9\",\"title\":\"cli-bridge execution\",\"status\":\"ready\",\"lines\":[\"provider: cli-bridge\",\"execution: local-process · local\",\"connection: connection-live-cli-bridge\",\"lifecycle: ready · retained · cleanup explicit\",\"continuity: session\",\"runtime endpoint host: 127.0.0.1\",\"placement: requested not specified · verified unavailable\",\"machine: unavailable · physical IP is not exposed\",\"created: 2026-08-29T00:20:53.953Z\",\"observed: 2026-08-29T00:21:06.253Z\",\"unavailable: cli-subscription-and-quota:not-exposed-by-provider\",\"unavailable: effective-resources:not-exposed-by-provider\",\"unavailable: machine-specs:not-exposed-by-provider\",\"unavailable: runtime-cpu-memory-usage:not-exposed-by-provider\"]}],\"details\":{\"title\":\"run run-37d5acb2-481f-458b-b054-4f6e516968ed\",\"fields\":[{\"label\":\"status\",\"value\":\"unknown\"},{\"label\":\"input tokens\",\"value\":\"0\"},{\"label\":\"output tokens\",\"value\":\"0\"},{\"label\":\"model\",\"value\":\"sonnet\"}]},\"capabilities\":{\"conversation.create\":{\"available\":true,\"source\":\"application\"},\"conversation.open\":{\"available\":true,\"source\":\"application\"},\"run.runner\":{\"available\":true,\"source\":\"application\"},\"run.model\":{\"available\":true,\"source\":\"application\"},\"run.effort\":{\"available\":true,\"source\":\"application\"},\"conversation.branch\":{\"available\":true,\"source\":\"application\"},\"conversation.clone\":{\"available\":true,\"source\":\"application\"},\"conversation.fork\":{\"available\":true,\"source\":\"application\"},\"analysis.ask\":{\"available\":true,\"source\":\"application\"},\"analysis.recipe\":{\"available\":true,\"source\":\"application\"},\"analysis.compare\":{\"available\":false,\"source\":\"application\",\"reason\":\"Two completed or failed runs are required for comparison\"},\"interaction.respond\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Interaction response is not exposed by the current runtime adapter\"},\"interaction.automation\":{\"available\":false,\"source\":\"application\",\"reason\":\"Interaction automation requires the shared response contract\"},\"run.interactive\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal mode requires an interactive TUI and a supported provider\"},\"run.attach\":{\"available\":false,\"source\":\"application\",\"reason\":\"Native terminal attachment requires an interactive TUI and a retained session\"},\"supervisor.worker.attach\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding\"},\"export.create\":{\"available\":true,\"source\":\"application\"},\"analysis.cancel\":{\"available\":false,\"source\":\"application\",\"reason\":\"There is no running analysis to cancel\"},\"application.quit\":{\"available\":true,\"source\":\"local\"},\"help.read\":{\"available\":true,\"source\":\"local\"},\"profile.select\":{\"available\":true,\"source\":\"application\"},\"connection.select\":{\"available\":true,\"source\":\"application\"},\"settings.open\":{\"available\":true,\"source\":\"application\"},\"activity.read\":{\"available\":true,\"source\":\"local\"},\"graph.read\":{\"available\":true,\"source\":\"local\"},\"details.read\":{\"available\":true,\"source\":\"local\"},\"supervisor.refresh\":{\"available\":true,\"source\":\"runtime\"},\"supervisor.worker.steer\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to steer\"},\"supervisor.worker.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervised worker to cancel\"},\"supervisor.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no running supervisor to cancel\"},\"draft.write\":{\"available\":true,\"source\":\"application\"},\"run.send\":{\"available\":true,\"source\":\"provider\"},\"run.cancel\":{\"available\":false,\"source\":\"runtime\",\"reason\":\"There is no active run to cancel\"},\"run.queue\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.steer\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.detach\":{\"available\":false,\"source\":\"provider\",\"reason\":\"There is no active run\"},\"run.reconnect\":{\"available\":true,\"source\":\"provider\"},\"run.reconcile\":{\"available\":true,\"source\":\"provider\"}},\"draft\":\"\",\"selectedSurface\":\"transcript\",\"appearance\":{\"color\":\"none\",\"highContrast\":false,\"reducedMotion\":false}}}\n{\"version\":1,\"type\":\"event\",\"sequence\":29,\"revision\":29,\"event\":{\"sequence\":29,\"revision\":29,\"kind\":\"application.shutdown.requested\",\"payload\":{\"value\":{\"kind\":\"application.shutdown.requested\",\"operationId\":\"op-rpc-eof-shutdown\"}}}}\n", - "process": { - "processIdentity": { - "instanceId": "4657286f-7f8b-4600-b17c-ffb56a0d099b", - "pid": 2246415, - "startedAt": 1787962853162 - }, - "termination": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": false, - "initialTree": { - "supported": true, - "gone": false, - "present": true, - "pids": [ - 2246415 - ], - "roots": [ - 2246415 - ], - "version": 0, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "nativeContinuation": { + "atomicBoundary": true, + "requestIdempotency": true, + "admissionControl": true + }, + "interactions": { + "kinds": [ + "permission" + ], + "answerFieldTypes": [ + "select" + ], + "responseScopes": [ + "interaction" + ], + "secretAnswers": false, + "concurrentRequests": false, + "replay": true, + "responseIdempotency": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false + } + }, + "codex": { + "profile": { + "namedProfiles": false, + "systemPrompt": { + "replace": true, + "append": false }, - "natural": { - "strategy": "natural-exit", - "termTimeoutMs": 2000, - "killTimeoutMs": 2000, - "termSent": false, - "killSent": false, - "forcedKill": false, - "initialExited": false, - "initialTree": { - "supported": true, - "gone": false, - "present": true, - "pids": [ - 2246415 - ], - "roots": [ - 2246415 - ], - "version": 0, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - }, - "exited": true, - "descendantsExited": true, - "descendantsVerified": true, - "cleanupStatus": "natural-exit", - "tree": { - "supported": true, - "gone": true, - "present": false, - "pids": [], - "roots": [], - "version": 1, - "mechanism": "posix-descendant-tracker", - "ownership": "pid-start-time-and-descendant-lineage", - "observed": true, - "escaped": false - } + "instructions": true, + "tools": true, + "permissions": true, + "mcp": true, + "subagents": true, + "resources": { + "files": true, + "instructions": true, + "tools": true, + "skills": true, + "agents": true, + "commands": true }, - "exit": { - "code": 0, - "signal": null - } + "hooks": false, + "modes": true, + "runtimeUpdate": false, + "validation": false + }, + "streaming": { + "live": true, + "replay": true, + "detach": true, + "turnIdempotency": true + }, + "sessions": { + "continue": true, + "list": false, + "messages": false + }, + "retainedControl": { + "exactRunIdentity": true, + "resultIdentity": true, + "eventIdentity": true, + "cancellationIdempotency": true + }, + "contextTransfer": { + "freshSession": true, + "requestIdempotency": true, + "lookup": true + }, + "workspace": { + "read": false, + "write": false, + "exec": false, + "git": false, + "upload": false, + "download": false + }, + "branching": { + "checkpoint": false, + "fork": false + }, + "placement": true, + "usage": true, + "confidential": false, + "observation": { + "identity": true, + "lifecycle": true, + "endpoint": true, + "placement": true, + "resources": false, + "resourceUse": false, + "modelUsage": true, + "computeBilling": false, + "accountUsage": false } } } }, + "analysis": { + "claim": "packed-analysis-readiness-only", + "python": { + "status": "ready", + "readiness": "ready" + }, + "ask": { + "readiness": "ready", + "status": "engine-configured", + "diagnostics": [] + } + }, + "credentialState": { + "configured": true, + "facility": "encrypted-headless", + "targetCount": 3, + "storedCount": 3, + "removedCount": 3 + }, + "bridgeCleanup": { + "stopped": { + "termination": { + "strategy": "process-group", + "termTimeoutMs": 2000, + "killTimeoutMs": 2000, + "termSent": true, + "killSent": false, + "forcedKill": false, + "initialExited": false, + "initialTree": { + "supported": true, + "gone": false, + "present": true, + "pids": [ + 3342141, + 3342155, + 3342156, + 3342172 + ], + "roots": [ + 3342141 + ], + "version": 0, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + }, + "exited": true, + "descendantsExited": true, + "descendantsVerified": true, + "cleanupStatus": "term", + "termSignal": { + "method": "process-group", + "sent": true + }, + "tree": { + "supported": true, + "gone": true, + "present": false, + "pids": [], + "roots": [], + "version": 1, + "mechanism": "posix-descendant-tracker", + "ownership": "pid-start-time-and-descendant-lineage", + "observed": true, + "escaped": false + } + }, + "exit": { + "code": null, + "signal": "SIGTERM" + }, + "stdout": "[cli-bridge] listening on http://127.0.0.1:3344 (host=127.0.0.1)\n[cli-bridge] backends: opencode, pi, codex\n[cli-bridge] bearer: required\n[cli-bridge] host admission: maxActive=8 maxQueue=16/class reservedActive=2 (bulk ceiling 6) queueTimeoutMs=30000 bulkQueueTimeoutMs=240000\n[cli-bridge] reserved-lane clients: pr-reviewer\n[cli-bridge] traces: /tmp/braid-bridge-final-exact.MwB7Kx/traces/spans.jsonl (max 16777216 bytes × 2 files)\n[cli-bridge] jail default: fs-jail root=/.agent-home\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"harness\":\"opencode\",\"provider\":\"zai-coding-plan\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:33518b13903a532eb86c9ead586aaca152a17eb02e4e8e276d6a7afebe608005\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"harness\":\"opencode\",\"provider\":\"zai-coding-plan\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:33518b13903a532eb86c9ead586aaca152a17eb02e4e8e276d6a7afebe608005\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:cacd611307b6fc338eb0b04bf568333ff6b6079673a73a4739edc9350eae65bf\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"harness\":\"opencode\",\"provider\":\"zai-coding-plan\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:33518b13903a532eb86c9ead586aaca152a17eb02e4e8e276d6a7afebe608005\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:b5f1c4d1083ed8b15a991640b4150c82084f59d0725ffe00110e35e8208db1dd\",\"harness\":\"opencode\",\"provider\":\"zai-coding-plan\",\"model\":\"opencode/zai-coding-plan/glm-5.2\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:33518b13903a532eb86c9ead586aaca152a17eb02e4e8e276d6a7afebe608005\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:2f1e3af6a4e6f5d48ca0de6acb0c758ac03e386f6c86295ae4536b4a2e75209a\",\"harness\":\"pi\",\"provider\":\"tangle-router\",\"model\":\"pi/tangle-router/deepseek-v4-flash\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"off\"},\"workspacePlanDigest\":\"sha256:2e0962913b2ebd66008754f9574c59b0ff54539a9e92dc161c2c67b5e5d99bf7\",\"files\":[],\"unsupported\":[],\"inference\":{\"effectiveEndpoint\":\"https://router.tangle.tools/v1\",\"apiMode\":\"openai-completions\",\"transport\":\"scoped-loopback\"}}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] profile materialization receipt {\"schema\":\"cli-bridge.profile-materialization.v2\",\"effectiveProfileDigest\":\"sha256:6525605d0716e56511da5fa74adafab3c7005594a913fe59ac1212a4ea74b3d8\",\"harness\":\"codex\",\"provider\":null,\"model\":\"codex/default\",\"reasoningEffort\":{\"requested\":\"none\",\"applied\":\"none\"},\"workspacePlanDigest\":\"sha256:4d77c3c772a6e4e51147810e5ddf060b6f676dfd8025697db53fd10ce00a7657\",\"files\":[],\"unsupported\":[]}\n[cli-bridge] SIGTERM — shutting down\n", + "stderr": "(node:3342141) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n\u001b[2m$ tsx src/server.ts\u001b[22m\n(node:3342156) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n(node:3342172) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)\n[cli-bridge] admission maxActive=8 exceeds scoped-executor concurrency=4: the executor is the real ceiling. Lower BRIDGE_HOST_CHAT_MAX_ACTIVE or raise CLI_BRIDGE_SCOPE_MAX_CONCURRENCY so one gate owns the limit.\n" + } + }, "cleanup": { "ok": true, "results": [ { - "path": "/tmp/braid-live-pack-eV8ASJ", + "path": "/tmp/braid-live-pack-FH1bzh", "removed": true }, { - "path": "/tmp/braid-live-install-bKXPm2", + "path": "/tmp/braid-live-install-LwdJOl", "removed": true }, { - "path": "/tmp/braid-live-targets-t25Lze", + "path": "/tmp/braid-live-targets-ABQ0I5", "removed": true } ] }, - "status": "failed", - "exitCode": 1, - "finishedAt": "2026-08-29T00:25:23.281Z" + "status": "passed", + "exitCode": 0, + "finishedAt": "2026-08-29T18:33:36.280Z" } diff --git a/scripts/live-bridge/config.mjs b/scripts/live-bridge/config.mjs index 1595eb38..f037a52e 100644 --- a/scripts/live-bridge/config.mjs +++ b/scripts/live-bridge/config.mjs @@ -193,7 +193,8 @@ export async function writeTargetConfig(root, endpoint, target, credential) { .replaceAll(/[^a-z0-9]+/giu, '-') .replace(/^-|-$/gu, '') .toLowerCase() - const workspace = join(root, `workspace-${key}`) + const operationNamespace = randomUUID() + const workspace = join(root, `workspace-${key}-${operationNamespace}`) const configDirectory = join(workspace, '.braid') const profileDirectory = join(configDirectory, 'profiles') await mkdir(profileDirectory, { recursive: true, mode: 0o700 }) @@ -202,7 +203,7 @@ export async function writeTargetConfig(root, endpoint, target, credential) { const profile = profileForBridgeTarget(target) const connectionId = 'connection-live-cli-bridge' const now = new Date().toISOString() - const databaseKeyFile = join(root, `database-key-${key}`) + const databaseKeyFile = join(root, `database-key-${key}-${operationNamespace}`) await writeFile(databaseKeyFile, `${randomBytes(32).toString('hex')}\n`, { mode: 0o600 }) const connection = { id: connectionId, @@ -240,6 +241,7 @@ export async function writeTargetConfig(root, endpoint, target, credential) { profile, connection, key, + operationNamespace, databaseKeyFile, } } diff --git a/scripts/live-bridge/constants.mjs b/scripts/live-bridge/constants.mjs index 3ae31ba5..db70c3ef 100644 --- a/scripts/live-bridge/constants.mjs +++ b/scripts/live-bridge/constants.mjs @@ -61,17 +61,30 @@ export const releaseRunnerTargetDefinitions = Object.freeze([ }, ]) +function marker(key, suffix) { + return `LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_${suffix}` +} + +export const liveMarkers = Object.freeze({ + normal: (key) => marker(key, 'OK'), + cancel: (key) => marker(key, 'CANCEL'), + handoffSource: (key) => marker(key, 'HANDOFF_SOURCE_OK'), + handoffDestination: (key) => marker(key, 'HANDOFF_OK'), + interactive: (key) => marker(key, 'INTERACTIVE_OK'), + restart: (key) => marker(key, 'RESTART'), +}) + export const livePrompts = Object.freeze({ normal: (key) => - `Output only this token, with no punctuation or explanation: LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_OK`, + `Output only this token, with no punctuation or explanation: ${liveMarkers.normal(key)}`, cancel: (key) => - `For LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_CANCEL, produce a numbered list from 1 to 1000 with one short word per line.`, + `For ${liveMarkers.cancel(key)}, produce a numbered list from 1 to 1000 with one short word per line.`, handoffSource: (key) => - `Output only this token, with no punctuation or explanation: LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_HANDOFF_SOURCE_OK`, + `Output only this token, with no punctuation or explanation: ${liveMarkers.handoffSource(key)}`, handoffDestination: (key) => - `Output only this token, with no punctuation or explanation: LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_HANDOFF_OK`, + `Output only this token, with no punctuation or explanation: ${liveMarkers.handoffDestination(key)}`, interactive: (key) => - `Ask one user-visible permission question before completing LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_INTERACTIVE_OK.`, + `Use the read tool now to read ./interaction-proof-${key}.txt. Do not guess its contents or answer without the tool call. After the permission response, report what happened.`, restart: (key) => - `For LIVE_BRAID_${key.toUpperCase().replaceAll('.', '_')}_RESTART, produce a numbered list from 1 to 1000 with one short word per line.`, + `Do not use tools. Reply directly with ${liveMarkers.restart(key)}, then count from 1 to 1000 with one integer per line.`, }) diff --git a/scripts/live-bridge/matrix.mjs b/scripts/live-bridge/matrix.mjs index 8d2658fc..236af779 100644 --- a/scripts/live-bridge/matrix.mjs +++ b/scripts/live-bridge/matrix.mjs @@ -320,9 +320,16 @@ async function runConfigurationMatrix() { const root = await mkdtemp(join(tmpdir(), 'braid-live-config-matrix-')) try { const written = await writeTargetConfig(root, endpoint, piGlm, undefined) + const repeated = await writeTargetConfig(root, endpoint, piGlm, undefined) assert.deepEqual(JSON.parse(await readFile(written.profilePath, 'utf8')), written.profile) assert.equal(written.profile.model.default, 'deepseek-v4-flash') assert.equal(written.profile.model.provider, 'deepseek') + assert.notEqual(repeated.workspace, written.workspace) + assert.notEqual(repeated.databaseKeyFile, written.databaseKeyFile) + assert.equal( + resolve(written.databaseKeyFile).startsWith(`${resolve(written.workspace)}/`), + false, + ) const credential = await writeTargetConfig(root, endpoint, glm, { recordRef: createLiveCredentialId('11111111-1111-1111-1111-111111111111'), }) diff --git a/scripts/live-bridge/process.mjs b/scripts/live-bridge/process.mjs index d1da0613..ce26c7fb 100644 --- a/scripts/live-bridge/process.mjs +++ b/scripts/live-bridge/process.mjs @@ -277,6 +277,24 @@ export class RpcSession { }) } + async waitForExit(label, timeoutMs = this.timeoutMs) { + let timer + const timeout = new Promise((_, rejectExit) => { + timer = setTimeout(() => { + rejectExit( + new LiveBridgeError('RPC_TIMEOUT', `timed out waiting for ${label}`, exitCodes.failed, { + timeoutMs, + }), + ) + }, timeoutMs) + }) + try { + return await Promise.race([this.exit, timeout]) + } finally { + clearTimeout(timer) + } + } + async close() { if (this.closePromise !== undefined) return this.closePromise this.closePromise = (async () => { diff --git a/scripts/live-bridge/provider-session-cleanup.mjs b/scripts/live-bridge/provider-session-cleanup.mjs new file mode 100644 index 00000000..b08641bb --- /dev/null +++ b/scripts/live-bridge/provider-session-cleanup.mjs @@ -0,0 +1,92 @@ +import { exitCodes } from './constants.mjs' +import { requestJson } from './endpoint.mjs' +import { LiveBridgeError } from './errors.mjs' + +const providerName = 'cli-bridge' + +function record(value) { + return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined +} + +function addBinding(sessionIds, value) { + const candidate = record(value) + if (candidate === undefined) return + const controlRef = record(candidate.controlRef) + const receipt = record(candidate.receipt) + const provider = controlRef?.provider ?? candidate.provider ?? receipt?.provider + const sessionId = + controlRef?.sessionId ?? candidate.providerSessionId ?? receipt?.providerSessionId + if ( + provider === providerName && + typeof sessionId === 'string' && + sessionId.length > 0 && + sessionId.length <= 1_024 + ) { + sessionIds.add(sessionId) + } +} + +export function ownedProviderSessionIds(responses) { + const sessionIds = new Set() + for (const response of responses ?? []) { + addBinding(sessionIds, response?.admission) + for (const run of response?.state?.runs ?? []) addBinding(sessionIds, run) + addBinding(sessionIds, response?.event?.payload) + } + return [...sessionIds] +} + +export function providerSessionReleaseResult(sessionId, response) { + const closed = response.status === 200 && response.body?.closed === true + const alreadyAbsent = response.status === 404 + return { + sessionId, + status: response.status ?? null, + closed, + alreadyAbsent, + released: closed || alreadyAbsent, + } +} + +export async function closeOwnedProviderSessions({ endpoint, responses, token, timeoutMs }) { + const sessionIds = ownedProviderSessionIds(responses) + const admitted = (responses ?? []).some( + (response) => response?.type === 'ack' && typeof response.runId === 'string', + ) + if (admitted && sessionIds.length === 0) { + throw new LiveBridgeError( + 'LIVE_PROVIDER_SESSION_BINDING_MISSING', + 'An admitted packed run did not expose its exact provider session for cleanup', + exitCodes.failed, + ) + } + + const results = [] + for (const sessionId of sessionIds) { + const response = await requestJson( + endpoint, + `/v1/sessions/${encodeURIComponent(sessionId)}/close`, + token, + Math.min(timeoutMs, 30_000), + { method: 'POST' }, + ) + results.push(providerSessionReleaseResult(sessionId, response)) + } + const failed = results.filter((result) => result.released !== true) + if (failed.length > 0) { + throw new LiveBridgeError( + 'LIVE_PROVIDER_SESSION_CLEANUP_FAILED', + 'CLI Bridge did not close every provider session owned by the packed proof', + exitCodes.failed, + { failures: failed }, + ) + } + return { + attempted: results.length, + closed: results.filter((result) => result.closed).length, + alreadyAbsent: results.filter((result) => result.alreadyAbsent).length, + released: results.length, + complete: true, + results, + } +} diff --git a/scripts/live-bridge/release-operations.mjs b/scripts/live-bridge/release-operations.mjs index a17ebfba..df9eedfc 100644 --- a/scripts/live-bridge/release-operations.mjs +++ b/scripts/live-bridge/release-operations.mjs @@ -1,9 +1,14 @@ +import { writeFile } from 'node:fs/promises' +import { join } from 'node:path' + import { profileForBridgeTarget } from './config.mjs' -import { exitCodes, livePrompts } from './constants.mjs' +import { exitCodes, liveMarkers, livePrompts } from './constants.mjs' import { LiveBridgeError } from './errors.mjs' import { RpcSession } from './process.mjs' import { classifyPackedStartup, + eventPayload, + exactMarker, interactionFromResponse, requestBase, runEventPayload, @@ -89,7 +94,7 @@ export async function executeCrossRunnerHandoff( const sourceTurn = await runNormalTurn(session, result, sourceTarget, timeoutMs, { operationPrefix: `${operationPrefix}-source`, prompt: livePrompts.handoffSource(sourceTarget.key), - marker: 'LIVE_BRAID_PI_HANDOFF_SOURCE_OK', + marker: liveMarkers.handoffSource(sourceTarget.key), }) const sourceMessage = terminalMessage(sourceTurn.terminal.state, sourceTurn.runId) if (typeof sourceMessage?.id !== 'string') { @@ -103,10 +108,13 @@ export async function executeCrossRunnerHandoff( const sourceProof = assertTargetRunIdentity(sourceTurn.finalRun, sourceTarget) const sourceUsage = assertObservedUsage(sourceTurn.finalRun) const destinationProfile = profileForBridgeTarget(destinationTarget) + const destinationPrompt = livePrompts.handoffDestination(destinationTarget.key) + const destinationMarker = liveMarkers.handoffDestination(destinationTarget.key) const forkParams = { conversationId: result.conversationId, branchId: result.branchId, messageId: sourceMessage.id, + text: destinationPrompt, workspace: false, runner: destinationTarget.definition.backend, model: destinationProfile.model.default, @@ -129,17 +137,22 @@ export async function executeCrossRunnerHandoff( timeoutMs, ) const plan = planResponse.type === 'ack' ? planResponse.result : undefined + const portablePlan = plan?.portableContextPlan if ( planResponse.type === 'error' || plan?.allowed !== true || plan.providerSession !== 'new' || typeof plan.digest !== 'string' || + typeof portablePlan?.digest !== 'string' || + typeof portablePlan.requiresAcceptance !== 'boolean' || typeof plan.destinationBranchId !== 'string' || !Array.isArray(plan.context?.messages) || plan.throughMessageId !== sourceMessage.id || plan.context?.sourceRunId !== sourceTurn.runId || plan.context?.sourceBoundary !== sourceMessage.id || - typeof plan.context?.digest !== 'string' + typeof plan.context?.digest !== 'string' || + portablePlan.source?.source?.runId !== sourceTurn.runId || + portablePlan.source?.source?.messageId !== sourceMessage.id ) { throw new LiveBridgeError( 'LIVE_RELEASE_HANDOFF_PLAN_INVALID', @@ -156,8 +169,15 @@ export async function executeCrossRunnerHandoff( 'execute_fork', forkOperationId, ), - params: { ...forkParams, planDigest: plan.digest }, + params: { + ...forkParams, + planDigest: plan.digest, + ...(portablePlan.requiresAcceptance === true + ? { acceptedDigest: portablePlan.digest } + : {}), + }, } + const executeResponseStartIndex = session.responses.length const executeResponse = await sendOperationRequest( session, result, @@ -190,12 +210,55 @@ export async function executeCrossRunnerHandoff( result.sourceRunId = sourceTurn.runId result.branchId = plan.destinationBranchId applyTargetReceipt(result, config, destinationTarget) - const destinationTurn = await runNormalTurn(session, result, destinationTarget, timeoutMs, { - operationPrefix: `${operationPrefix}-destination`, - prompt: livePrompts.handoffDestination(destinationTarget.key), - marker: 'LIVE_BRAID_CODEX_HANDOFF_OK', - }) - const destinationSessionId = providerSessionId(destinationTurn.finalRun) + const destinationAdmissionResponse = await session.waitFor( + 'cross-runner destination admission', + (response) => { + const payload = eventPayload(response) + return ( + session.responses.indexOf(response) >= executeResponseStartIndex && + response?.event?.kind === 'run.requested' && + payload?.status === 'admitted' && + typeof payload.runId === 'string' && + payload.admission?.runId === payload.runId && + payload.admission?.branchId === plan.destinationBranchId + ) + }, + timeoutMs, + ) + const destinationAdmission = eventPayload(destinationAdmissionResponse) + const destinationRunId = destinationAdmission.runId + const destinationTerminal = await terminalOperationState( + session, + result, + `${operationPrefix}-destination`, + destinationRunId, + timeoutMs, + ) + const destinationRun = runWithAdmissionReceipt( + destinationTerminal.run, + destinationAdmission.admission, + ) + const destinationMessage = terminalMessage( + destinationTerminal.response.state, + destinationRunId, + ) + const destinationMarkerObserved = exactMarker(destinationMessage?.text, destinationMarker) + if ( + destinationRun?.status !== 'completed' || + typeof destinationMessage?.text !== 'string' || + destinationMessage.text.trim() === '' || + !destinationMarkerObserved + ) { + throw new LiveBridgeError( + destinationMarkerObserved ? 'LIVE_FINAL_OUTPUT_MISSING' : 'LIVE_FINAL_OUTPUT_MISMATCH', + destinationMarkerObserved + ? 'The cross-runner destination did not retain a completed assistant message' + : 'The cross-runner destination completed without the expected response marker', + exitCodes.failed, + { run: destinationRun, assistant: destinationMessage }, + ) + } + const destinationSessionId = providerSessionId(destinationRun) if ( typeof destinationSessionId !== 'string' || destinationSessionId.length === 0 || @@ -205,20 +268,20 @@ export async function executeCrossRunnerHandoff( 'LIVE_RELEASE_DESTINATION_RECEIPT_INVALID', 'The Codex destination run did not prove a distinct runner and provider session', exitCodes.failed, - { run: destinationTurn.finalRun, sourceSessionId }, + { run: destinationRun, sourceSessionId }, ) } - const destinationProof = assertTargetRunIdentity(destinationTurn.finalRun, destinationTarget) - const destinationUsage = assertObservedUsage(destinationTurn.finalRun) + const destinationProof = assertTargetRunIdentity(destinationRun, destinationTarget) + const destinationUsage = assertObservedUsage(destinationRun) const transfer = assertContextTransfer({ sourceRunId: sourceTurn.runId, sourceMessageId: sourceMessage.id, plan, - destinationRun: destinationTurn.finalRun, + destinationRun, }) return { - runId: destinationTurn.runId, - runIds: [sourceTurn.runId, destinationTurn.runId], + runId: destinationRunId, + runIds: [sourceTurn.runId, destinationRunId], targetProof: destinationProof, evidence: { sourceRunner: sourceProof.harness, @@ -226,11 +289,11 @@ export async function executeCrossRunnerHandoff( sourceProvider: sourceProof.provider, destinationProvider: destinationProof.provider, sourceRun: evidenceValue(sourceRun), - destinationRun: evidenceValue(destinationTurn.finalRun), + destinationRun: evidenceValue(destinationRun), sourceUsage, destinationUsage, sourceRunId: sourceTurn.runId, - destinationRunId: destinationTurn.runId, + destinationRunId, sourceProviderSessionId: sourceSessionId, destinationProviderSessionId: destinationSessionId, sourceMessageId: sourceMessage.id, @@ -239,9 +302,17 @@ export async function executeCrossRunnerHandoff( planDigest: plan.digest, contextPlanDigest: plan.context.digest, providerSession: plan.providerSession, + acceptance: + portablePlan.requiresAcceptance === true + ? { required: true, acceptedDigest: portablePlan.digest } + : { required: false }, transfer: evidenceValue(transfer), plan: evidenceValue(plan), execution: evidenceValue(branch), + destinationAdmission: evidenceValue(destinationAdmissionResponse), + destinationPrompt, + destinationMarker, + destinationMarkerObserved, }, } }, @@ -278,8 +349,13 @@ export async function executeInteractiveProtocol( timeoutMs, operation, operationPrefix, - execute: async ({ result, getSession }) => { + execute: async ({ result, config, getSession }) => { const session = getSession() + await writeFile( + join(config.workspace, `interaction-proof-${target.key}.txt`), + `${liveMarkers.interactive(target.key)}\n`, + { mode: 0o600 }, + ) const started = await admitOperationTurn( session, result, @@ -570,6 +646,23 @@ export async function executeRestartReconciliation( timeoutMs, ) const streamedRun = runFromState(streamedState.state, started.runId) + if (!['running', 'waiting', 'streaming'].includes(streamedRun?.status)) { + throw new LiveBridgeError( + 'LIVE_RELEASE_RESTART_STREAM_ENDED', + 'The selected run reached a terminal state before Braid could disconnect', + exitCodes.failed, + { + run: streamedRun, + progress: { + kind: activeStream.event.kind, + sequence: activeStream.sequence, + revision: activeStream.revision, + providerSequence: activeStreamPayload.source.providerSequence, + cursor: activeStreamPayload.source.cursor ?? null, + }, + }, + ) + } const activeStateResponseIndex = getSession().responses.indexOf(activeState) const activeStreamResponseIndex = getSession().responses.indexOf(activeStream) const activeModel = { @@ -597,8 +690,28 @@ export async function executeRestartReconciliation( cursor: activeStreamPayload.source.cursor ?? null, }, } - const savedCursor = streamedRun?.lastCursor - const savedProviderSequence = streamedRun?.lastProviderSequence + const savedCursor = streamedRun?.cursor + const savedCursorCommittedSequence = streamedRun?.cursorCommittedSequence + const savedCursorResponse = getSession().responses.findLast((response) => { + const payload = runEventPayload(response, started.runId) + return ( + response.type === 'event' && + response.sequence === savedCursorCommittedSequence && + payload?.source?.cursor === savedCursor && + Number.isSafeInteger(payload.source.providerSequence) + ) + }) + const savedCursorPayload = runEventPayload(savedCursorResponse, started.runId) + const savedProviderSequence = savedCursorPayload?.source?.providerSequence + const savedCursorBoundary = { + runId: started.runId, + kind: savedCursorResponse?.event?.kind, + responseIndex: getSession().responses.indexOf(savedCursorResponse), + sequence: savedCursorResponse?.sequence, + revision: savedCursorResponse?.revision, + cursor: savedCursorPayload?.source?.cursor, + providerSequence: savedProviderSequence, + } const detachRequest = operationRequest(result, operationPrefix, 'detach', 'detach', { runId: started.runId, }) @@ -702,28 +815,85 @@ export async function executeRestartReconciliation( ) const reconnectBoundaryResponseIndex = restarted.responses.indexOf(reconnectBoundaryResponse) const reconnectBoundaryPayload = runEventPayload(reconnectBoundaryResponse, started.runId) - const replayEvent = await restarted.waitFor( - 'restart replayed post-cursor event', - (response) => { - const payload = runEventPayload(response, started.runId) - return ( - restarted.responses.indexOf(response) > reconnectBoundaryResponseIndex && - payload !== undefined && - response.event?.kind !== 'run.reconnecting' && - Number.isSafeInteger(response.sequence) && - response.sequence > reconnectBoundaryResponse.sequence && - Number.isSafeInteger(response.revision) && - response.revision > reconnectBoundaryResponse.revision && - Number.isSafeInteger(payload.source?.providerSequence) && - Number.isSafeInteger(savedProviderSequence) && - savedProviderSequence > 0 && - payload.source.providerSequence === savedProviderSequence + 1 && - response.sequence <= reconnectResponse.revision && - response.revision <= reconnectResponse.revision - ) - }, - timeoutMs, - ) + let replayEvent + try { + replayEvent = await restarted.waitFor( + 'restart replayed post-cursor event', + (response) => { + const payload = runEventPayload(response, started.runId) + return ( + restarted.responses.indexOf(response) > reconnectBoundaryResponseIndex && + payload !== undefined && + response.event?.kind !== 'run.reconnecting' && + Number.isSafeInteger(response.sequence) && + response.sequence > reconnectBoundaryResponse.sequence && + Number.isSafeInteger(response.revision) && + response.revision > reconnectBoundaryResponse.revision && + Number.isSafeInteger(payload.source?.providerSequence) && + Number.isSafeInteger(savedProviderSequence) && + savedProviderSequence > 0 && + payload.source.providerSequence > savedProviderSequence && + response.sequence <= reconnectResponse.revision && + response.revision <= reconnectResponse.revision + ) + }, + timeoutMs, + ) + } catch (error) { + const postReconnectResponses = restarted.responses + .slice(responseCountBeforeReconnect) + .map((response, responseOffset) => { + const payload = runEventPayload(response, started.runId) + return { + responseIndex: responseCountBeforeReconnect + responseOffset, + type: response.type, + ...(response.requestId === undefined ? {} : { requestId: response.requestId }), + ...(response.sequence === undefined ? {} : { sequence: response.sequence }), + ...(response.revision === undefined ? {} : { revision: response.revision }), + ...(response.event?.kind === undefined ? {} : { kind: response.event.kind }), + ...(payload === undefined + ? {} + : { + run: { + runId: payload.runId, + ...(payload.status === undefined ? {} : { status: payload.status }), + ...(payload.cursor === undefined ? {} : { cursor: payload.cursor }), + ...(payload.source?.providerSequence === undefined + ? {} + : { providerSequence: payload.source.providerSequence }), + ...(payload.source?.cursor === undefined + ? {} + : { providerCursor: payload.source.cursor }), + }, + }), + ...(response.type !== 'error' + ? {} + : { error: { code: response.code, message: response.message } }), + } + }) + const postReconnect = { + count: postReconnectResponses.length, + first: postReconnectResponses.slice(0, 8), + last: postReconnectResponses.slice(-8), + } + throw new LiveBridgeError( + 'LIVE_RELEASE_REPLAY_TIMEOUT', + 'The restart operation did not retain a provider event after its saved cursor', + exitCodes.failed, + { + cause: + error instanceof LiveBridgeError + ? { code: error.code, message: error.message, details: error.details } + : { message: error instanceof Error ? error.message : String(error) }, + savedCursor, + savedProviderSequence, + reopenedRun, + reconnectResponse, + reconnectBoundary: reconnectBoundaryResponse, + postReconnect, + }, + ) + } const replayPayload = runEventPayload(replayEvent, started.runId) const terminal = await terminalOperationState( restarted, @@ -757,6 +927,7 @@ export async function executeRestartReconciliation( newProcess, forcedProcess, activeModel, + savedCursorBoundary, reopenedRevision: reopenedState.revision, reconnectRequest, reconnectResponse, @@ -798,6 +969,7 @@ export async function executeRestartReconciliation( detachedState: evidenceValue(detachedState), savedCursor, savedProviderSequence, + savedCursorBoundary: evidenceValue(savedCursorBoundary), reopenedState: evidenceValue(reopenedState), detach: evidenceValue(detachResponse), reconnect: evidenceValue(reconnectResponse), diff --git a/scripts/live-bridge/release-proof-validation.mjs b/scripts/live-bridge/release-proof-validation.mjs index ea2c1aa1..924b4cbe 100644 --- a/scripts/live-bridge/release-proof-validation.mjs +++ b/scripts/live-bridge/release-proof-validation.mjs @@ -113,7 +113,12 @@ export function assertTargetRunIdentity(run, target) { receipt, materialization, }) - if (text(run.model)) same(run.model, expected.model, 'run model', { run, expected }) + if (text(run.model) && run.model !== target.modelId && run.model !== expected.model) + fail( + 'LIVE_RELEASE_TARGET_IDENTITY_INVALID', + 'run model does not match the selected route or provider model', + { run, target, expected }, + ) return { key: target.key, @@ -128,17 +133,24 @@ export function assertTargetRunIdentity(run, target) { } export function assertObservedUsage(run) { - if (run?.status !== 'completed' || run.complete !== true) + if (run?.status !== 'completed' || run.completeness !== 'complete') fail('LIVE_RELEASE_USAGE_MISSING', 'The release run did not complete', { run }) if ( - run.tokensKnown === false || + run.tokensKnown !== true || + run.tokenStatus !== 'complete' || !Number.isFinite(run.inputTokens) || !Number.isFinite(run.outputTokens) ) fail('LIVE_RELEASE_USAGE_MISSING', 'The release run omitted known token usage', { run }) - if (!Number.isInteger(run.llmCalls) || run.llmCalls < 1) - fail('LIVE_RELEASE_USAGE_MISSING', 'The release run omitted observed model-call usage', { run }) - return { inputTokens: run.inputTokens, outputTokens: run.outputTokens, llmCalls: run.llmCalls } + if (run.inputTokens + run.outputTokens < 1) + fail('LIVE_RELEASE_USAGE_MISSING', 'The release run reported empty token usage', { run }) + if (run.llmCalls !== undefined && (!Number.isInteger(run.llmCalls) || run.llmCalls < 1)) + fail('LIVE_RELEASE_USAGE_MISSING', 'The release run reported invalid model-call usage', { run }) + return { + inputTokens: run.inputTokens, + outputTokens: run.outputTokens, + ...(run.llmCalls === undefined ? {} : { llmCalls: run.llmCalls }), + } } export function assertRetainedInteraction( @@ -193,8 +205,19 @@ export function assertRetainedInteraction( export function assertContextTransfer({ sourceRunId, sourceMessageId, plan, destinationRun }) { const context = plan?.context + const portablePlan = plan?.portableContextPlan + const portableSource = portablePlan?.source?.source + const portableContext = portablePlan?.context const transfer = destinationRun?.receipt?.contextTransfer - if (!text(sourceRunId) || !text(sourceMessageId) || !context || !transfer) + if ( + !text(sourceRunId) || + !text(sourceMessageId) || + !context || + !portablePlan || + !portableSource || + !portableContext || + !transfer + ) fail( 'LIVE_RELEASE_CONTEXT_TRANSFER_MISSING', 'The handoff omitted durable context transfer evidence', @@ -206,13 +229,37 @@ export function assertContextTransfer({ sourceRunId, sourceMessageId, plan, dest context, sourceMessageId, }) - if (!text(context.digest) || !text(plan.digest)) + same(portableSource.runId, sourceRunId, 'portable source run', { + portableSource, + sourceRunId, + }) + same(portableSource.messageId, sourceMessageId, 'portable source boundary', { + portableSource, + sourceMessageId, + }) + same(portableContext.source?.runId, sourceRunId, 'transferred context source run', { + portableContext, + sourceRunId, + }) + same(portableContext.source?.messageId, sourceMessageId, 'transferred context source boundary', { + portableContext, + sourceMessageId, + }) + if ( + !text(context.digest) || + !text(plan.digest) || + !text(portablePlan.digest) || + !text(portableContext.digest) + ) fail( 'LIVE_RELEASE_CONTEXT_TRANSFER_INVALID', 'The handoff omitted a context or fork-plan digest', { plan }, ) - same(transfer.planDigest, context.digest, 'destination context digest', { transfer, context }) + same(transfer.planDigest, portablePlan.digest, 'destination plan digest', { + transfer, + portablePlan, + }) same(transfer.sourceRunId, sourceRunId, 'destination source run', { transfer, sourceRunId }) same(transfer.destinationRunId, destinationRun.id, 'destination run', { transfer, @@ -220,9 +267,9 @@ export function assertContextTransfer({ sourceRunId, sourceMessageId, plan, dest }) same( destinationRun.receipt.requested?.contextPlanDigest, - context.digest, - 'destination requested context digest', - { destinationRun, context }, + portablePlan.digest, + 'destination requested plan digest', + { destinationRun, portablePlan }, ) if (text(transfer.sourceBoundary)) same(transfer.sourceBoundary, sourceMessageId, 'destination source boundary', { @@ -232,8 +279,9 @@ export function assertContextTransfer({ sourceRunId, sourceMessageId, plan, dest return { sourceRunId, sourceMessageId, - contextDigest: context.digest, - planDigest: plan.digest, + contextDigest: portableContext.digest, + planDigest: portablePlan.digest, + forkPlanDigest: plan.digest, transfer, } } @@ -328,15 +376,41 @@ function assertRecoveryIdentity(before, after, label) { }) } -function assertSavedCursor(run, cursor, providerSequence, label) { - if (run?.lastCursor !== cursor || run?.lastProviderSequence !== providerSequence) +function assertSavedCursor(run, cursor, committedSequence, label) { + if (run?.cursor !== cursor || run?.cursorCommittedSequence !== committedSequence) fail( 'LIVE_RELEASE_RESTART_CURSOR_CHANGED', `${label} did not retain the saved provider cursor`, - { cursor, providerSequence, run }, + { cursor, committedSequence, run }, ) } +function assertSavedCursorBoundary(boundary, runId, cursor, providerSequence) { + if ( + boundary?.runId !== runId || + typeof boundary.kind !== 'string' || + boundary.kind.length === 0 || + !nonNegativeInteger(boundary.responseIndex) || + !positiveInteger(boundary.sequence) || + !positiveInteger(boundary.revision) || + boundary.cursor !== cursor || + boundary.providerSequence !== providerSequence + ) + fail( + 'LIVE_RELEASE_RESTART_CURSOR_BOUNDARY_MISSING', + 'The restart proof did not bind its saved cursor to a durable provider event', + { boundary, runId, cursor, providerSequence }, + ) + return { + kind: boundary.kind, + responseIndex: boundary.responseIndex, + sequence: boundary.sequence, + revision: boundary.revision, + cursor: boundary.cursor, + providerSequence: boundary.providerSequence, + } +} + function assertForcedRestartProcess({ oldProcess, newProcess, forcedProcess }) { const oldPid = oldProcess?.pid const newPid = newProcess?.pid @@ -530,11 +604,12 @@ function assertReconnectBoundary({ 'The restart proof did not retain the durable reconnect boundary', { reconnectBoundary, reconnectResponse }, ) - const provider = replayEvent?.event?.provider + const provider = replayEvent?.event?.source const nextProviderSequence = savedProviderSequence + 1 if ( replayEvent?.event?.runId !== runId || - replayEvent.kind !== replayEvent.event.kind || + typeof replayEvent.kind !== 'string' || + replayEvent.kind.length === 0 || replayEvent.kind === 'run.reconnecting' || !nonNegativeInteger(replayEvent.responseIndex) || replayEvent.responseIndex <= reconnectBoundary.responseIndex || @@ -589,19 +664,23 @@ function assertTerminalUniqueness(terminalReceiptsValue, finalState, runId, term ) const receipt = terminalReceiptsValue[0] const finalRun = finalState?.state?.runs?.find((run) => run?.id === runId) + const receiptCursor = receipt.cursor !== null && text(receipt.cursor) ? receipt.cursor : undefined + const durableCursor = text(finalRun?.cursor) ? finalRun.cursor : undefined if ( receipt.runId !== runId || (terminalSession !== undefined && receipt.session !== terminalSession) || receipt.status !== 'completed' || !text(receipt.providerEventId) || !positiveInteger(receipt.providerSequence) || - !text(receipt.cursor) || + (receipt.cursor !== null && receiptCursor === undefined) || + durableCursor === undefined || + (receiptCursor !== undefined && receiptCursor !== durableCursor) || !positiveInteger(receipt.sequence) || !positiveInteger(receipt.revision) || !positiveInteger(finalState?.revision) || !positiveInteger(finalState?.state?.revision) || finalRun?.status !== 'completed' || - finalRun.complete !== true || + finalRun.completeness !== 'complete' || receipt.sequence > finalState.state.revision || receipt.revision > finalState.state.revision ) @@ -614,6 +693,7 @@ function assertTerminalUniqueness(terminalReceiptsValue, finalState, runId, term deliveryCount: terminalReceiptsValue.length, receipt, durableRevision: finalState.state.revision, + durableCursor, } } @@ -629,6 +709,7 @@ export function assertRetainedRestartProof({ newProcess, forcedProcess, activeModel, + savedCursorBoundary, reopenedRevision, reconnectRequest, reconnectResponse, @@ -665,6 +746,12 @@ export function assertRetainedRestartProof({ { savedCursor, savedProviderSequence, beforeDetach }, ) const activeEvidence = assertActiveModelTiming(activeModel, runId) + const cursorEvidence = assertSavedCursorBoundary( + savedCursorBoundary, + runId, + savedCursor, + savedProviderSequence, + ) if (beforeDetach?.status === undefined || !ACTIVE_RUN_STATUSES.has(beforeDetach.status)) fail('LIVE_RELEASE_RESTART_NOT_ACTIVE', 'The restart proof did not detach an active run', { beforeDetach, @@ -685,9 +772,9 @@ export function assertRetainedRestartProof({ assertRecoveryIdentity(beforeDetach, detached, 'detach') assertRecoveryIdentity(beforeDetach, reopened, 'restart') assertRecoveryIdentity(beforeDetach, final, 'reconnect') - assertSavedCursor(beforeDetach, savedCursor, savedProviderSequence, 'active stream') - assertSavedCursor(detached, savedCursor, savedProviderSequence, 'detached state') - assertSavedCursor(reopened, savedCursor, savedProviderSequence, 'reopened state') + assertSavedCursor(beforeDetach, savedCursor, cursorEvidence.sequence, 'active stream') + assertSavedCursor(detached, savedCursor, cursorEvidence.sequence, 'detached state') + assertSavedCursor(reopened, savedCursor, cursorEvidence.sequence, 'reopened state') const reconnectEvidence = assertReconnectBoundary({ runId, savedCursor, @@ -704,12 +791,13 @@ export function assertRetainedRestartProof({ 'The restart proof did not replay a provider event after the saved cursor', { savedCursor, savedProviderSequence, replayEvent }, ) - if (final?.status !== 'completed' || final.complete !== true) + if (final?.status !== 'completed' || final.completeness !== 'complete') fail( 'LIVE_RELEASE_RESTART_NOT_COMPLETED', 'The retained run did not complete after reconnect', { final, + lastError: finalState?.state?.lastError ?? null, }, ) const terminalEvidence = assertTerminalUniqueness( @@ -726,6 +814,7 @@ export function assertRetainedRestartProof({ controlRef: final.controlRef, process: processEvidence, activeModel: activeEvidence, + savedCursorBoundary: cursorEvidence, reconnect: reconnectEvidence, terminal: terminalEvidence, } diff --git a/scripts/live-bridge/release-proof-validation.test.mjs b/scripts/live-bridge/release-proof-validation.test.mjs index 09b71817..072590aa 100644 --- a/scripts/live-bridge/release-proof-validation.test.mjs +++ b/scripts/live-bridge/release-proof-validation.test.mjs @@ -13,6 +13,10 @@ import { retainedCancellationAdvertised, runWithAdmissionReceipt, } from './protocol.mjs' +import { + ownedProviderSessionIds, + providerSessionReleaseResult, +} from './provider-session-cleanup.mjs' import { evidenceValue, secretValues, @@ -28,7 +32,8 @@ import { assertUniqueRunIds, terminalReceipts, } from './release-proof-validation.mjs' -import { assertTargetSemantics, verifyInteraction } from './target-actions.mjs' +import { selectRestartTarget } from './release-proofs.mjs' +import { assertTargetSemantics, cancelFailedTarget, verifyInteraction } from './target-actions.mjs' import { operationRequest, operationState } from './target-flow.mjs' const target = { @@ -37,6 +42,83 @@ const target = { definition: { backend: 'pi' }, } +test('restart proof selects the target with measured incremental delivery', () => { + const buffered = { + key: 'buffered', + modelId: 'opencode/provider/buffered', + definition: { backend: 'opencode' }, + } + const incremental = { + key: 'incremental', + modelId: 'pi/provider/incremental', + definition: { backend: 'pi' }, + } + const records = [ + { + status: 'passed', + targetProof: { key: buffered.key, route: buffered.modelId }, + normal: { run: { cursorCommittedSequence: 12 } }, + }, + { + status: 'passed', + targetProof: { key: incremental.key, route: incremental.modelId }, + normal: { run: { cursorCommittedSequence: 48 } }, + }, + ] + + assert.equal(selectRestartTarget([buffered, incremental], records), incremental) + assert.equal(selectRestartTarget([buffered, incremental], []), buffered) + assert.equal(selectRestartTarget([], records), undefined) +}) + +test('provider cleanup selects only exact CLI Bridge session bindings', () => { + const responses = [ + { + type: 'ack', + admission: { provider: 'cli-bridge', providerSessionId: 'session-admission' }, + }, + { + type: 'state', + state: { + runs: [ + { + provider: 'cli-bridge', + providerSessionId: 'session-admission', + controlRef: { provider: 'cli-bridge', sessionId: 'session-control' }, + }, + { provider: 'another-provider', providerSessionId: 'session-foreign' }, + ], + }, + }, + ] + + assert.deepEqual(ownedProviderSessionIds(responses), ['session-admission', 'session-control']) +}) + +test('provider cleanup accepts closed and already absent sessions only', () => { + assert.deepEqual( + providerSessionReleaseResult('session-closed', { + status: 200, + body: { closed: true }, + }), + { + sessionId: 'session-closed', + status: 200, + closed: true, + alreadyAbsent: false, + released: true, + }, + ) + assert.deepEqual(providerSessionReleaseResult('session-absent', { status: 404 }), { + sessionId: 'session-absent', + status: 404, + closed: false, + alreadyAbsent: true, + released: true, + }) + assert.equal(providerSessionReleaseResult('session-conflict', { status: 409 }).released, false) +}) + test('retained cancellation proof reads the environment capability contract', () => { assert.equal(retainedCancellationAdvertised({}), false) assert.equal( @@ -145,11 +227,13 @@ function run(overrides = {}) { return { id: 'run-1', status: 'completed', - complete: true, + completeness: 'complete', inputTokens: 2, outputTokens: 3, + tokensKnown: true, + tokenStatus: 'complete', llmCalls: 1, - model: 'model', + model: 'pi/provider/model', receipt: { runId: 'run-1', profileDigest: 'profile-digest', @@ -173,6 +257,11 @@ function run(overrides = {}) { test('identity validation rejects configured-label false positives', () => { assert.doesNotThrow(() => assertTargetRunIdentity(run(), target)) + assert.doesNotThrow(() => assertTargetRunIdentity(run({ model: 'model' }), target)) + assert.throws( + () => assertTargetRunIdentity(run({ model: 'other' }), target), + /selected route or provider model/u, + ) for (const broken of [ { requested: { runner: 'codex' } }, { requested: { model: 'other' } }, @@ -216,7 +305,7 @@ test('identity validation retains nested and runner-only model routes', () => { definition: { backend: 'pi' }, } const nestedRun = run({ - model: 'openai/gpt-5.6-luna', + model: nestedTarget.modelId, receipt: { ...run().receipt, requested: { @@ -243,7 +332,7 @@ test('identity validation retains nested and runner-only model routes', () => { definition: { backend: 'codex' }, } const defaultRun = run({ - model: 'default', + model: defaultTarget.modelId, receipt: { ...run().receipt, requested: { @@ -265,6 +354,10 @@ test('identity validation retains nested and runner-only model routes', () => { test('usage and cancellation unavailable states cannot pass strict conformance', () => { assert.throws(() => assertObservedUsage(run({ tokensKnown: false })), /known token usage/u) assert.throws(() => assertObservedUsage(run({ llmCalls: 0 })), /model-call usage/u) + assert.deepEqual(assertObservedUsage(run({ llmCalls: undefined })), { + inputTokens: 2, + outputTokens: 3, + }) const cancellationUnavailable = { cancel: { status: 'reported-unavailable', advertised: false }, interaction: { status: 'reported-unavailable', advertised: false }, @@ -329,8 +422,8 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal const identity = { id: 'run-1', providerSessionId: 'session-1', - lastCursor: '1:0', - lastProviderSequence: 1, + cursor: '1:0', + cursorCommittedSequence: 11, controlRef: { runId: 'provider-run-1', provider: 'cli-bridge', @@ -354,7 +447,7 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal beforeDetach: { ...identity, status: 'streaming' }, detached: { ...identity, status: 'detached' }, reopened: { ...identity, status: 'detached' }, - final: { ...identity, status: 'completed', complete: true }, + final: { ...identity, status: 'completed', completeness: 'complete' }, oldProcess, newProcess, forcedProcess: { @@ -396,6 +489,15 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal cursor: '2:0', }, }, + savedCursorBoundary: { + runId: 'run-1', + kind: 'run.text.delta', + responseIndex: 10, + sequence: 11, + revision: 11, + cursor: '1:0', + providerSequence: 1, + }, reopenedRevision: 12, reconnectRequest, reconnectResponse: { @@ -419,9 +521,8 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal sequence: 14, revision: 14, event: { - kind: 'run.text.delta', runId: 'run-1', - provider: { providerSequence: 2, cursor: '2:0' }, + source: { providerSequence: 2, cursor: '2:0' }, }, }, terminalReceipts: [ @@ -441,12 +542,19 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal revision: 16, state: { revision: 16, - runs: [{ id: 'run-1', status: 'completed', complete: true }], + runs: [{ id: 'run-1', status: 'completed', completeness: 'complete', cursor: '3:0' }], }, }, terminalSession: newProcess.instanceId, } assert.equal(assertRetainedRestartProof(proof).terminal.deliveryCount, 1) + assert.equal( + assertRetainedRestartProof({ + ...proof, + terminalReceipts: [{ ...proof.terminalReceipts[0], cursor: null }], + }).terminal.durableCursor, + '3:0', + ) const adversarial = [ { @@ -522,6 +630,10 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal replayEvent: { ...proof.replayEvent, responseIndex: proof.reconnectBoundary.responseIndex }, }, }, + { + name: 'replay without a public kind', + proof: { ...proof, replayEvent: { ...proof.replayEvent, kind: '' } }, + }, { name: 'reconnect boundary uses a different saved cursor', proof: { @@ -537,7 +649,7 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal ...proof.replayEvent, event: { ...proof.replayEvent.event, - provider: { providerSequence: 99, cursor: '99:0' }, + source: { providerSequence: 99, cursor: '99:0' }, }, }, }, @@ -563,6 +675,13 @@ test('restart proof rejects process, timing, reconnect, replay, and terminal fal name: 'terminal not durable', proof: { ...proof, finalState: { revision: 14, state: { revision: 14 } } }, }, + { + name: 'terminal cursor conflicts with durable run', + proof: { + ...proof, + terminalReceipts: [{ ...proof.terminalReceipts[0], cursor: 'other-cursor' }], + }, + }, { name: 'terminal completion missing', proof: { ...proof, terminalReceipts: [] }, @@ -740,15 +859,26 @@ test('context transfer binds boundary, source run, digest, and destination recei digest: 'context-digest', messages: [{ id: 'message-1' }], }, + portableContextPlan: { + digest: 'portable-plan-digest', + source: { + source: { runId: 'source-run', messageId: 'message-1' }, + }, + context: { + source: { runId: 'source-run', messageId: 'message-1' }, + digest: 'portable-context-digest', + }, + requiresAcceptance: true, + }, } const destination = run({ id: 'destination-run', receipt: { ...run().receipt, runId: 'destination-run', - requested: { ...run().receipt.requested, contextPlanDigest: 'context-digest' }, + requested: { ...run().receipt.requested, contextPlanDigest: 'portable-plan-digest' }, contextTransfer: { - planDigest: 'context-digest', + planDigest: 'portable-plan-digest', sourceRunId: 'source-run', destinationRunId: 'destination-run', acceptedAt: '2026-08-10T00:00:00.000Z', @@ -766,6 +896,15 @@ test('context transfer binds boundary, source run, digest, and destination recei for (const broken of [ { plan: { ...plan, throughMessageId: 'other' } }, { plan: { ...plan, context: { ...plan.context, sourceRunId: 'other' } } }, + { + plan: { + ...plan, + portableContextPlan: { + ...plan.portableContextPlan, + source: { source: { runId: 'other', messageId: 'message-1' } }, + }, + }, + }, { destinationRun: run({ id: 'destination-run', @@ -781,7 +920,7 @@ test('context transfer binds boundary, source run, digest, and destination recei plan: broken.plan ?? plan, destinationRun: broken.destinationRun ?? destination, }), - /message|context|boundary/u, + /message|context|boundary|source/u, ) } }) @@ -801,6 +940,43 @@ test('release operations reject reused run IDs and redact bridge bearers', () => assert.equal(withoutBridgeSecrets({ BRIDGE_BEARER: secret }).BRIDGE_BEARER, undefined) }) +test('failed release operations cancel active work and await RPC exit', async () => { + const sent = [] + const acknowledgement = { + type: 'ack', + requestId: 'interactive-failure-shutdown-pi-test', + command: 'shutdown', + revision: 7, + } + const session = { + send(request) { + sent.push(request) + }, + async waitFor(label, predicate, timeoutMs) { + assert.equal(label, 'failed operation cancellation acknowledgement') + assert.equal(timeoutMs, 2_000) + assert.equal(predicate(acknowledgement), true) + return acknowledgement + }, + async waitForExit(label, timeoutMs) { + assert.equal(label, 'failed operation cancellation shutdown') + assert.equal(timeoutMs, 2_000) + return { code: 0, signal: null } + }, + } + const result = { targetKey: 'pi-test', requests: [] } + + const receipt = await cancelFailedTarget(session, result, { + operationPrefix: 'interactive', + timeoutMs: 2_000, + }) + + assert.deepEqual(sent, result.requests) + assert.deepEqual(sent[0]?.params, { mode: 'cancel' }) + assert.equal(receipt.response.command, 'shutdown') + assert.deepEqual(receipt.exit, { code: 0, signal: null }) +}) + test('started CLI Bridge keeps local subscription settings but strips Braid live credentials', () => { const environment = { PATH: '/usr/bin', diff --git a/scripts/live-bridge/release-proofs.mjs b/scripts/live-bridge/release-proofs.mjs index 2abfb9bd..49a33c9a 100644 --- a/scripts/live-bridge/release-proofs.mjs +++ b/scripts/live-bridge/release-proofs.mjs @@ -34,6 +34,28 @@ function interactionTarget(targets, capabilitiesByBackend) { ) } +function observedCommittedSequence(target, targetRecords) { + const record = (targetRecords ?? []).find( + (candidate) => + candidate?.status === 'passed' && + candidate?.targetProof?.key === target?.key && + candidate?.targetProof?.route === target?.modelId, + ) + const sequence = record?.normal?.run?.cursorCommittedSequence + return Number.isSafeInteger(sequence) && sequence > 0 ? sequence : 0 +} + +/** Select the runner that has already proved the richest incremental delivery. */ +export function selectRestartTarget(targets, targetRecords) { + return (targets ?? []).reduce((selected, candidate) => { + if (selected === undefined) return candidate + return observedCommittedSequence(candidate, targetRecords) > + observedCommittedSequence(selected, targetRecords) + ? candidate + : selected + }, undefined) +} + function proofTarget(target, operationResult) { const proof = operationResult?.targetProof if ( @@ -79,7 +101,13 @@ function passedProof(requirementId, operation, target, operationResult, targetRe 'LIVE_RELEASE_OPERATION_EVIDENCE_MISSING', `${operation} did not return a passed packed operation receipt`, exitCodes.failed, - { requirementId, operation }, + { + requirementId, + operation, + status: operationResult?.status, + error: operationResult?.error, + receipt: operationResult?.operationReceipt, + }, ) } const descriptor = proofTarget(target, operationResult) @@ -151,6 +179,31 @@ function operationFailure(requirementId, operation, target, error) { } } +function operationResultFailure(requirementId, operation, target, result) { + const missing = errorEvidence( + new LiveBridgeError( + 'LIVE_RELEASE_OPERATION_EVIDENCE_MISSING', + `${operation} returned no failure evidence`, + exitCodes.failed, + { requirementId, operation }, + ), + ) + return evidenceValue({ + requirementId, + operation, + target: { + key: target.key, + modelId: target.modelId, + harness: target.definition.backend, + }, + status: result?.status === 'unavailable' ? 'unavailable' : 'failed', + error: result?.error ?? missing, + ...(typeof result?.stderr === 'string' && result.stderr.length > 0 + ? { stderr: result.stderr } + : {}), + }) +} + function missingTarget(requirementId, operation, harness, targets) { return operationFailure( requirementId, @@ -222,6 +275,12 @@ export async function executeReleaseProofs({ } try { const operationResult = await action(target) + if (operationResult?.status !== 'passed') { + const failure = operationResultFailure(requirementId, operation, target, operationResult) + releaseOperations.push(failure) + failures.push(failure) + return + } const proof = passedProof( requirementId, operation, @@ -308,7 +367,7 @@ export async function executeReleaseProofs({ ), ) - const restartTarget = targets[0] + const restartTarget = selectRestartTarget(targets, targetRecords) await execute(REQUIREMENTS.restart, liveReleaseProofOperations.restart, restartTarget, (target) => executeRestartReconciliation( binary, diff --git a/scripts/live-bridge/target-actions.mjs b/scripts/live-bridge/target-actions.mjs index bd28d9ee..4778a088 100644 --- a/scripts/live-bridge/target-actions.mjs +++ b/scripts/live-bridge/target-actions.mjs @@ -1,4 +1,4 @@ -import { exitCodes, livePrompts } from './constants.mjs' +import { exitCodes, liveMarkers, livePrompts } from './constants.mjs' import { LiveBridgeError } from './errors.mjs' import { sleep } from './process.mjs' import { @@ -85,7 +85,7 @@ export async function runNormalTurn( { operationPrefix = 'live', prompt, marker } = {}, ) { const normalPrompt = prompt ?? livePrompts.normal(target.key) - const expectedMarker = marker ?? `LIVE_BRAID_${target.key.toUpperCase().replaceAll('.', '_')}_OK` + const expectedMarker = marker ?? liveMarkers.normal(target.key) const send = { ...requestBase( requestIdFor(operationPrefix, 'send', target.key), @@ -148,6 +148,7 @@ export async function runNormalTurn( marker: expectedMarker, markerObserved, prompt: normalPrompt, + lastError: terminal.state?.lastError ?? null, } if ( finalRun?.status !== 'completed' || @@ -155,13 +156,20 @@ export async function runNormalTurn( finalMessage.text.trim() === '' || !markerObserved ) { + const providerFailed = finalRun?.status === 'failed' throw new LiveBridgeError( - markerObserved ? 'LIVE_FINAL_OUTPUT_MISSING' : 'LIVE_FINAL_OUTPUT_MISMATCH', - markerObserved - ? `Packed Braid ${target.definition.label} turn did not produce a completed assistant message` - : `Packed Braid ${target.definition.label} turn completed without the expected response marker`, + providerFailed + ? 'LIVE_PROVIDER_RUN_FAILED' + : markerObserved + ? 'LIVE_FINAL_OUTPUT_MISSING' + : 'LIVE_FINAL_OUTPUT_MISMATCH', + providerFailed + ? `Packed Braid ${target.definition.label} reported a failed provider run` + : markerObserved + ? `Packed Braid ${target.definition.label} turn did not produce a completed assistant message` + : `Packed Braid ${target.definition.label} turn completed without the expected response marker`, exitCodes.failed, - { run: finalRun, assistant: finalMessage }, + { run: finalRun, assistant: finalMessage, lastError: terminal.state?.lastError ?? null }, ) } return { finalRun, runId, terminal } @@ -405,3 +413,31 @@ export async function finishTarget(session, result, { operationPrefix = 'live' } ), ) } + +export async function cancelFailedTarget(session, result, { operationPrefix, timeoutMs = 30_000 }) { + const shutdown = { + ...requestBase( + requestIdFor(operationPrefix, 'failure-shutdown', result.targetKey), + 'shutdown', + operationIdFor(operationPrefix, 'failure-shutdown', result.targetKey), + ), + params: { mode: 'cancel' }, + } + result.requests.push(evidenceValue(shutdown)) + session.send(shutdown) + const response = await session.waitFor( + 'failed operation cancellation acknowledgement', + responseForRequest(shutdown.requestId), + timeoutMs, + ) + if (response.type !== 'ack') { + throw new LiveBridgeError( + 'LIVE_RELEASE_FAILURE_CLEANUP_REJECTED', + 'Packed Braid rejected cancellation cleanup for a failed release operation', + exitCodes.failed, + { response }, + ) + } + const exit = await session.waitForExit('failed operation cancellation shutdown', timeoutMs) + return evidenceValue({ response, exit }) +} diff --git a/scripts/live-bridge/target-flow.mjs b/scripts/live-bridge/target-flow.mjs index 6fac8373..b794d7ba 100644 --- a/scripts/live-bridge/target-flow.mjs +++ b/scripts/live-bridge/target-flow.mjs @@ -1,4 +1,3 @@ -import { randomUUID } from 'node:crypto' import { join, relative } from 'node:path' import { createLiveCredentialReference, @@ -19,6 +18,7 @@ import { stateForRequest, stateForRun, } from './protocol.mjs' +import { closeOwnedProviderSessions } from './provider-session-cleanup.mjs' import { evidenceValue, redactString, @@ -32,6 +32,7 @@ import { } from './release-proof-validation.mjs' import { assertTargetSemantics, + cancelFailedTarget, finishTarget, initializeTarget, runNormalTurn, @@ -121,7 +122,9 @@ export async function executeTarget( provider: targetProof.provider, } result.runIds = assertUniqueRunIds( - [runId, result.cancel?.runId, result.interaction?.runId], + [runId, result.cancel?.runId, result.interaction?.runId].filter( + (candidate) => typeof candidate === 'string', + ), new Set(), operation, ) @@ -162,6 +165,7 @@ export async function executeTarget( ? 'unavailable' : 'failed' } finally { + const providerResponses = session?.responses ?? [] const processResult = session === undefined ? { started: false } @@ -189,6 +193,7 @@ export async function executeTarget( ), ) } + await recordProviderSessionCleanup(result, endpoint, providerResponses, token, timeoutMs) if (credentialInstallation !== undefined) { try { result.credentialLifecycle = evidenceValue(await credentialInstallation.cleanup()) @@ -218,7 +223,7 @@ export async function executeTarget( function targetResult(config, target, providerCapabilities, credential, operation) { return { - operationNamespace: randomUUID(), + operationNamespace: config.operationNamespace, targetKey: target.key, workspace: config.workspace, label: target.definition.label, @@ -378,7 +383,18 @@ export async function executeNamedOperation({ normalizedError.exitCode === exitCodes.unavailable ? 'unavailable' : 'failed' + if (session !== undefined) { + try { + result.failureCleanup = await cancelFailedTarget(session, result, { + operationPrefix, + timeoutMs: Math.min(timeoutMs, 30_000), + }) + } catch (cleanupError) { + result.failureCleanupError = errorEvidence(cleanupError) + } + } } finally { + const providerResponses = session?.responses ?? [] const processResult = session === undefined ? { started: false } @@ -402,6 +418,7 @@ export async function executeNamedOperation({ ), ) } + await recordProviderSessionCleanup(result, endpoint, providerResponses, token, timeoutMs) if (credentialInstallation !== undefined) { try { const lifecycle = evidenceValue(await credentialInstallation.cleanup()) @@ -441,6 +458,18 @@ export async function executeNamedOperation({ return evidenceValue(result) } +async function recordProviderSessionCleanup(result, endpoint, responses, token, timeoutMs) { + try { + result.providerSessionCleanup = evidenceValue( + await closeOwnedProviderSessions({ endpoint, responses, token, timeoutMs }), + ) + } catch (error) { + result.providerSessionCleanup = { complete: false, error: errorEvidence(error) } + result.status = 'failed' + if (result.error === undefined) result.error = errorEvidence(error) + } +} + export function operationRequest(result, prefix, action, command, params, suffix) { if (typeof result.operationNamespace !== 'string' || result.operationNamespace.length === 0) { throw new LiveBridgeError( diff --git a/src/adapters/runtime/cli-bridge-context-transfer.ts b/src/adapters/runtime/cli-bridge-context-transfer.ts new file mode 100644 index 00000000..5e9a50e8 --- /dev/null +++ b/src/adapters/runtime/cli-bridge-context-transfer.ts @@ -0,0 +1,65 @@ +import { + ContextTransferResultSchema, + type AgentEnvironmentCapabilities, + type ContextTransferRequest, + type ContextTransferResult, +} from '@tangle-network/agent-interface' +import type { CliBridgeProvider } from '@tangle-network/agent-provider-cli-bridge' +import type { ContextTransferExecutionPort } from '../../ports/execution.js' + +export interface CliBridgeContextTransferResolution { + readonly provider: CliBridgeProvider + readonly capabilities: AgentEnvironmentCapabilities +} + +export interface CliBridgeContextTransferOptions { + readonly resolve: (request: ContextTransferRequest) => Promise +} + +/** Route portable context through the destination provider that owns admission. */ +export function createCliBridgeContextTransferPort( + options: CliBridgeContextTransferOptions, +): ContextTransferExecutionPort { + return Object.freeze({ + lookup: async (request: ContextTransferRequest) => { + const resolved = await options.resolve(request) + if (!supportsContextTransfer(resolved, request)) return undefined + return resolved.provider.contextTransfer?.lookup(request) + }, + transfer: async (request: ContextTransferRequest) => { + const resolved = await options.resolve(request) + if (!supportsContextTransfer(resolved, request)) { + return unavailableContextTransfer(request) + } + return ( + (await resolved.provider.contextTransfer?.transfer(request)) ?? + unavailableContextTransfer(request) + ) + }, + }) +} + +function supportsContextTransfer( + resolved: CliBridgeContextTransferResolution, + request: ContextTransferRequest, +): boolean { + const capability = resolved.capabilities.contextTransfer + return ( + request.plan.destination.provider === resolved.provider.name && + capability?.freshSession === true && + capability.requestIdempotency === true && + capability.lookup === true && + resolved.provider.contextTransfer?.transfer !== undefined && + resolved.provider.contextTransfer.lookup !== undefined + ) +} + +function unavailableContextTransfer(request: ContextTransferRequest): ContextTransferResult { + return ContextTransferResultSchema.parse({ + status: 'unknown', + operationId: request.operationId, + requestDigest: request.requestDigest, + message: 'The selected CLI Bridge route does not support portable context transfer', + retryable: false, + }) +} diff --git a/src/adapters/runtime/cli-bridge-retained-execution.ts b/src/adapters/runtime/cli-bridge-retained-execution.ts index 6e447f42..75748249 100644 --- a/src/adapters/runtime/cli-bridge-retained-execution.ts +++ b/src/adapters/runtime/cli-bridge-retained-execution.ts @@ -1,10 +1,15 @@ import type { AgentExactRunControlRef } from '@tangle-network/agent-interface' -import type { ExecuteTurnInput, RetainedExecutionRecoveryContext } from '../../ports/execution.js' +import type { + ContextTransferExecutionPort, + ExecuteTurnInput, + RetainedExecutionRecoveryContext, +} from '../../ports/execution.js' import { createCliBridgeRetainedPlan } from './cli-bridge-retained-run.js' import type { PreparedCliBridgeConnection } from './production-cli-bridge-backend.js' import { RetainedExecutionPort } from './retained-execution.js' export interface CliBridgeRetainedExecutionOptions { + readonly context?: ContextTransferExecutionPort readonly resolve: (input: ExecuteTurnInput) => Promise readonly recover: ( input: { @@ -18,6 +23,8 @@ export interface CliBridgeRetainedExecutionOptions { /** Braid's durable CLI-Bridge path. CLI-Bridge owns the job; the shared port owns readers. */ export class CliBridgeRetainedExecutionPort extends RetainedExecutionPort { + readonly context?: ContextTransferExecutionPort + constructor(options: CliBridgeRetainedExecutionOptions) { super({ resolve: async (input) => @@ -38,5 +45,6 @@ export class CliBridgeRetainedExecutionPort extends RetainedExecutionPort { recovery, ), }) + if (options.context !== undefined) this.context = options.context } } diff --git a/src/adapters/runtime/cli-bridge-retained-run.ts b/src/adapters/runtime/cli-bridge-retained-run.ts index 3e40ffe3..71c51347 100644 --- a/src/adapters/runtime/cli-bridge-retained-run.ts +++ b/src/adapters/runtime/cli-bridge-retained-run.ts @@ -63,14 +63,18 @@ export async function createCliBridgeRetainedPlan( throw new Error('retained CLI Bridge control reference conflicts with the persisted run') } const exactControlRef = controlRef ?? persistedControlRef + const contextDestination = prepared.contextTransfer?.plan.destination const environmentId = exactControlRef?.environmentId ?? - (admission?.phase === 'environment' ? admission.environmentId : undefined) + (admission?.phase === 'environment' ? admission.environmentId : undefined) ?? + contextDestination?.environmentId const executionId = exactControlRef?.executionId ?? (admission?.phase === 'intent' || admission?.phase === 'environment' ? admission.executionId - : safeExecutionId(runId)) + : undefined) ?? + contextDestination?.executionId ?? + safeExecutionId(runId) const providerSessionId = exactControlRef?.sessionId ?? (admission?.phase === 'intent' || admission?.phase === 'environment' @@ -136,12 +140,16 @@ export async function startCliBridgeRetainedRun( backend: plan.prepared.runner, workspace: { cwd: plan.prepared.workspace }, idempotencyKey: plan.environmentIdempotencyKey, + ...(input.contextTransfer === undefined + ? {} + : { requestedId: input.contextTransfer.plan.destination.environmentId }), }, turn: { prompt: input.text, turnId: safeExecutionId(input.operationId), interactions: input.interactions ?? {}, signal: input.signal, + ...(input.contextTransfer === undefined ? {} : { contextTransfer: input.contextTransfer }), }, identity: { sessionId: plan.prepared.providerSessionId, @@ -179,12 +187,20 @@ async function recoverCliBridgeRetainedRun( backend: plan.prepared.runner, workspace: { cwd: plan.prepared.workspace }, idempotencyKey: admission.idempotencyKey, + ...(plan.prepared.contextTransfer === undefined + ? {} + : { + requestedId: plan.prepared.contextTransfer.plan.destination.environmentId, + }), }, turn: { prompt: input.receipt.requested.text, turnId: admission.turnId, interactions: input.receipt.requested.interactions ?? {}, ...(input.signal === undefined ? {} : { signal: input.signal }), + ...(plan.prepared.contextTransfer === undefined + ? {} + : { contextTransfer: plan.prepared.contextTransfer }), }, identity: { sessionId: admission.sessionId, diff --git a/src/adapters/runtime/production-cli-bridge-backend.ts b/src/adapters/runtime/production-cli-bridge-backend.ts index 24849e46..9d11c8f0 100644 --- a/src/adapters/runtime/production-cli-bridge-backend.ts +++ b/src/adapters/runtime/production-cli-bridge-backend.ts @@ -3,6 +3,7 @@ import type { AgentProfile, HarnessType, } from '@tangle-network/agent-interface' +import { canonicalAgentProfileDigest } from '@tangle-network/agent-interface' import type { CliBridgeProvider } from '@tangle-network/agent-provider-cli-bridge' import type { BridgeModelCredential } from '@tangle-network/agent-runtime/kernel' import { ConnectionError } from '../../app/connection-errors.js' @@ -47,10 +48,18 @@ export interface PreparedCliBridgeConnection { readonly providerSessionId: string readonly provider: CliBridgeProvider readonly capabilities: AgentEnvironmentCapabilities + readonly contextTransfer?: ExecuteTurnInput['contextTransfer'] readonly observation: NonNullable readonly materializationReceipt: Readonly> } +export interface PreparedCliBridgeProviderRoute { + readonly bridgeUrl: string + readonly bearerToken: string + readonly provider: CliBridgeProvider + readonly capabilities: AgentEnvironmentCapabilities +} + export async function prepareCliBridgeConnection( options: ProductionBackendResolverOptions, input: ExecuteTurnInput, @@ -76,53 +85,35 @@ export async function prepareCliBridgeConnection( ) } - const record = connectionRecord(connectionId, options) - const credential = await readConnectionCredential(record, options, endpoint) const providerSessionId = input.sessionId ?? stableProviderId('session-braid-', input.runId) const route = materializeBridgeModelRoute(runner, model, profile.model?.provider) const workspace = requiredWorkspaceCwd(input.workspaceRoot, options.workspaceCwd) - const bridgeUrl = normalizeCliBridgeProviderBaseUrl(endpoint, connectionId) - const bridgeLocation = endpointLocation(bridgeUrl) + const preparedProvider = await prepareCliBridgeProviderRoute( + options, + connectionId, + endpoint, + runner, + route, + ) + const bridgeLocation = endpointLocation(preparedProvider.bridgeUrl) const createdAt = new Date().toISOString() - const { createCliBridgeProvider } = await import('@tangle-network/agent-provider-cli-bridge') - const providerFetch = - options.bridgeModelCredential === undefined - ? options.fetch - : bridgeCredentialFetch( - bridgeUrl, - options.bridgeModelCredential, - options.fetch ?? globalThis.fetch, - ) - const providerOptions = { - baseUrl: bridgeUrl, - bearerToken: credential ?? LOCAL_BRIDGE_BEARER, - defaultModel: route, - ...(runner === 'pi' - ? { - defaultExecution: { - kind: 'host' as const, - jail: { mode: 'fs-jail' as const }, - }, - } - : {}), - ...(providerFetch === undefined ? {} : { fetch: providerFetch }), - } - const provider = createCliBridgeProvider(providerOptions) - const capabilities = await provider.capabilities() + const { provider, capabilities } = preparedProvider + assertContextTransferDestination(input, provider.name, profile, runner, model) return freezeExecution({ profile, model, runner, route, workspace, - bridgeUrl, - bearerToken: credential ?? LOCAL_BRIDGE_BEARER, + bridgeUrl: preparedProvider.bridgeUrl, + bearerToken: preparedProvider.bearerToken, ...(options.bridgeModelCredential === undefined ? {} : { bridgeModelCredential: options.bridgeModelCredential }), ...(options.fetch === undefined ? {} : { fetch: options.fetch }), provider, capabilities, + ...(input.contextTransfer === undefined ? {} : { contextTransfer: input.contextTransfer }), providerSessionId, observation: staticExecutionObservation({ kind: bridgeLocation.location === 'local' ? 'local-process' : 'remote-service', @@ -147,7 +138,12 @@ export async function prepareCliBridgeConnection( sessionId: providerSessionId, lifecycle: 'retained-session', cleanup: 'explicit', - portableContext: 'unavailable', + portableContext: + capabilities.contextTransfer?.freshSession === true && + capabilities.contextTransfer.requestIdempotency === true && + capabilities.contextTransfer.lookup === true + ? 'provider-owned' + : 'unavailable', workspace, model, route, @@ -156,6 +152,76 @@ export async function prepareCliBridgeConnection( }) } +/** Resolve one exact Bridge route without requiring an AgentProfile. */ +export async function prepareCliBridgeProviderRoute( + options: ProductionBackendResolverOptions, + connectionId: ConnectionId, + endpoint: string, + runner: HarnessType, + route: string, +): Promise { + const record = connectionRecord(connectionId, options) + if (record.kind !== 'cli-bridge') { + throw new Error('The CLI Bridge provider route received another connection kind') + } + const credential = await readConnectionCredential(record, options, endpoint) + const bridgeUrl = normalizeCliBridgeProviderBaseUrl(endpoint, connectionId) + const { createCliBridgeProvider } = await import('@tangle-network/agent-provider-cli-bridge') + const providerFetch = + options.bridgeModelCredential === undefined + ? options.fetch + : bridgeCredentialFetch( + bridgeUrl, + options.bridgeModelCredential, + options.fetch ?? globalThis.fetch, + ) + const providerOptions = { + baseUrl: bridgeUrl, + bearerToken: credential ?? LOCAL_BRIDGE_BEARER, + defaultModel: route, + ...(runner === 'pi' + ? { + defaultExecution: { + kind: 'host' as const, + jail: { mode: 'fs-jail' as const }, + }, + } + : {}), + ...(providerFetch === undefined ? {} : { fetch: providerFetch }), + } + const provider = createCliBridgeProvider(providerOptions) + const capabilities = await provider.capabilities() + return freezeExecution({ + bridgeUrl, + bearerToken: credential ?? LOCAL_BRIDGE_BEARER, + provider, + capabilities, + }) +} + +function assertContextTransferDestination( + input: ExecuteTurnInput, + providerName: string, + profile: AgentProfile, + runner: HarnessType, + model: string, +): void { + const transfer = input.contextTransfer + if (transfer === undefined) return + const destination = transfer.plan.destination + if ( + destination.provider !== providerName || + destination.runner !== runner || + destination.model !== model || + destination.profileDigest !== canonicalAgentProfileDigest(profile) || + destination.sessionId !== input.sessionId + ) { + throw new Error( + 'The portable context destination does not match the selected provider, runner, model, profile, or session', + ) + } +} + function bridgeCredentialFetch( bridgeUrl: string, credential: BridgeModelCredential, diff --git a/src/adapters/runtime/retained-execution-stream.ts b/src/adapters/runtime/retained-execution-stream.ts index 3034ed07..ec3a004e 100644 --- a/src/adapters/runtime/retained-execution-stream.ts +++ b/src/adapters/runtime/retained-execution-stream.ts @@ -27,6 +27,12 @@ export async function* streamRetainedExecution(input: { if (observation === undefined) { throw new Error('Retained execution observation is unavailable') } + if ( + observation.providerEnvironmentId !== undefined && + observation.providerEnvironmentId !== input.handle.controlRef.environmentId + ) { + throw new Error('Retained execution observation conflicts with its exact control reference') + } yield { runId: input.runId, eventId: `${input.runId}:execution-bound`, @@ -34,7 +40,13 @@ export async function* streamRetainedExecution(input: { receivedAt: observedAt, event: { type: 'braid.execution.observed', - observation, + observation: + observation.providerEnvironmentId === undefined + ? { + ...observation, + providerEnvironmentId: input.handle.controlRef.environmentId, + } + : observation, controlRef: input.handle.controlRef, timestamp: observedAt, }, diff --git a/src/app/production-composition.ts b/src/app/production-composition.ts index 9647f3cd..07bf7702 100644 --- a/src/app/production-composition.ts +++ b/src/app/production-composition.ts @@ -1,4 +1,5 @@ -import type { AgentProfile } from '@tangle-network/agent-interface' +import { harnessTypeSchema, type AgentProfile } from '@tangle-network/agent-interface' +import { materializeBridgeModelRoute } from '../adapters/connections/cli-bridge-model-route.js' import { nitroVerifiersForConnection } from '../adapters/connections/nitro-confidential-attestation.js' import type { ProductionConnectionOptions } from '../adapters/connections/production-connections.js' import { @@ -10,6 +11,7 @@ import { AgentRuntimeExecutionPort, type AgentTurnBackendResolver, } from '../adapters/runtime/agent-runtime-execution.js' +import { createCliBridgeContextTransferPort } from '../adapters/runtime/cli-bridge-context-transfer.js' import { CliBridgeRetainedExecutionPort } from '../adapters/runtime/cli-bridge-retained-execution.js' import { ModeRoutingExecutionPort } from '../adapters/runtime/mode-routing-execution.js' import { NativeInteractiveRunBroker } from '../adapters/runtime/native-interactive-run-broker.js' @@ -19,6 +21,7 @@ import { resolveProductionCliBridgeConnection, resolveProductionTangleRetainedConnection, } from '../adapters/runtime/production-backend-resolver.js' +import { prepareCliBridgeProviderRoute } from '../adapters/runtime/production-cli-bridge-backend.js' import { RuntimeSupervisorController } from '../adapters/runtime/supervisor-control.js' import { TangleRetainedExecutionPort } from '../adapters/runtime/tangle-retained-execution.js' import { TangleRetainedInteractiveExecutionPort } from '../adapters/runtime/tangle-retained-interactive-execution.js' @@ -243,7 +246,26 @@ export function createProductionComposition( let nativeInteractive: NativeInteractiveExecutionControl | undefined const execution = (() => { if (connection.kind === 'cli-bridge') { + const context = createCliBridgeContextTransferPort({ + resolve: (request) => { + const destination = request.plan.destination + const runner = harnessTypeSchema.safeParse(destination.runner) + if (!runner.success || destination.model === undefined) { + throw new Error( + 'The portable context destination requires a supported runner and exact model', + ) + } + return prepareCliBridgeProviderRoute( + resolverOptions, + connection.id, + connectionEndpoint(connection, resolverOptions), + runner.data, + materializeBridgeModelRoute(runner.data, destination.model), + ) + }, + }) return new CliBridgeRetainedExecutionPort({ + context, resolve: (input) => resolveProductionCliBridgeConnection(resolverOptions, input), recover: ({ runId, providerSessionId, signal, ...recovery }) => resolveProductionCliBridgeConnection( diff --git a/test/cli-bridge-context-transfer.test.ts b/test/cli-bridge-context-transfer.test.ts new file mode 100644 index 00000000..f7245978 --- /dev/null +++ b/test/cli-bridge-context-transfer.test.ts @@ -0,0 +1,160 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import { + type ContextTransferRequest, + canonicalAgentProfileDigest, + contextTransferRequestDigest, + defineAgentProfile, + type PortableConversationContext, + portableContextPlanDigest, + portableConversationContextDigest, +} from '@tangle-network/agent-interface' +import { createProductionComposition } from '../src/app/production-composition.js' +import type { ConnectionRecord } from '../src/domain/entities.js' +import { createConnectionId } from '../src/domain/ids.js' +import type { ExecuteTurnInput, RetainedRunAdmissionRecord } from '../src/ports/execution.js' +import { startRuntimeBridgeServer } from './support/runtime-bridge-server.js' + +const at = '2026-08-20T12:00:00.000Z' + +test('production CLI Bridge transfers context into one exact fresh retained session', async () => { + const bridge = await startRuntimeBridgeServer({ responseText: 'CONTEXT_TRANSFER_OK' }) + const connection: ConnectionRecord = { + id: createConnectionId('connection-cli-context'), + kind: 'cli-bridge', + name: 'CLI Bridge context test', + endpoint: bridge.endpoint, + providerOptions: { transport: 'local' }, + createdAt: at, + updatedAt: at, + lastHealth: { status: 'unknown' }, + } + const profile = defineAgentProfile({ + name: 'CLI Bridge context destination', + harness: 'pi', + model: { provider: 'openai', default: 'openai/gpt-5' }, + }) + const transfer = contextTransfer(profile) + const production = createProductionComposition({ + profile, + connections: [connection], + connectionId: connection.id, + workspaceRoot: '/workspace', + }) + + try { + assert.ok(production.execution.context?.transfer) + const receipt = await production.execution.context.transfer(transfer) + assert.equal(receipt.status, 'accepted') + if (receipt.status !== 'accepted') throw new Error('context transfer was not accepted') + + const admissions: RetainedRunAdmissionRecord[] = [] + const input: ExecuteTurnInput = { + operationId: 'operation-context-destination', + runId: 'run-braid-context-destination', + text: 'Continue with the transferred marker.', + profile, + connectionId: connection.id, + workspaceRoot: '/workspace', + sessionId: receipt.sessionId, + signal: new AbortController().signal, + contextTransfer: transfer, + onRetainedAdmission: async (admission) => { + admissions.push(structuredClone(admission)) + }, + } + const admission = await production.execution.admit?.(input) + assert.equal(admission?.environmentId, transfer.plan.destination.environmentId) + assert.equal(admission?.providerSessionId, transfer.plan.destination.sessionId) + + const events = [] + for await (const event of production.execution.streamTurn(input)) events.push(event) + + assert.ok( + events.some((candidate) => { + const event = 'event' in candidate ? candidate.event : undefined + return ( + typeof event === 'object' && event !== null && 'type' in event && event.type === 'final' + ) + }), + ) + assert.deepEqual( + admissions.map((candidate) => candidate.phase), + ['intent', 'environment', 'dispatched'], + ) + assert.equal(bridge.sessions[0]?.id, transfer.plan.destination.sessionId) + assert.notEqual(input.runId, transfer.plan.destination.runId) + assert.equal(bridge.requests[0]?.runId, transfer.plan.destination.runId) + assert.deepEqual(bridge.requests[0]?.body.context_transfer, transfer) + assert.equal(bridge.requests[0]?.body.environment_id, transfer.plan.destination.environmentId) + assert.equal(bridge.requests[0]?.body.execution_id, transfer.plan.destination.executionId) + } finally { + await bridge.close() + } +}) + +function contextTransfer(profile: ReturnType): ContextTransferRequest { + const sourceMaterial = { + source: { + runId: 'run-context-source', + messageId: 'message-context-source', + provider: 'cli-bridge', + environmentId: 'environment-context-source', + sessionId: 'session-context-source', + executionId: 'execution-context-source', + requestDigest: `sha256:${'a'.repeat(64)}` as const, + }, + completeness: 'complete' as const, + messages: [ + { + id: 'message-context-source', + role: 'user' as const, + parts: [{ type: 'text' as const, text: 'portable context marker 96e1' }], + timestamp: '2026-08-20T11:59:58.000Z', + }, + ], + attachments: [], + } + const context: PortableConversationContext = { + ...sourceMaterial, + digest: portableConversationContextDigest(sourceMaterial), + } + const destination = { + runner: 'pi', + provider: 'cli-bridge', + environmentId: 'environment-context-destination', + sessionId: 'session-context-destination', + runId: 'run-context-destination', + executionId: 'execution-context-destination', + model: 'openai/gpt-5', + profileDigest: canonicalAgentProfileDigest(profile), + } + const planMaterial = { + planId: 'plan-context-destination', + source: context, + destination, + messages: [ + { + messageId: 'message-context-source', + action: 'include' as const, + parts: [{ partIndex: 0, action: 'include' as const }], + }, + ], + context, + requiresAcceptance: false, + } + const plan = { ...planMaterial, digest: portableContextPlanDigest(planMaterial) } + const requestMaterial = { + operationId: 'transfer-context-destination', + plan, + acceptance: { + planDigest: plan.digest, + acceptedAt: at, + acceptedBy: 'policy' as const, + }, + } + return { + ...requestMaterial, + requestDigest: contextTransferRequestDigest(requestMaterial), + } +} diff --git a/test/retained-execution-lifecycle.test.ts b/test/retained-execution-lifecycle.test.ts index 3babd635..961186a9 100644 --- a/test/retained-execution-lifecycle.test.ts +++ b/test/retained-execution-lifecycle.test.ts @@ -164,6 +164,40 @@ test('retained controls follow complete provider capabilities', () => { ) }) +test('retained observations use the exact provider environment identity', async () => { + const exact = controlRef('observation') + const retainedPlan: RetainedExecutionPlan = { + ...plan(exact, async () => handle(exact)), + observe: async () => ({ + kind: 'remote-service', + provider: exact.provider, + lifecycle: 'ready', + lifecycleMode: 'retained', + cleanup: 'explicit', + continuity: 'session', + location: 'remote', + createdAt: now, + observedAt: now, + unavailable: [], + }), + } + const execution = executionFor(async () => retainedPlan) + const runInput = input('observation') + + await execution.admit(runInput) + const stream = execution.streamTurn(runInput)[Symbol.asyncIterator]() + const first = await stream.next() + + assert.equal(first.done, false) + assert.equal(first.value?.event.type, 'braid.execution.observed') + if (first.value?.event.type !== 'braid.execution.observed') { + throw new Error('expected the retained execution observation') + } + assert.equal(first.value.event.observation.providerEnvironmentId, exact.environmentId) + assert.deepEqual(first.value.event.controlRef, exact) + await stream.return?.(undefined as never) +}) + function executionFor( resolve: (input: ExecuteTurnInput) => Promise, ): RetainedExecutionPort { diff --git a/test/scripts.test.ts b/test/scripts.test.ts index adf45986..dcd9350b 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -357,6 +357,7 @@ test('every scoped package alias forwards its declared file set', () => { 'analysis-model-call-observability.test.js', 'analysis-model-call-roundtrip.test.js', 'application.test.js', + 'cli-bridge-context-transfer.test.js', 'cli-bridge-interactions.test.js', 'cli-bridge-profile-contract.test.js', 'cli-bridge-retained-restart.test.js', diff --git a/test/support/runtime-bridge-server.ts b/test/support/runtime-bridge-server.ts index 396d032b..bd48bc55 100644 --- a/test/support/runtime-bridge-server.ts +++ b/test/support/runtime-bridge-server.ts @@ -5,8 +5,11 @@ import type { AddressInfo } from 'node:net' import { type AgentEnvironmentCapabilities, type AgentProfile, + type ContextTransferReceipt, canonicalAgentProfileDigest, canonicalCandidateDigest, + ContextTransferReceiptSchema, + ContextTransferRequestSchema, } from '@tangle-network/agent-interface' const PROFILE_MATERIALIZATION_SCHEMA = 'cli-bridge.profile-materialization.v2' @@ -184,6 +187,7 @@ const PI_NATIVE_CAPABILITIES: AgentEnvironmentCapabilities = { eventIdentity: true, cancellationIdempotency: true, }, + contextTransfer: { freshSession: true, requestIdempotency: true, lookup: true }, nativeContinuation: { atomicBoundary: true, requestIdempotency: true, @@ -243,6 +247,7 @@ const GENERIC_CAPABILITIES: AgentEnvironmentCapabilities = { eventIdentity: true, cancellationIdempotency: true, }, + contextTransfer: { freshSession: true, requestIdempotency: true, lookup: true }, workspace: { read: false, write: false, @@ -403,6 +408,7 @@ export async function startRuntimeBridgeServer( } const runs = new Map() const nativeSessions = new Map() + const contextTransfers = new Map() /** Exact run coordinates travel on every run response, as cli-bridge 0.9 requires. */ const coordinateHeaders = (run: RetainedFixtureRun) => ({ @@ -571,6 +577,86 @@ export async function startRuntimeBridgeServer( response.end(JSON.stringify(document)) return } + if (request.method === 'POST' && path === '/v1/context-transfers') { + const parsed = ContextTransferRequestSchema.safeParse(JSON.parse(await readBody(request))) + if (!parsed.success) { + writeJson(response, 400, { error: { type: 'invalid_request_error' } }) + return + } + const transfer = parsed.data + const existing = contextTransfers.get(transfer.operationId) + if (existing !== undefined) { + writeJson( + response, + 200, + ContextTransferReceiptSchema.parse({ ...existing, status: 'replayed' }), + ) + return + } + const admittedAt = new Date( + Math.max(Date.now(), Date.parse(transfer.acceptance.acceptedAt)), + ).toISOString() + const receipt = ContextTransferReceiptSchema.parse({ + status: 'accepted', + operationId: transfer.operationId, + requestDigest: transfer.requestDigest, + planDigest: transfer.plan.digest, + contextDigest: transfer.plan.context.digest, + source: transfer.plan.source.source, + destination: transfer.plan.destination, + provider: transfer.plan.destination.provider, + environmentId: transfer.plan.destination.environmentId, + sessionId: transfer.plan.destination.sessionId, + runId: transfer.plan.destination.runId, + executionId: transfer.plan.destination.executionId, + sessionCreatedForOperationId: transfer.operationId, + sessionCreatedAt: admittedAt, + transferredMessageIds: transfer.plan.messages + .filter((message) => message.action === 'include') + .map((message) => message.messageId), + omittedMessageIds: transfer.plan.messages + .filter((message) => message.action === 'omit') + .map((message) => message.messageId), + admittedAt, + }) + contextTransfers.set(transfer.operationId, receipt) + writeJson(response, 200, receipt) + return + } + const contextTransferMatch = /^\/v1\/context-transfers\/([^/]+)$/u.exec(path) + if (request.method === 'GET' && contextTransferMatch !== null) { + const receipt = contextTransfers.get(decodeURIComponent(contextTransferMatch[1] ?? '')) + if ( + receipt === undefined || + url.searchParams.get('request_digest') !== receipt.requestDigest + ) { + writeJson(response, 404, { error: { type: 'not_found_error' } }) + return + } + writeJson( + response, + 200, + ContextTransferReceiptSchema.parse({ ...receipt, status: 'replayed' }), + ) + return + } + const contextEnvironmentMatch = /^\/v1\/context-transfer-environments\/([^/]+)$/u.exec(path) + if (request.method === 'GET' && contextEnvironmentMatch !== null) { + const environmentId = decodeURIComponent(contextEnvironmentMatch[1] ?? '') + const receipt = Array.from(contextTransfers.values()).find( + (candidate) => candidate.environmentId === environmentId, + ) + if (receipt === undefined) { + writeJson(response, 404, { error: { type: 'not_found_error' } }) + return + } + writeJson( + response, + 200, + ContextTransferReceiptSchema.parse({ ...receipt, status: 'replayed' }), + ) + return + } const eventsMatch = /^\/v1\/runs\/([^/]+)\/events$/u.exec(path) if (request.method === 'GET' && eventsMatch !== null) { const runId = decodeURIComponent(eventsMatch[1] ?? '') From 000e4ec68994ae5682a81760cee0dfb1be291256 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 12:53:27 -0600 Subject: [PATCH 075/136] test(ui): refresh canonical terminal proof --- artifacts/verification/connections/120x40.png | Bin 5398 -> 5398 bytes artifacts/verification/connections/200x60.png | Bin 6640 -> 6640 bytes artifacts/verification/connections/40x12.png | Bin 4534 -> 4534 bytes .../connections/80x24-connection-keyboard.gif | Bin 79179 -> 83710 bytes artifacts/verification/connections/80x24.png | Bin 5104 -> 5104 bytes .../connections/capture-manifest.json | 16 +- artifacts/verification/w6/120x40-plain.txt | 2 +- artifacts/verification/w6/120x40.png | Bin 22649 -> 22649 bytes artifacts/verification/w6/200x60-plain.txt | 2 +- artifacts/verification/w6/200x60.png | Bin 10379 -> 10379 bytes artifacts/verification/w6/40x12-plain.txt | 2 +- artifacts/verification/w6/40x12.png | Bin 14275 -> 14275 bytes .../verification/w6/80x24-automation.gif | Bin 14866 -> 14866 bytes artifacts/verification/w6/80x24-plain.txt | 2 +- .../w6/80x24-transcript-keyboard.gif | Bin 362293 -> 362293 bytes artifacts/verification/w6/80x24.png | Bin 18510 -> 18510 bytes .../verification/w6/capture-manifest.json | 130 +++++++-------- artifacts/verification/w6/package-proof.json | 156 ++++++++++-------- .../w6/raw/transcript-keyboard.cast | 145 ++++++++-------- .../w6/states/active-streaming.json | 30 ++-- .../w6/states/active-streaming.png | Bin 15091 -> 15091 bytes .../verification/w6/states/analysis.json | 2 +- artifacts/verification/w6/states/analysis.png | Bin 58389 -> 58389 bytes .../verification/w6/states/automation.json | 2 +- .../verification/w6/states/automation.png | Bin 4156 -> 4156 bytes .../w6/states/command-palette-120.json | 2 +- .../w6/states/command-palette-120.png | Bin 36822 -> 36822 bytes .../w6/states/command-palette-40.json | 2 +- .../w6/states/command-palette-40.png | Bin 9482 -> 9482 bytes .../w6/states/command-palette-80.json | 2 +- .../w6/states/command-palette-80.png | Bin 35276 -> 35276 bytes .../verification/w6/states/comparison.json | 2 +- .../verification/w6/states/comparison.png | Bin 64782 -> 64782 bytes artifacts/verification/w6/states/empty.json | 2 +- artifacts/verification/w6/states/empty.png | Bin 5782 -> 5782 bytes .../w6/states/failure-or-reconnect.json | 40 ++--- .../w6/states/failure-or-reconnect.png | Bin 18786 -> 18786 bytes .../verification/w6/states/fork-preview.json | 2 +- .../verification/w6/states/fork-preview.png | Bin 9878 -> 9878 bytes .../w6/states/graph-or-analysis.json | 2 +- .../w6/states/graph-or-analysis.png | Bin 20641 -> 20641 bytes .../verification/w6/states/interaction.json | 2 +- .../verification/w6/states/interaction.png | Bin 28820 -> 28820 bytes .../verification/w6/states/multi-run.json | 58 +++---- .../verification/w6/states/multi-run.png | Bin 24549 -> 24549 bytes artifacts/verification/w6/states/narrow.json | 2 +- artifacts/verification/w6/states/narrow.png | Bin 9639 -> 9639 bytes artifacts/verification/w6/states/profile.json | 2 +- artifacts/verification/w6/states/profile.png | Bin 6355 -> 6355 bytes .../verification/w6/states/supervision.json | 2 +- .../verification/w6/states/supervision.png | Bin 24507 -> 24507 bytes 51 files changed, 322 insertions(+), 287 deletions(-) diff --git a/artifacts/verification/connections/120x40.png b/artifacts/verification/connections/120x40.png index 2ae09e794e5ff9b5060edad37b38a7a6fa4e5633..ca245f1a11e15da5966d696a030e1103274158cc 100644 GIT binary patch delta 20 ccmbQHHBD>7Y({n=BlgyP54blkVk{8`089o4DgXcg delta 20 ccmbQHHBD>7Y({n-E9LY%3@bJ-Vk{8`07{+*1poj5 diff --git a/artifacts/verification/connections/200x60.png b/artifacts/verification/connections/200x60.png index 5f02883855a739940f7f7c1a7b5f34be52eb1ea9..887dc154fd2e81b4ea3e6668ed7da8d35aa7d6aa 100644 GIT binary patch delta 20 ccmexh{K0sG9V5Gt5r-(_-&vbo8COdH08WVp@&Et; delta 20 ccmexh{K0sG9V0uBmCDZ@Q@J<0GOm^Y09QK)v;Y7A diff --git a/artifacts/verification/connections/40x12.png b/artifacts/verification/connections/40x12.png index ee50187137620087f81715142c4c5278b35dde7c..a1ed42b4283b44c62d0334047340cc92ee8332f6 100644 GIT binary patch delta 20 ccmdm{yiIw-Rwi~KBi8Hz>% diff --git a/artifacts/verification/connections/80x24-connection-keyboard.gif b/artifacts/verification/connections/80x24-connection-keyboard.gif index 63d7e1104b56b27a9897184eb9202f9b12c2f602..de2da1b0fb4574b97b227464c5c6b37a8895df81 100644 GIT binary patch delta 78820 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 uN9Vw{4ve9J=iPx>Ihx&HxiN$BhV delta 74284 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�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 delta 18 ZcmX?{e>i_aHam}{wv*QF$c;sT<^V{<2O=jjN;n^GMMzrKup=~v+pro&jO212a2+7@AqU*ybtD2?r&w=&a27d OSjNb?-G4sIv*!TrP%E1N delta 114 zcmdnmC$_auY=RP_>_+8}0gRlRMFU-@FtTrse##`l$T@lAO5x3ge~VS77kM&^xBpgT z-2PjU$KvluzSoasOrw(b3%%!&6IIkyAV#+EU1 LZ1%f$`h~#tGT%LWZmkb1yyFSaio709Wq_;s5{u delta 20 ccmX>%f$`h~#tGT%JeInvJ?nBd7Ts|N09GLgR{#J2 diff --git a/artifacts/verification/w6/capture-manifest.json b/artifacts/verification/w6/capture-manifest.json index d93703b7..00fc2583 100644 --- a/artifacts/verification/w6/capture-manifest.json +++ b/artifacts/verification/w6/capture-manifest.json @@ -1,11 +1,11 @@ { "schemaVersion": 3, - "generatedAt": "2026-08-29T12:58:17.504Z", + "generatedAt": "2026-08-29T18:49:38.773Z", "command": "pnpm capture:visual", "binary": "clean npm install from generated tarball", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c", + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9", "stateFixture": "deterministic", "liveDemoCommand": "pnpm capture:demo:live", "terminal": "node-pty/xterm-256color", @@ -255,14 +255,14 @@ }, { "path": "40x12-plain.txt", - "sha256": "9ccc454ee72a766df3b724611055ff984955356e2151497cf56c0d09bcdb4016", + "sha256": "88ebcf94c6950e0cebe6736fde7bc67a8f636fcad2ba96272ab86453e6fb2622", "kind": "plain-frame", "columns": 40, "rows": 12 }, { "path": "40x12.png", - "sha256": "79f7bdb3af5a86f5b8bfb28dc87e9391c81f649bf7acfb072eb5042e9b50c61b", + "sha256": "d0903d3cc2504312980d3d6bdfad9d77f17edec4b155512a04a2e9ecf5ff6df1", "kind": "png", "columns": 40, "rows": 12 @@ -276,14 +276,14 @@ }, { "path": "80x24-plain.txt", - "sha256": "9ccc454ee72a766df3b724611055ff984955356e2151497cf56c0d09bcdb4016", + "sha256": "88ebcf94c6950e0cebe6736fde7bc67a8f636fcad2ba96272ab86453e6fb2622", "kind": "plain-frame", "columns": 80, "rows": 24 }, { "path": "80x24.png", - "sha256": "2bda8dbe1f17ce28adec1240e2df40d93a98e1c0783c1f8d07a845fe504eac64", + "sha256": "36ecd364dec5235b4b7520d7702ea37f16fc673d4ca56fb369ac65b22af66bca", "kind": "png", "columns": 80, "rows": 24 @@ -297,14 +297,14 @@ }, { "path": "120x40-plain.txt", - "sha256": "9ccc454ee72a766df3b724611055ff984955356e2151497cf56c0d09bcdb4016", + "sha256": "88ebcf94c6950e0cebe6736fde7bc67a8f636fcad2ba96272ab86453e6fb2622", "kind": "plain-frame", "columns": 120, "rows": 40 }, { "path": "120x40.png", - "sha256": "6966045b257d8064bff7dee586c8ab20389342fb4f313d5d5566d6d312c50b6b", + "sha256": "8b459f71f72b077c585cd49a3e27303aded77cbd7cbb01ab8385c0aa5f9306cd", "kind": "png", "columns": 120, "rows": 40 @@ -318,21 +318,21 @@ }, { "path": "200x60-plain.txt", - "sha256": "9ccc454ee72a766df3b724611055ff984955356e2151497cf56c0d09bcdb4016", + "sha256": "88ebcf94c6950e0cebe6736fde7bc67a8f636fcad2ba96272ab86453e6fb2622", "kind": "plain-frame", "columns": 200, "rows": 60 }, { "path": "200x60.png", - "sha256": "e2615abf4c28af164790823cfcf984c23e57ea858dee699f8ccd5988b8f4f64e", + "sha256": "0aefed5d63acdd2f2bffb282cbfef64bce682e3f1e8f9910d3e19f3118933cd7", "kind": "png", "columns": 200, "rows": 60 }, { "path": "states/command-palette-40.json", - "sha256": "75d4a1d6f7273e876302f37cc0e8a0e46a8a097302447982756b726875d760e9", + "sha256": "f8a9434eeaa51366cda6e8bd4f7a36bb40a05aee2ecf1654faca0da89d9be8f9", "kind": "semantic-state", "state": "command-palette-40", "columns": 40, @@ -348,7 +348,7 @@ }, { "path": "raw/command-palette-40.cast", - "sha256": "4a764fb7f0179f0c56cf4d40485dc9a0ba77492358fb7e916c06a8553a992eaf", + "sha256": "bd1716f9a734d5303d98c210e5b1d85fe85b0a71ffdc5c45473683debda949e3", "kind": "asciicast", "state": "command-palette-40", "columns": 40, @@ -364,7 +364,7 @@ }, { "path": "states/command-palette-40.png", - "sha256": "59ee96310e2638dd0edd852f0da92b652b99b669813a0ffa64726d416f9b89d9", + "sha256": "4e166185c79222039aea145ca448216b7f782213af45aaa4fdf00296b11abb3a", "kind": "png", "state": "command-palette-40", "columns": 40, @@ -372,7 +372,7 @@ }, { "path": "states/command-palette-80.json", - "sha256": "f7697185a6041cea9b6cbbbdd4dabd2aa71ddb00033d35747860b9fba0556a51", + "sha256": "da0f576e17b8c34d722aa63a60670ae4d7356eda43320031562a67426d415078", "kind": "semantic-state", "state": "command-palette-80", "columns": 80, @@ -388,7 +388,7 @@ }, { "path": "raw/command-palette-80.cast", - "sha256": "699b48a83b4b4945a3889f91b6de534193f23ff147733d587e3e3069904d0f62", + "sha256": "e657763442961bb82a96d276b6a97e4a9cce783c2225792a9c7c3eb428ef3652", "kind": "asciicast", "state": "command-palette-80", "columns": 80, @@ -404,7 +404,7 @@ }, { "path": "states/command-palette-80.png", - "sha256": "a78d44cc23cc18771a3d1fff3e169ff11c17215855d3ba2be8963b264307068c", + "sha256": "b61cffc8c0d0ef0b619a6ee7010e52ba855616a5346fad25ffeb3209c4433aa3", "kind": "png", "state": "command-palette-80", "columns": 80, @@ -412,7 +412,7 @@ }, { "path": "states/command-palette-120.json", - "sha256": "d45b27cbca7d324ab8cb861e486d9b8c48a0ff9ceed3961211c1202462dc9992", + "sha256": "ebebb853471835f503e7ae4f25d6144bf45659f1f9349efc5b8c8a6ea9911a31", "kind": "semantic-state", "state": "command-palette-120", "columns": 120, @@ -428,7 +428,7 @@ }, { "path": "raw/command-palette-120.cast", - "sha256": "68e1c98e8afb4958e9ff1037037d6a9a02b55554136a1c8cda99e7a4f2425ae4", + "sha256": "43134eda39f477069f203714c25c608d73f0547a8594f06c4a3e84e4a4e009fb", "kind": "asciicast", "state": "command-palette-120", "columns": 120, @@ -444,7 +444,7 @@ }, { "path": "states/command-palette-120.png", - "sha256": "a16664b927fffd8e1b53a09490cdc87d92ea0beaf169461c76461af4819f5a28", + "sha256": "1ccacd89d917d48d98377ea057d5232202bd865f367cf06a935c14acfb971bfa", "kind": "png", "state": "command-palette-120", "columns": 120, @@ -452,7 +452,7 @@ }, { "path": "states/empty.json", - "sha256": "7dc2d5b49371a26d3a4b5a487977b4044805b8c047002406cfe0589837062528", + "sha256": "47afd8a5e0d6717f420063d4ea9e4df1f84445883ed6e1debf87cd2ec767ac0a", "kind": "semantic-state", "state": "empty", "columns": 80, @@ -468,7 +468,7 @@ }, { "path": "raw/empty.cast", - "sha256": "a192782e430b7294ac0494dc8f46564e3b93d175ee95ec272af1c304fc63bc4d", + "sha256": "c5248633d81acf407a023475137c2943d590754d2bb5ac3e1788b149dddfbe96", "kind": "asciicast", "state": "empty", "columns": 80, @@ -484,7 +484,7 @@ }, { "path": "states/empty.png", - "sha256": "bcff4e37ecd6f0e3a8a4c22dc39ea7936a35402b7b70e25a28a807d51907bf9b", + "sha256": "74e8a83242e4a6b8f638f4ed22f6edfe68e9a5b4716d3012e1033e47d2ba085c", "kind": "png", "state": "empty", "columns": 80, @@ -492,7 +492,7 @@ }, { "path": "states/active-streaming.json", - "sha256": "94f786805f9ef3b3cab32ebeee4c47771edc7fa474b348aa28003d90fff27e6c", + "sha256": "71c56959646e2fe001522acc8bd8b5de659578ff620732661fc90339e5a905a7", "kind": "semantic-state", "state": "active-streaming", "columns": 80, @@ -508,7 +508,7 @@ }, { "path": "raw/active-streaming.cast", - "sha256": "7ee029850699d7467fb3d49fe7fabbc6fc81232dcd2663f91d7cf62ab5c4b473", + "sha256": "79b86246efe93a8ece606676e5c962b5a7693118e4690b15ad4313584e02ff7f", "kind": "asciicast", "state": "active-streaming", "columns": 80, @@ -516,7 +516,7 @@ }, { "path": "states/active-streaming.ansi", - "sha256": "0e5e03726bf854f2aedca96d72cea683a111d4206d74c7e654a60676791c66ad", + "sha256": "8f257fe6cc7f6acb7a2ca7ded88fe993da932eb85fbbb67a52e299418b2d7424", "kind": "ansi", "state": "active-streaming", "columns": 80, @@ -524,7 +524,7 @@ }, { "path": "states/active-streaming.png", - "sha256": "6766de806225e410cf79fa35b332a7bdb1bc5038cc32dcc7384f2d1ea9609f82", + "sha256": "429dcb7b94418bc66579dcae6a07a0dabb4413fa32406ec0e6556bcc6dc7f81e", "kind": "png", "state": "active-streaming", "columns": 80, @@ -532,7 +532,7 @@ }, { "path": "states/multi-run.json", - "sha256": "3bee00e6ab06e2f493ea310b4e17534a5cf84cb132ce529678beb42aa2c08415", + "sha256": "4d6088df334a92a138a5ac8d63a48a4ec560475aa9340e0f1968fd4befaff563", "kind": "semantic-state", "state": "multi-run", "columns": 80, @@ -548,7 +548,7 @@ }, { "path": "raw/multi-run.cast", - "sha256": "651e77d7be5f0e1555faf9074829a3b7f436367dec92b3004905143f9dc43920", + "sha256": "5bde3ca6f4a2174dcc90dcec7394c33c171dea373c9be51b2dc861f1bd05e959", "kind": "asciicast", "state": "multi-run", "columns": 80, @@ -556,7 +556,7 @@ }, { "path": "states/multi-run.ansi", - "sha256": "98d975a77070649c0261e0e8bec787e73d3e47c697c9237814be7d552ff4d559", + "sha256": "c4c75e26b7a9f5736994f0424f06acb7dba65b6c473844b83413322a7f6dbe72", "kind": "ansi", "state": "multi-run", "columns": 80, @@ -564,7 +564,7 @@ }, { "path": "states/multi-run.png", - "sha256": "f3bad77d3f9ba68e9fd94716510ac794cc57a96f9bdeb21d4de49c16a983a4b6", + "sha256": "13fcf78ca1940db056be73b182943887bbb8ebcf31d53d95f9ffecf84ac03161", "kind": "png", "state": "multi-run", "columns": 80, @@ -572,7 +572,7 @@ }, { "path": "states/supervision.json", - "sha256": "cdff563ac75acf430c6d348f5e37264d30ef044555281b329a3d29a0a09bb2a0", + "sha256": "a6388ad92cd504fc918a57951128d20eb111e5a73bf068c5d1ad08914f5d167a", "kind": "semantic-state", "state": "supervision", "columns": 80, @@ -588,7 +588,7 @@ }, { "path": "raw/supervision.cast", - "sha256": "2e19dc025d477b436bfc007cd63481d0802182264cc6e6763b1a6949c29f6da9", + "sha256": "b1e0935e7b6b21d23764539e8c24eb5c3a3151aafd9d2c24005cf297c64b6e9c", "kind": "asciicast", "state": "supervision", "columns": 80, @@ -604,7 +604,7 @@ }, { "path": "states/supervision.png", - "sha256": "521ce84bf91369b24d5229cf618ebaf0cc36c7f5f197933f829b915d7d1a5e89", + "sha256": "be6b14047938f26e4a79571ea67963266ba07f9d664d757efd311259dcbe1d66", "kind": "png", "state": "supervision", "columns": 80, @@ -612,7 +612,7 @@ }, { "path": "states/interaction.json", - "sha256": "17fef216654e73bf174c8ee8db5d4d1228b7055025c79ab450af3f907ddaa346", + "sha256": "6d264fc07a1001ad19b23f47587153e053b350869eb0fcc20b380ff4ab420d64", "kind": "semantic-state", "state": "interaction", "columns": 80, @@ -628,7 +628,7 @@ }, { "path": "raw/interaction.cast", - "sha256": "27228acccc67ad707666ccf53f2fd35f50f4dc958efcd296c1ee8d1629b5af72", + "sha256": "7de991d2ce3adceb73472ffb82f1fb0311e1b21a50c1bab742882462b853fc5c", "kind": "asciicast", "state": "interaction", "columns": 80, @@ -644,7 +644,7 @@ }, { "path": "states/interaction.png", - "sha256": "5a55826e632960a1b548af0d82514c6d0e820b382a0abdcfc737738e316ec7b2", + "sha256": "e3609d5ea5d5e781ecc94e643922926ea29d14f7068b9cc6ec2d4c5ccacbca5b", "kind": "png", "state": "interaction", "columns": 80, @@ -652,7 +652,7 @@ }, { "path": "states/automation.json", - "sha256": "386bd22196f699272a9fed1e80a3e2f3af316d7899344e307793e2f6bcfe11b0", + "sha256": "9e42bcbcb423c76905a88eada957bd2a821ef71843fe77fba5115397b1e2a7c0", "kind": "semantic-state", "state": "automation", "columns": 80, @@ -668,7 +668,7 @@ }, { "path": "raw/automation.cast", - "sha256": "a1835934b1a73874465cfb922572c8a71fd697f72f43d5852941dc1cd4199bca", + "sha256": "b6f313d3d0d85a03eed062496d469b6d5532f97640ffdeeaf88a7c12a148b8b1", "kind": "asciicast", "state": "automation", "columns": 80, @@ -684,7 +684,7 @@ }, { "path": "states/automation.png", - "sha256": "dc9d1987bc87d9ca8a50c9c2890ddc847b5ab560ad3d3a85e1d584976d0aea88", + "sha256": "29789fa8f4dc0e14d7b359fdccabdff22bbeac13f949c007c43fb2a329d4607b", "kind": "png", "state": "automation", "columns": 80, @@ -692,7 +692,7 @@ }, { "path": "states/fork-preview.json", - "sha256": "6695b4392cb0196ab8ad03ac15f8f7f29559fb4a8019410856285466b19cd93e", + "sha256": "61f8a2799dab35f4b47ee2d78f7254937e18b47e199aabeb2dda00c2559607ad", "kind": "semantic-state", "state": "fork-preview", "columns": 80, @@ -708,7 +708,7 @@ }, { "path": "raw/fork-preview.cast", - "sha256": "825bb48cbd39c8c9168f2c17ac9fd94ba503e2814883186adcd2ec6b44f3632d", + "sha256": "b186f2d25e06db8339e430067a86ea5a479d91b921d1e6b1a32cd031f33c1963", "kind": "asciicast", "state": "fork-preview", "columns": 80, @@ -724,7 +724,7 @@ }, { "path": "states/fork-preview.png", - "sha256": "9beed4a68a906df03413f039a5e90b4c8c4076ad23ba48217f9cb7181732962a", + "sha256": "53e46b17876b351baba8af3609f3dc5cfea28fc26bb79d2266dc8c898581f24e", "kind": "png", "state": "fork-preview", "columns": 80, @@ -732,7 +732,7 @@ }, { "path": "states/graph-or-analysis.json", - "sha256": "f54468400e2d5f55168570ffce55bd77145f7f9a41c5471d0c093b01ed10e577", + "sha256": "900bf81ae4a50231d249dfc298b4c6e8c7b49e9eebc2e518b1788cd0beb10821", "kind": "semantic-state", "state": "graph-or-analysis", "columns": 80, @@ -748,7 +748,7 @@ }, { "path": "raw/graph-or-analysis.cast", - "sha256": "c989791d7c61f7372c4c3577e092981832693dcea6f4bc2de5cb13cffb3c6cb0", + "sha256": "5d539182123592304407d6771914d69e6bb2833205abd978af09b7e20e198871", "kind": "asciicast", "state": "graph-or-analysis", "columns": 80, @@ -764,7 +764,7 @@ }, { "path": "states/graph-or-analysis.png", - "sha256": "f072ece9d953675f19af838c3a4d99ad0509ea9fd08dc6b718a5383a2e6e6cf4", + "sha256": "a371550ca924acc6aeff097404847ac28a91702a4b3bfcb59f0d38177484fdf3", "kind": "png", "state": "graph-or-analysis", "columns": 80, @@ -772,7 +772,7 @@ }, { "path": "states/analysis.json", - "sha256": "2af19093182cdd20bdf345f99a421f8203967ade78be0c0e00f45146a68e5b6c", + "sha256": "828a3caf3daf27888d148593f1879d7c89a199b929c24723c5442a5dd38e7ff1", "kind": "semantic-state", "state": "analysis", "columns": 80, @@ -788,7 +788,7 @@ }, { "path": "raw/analysis.cast", - "sha256": "2f16f9722adf101e06aa021e7b8b272c9c59519b0a75414b83543fde3876a4ef", + "sha256": "41b99c0a6604c92f8b691d1aebc2e6847d488992f54d504bcc89a3812dadc1fa", "kind": "asciicast", "state": "analysis", "columns": 80, @@ -796,7 +796,7 @@ }, { "path": "states/analysis.ansi", - "sha256": "7a3706d836f53afff168f087c7c6ccfbe608ebff0905e774e99bd043367b0abe", + "sha256": "af70e39675929e6c9346f7f4a9eee39f40275473fef2f2f549279087bf75bc04", "kind": "ansi", "state": "analysis", "columns": 80, @@ -804,7 +804,7 @@ }, { "path": "states/analysis.png", - "sha256": "267017481cca6d1b99b5564dbacb096768667d0d176290d309ef2ca6d3740d1e", + "sha256": "c9fedc97f5f59d770f76e967056e8a06aeaa0a1f189b63a5edceff0c94a06cbc", "kind": "png", "state": "analysis", "columns": 80, @@ -812,7 +812,7 @@ }, { "path": "states/comparison.json", - "sha256": "e1adce13bc7569da4c3eb2ddd0d94db714ebaae54f46e4a6bfb452b2cc5a911c", + "sha256": "2bdcf736791ea2a7b6014ff77017c42de2929f9058a3951b4df0e5fcae8c9ea1", "kind": "semantic-state", "state": "comparison", "columns": 80, @@ -828,7 +828,7 @@ }, { "path": "raw/comparison.cast", - "sha256": "1319a2d17bcb0d6c450cc1d18048be0b75665694250161c698023359ff081f10", + "sha256": "4c849b0a38fad8c9ba063dd1558b3464dc757497a081c0ef990e30eccbca9d39", "kind": "asciicast", "state": "comparison", "columns": 80, @@ -844,7 +844,7 @@ }, { "path": "states/comparison.png", - "sha256": "11db8b0a750d51636212dcfe18e6598827f5832c4e591389a59687c35997bb99", + "sha256": "47a8581b83d535fe47c69bb005f52702483c2c3fdd18c75c022b3ceaf4dec8c7", "kind": "png", "state": "comparison", "columns": 80, @@ -852,7 +852,7 @@ }, { "path": "states/profile.json", - "sha256": "6480f34d85aed3f6fd626b0bdada5965935bf77713d7bfe5b237dc1915549765", + "sha256": "8e07e14991194c9ac4f561d6f9897fa7fd827aac320b186ab979ba3c58225ecd", "kind": "semantic-state", "state": "profile", "columns": 80, @@ -868,7 +868,7 @@ }, { "path": "raw/profile.cast", - "sha256": "1e801c13ae975ef398729d9362a859cebbdf232fa0fff74a7ca2e623bd2d71f7", + "sha256": "e6c6cb5b437b5e2f0f79da9592471a50e4bd774cce85e37b6102786e47feff90", "kind": "asciicast", "state": "profile", "columns": 80, @@ -884,7 +884,7 @@ }, { "path": "states/profile.png", - "sha256": "b91a4d8149e96e9ecd6993d8b8e382ff17c2f871886f00783f77ee55c0ade9e7", + "sha256": "d56bd3ca3bbb73bb2d19fe2085356c76ba77bf1cae09b55180c88ff51b088845", "kind": "png", "state": "profile", "columns": 80, @@ -892,7 +892,7 @@ }, { "path": "states/narrow.json", - "sha256": "e5a7a1d1024ac067f6de776191d4360f3ddc62999da25708b9367c17b9262eaa", + "sha256": "8629d632c3779e5bf4a3d8f0d2caccf1c1e018d2745f8c6779180199a5d84806", "kind": "semantic-state", "state": "narrow", "columns": 40, @@ -908,7 +908,7 @@ }, { "path": "raw/narrow.cast", - "sha256": "a1d312cc92b04e1333cc030056118a852e8200a10ec224e12e9be7271249f39b", + "sha256": "3126e030c4695d8e2a60d8b36ad00af3d1775bf620503ff774ed171593f58705", "kind": "asciicast", "state": "narrow", "columns": 40, @@ -924,7 +924,7 @@ }, { "path": "states/narrow.png", - "sha256": "a00fa36fee1e986871c72bc24a1b678bf6b774115ff67c9334552edb2c681ee7", + "sha256": "ac0aec3c515c06e4adae078eabf3e3a657ad5535c6993d03220e9c93a1d349f0", "kind": "png", "state": "narrow", "columns": 40, @@ -932,7 +932,7 @@ }, { "path": "states/failure-or-reconnect.json", - "sha256": "cf989dbd93b96d1a295cc3bf2545435165e0cceb23573150174b6f6b4ef495a7", + "sha256": "c1fa226d09fdbe4169cc8c15a0e7c225e9cac6413abf46b90e62193ee9795c3a", "kind": "semantic-state", "state": "failure-or-reconnect", "columns": 80, @@ -948,7 +948,7 @@ }, { "path": "raw/failure-or-reconnect.cast", - "sha256": "f6e5afea15d0eb975059d6a6c3557d24bbe5c478267025d6e4346c927898b7a9", + "sha256": "3f2e8a831b9f8749df3f125fa332f7dde7cb4294b12062b2e50b922e408444f4", "kind": "asciicast", "state": "failure-or-reconnect", "columns": 80, @@ -964,7 +964,7 @@ }, { "path": "states/failure-or-reconnect.png", - "sha256": "77d5c40d0b688f0f1c8ed9ea98ac26b7c27337fa1d8eb472ba4dfea0e768e135", + "sha256": "4dc9e1f3e330b00e03a955f0e8f63af67d84728a6a6580386478650cba18a90b", "kind": "png", "state": "failure-or-reconnect", "columns": 80, @@ -979,7 +979,7 @@ }, { "path": "80x24-automation.gif", - "sha256": "5ce95b76a7f7450313b78c54702beb85b897b701b5efad1476739ec6ae5af049", + "sha256": "352145984fba2e0f9a648e30e128e381066ef5e57275893bdaa2bc30e82c81bf", "kind": "automation-flow", "state": "automation", "columns": 80, @@ -987,7 +987,7 @@ }, { "path": "80x24-multirun.gif", - "sha256": "799759d72129e8e14e33c94e59cbfba4e76dbf39b8431ce386b4bbf326445da0", + "sha256": "b46bb222d0225943056d7a32c0dd467a84d0e45c69a43e754e68fccb66d547f0", "kind": "multi-run-flow", "state": "multi-run", "columns": 80, @@ -995,14 +995,14 @@ }, { "path": "raw/transcript-keyboard.cast", - "sha256": "752a2e6948ab2dcdef4e47eed351cf0c613ad9d8c8f51a5e39254092229e8353", + "sha256": "0679841ed1b1a28278ae3474de5a76456930495a47ca319c968f17baa351c3ab", "kind": "keyboard-asciicast", "columns": 80, "rows": 24 }, { "path": "80x24-transcript-keyboard.gif", - "sha256": "07eca21de075863c291f421842734a781ba8d471a2441c850bb0b7eb492832c1", + "sha256": "c9b4affd2aa045b8514c817546f71bd70a9f522387f2e9a2f0a3f2551da0d22b", "kind": "keyboard-flow", "columns": 80, "rows": 24 diff --git a/artifacts/verification/w6/package-proof.json b/artifacts/verification/w6/package-proof.json index 1fead57c..996f8ff1 100644 --- a/artifacts/verification/w6/package-proof.json +++ b/artifacts/verification/w6/package-proof.json @@ -1,10 +1,10 @@ { "tarball": "tangle-network-braid-0.3.0.tgz", - "sha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c", + "sha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9", "version": "0.3.0", - "gitCommit": "4f97573380bedf01943604813447588d0cfc8016", - "treeSha256": "d3dd69e95958f6ffef72ca37c2beed4487569a52", - "sourceDigest": "c893a730eb2e5f35cb231bd4e8264dced4b86570ea3799aeef0c45b114ee8b49", + "gitCommit": "515b5af81a69c662713ef4f9a4a5d2d38a906fe6", + "treeSha256": "e8dc8ae7d9e68ca1d12a7e8dd547585269dfcd34", + "sourceDigest": "f54b865d7e36477b0542bddf8034eedef44ac9f505af776b75282f9bbb2e5919", "isolatedBuild": true, "sourceCheckout": "isolated-copy-of-worktree", "packageFileManifest": { @@ -810,25 +810,45 @@ "size": 262, "sha256": "2ac975e46e4c95050633d4b59bf66f8168389488a1a66fa4d5f1ec1594939954" }, + { + "path": "package/dist/adapters/runtime/cli-bridge-context-transfer.d.ts", + "size": 861, + "sha256": "06d54deb433c36431d2576c86abeca05f4369a447a7b91381d5eda4a22070f08" + }, + { + "path": "package/dist/adapters/runtime/cli-bridge-context-transfer.d.ts.map", + "size": 626, + "sha256": "3e02f6a1f4b3688ec6f53d073fac1a614e3893ff15f76061ee77a67f634aeb5c" + }, + { + "path": "package/dist/adapters/runtime/cli-bridge-context-transfer.js", + "size": 1778, + "sha256": "f16cdcd0d193b129302105c592bd63da27a04b3eefe521dd11b12fe733c7a96b" + }, + { + "path": "package/dist/adapters/runtime/cli-bridge-context-transfer.js.map", + "size": 1511, + "sha256": "679ab8ff08bd87524a19eaf75a318d11881db0fbd0f9c0618bf29ed643848cb1" + }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-execution.d.ts", - "size": 1063, - "sha256": "140f63295a3b41eb0b6102a7c3ae330195881e0d90975a462f99d2ab4195d7b5" + "size": 1199, + "sha256": "74ec9a56c40fe76347efd68cc4a1bae34600108628273ef3147c216a522cf46f" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-execution.d.ts.map", - "size": 827, - "sha256": "5304b2ae1247286622049a8a24f3f6f704c21047d133dd256ee735c87a24d526" + "size": 928, + "sha256": "84846704ec8f77cdc1704bb4877ac5f637392045f811bb66a3d3551e0e08234b" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-execution.js", - "size": 1134, - "sha256": "41251eefeb0130ffacfc05dec0023ed3f9368cc0c79ee6e8f10596693e249d2d" + "size": 1234, + "sha256": "6c32e25be5df2001b125f68e01866ad460215fe0d8551f7bb6af73179ea904af" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-execution.js.map", - "size": 1109, - "sha256": "4ad7fcd819c4a4c7dcaf16e25b420a0fa02e3a0d720806bee2452ecafb4c746b" + "size": 1207, + "sha256": "c123a9ea53910673ece3b3132da57f81df59295e8b01381d2ded6c84cec44db0" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-run.d.ts", @@ -838,17 +858,17 @@ { "path": "package/dist/adapters/runtime/cli-bridge-retained-run.d.ts.map", "size": 1218, - "sha256": "fbddd0fa4be36d12af5492f29d6b45738938fcd1b9fbe64629b1a74738e0d4b8" + "sha256": "dad7ebe5f34375c61be9efbeb84fde60299be1e0b40f28d5bae2b00a48aa29c0" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-run.js", - "size": 7726, - "sha256": "f621170aa957a8ec93ee6eb3f6fc4696c3182504e2d224b5aa3e5a13477945d0" + "size": 8609, + "sha256": "6694f91541bbb7705dbd1ad0952e4aaa40d4040da15a7ee89d780096a5c2e0ed" }, { "path": "package/dist/adapters/runtime/cli-bridge-retained-run.js.map", - "size": 6487, - "sha256": "a1ec9057cdb661b98b7c2e235dfcd1dc3521761150aa69275aaeaa777c7b493d" + "size": 7183, + "sha256": "be734be9c80e092a3488ab5775f058ab28cc7207bc702a69a6f9b5ed6b6befde" }, { "path": "package/dist/adapters/runtime/execution-observation-source.d.ts", @@ -992,23 +1012,23 @@ }, { "path": "package/dist/adapters/runtime/production-cli-bridge-backend.d.ts", - "size": 1557, - "sha256": "2361c757743c1b717a20ca7f1d595bc85f437f5b8a0234af13eddda47d1dc528" + "size": 2136, + "sha256": "a77680eca0be436561ef9e0a948aeddbc51162de311b9fc7148b6344487d72a1" }, { "path": "package/dist/adapters/runtime/production-cli-bridge-backend.d.ts.map", - "size": 1372, - "sha256": "08cae03ebcfa071104c374053ab94a1921fff041e4c4abf44b1b565e80bb1271" + "size": 1781, + "sha256": "76f4930c91bf9b29f794a6d7a4a85861aa1394988abca94ae3201ac443e0156b" }, { "path": "package/dist/adapters/runtime/production-cli-bridge-backend.js", - "size": 6986, - "sha256": "0d523c8a7d325e32ccc86feaa048e3ac6e354011c9e059e67a651a6dad5f6d9c" + "size": 8805, + "sha256": "7ca44ebdc7116e4ca9c813a436c92ee1c431ad0f670fdd29eb3ea09c1978f426" }, { "path": "package/dist/adapters/runtime/production-cli-bridge-backend.js.map", - "size": 5663, - "sha256": "4d2eb5c0936e963c8984f915b1ff0bb23cf6eedc1679c481037c82c41dff2bf3" + "size": 7028, + "sha256": "32d3079855bce2a58a83d4e60773b731681ccfdd02c390601ef8e90f22dfc3a4" }, { "path": "package/dist/adapters/runtime/production-tangle-inference-backend.d.ts", @@ -1118,17 +1138,17 @@ { "path": "package/dist/adapters/runtime/retained-execution-stream.d.ts.map", "size": 811, - "sha256": "907c9512cfaf24ddad53b8def2a2dbdb51d75bb7590a79c3b62952bffa1a9804" + "sha256": "6957487804091829c9d4d49b73b79d4064be0ef059bdb5f0e8290b999a89f6df" }, { "path": "package/dist/adapters/runtime/retained-execution-stream.js", - "size": 1939, - "sha256": "289c56365b43d9250f2f22ebe7fb7a5a272c57fd09aa98e8df8b04fa217b39cb" + "size": 2500, + "sha256": "e94169a343cde478e151e2b44cb58ec3b6f29ce97bdb66c4ce0c86ffb7da383d" }, { "path": "package/dist/adapters/runtime/retained-execution-stream.js.map", - "size": 1985, - "sha256": "2c7abace45c973b8c1e7ff488edf92f3fab216cd5d9c4d9e4322430557fc9c34" + "size": 2298, + "sha256": "991577144799427c81a0d51c888ad753df7720e24c5ca4ee7b6361a37b6d4e81" }, { "path": "package/dist/adapters/runtime/retained-execution.d.ts", @@ -1638,17 +1658,17 @@ { "path": "package/dist/adapters/storage/sqlite-crypto.d.ts.map", "size": 500, - "sha256": "006299c7091a65a7ee98a2c03d523e753d9732f27c184f72671f98b11804b9f5" + "sha256": "3177112a040830a8d3a133a8e50a4d4b1a9137c1ab1a6fa768cba29b899d208a" }, { "path": "package/dist/adapters/storage/sqlite-crypto.js", - "size": 8068, - "sha256": "83ed6ae5d00eb78614d2cdeeb49ac19e97936246443dd22049b47c3e6ca9caef" + "size": 8494, + "sha256": "b24c5dd134cc2ee35aed7cefc78000c02385f1cfa3379149548613d0a685667e" }, { "path": "package/dist/adapters/storage/sqlite-crypto.js.map", - "size": 7501, - "sha256": "995cc2207bcbeabe8e98f8af9e7075be8762aa56979152fe43bbd73a5f2ef193" + "size": 7890, + "sha256": "9fb0ad3fb0a686a6cba4c5f70e376f09dbc8a423a60581ee2dc0077a9fa393ea" }, { "path": "package/dist/adapters/storage/sqlite-driver.d.ts", @@ -3822,13 +3842,13 @@ }, { "path": "package/dist/app/conversation-branches.js", - "size": 23468, - "sha256": "457a9a204845a9808bdab75de5aed76cd5da7cae928a58fb92de23cb4bb11067" + "size": 23481, + "sha256": "ab2700a114639e548d82a3e816b19899fbe3ce8193648c1fcd972113da30869c" }, { "path": "package/dist/app/conversation-branches.js.map", - "size": 21865, - "sha256": "9d6092f88338cc3d2eef069bc879941ee10732335e97565031f551dc08b4c305" + "size": 21885, + "sha256": "70aba7052a8e6aec364400093853c5ddf015166b2b6501202518522e5ced5bef" }, { "path": "package/dist/app/conversation-composition.d.ts", @@ -4593,22 +4613,22 @@ { "path": "package/dist/app/production-composition.d.ts", "size": 2549, - "sha256": "065aeeb2a634ab9bb700625a52b54b09a8c51100025d08968a77d2919a344042" + "sha256": "825be10292c8c9f930d0edeb67701dd3d99984e39d83fe6eec226ef4316f8e22" }, { "path": "package/dist/app/production-composition.d.ts.map", - "size": 1577, - "sha256": "d94af449f94806efddde537e5c0b062abcc16a617af0212d393199af9a817cb8" + "size": 1578, + "sha256": "cda86ffa594e6dea016d6146bee1e904d104ce3e9deb0ed0a9a123c590d08d02" }, { "path": "package/dist/app/production-composition.js", - "size": 10553, - "sha256": "282eb2f14dee2ed6dd0e2f7d561115e53df805065ec0ed91023acd5ce5e9a375" + "size": 11675, + "sha256": "7fa98c871ca11c0c5d8386b6cfb598c927557944ec2bab01ef2c75a80180df04" }, { "path": "package/dist/app/production-composition.js.map", - "size": 8061, - "sha256": "8f7c360503b306c6b170bf094e5f15b536e96e056b49ac85d0c68b981c3bbd8a" + "size": 8772, + "sha256": "180e5736c4d11cb0ff07d574e6a15de0417d8ae08a30d18efad18f8764bfe714" }, { "path": "package/dist/app/profile-action-support.d.ts", @@ -4738,17 +4758,17 @@ { "path": "package/dist/app/profile-selection.d.ts.map", "size": 357, - "sha256": "5dbbdaca43921a5b622b13f7168d36cbd90bbc320b8227a3a1aad00d51588913" + "sha256": "c4e7a67a2b2fbbf562a177f2fd03eea76ca4932e804e50514065d89392a3f1b2" }, { "path": "package/dist/app/profile-selection.js", - "size": 5121, - "sha256": "fd193ec876ce3c29bc2aa9029cd019b470d6f6527bd4df65c6413d2d57f49094" + "size": 5547, + "sha256": "4716aff60c6829188375226e3c7b217c7446bee82fd9f5657c4b5f003d771f51" }, { "path": "package/dist/app/profile-selection.js.map", - "size": 5176, - "sha256": "26db347c14953f9b129c652eeb39675fa2c0959ad308c13f7202c54a45ac6648" + "size": 5579, + "sha256": "04fb1ac322ca691c1d5905674ba7610731c452a0db521767e614b8b66c4d96f6" }, { "path": "package/dist/app/profile-snapshots.d.ts", @@ -7158,17 +7178,17 @@ { "path": "package/dist/domain/reducer-runtime.d.ts.map", "size": 828, - "sha256": "c548568b811c406c6022a08d12462995df5af42c7b49c07457ce295674303fe0" + "sha256": "9e62d7d8a55f3bacffd20fce494c474cf3a7332c354d906c02103eb821cb1b51" }, { "path": "package/dist/domain/reducer-runtime.js", - "size": 6578, - "sha256": "3f583149e8d539e4646eca3e17b4124953114ceba0441c3db27d65aef30aef7f" + "size": 6787, + "sha256": "7b9cef2aa0aecb8873de37ef27857924898fbdbb15d82c1926c73580cd9e0871" }, { "path": "package/dist/domain/reducer-runtime.js.map", - "size": 5899, - "sha256": "9f511db403a58ef4c38c4d5b54e4c80decd066df96741fb86d38218bdda64048" + "size": 5991, + "sha256": "f510de444d6cf78d439ef4ac757e32575d0f7a8bb4a570e779ec22a777a26f76" }, { "path": "package/dist/domain/reducer-support.d.ts", @@ -8238,17 +8258,17 @@ { "path": "package/dist/views/headless/rpc.d.ts.map", "size": 460, - "sha256": "fa65c8fe62b5ca8ca9fda7c7d974a0ca74fc0af125eec327843ece710d37e0c4" + "sha256": "a5899e3b947df9dd17b606d3e5547635941c96c0f17aae12f48209a352d10d13" }, { "path": "package/dist/views/headless/rpc.js", - "size": 18893, - "sha256": "948a9f2c88164fefbb33d0d4408c44e41167896a2f0b96a575127cf6c06bbece" + "size": 19431, + "sha256": "d54ef4da2814fcbbf980c26e70058b16252a46a80d9fefad376305b673d09fa8" }, { "path": "package/dist/views/headless/rpc.js.map", - "size": 14940, - "sha256": "4094e1d97979008c7070bbeba05ba90cd9dd334b2305d1ca74ab50b068209e1d" + "size": 15381, + "sha256": "8ad45c42bbc31fd6cecfceacfe1b3a33c07e9e34a2227198b73b24c502d07631" }, { "path": "package/dist/views/shared/analysis-model-call-presentation.d.ts", @@ -8718,17 +8738,17 @@ { "path": "package/dist/views/shared/semantic-projection.d.ts.map", "size": 580, - "sha256": "63803a6cda605e4d143071b913af1602a1054dbe3e5c43678bdc15c200ffdf74" + "sha256": "b3a3a1580c531350cdd0c1fca0a4312ddf59afc654b504159fab19dd9b7ab8f3" }, { "path": "package/dist/views/shared/semantic-projection.js", - "size": 16731, - "sha256": "b26f09b65c7d76539ffc6f321f8afddde45f7c4d058124b31b9fe7b1e21f7568" + "size": 22885, + "sha256": "741d5f86b53b91816b04438beee437cd8910635339042531eee4aa044a6ffd84" }, { "path": "package/dist/views/shared/semantic-projection.js.map", - "size": 16482, - "sha256": "500aa03bd74c1cbc91be87561988649333841258cb93127d2daf0e5470f0b7cf" + "size": 21654, + "sha256": "ad7b16160d99cad8dc8fe87590646893133700b2ae7bb6f915a0f2ceb0921b13" }, { "path": "package/dist/views/shared/semantic-query-scope.d.ts", @@ -10233,10 +10253,10 @@ { "path": "package/package.json", "size": 6160, - "sha256": "5b6a72ffdb83769fd440001e817247111413bca8e6feb6eb4ba1c287e4e43ced" + "sha256": "c4980275f346b60e04de4299c77d9b1b04cf37f38728b533513520d4b2aff5f1" } ], - "digest": "f4b81fe5197fd1478b892a14fa18da61ccbe0053a5466f38f53e5a043be554b0" + "digest": "25eb4c33b72cfd93131316431d5e0203003a4fb4532285fb1cb71d85c4ff6944" }, "rpcRecords": 37, "referenceSizes": [ diff --git a/artifacts/verification/w6/raw/transcript-keyboard.cast b/artifacts/verification/w6/raw/transcript-keyboard.cast index a5444d3c..a162e209 100644 --- a/artifacts/verification/w6/raw/transcript-keyboard.cast +++ b/artifacts/verification/w6/raw/transcript-keyboard.cast @@ -1,65 +1,80 @@ -{"version":2,"width":80,"height":24,"timestamp":1788008297,"duration":1.756396,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} -[0.292471,"o","\u001b[?2004h"] -[0.292587,"o","\u001b[>7u\u001b[?u\u001b[c"] -[0.292604,"o","\u001b[?1049h\u001b[2J\u001b[H\u001b[?25l"] -[0.303119,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.30315,"o","\u001b[3A\u001b[2G"] -[0.303156,"o","\u001b[?25l"] -[0.326173,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] -[0.330584,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.330647,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.342254,"i","keyboard-flow-01"] -[0.34235,"i","\r"] -[0.346939,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-01\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.35533,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.378385,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.443399,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.524738,"i","keyboard-flow-02"] -[0.524834,"i","\r"] -[0.529164,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.530742,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.548013,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.599336,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.685218,"i","keyboard-flow-03"] -[0.685312,"i","\r"] -[0.688419,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.690295,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.70698,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.76263,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.846709,"i","keyboard-flow-04"] -[0.846798,"i","\r"] -[0.84927,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.851212,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.867799,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.922685,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.009328,"i","keyboard-flow-05"] -[1.009431,"i","\r"] -[1.012536,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-05\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.014385,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.032045,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.085954,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.172099,"i","keyboard-flow-06"] -[1.172211,"i","\r"] -[1.174371,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.176229,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.193667,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.250526,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.33621,"i","keyboard-flow-07"] -[1.336307,"i","\r"] -[1.34013,"o","\u001b[15G\u001b[?25l"] -[1.356209,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.41324,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] -[1.413318,"o","\u001b[?25l"] -[1.497999,"i","keyboard-flow-08"] -[1.498103,"i","\r"] -[1.500227,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.502393,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.519104,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.576931,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.660355,"i","\u001b[5~"] -[1.66044,"i","\u001b[1;3H"] -[1.665231,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.742854,"i","\u001b[6~"] -[1.742959,"i","\u001b[1;3F"] -[1.746396,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.756396,"o","\u001b[0m"] +{"version":2,"width":80,"height":24,"timestamp":1788029378,"duration":1.78627,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} +[0.322567,"o","\u001b[?2004h"] +[0.322727,"o","\u001b[>7u\u001b[?u\u001b[c"] +[0.322739,"o","\u001b[?1049h"] +[0.322744,"o","\u001b[2J\u001b[H"] +[0.322758,"o","\u001b[?25l"] +[0.330883,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.330929,"o","\u001b[3A\u001b[2G\u001b[?25l"] +[0.356859,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] +[0.36038,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.360404,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.361536,"i","keyboard-flow-01"] +[0.361583,"i","\r"] +[0.365955,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-01\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] +[0.365989,"o","\u001b[?25l"] +[0.367321,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G"] +[0.36736,"o","\u001b[?25l"] +[0.40859,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.468357,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] +[0.468409,"o","\u001b[?25l"] +[0.562206,"i","keyboard-flow-02"] +[0.562276,"i","\r"] +[0.566147,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] +[0.56619,"o","\u001b[?25l"] +[0.568135,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.568144,"o","\u001b[15G"] +[0.568149,"o","\u001b[?25l"] +[0.584656,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.584682,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[0.636771,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.636831,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[0.723678,"i","keyboard-flow-03"] +[0.723749,"i","\r"] +[0.726097,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.726135,"o","\u001b[31G\u001b[?25l"] +[0.727942,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.744462,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.744509,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[0.798614,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.886597,"i","keyboard-flow-04"] +[0.886692,"i","\r"] +[0.889233,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.891338,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.906988,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.966684,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.048501,"i","keyboard-flow-05"] +[1.048568,"i","\r"] +[1.053495,"o","\u001b[15G\u001b[?25l"] +[1.068593,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.126936,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.209763,"i","keyboard-flow-06"] +[1.209829,"i","\r"] +[1.211641,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.213517,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G"] +[1.213525,"o","\u001b[?25l"] +[1.230168,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.230216,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[1.287134,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.370074,"i","keyboard-flow-07"] +[1.370144,"i","\r"] +[1.371958,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-07\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.374444,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.374483,"o","\u001b[15G\u001b[?25l"] +[1.393488,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.454533,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.530449,"i","keyboard-flow-08"] +[1.530533,"i","\r"] +[1.532999,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.535527,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.550823,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.61134,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.692165,"i","\u001b[5~"] +[1.692246,"i","\u001b[1;3H"] +[1.694459,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] +[1.694498,"o","\u001b[?25l"] +[1.773162,"i","\u001b[6~"] +[1.773235,"i","\u001b[1;3F"] +[1.776199,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.77627,"o","\u001b[4A\u001b[15G\u001b[?25l"] +[1.78627,"o","\u001b[0m"] diff --git a/artifacts/verification/w6/states/active-streaming.json b/artifacts/verification/w6/states/active-streaming.json index 25532094..97a7ebca 100644 --- a/artifacts/verification/w6/states/active-streaming.json +++ b/artifacts/verification/w6/states/active-streaming.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 80, @@ -320,7 +320,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-29T12:57:55.792Z", + "occurredAt": "2026-08-29T18:49:16.505Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -697,10 +697,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-7af8efb4db2aaabf6ec9874d", + "id": "effect-op-terminal-000002-384ad0e49fd4fa9cd2f39550", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "7af8efb4db2aaabf6ec9874d6335e0371986dbea87c7625a02693d9a8a91c405", + "requestDigest": "384ad0e49fd4fa9cd2f395509b8c735ea1efe909192cfc3300f4a250d4f387f4", "kind": "send", "status": "pending", "attempt": 1, @@ -719,13 +719,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T12:57:55.792Z", + "occurredAt": "2026-08-29T18:49:16.505Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-718fa6f2-257a-4a6f-a893-7e855c481115", + "id": "turn-97b7e310-3db8-42ec-94d3-f108d406e483", "intent": "W6 active streaming", "metadata": { "identity": { @@ -735,11 +735,11 @@ } }, "session": { - "id": "0f0f50e5-afc1-4a5a-9d07-b8c4898f18db", + "id": "50f1dbda-ac67-4d26-ace8-961ede571f25", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T12:57:55.792Z", - "updatedAt": "2026-08-29T12:57:55.792Z", + "createdAt": "2026-08-29T18:49:16.505Z", + "updatedAt": "2026-08-29T18:49:16.505Z", "metadata": "[unavailable]" }, "backend": "router", @@ -761,16 +761,16 @@ }, "execution": { "kind": "request", - "id": "turn-718fa6f2-257a-4a6f-a893-7e855c481115" + "id": "turn-97b7e310-3db8-42ec-94d3-f108d406e483" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-718fa6f2-257a-4a6f-a893-7e855c481115:attempt:53ca744c-2c49-442e-b2c5-364aad62e0fc", - "materializationReceiptDigest": "sha256:13fb22bcca0e0719404ec0295edc82971091c57a35c0a41d0a341d10360735af", - "bindingDigest": "sha256:0aa5f9d69e44070ede279df98caa1a075448ba0b84f02b533764de7011bfe6b9", + "attemptId": "turn-97b7e310-3db8-42ec-94d3-f108d406e483:attempt:96894925-0be1-41ec-96f2-44cc1ce8211d", + "materializationReceiptDigest": "sha256:a63914682a3f6212d6a1f19fc5d502d858c3740c5edfca9a20d38d4b9e5b117f", + "bindingDigest": "sha256:b625a98a0d03b9d7cfd3ecb14ca9d943a4740d3dea2c9b66b36a8afa6d9aa880", "descriptor": { "kind": "router-request", "transport": "http", @@ -782,10 +782,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T12:57:55.791Z" + "startedAt": "2026-08-29T18:49:16.503Z" } }, - "timestamp": "2026-08-29T12:57:55.792Z" + "timestamp": "2026-08-29T18:49:16.505Z" } } } diff --git a/artifacts/verification/w6/states/active-streaming.png b/artifacts/verification/w6/states/active-streaming.png index 96926cb0b5fe23e2a5dcb55a9ea4200c7c19476c..12a57c396aeb7b3aab054a652d42c460d893f772 100644 GIT binary patch delta 18 Zcmexd`nhyMHoK6aV3a%C%#B5jRsc;L2Soq? delta 18 acmexd`nhyMHam}{<;KaY1UD8nS^)r5jtDLQ diff --git a/artifacts/verification/w6/states/analysis.json b/artifacts/verification/w6/states/analysis.json index 4620173e..59cc53ef 100644 --- a/artifacts/verification/w6/states/analysis.json +++ b/artifacts/verification/w6/states/analysis.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/analysis.png b/artifacts/verification/w6/states/analysis.png index c2d4a6c86b735fda7aa50a0a458bab986f696bae..0f92d3880a5dc8a13add9130cdeac1353a675d49 100644 GIT binary patch delta 20 ccmbPwf_dr*<_X#CLWZ)zAH6nhEL!{+09RNE3;+NC delta 20 ccmbPwf_dr*<_X#CJXRd16MnwfShV;t09&L9#sB~S diff --git a/artifacts/verification/w6/states/automation.json b/artifacts/verification/w6/states/automation.json index 8edb0208..8d47c659 100644 --- a/artifacts/verification/w6/states/automation.json +++ b/artifacts/verification/w6/states/automation.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/automation.png b/artifacts/verification/w6/states/automation.png index 13f39e5c0be41d2d997c98d99dfa4a29ff3e58bd..88c9d5433a3bd0a71254e67d244d4a8a6707aba0 100644 GIT binary patch delta 20 ccmdm^ut#CTHb!C`)oJwWvu4|08Xa|IRF3v delta 20 ccmdm^ut#CTHb!3}08J?d`~Uy| diff --git a/artifacts/verification/w6/states/command-palette-120.json b/artifacts/verification/w6/states/command-palette-120.json index 0ca7d4e6..77079471 100644 --- a/artifacts/verification/w6/states/command-palette-120.json +++ b/artifacts/verification/w6/states/command-palette-120.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 120, diff --git a/artifacts/verification/w6/states/command-palette-120.png b/artifacts/verification/w6/states/command-palette-120.png index 9ffafc42bb9489dd1c7e468b5b48e7cc5c39945d..a1bfb70200b42ab075a09fe3b3b56f19277ca2f7 100644 GIT binary patch delta 20 ccmcaMpXu6srU}{XLWX?T{kd~C7Nzt909Jwr^#A|> delta 20 ccmcaMpXu6srU}{XJeHhhY9%`RlfbwTNT>BgcNDgZ!I2MquK delta 18 ZcmeD3>hhY9&CX+Kq~=&Wb7RpA6#zTk26O-b diff --git a/artifacts/verification/w6/states/command-palette-80.json b/artifacts/verification/w6/states/command-palette-80.json index 48f74583..d74c7049 100644 --- a/artifacts/verification/w6/states/command-palette-80.json +++ b/artifacts/verification/w6/states/command-palette-80.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/command-palette-80.png b/artifacts/verification/w6/states/command-palette-80.png index 5fa1d245c2d415d262de1155c445fac46b720dd2..4259ae4078792d73b838bd360d8f3977e8331a87 100644 GIT binary patch delta 20 bcmX>znd!`ArU}{XLWVq+j#&;Hi=sLKPfQ0s delta 20 ccmX>znd!`ArU}{XJeDTsm9DMXSQOO>09iciFrFockyV&MRW?5kXLR1B; diff --git a/artifacts/verification/w6/states/failure-or-reconnect.json b/artifacts/verification/w6/states/failure-or-reconnect.json index 7f351336..a992cdd1 100644 --- a/artifacts/verification/w6/states/failure-or-reconnect.json +++ b/artifacts/verification/w6/states/failure-or-reconnect.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 80, @@ -336,7 +336,7 @@ "title": "event backend_start", "status": "failed", "detail": "sequence 1", - "occurredAt": "2026-08-29T12:58:13.794Z", + "occurredAt": "2026-08-29T18:49:35.058Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -348,7 +348,7 @@ "title": "error", "status": "failed", "detail": "RUNTIME_BACKEND_ERROR", - "occurredAt": "2026-08-29T12:58:13.799Z", + "occurredAt": "2026-08-29T18:49:35.062Z", "sourceEventId": "run-000001:runtime:2", "runId": "run-000001", "entityType": "run", @@ -725,10 +725,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-5e39aac4d18105dd9e577ca7", + "id": "effect-op-terminal-000002-12c768a101dbda06afca5deb", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "5e39aac4d18105dd9e577ca78326af4faad463c24670308fb8b7aa1361f7054c", + "requestDigest": "12c768a101dbda06afca5deb7d9dcae1c76a81c2075fe222c7c8be66c0bd421b", "kind": "send", "status": "pending", "attempt": 1, @@ -747,13 +747,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T12:58:13.794Z", + "occurredAt": "2026-08-29T18:49:35.058Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-2769ffcc-98ea-4612-9576-2f322f445d1b", + "id": "turn-d42e6be9-24b7-4230-818b-38afb5d626ea", "intent": "W6 failure state", "metadata": { "identity": { @@ -763,11 +763,11 @@ } }, "session": { - "id": "e9bd77a2-9b79-41bf-b5be-854afbff5652", + "id": "2e03c87a-08b5-43b3-aa03-093d7ab31dc4", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T12:58:13.794Z", - "updatedAt": "2026-08-29T12:58:13.794Z", + "createdAt": "2026-08-29T18:49:35.058Z", + "updatedAt": "2026-08-29T18:49:35.058Z", "metadata": "[unavailable]" }, "backend": "router", @@ -789,16 +789,16 @@ }, "execution": { "kind": "request", - "id": "turn-2769ffcc-98ea-4612-9576-2f322f445d1b" + "id": "turn-d42e6be9-24b7-4230-818b-38afb5d626ea" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-2769ffcc-98ea-4612-9576-2f322f445d1b:attempt:2c9ef26e-cf70-4224-8b9c-f6442fd1cb0d", - "materializationReceiptDigest": "sha256:d02922ef9799ffd4d065649684bb2ae79b30b5ad6494dbf96a14d331e9ecabb5", - "bindingDigest": "sha256:1c9a2f7c75e37f9bf99cb00ed5bca04871428aa8bdc2bcf7cd6c53261cb4e9e8", + "attemptId": "turn-d42e6be9-24b7-4230-818b-38afb5d626ea:attempt:58676d50-c9e3-4233-8e0e-1f4aac8064ce", + "materializationReceiptDigest": "sha256:04ae2d1c383de26ce002261980b27455265eea81238c78b1a6b6cd479da758e4", + "bindingDigest": "sha256:47d4bb00ab4f9cbfaaad069f1111dd4a7b03e62d5792097ad7014f08c133ca50", "descriptor": { "kind": "router-request", "transport": "http", @@ -810,10 +810,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T12:58:13.792Z" + "startedAt": "2026-08-29T18:49:35.056Z" } }, - "timestamp": "2026-08-29T12:58:13.794Z" + "timestamp": "2026-08-29T18:49:35.058Z" } } }, @@ -826,7 +826,7 @@ "source": { "eventId": "run-000001:runtime:2", "providerSequence": 2, - "occurredAt": "2026-08-29T12:58:13.799Z", + "occurredAt": "2026-08-29T18:49:35.062Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "error": { @@ -845,7 +845,7 @@ "source": { "eventId": "run-000001:runtime:3", "providerSequence": 3, - "occurredAt": "2026-08-29T12:58:13.802Z", + "occurredAt": "2026-08-29T18:49:35.066Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "status": "failed", @@ -869,10 +869,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-5e39aac4d18105dd9e577ca7", + "id": "effect-op-terminal-000002-12c768a101dbda06afca5deb", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "5e39aac4d18105dd9e577ca78326af4faad463c24670308fb8b7aa1361f7054c", + "requestDigest": "12c768a101dbda06afca5deb7d9dcae1c76a81c2075fe222c7c8be66c0bd421b", "kind": "send", "status": "failed", "attempt": 1, diff --git a/artifacts/verification/w6/states/failure-or-reconnect.png b/artifacts/verification/w6/states/failure-or-reconnect.png index 95937aa08655e5a9acbd07ceb0f7bef04dd862c7..ba3c6f4d6a57ead60de666dbac930a3ddd56c0de 100644 GIT binary patch delta 20 ccmaDfiSf}S#tGT%LWatdCWK3FEc)O909ULCKmY&$ delta 20 ccmaDfiSf}S#tGT%JXU;4%rSR27Jcvl08^d^`Tzg` diff --git a/artifacts/verification/w6/states/fork-preview.json b/artifacts/verification/w6/states/fork-preview.json index d47784de..4b366ac0 100644 --- a/artifacts/verification/w6/states/fork-preview.json +++ b/artifacts/verification/w6/states/fork-preview.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/fork-preview.png b/artifacts/verification/w6/states/fork-preview.png index 4049b1bffb94a65574269a0c5efd0fe5add26c4c..871b4ca104fc062a51dbf5f2244e9ce7e969788c 100644 GIT binary patch delta 20 ccmbQ{JI!~4F*Cc6q14%__XRgwF~=wa082~;(f|Me delta 20 bcmbQ{JI!~4F*7@l73 delta 20 ccmZ3uka6Kc#tGT%JXUNvH?F+jSfn2S08`NjJ^%m! diff --git a/artifacts/verification/w6/states/interaction.json b/artifacts/verification/w6/states/interaction.json index 50f8c62c..506ab68e 100644 --- a/artifacts/verification/w6/states/interaction.json +++ b/artifacts/verification/w6/states/interaction.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/interaction.png b/artifacts/verification/w6/states/interaction.png index 86951bb6342da9a7b81c2b0e9f02a39fd8b76889..3ab4674988a4003d074c4ac49620b5970f80f4fa 100644 GIT binary patch delta 20 ccmbR8ka5aG#tGT%LWW{TlqXwlEK(`}09EVb%7 delta 20 ccmbR8ka5aG#tGT%JXTEFTLr#tEK(`}097Cd(f|Me diff --git a/artifacts/verification/w6/states/multi-run.json b/artifacts/verification/w6/states/multi-run.json index b555b319..feda92f6 100644 --- a/artifacts/verification/w6/states/multi-run.json +++ b/artifacts/verification/w6/states/multi-run.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 80, @@ -456,7 +456,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-29T12:57:57.576Z", + "occurredAt": "2026-08-29T18:49:18.339Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -468,7 +468,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-29T12:57:57.711Z", + "occurredAt": "2026-08-29T18:49:18.470Z", "sourceEventId": "run-000005:runtime:1", "runId": "run-000005", "entityType": "run", @@ -1022,10 +1022,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000003-354b13a404335bfa25af0aee", + "id": "effect-op-terminal-000003-1eab404b1733ed7252c38ab2", "operationId": "op-terminal-000003", "effectKind": "run.execute", - "requestDigest": "354b13a404335bfa25af0aee470c0330e1d69babf4a17dda9bd9ad8fe6f27b0e", + "requestDigest": "1eab404b1733ed7252c38ab26fd0dc31afec888499fbdf02d3f9c163735a524a", "kind": "send", "status": "pending", "attempt": 1, @@ -1044,13 +1044,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T12:57:57.576Z", + "occurredAt": "2026-08-29T18:49:18.339Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-2a0b3f72-352c-4468-91be-96ce0e9502ca", + "id": "turn-54cd58eb-6b15-4092-9d80-3d947380d407", "intent": "parallel run A", "metadata": { "identity": { @@ -1060,11 +1060,11 @@ } }, "session": { - "id": "3ab968e0-a991-4254-8320-7cdecf4f090c", + "id": "e4b834df-99bb-4231-ba88-c82fc02c9c3b", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T12:57:57.576Z", - "updatedAt": "2026-08-29T12:57:57.576Z", + "createdAt": "2026-08-29T18:49:18.339Z", + "updatedAt": "2026-08-29T18:49:18.339Z", "metadata": "[unavailable]" }, "backend": "router", @@ -1086,16 +1086,16 @@ }, "execution": { "kind": "request", - "id": "turn-2a0b3f72-352c-4468-91be-96ce0e9502ca" + "id": "turn-54cd58eb-6b15-4092-9d80-3d947380d407" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-2a0b3f72-352c-4468-91be-96ce0e9502ca:attempt:1ddc1f6c-3b37-4471-9cdf-1df4153b64ad", - "materializationReceiptDigest": "sha256:b24dde71ea5836c46a6dfd53a380981178af4e54bd4c907420986852770ea257", - "bindingDigest": "sha256:25d1202e69d9d4c9287d9545f4f41655ffbd32cac5bf7d945dfd75d8b3364d8d", + "attemptId": "turn-54cd58eb-6b15-4092-9d80-3d947380d407:attempt:57120366-ecf3-46a3-a82a-a2476639da14", + "materializationReceiptDigest": "sha256:c3ff5b81b6b839b3dc731e7c3ebe88c13fa539b2c4306ad1c71067e496cccdb8", + "bindingDigest": "sha256:292aa954ec5a08445bd2f867b19b0ee89f1510cbf136562a17883b09bd3ba0c9", "descriptor": { "kind": "router-request", "transport": "http", @@ -1107,10 +1107,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T12:57:57.574Z" + "startedAt": "2026-08-29T18:49:18.337Z" } }, - "timestamp": "2026-08-29T12:57:57.576Z" + "timestamp": "2026-08-29T18:49:18.339Z" } } }, @@ -1360,10 +1360,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000007-925e14a7359350e02503ba59", + "id": "effect-op-terminal-000007-71498fb13166b8c6a82ba385", "operationId": "op-terminal-000007", "effectKind": "run.execute", - "requestDigest": "925e14a7359350e02503ba59fc2c1f0443041ab24d81a02404943cece23c3dcf", + "requestDigest": "71498fb13166b8c6a82ba385d80a4065ff9f6863b874f806faf306b706fa24ff", "kind": "send", "status": "pending", "attempt": 1, @@ -1382,13 +1382,13 @@ "source": { "eventId": "run-000005:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T12:57:57.711Z", + "occurredAt": "2026-08-29T18:49:18.470Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-72e1b6ee-9e74-4a13-a70a-50d0f444a174", + "id": "turn-697a4509-b74c-4019-9008-8cb0a9793631", "intent": "parallel run B", "metadata": { "identity": { @@ -1398,11 +1398,11 @@ } }, "session": { - "id": "76bc27f8-1247-4431-a222-3924c0202c80", + "id": "1fab21ac-e69f-4b3b-a8c9-940604f0fb79", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T12:57:57.711Z", - "updatedAt": "2026-08-29T12:57:57.711Z", + "createdAt": "2026-08-29T18:49:18.470Z", + "updatedAt": "2026-08-29T18:49:18.470Z", "metadata": "[unavailable]" }, "backend": "router", @@ -1424,16 +1424,16 @@ }, "execution": { "kind": "request", - "id": "turn-72e1b6ee-9e74-4a13-a70a-50d0f444a174" + "id": "turn-697a4509-b74c-4019-9008-8cb0a9793631" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-72e1b6ee-9e74-4a13-a70a-50d0f444a174:attempt:5dace444-8cb6-4465-b692-ad101d306761", - "materializationReceiptDigest": "sha256:8e3a4854db5f2faee7343323e73e425ca3f91f49a36e3e09c541981d07ef905f", - "bindingDigest": "sha256:9fa3b9a1e018a743a72853bf019a6b0d649a016f1f41f15eca56ea2a7b272c27", + "attemptId": "turn-697a4509-b74c-4019-9008-8cb0a9793631:attempt:bf5a127d-44a2-4e98-890a-e598d87196e2", + "materializationReceiptDigest": "sha256:826f6e943bbfaa888c9966df7dfc88501d0284c8bcaee7d5055ae0b65d2912d2", + "bindingDigest": "sha256:bc4d1627ab6fa411b944354c0b7bbcd0c069841f0a1e0d71ea0d962d8cda4411", "descriptor": { "kind": "router-request", "transport": "http", @@ -1445,10 +1445,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T12:57:57.711Z" + "startedAt": "2026-08-29T18:49:18.470Z" } }, - "timestamp": "2026-08-29T12:57:57.711Z" + "timestamp": "2026-08-29T18:49:18.470Z" } } }, diff --git a/artifacts/verification/w6/states/multi-run.png b/artifacts/verification/w6/states/multi-run.png index e1f40bdea554064fb332361e8ef850add8b00a59..cd78d37cd518d352fb9392ee60b1dee4538b1fdb 100644 GIT binary patch delta 20 ccmaF5pYiE_#tGT%LWaUyJkz&sEGmu%0AE@Nu>b%7 delta 20 ccmaF5pYiE_#tGT%JeF1(vwpAMSX3Mj0Ab__DF6Tf diff --git a/artifacts/verification/w6/states/narrow.json b/artifacts/verification/w6/states/narrow.json index f4a743f6..ae86a2e8 100644 --- a/artifacts/verification/w6/states/narrow.json +++ b/artifacts/verification/w6/states/narrow.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 40, diff --git a/artifacts/verification/w6/states/narrow.png b/artifacts/verification/w6/states/narrow.png index 3616c2b9afadc6b072dfd7a27b0d6739a526c555..36e1db44f092750f846482fe73f55073948e6893 100644 GIT binary patch delta 18 ZcmZ4Pz1(|3HoK6a($neb{Tqu+RRKm!2Ri@& delta 18 ZcmZ4Pz1(|3Ham|M?`|&M^o>QPssKHh1@Hg> diff --git a/artifacts/verification/w6/states/profile.json b/artifacts/verification/w6/states/profile.json index 3849b6c6..6bde8f37 100644 --- a/artifacts/verification/w6/states/profile.json +++ b/artifacts/verification/w6/states/profile.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "551a0739cdae863f784eef82dba7ef926e7bf436f67ca908ef0f18899788355c" + "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" }, "dimensions": { "columns": 80, diff --git a/artifacts/verification/w6/states/profile.png b/artifacts/verification/w6/states/profile.png index 8861d482fa6518c9602284c3a68c216e4513eb15..2412abf3971de392f569819fe4e637f00eec92bb 100644 GIT binary patch delta 20 bcmca?c-e4+6%)IVp<>NEGt Date: Sat, 29 Aug 2026 13:16:03 -0600 Subject: [PATCH 076/136] fix(analysis): retry transient Router failures --- src/adapters/analysis/runtime-model-owner.ts | 5 +- test/trace-analysis-configuration.test.ts | 67 +++++++++++++++++++- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/adapters/analysis/runtime-model-owner.ts b/src/adapters/analysis/runtime-model-owner.ts index dd999d25..5d061728 100644 --- a/src/adapters/analysis/runtime-model-owner.ts +++ b/src/adapters/analysis/runtime-model-owner.ts @@ -657,9 +657,8 @@ function analystModelPrompt(harness: NonNullable): Agen export function createRuntimeTraceModelOwner( options: RuntimeTraceModelOwnerOptions, ): RuntimeTraceModelOwner { - // Analyst calls settle one receipt per invocation. Keep retries explicit so a - // single recorded invocation cannot conceal multiple paid provider requests. - const retry = Object.freeze({ maxAttempts: 1, ...options.retry }) + // Runtime retries one transient transport failure with the same idempotent call identity. + const retry = Object.freeze({ maxAttempts: 2, ...options.retry }) const sourceProfileDigest = canonicalAgentProfileDigestHex(options.profile) const callRef = `braid-agent-runtime:${String( canonicalDigest({ diff --git a/test/trace-analysis-configuration.test.ts b/test/trace-analysis-configuration.test.ts index f856e92e..9df9e7f8 100644 --- a/test/trace-analysis-configuration.test.ts +++ b/test/trace-analysis-configuration.test.ts @@ -1,4 +1,5 @@ import assert from 'node:assert/strict' +import { createServer } from 'node:http' import test from 'node:test' import type { ExternalOptimizerModelCallRequest, @@ -623,7 +624,71 @@ test('runtime-owned trace model call preserves canonical messages, limits, usage assert.doesNotMatch(execution, /private analyst instruction/u) assert.doesNotMatch(execution, /private trace question/u) assert.match(execution, /streamAgentTurn/u) - assert.match(execution, /"maxAttempts":1/u) + assert.match(execution, /"maxAttempts":2/u) +}) + +test('runtime-owned trace model retries one transient Router failure with the same call', async () => { + let attempts = 0 + const idempotencyKeys: string[] = [] + const server = createServer((request, response) => { + attempts += 1 + const key = request.headers['idempotency-key'] + if (typeof key === 'string') idempotencyKeys.push(key) + if (attempts === 1) { + response.statusCode = 502 + response.end('temporary router failure') + return + } + response.setHeader('content-type', 'application/json') + response.end( + JSON.stringify({ + model: 'pi/tangle-router/glm-5.2', + choices: [{ message: { content: '{"answer":"recovered"}' }, finish_reason: 'stop' }], + usage: { prompt_tokens: 12, completion_tokens: 3, total_tokens: 15 }, + }), + ) + }) + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(0, '127.0.0.1', resolve) + }) + try { + const address = server.address() + if (address === null || typeof address === 'string') throw new Error('test server has no port') + const selected = connection( + 'tangle-inference', + 'runtime-owner-retry', + `http://127.0.0.1:${address.port}/v1`, + true, + ) + const owner = createRuntimeTraceModelOwner({ + profile: { + harness: 'cli-base', + model: { + default: 'pi/tangle-router/glm-5.2', + provider: 'tangle-router', + reasoningEffort: 'high', + }, + }, + connection: selected, + baseUrl: `http://127.0.0.1:${address.port}/v1`, + credential: 'credential-never-recorded', + model: 'pi/tangle-router/glm-5.2', + pricing: PRICING, + retry: { initialBackoffMs: 0, maxBackoffMs: 0, jitter: 0 }, + }) + + const result = await owner.call(optimizerRequest()) + assert.equal(result.succeeded, true) + assert.equal(attempts, 2) + assert.deepEqual(idempotencyKeys, ['analysis-model-call-1', 'analysis-model-call-1']) + assert.equal(result.succeeded ? result.response.content : undefined, '{"answer":"recovered"}') + assert.match(JSON.stringify(result.execution), /"maxAttempts":2/u) + } finally { + await new Promise((resolve, reject) => { + server.close((error) => (error === undefined ? resolve() : reject(error))) + }) + } }) test('runtime-owned trace model lowers visible and aggregate ceilings without an unenforceable reasoning ceiling', async () => { From 2f193d3394f7248ff30718b200c34012d988111b Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 13:50:10 -0600 Subject: [PATCH 077/136] fix(release): reconcile verification evidence and checks --- .agent/skill-runs.jsonl | 10 ++++++++ docs/08-verification.md | 2 +- scripts/check-dependencies.mjs | 36 ++++++++++++++++++++++++---- scripts/live-required/supervisor.mjs | 13 ++++++++-- scripts/run-tests.mjs | 1 + 5 files changed, 55 insertions(+), 7 deletions(-) diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index 26b939c9..84161fed 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -86,3 +86,13 @@ {"skill":"/ui-test","ts":"2026-08-29T03:42:50Z","project":"braid-10-complete","target":"packed W6 terminal captures at 40x12, 80x24, 120x40, 200x60 and keyboard flow","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/verify","ts":"2026-08-29T04:21:54Z","project":"braid-10-complete","target":"Braid release-readiness: tests, checks, PTY, visual captures, package proof, component docs","operatorPrompt":"","durationMin":null,"verdict":"HOLD","dispatchedTo":"/converge","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/harden","ts":"2026-08-29T07:05:42Z","project":"braid-10-complete","target":"Braid interaction response reconciliation and startup ordering","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/critical-audit","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/ui-test","ts":"2026-08-29T17:56:15Z","project":"braid-10-complete","target":"Braid packed PTY, keyboard, multi-run, and connection flows","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/product-design-audit","ts":"2026-08-29T17:56:15Z","project":"braid-10-complete","target":"Braid packed terminal workflows and responsive states","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/verify","ts":"2026-08-29T18:15:53Z","project":"braid-10-complete","target":"exact @tangle-network/agent-runtime 0.180.0 integration","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/report","ts":"2026-08-29T18:16:13Z","project":"braid-10-complete","target":"Braid progress during the last six hours","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/ship","ts":"2026-08-29T18:30:49Z","project":"braid-10-complete","target":"final packed CLI Bridge LIVE-01..05 proof","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/deploy-proof","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"--help","ts":"2026-08-29T18:53:12Z","project":"braid-10-complete","target":"","operatorPrompt":"","durationMin":null,"verdict":"n/a","dispatchedTo":"stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/product-design","ts":"2026-08-29T18:53:17Z","project":"braid-10-complete","target":"Braid terminal connection and W6 captures at 40x12, 80x24, 120x40, 200x60","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/product-design-audit","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/product-design-audit","ts":"2026-08-29T18:53:17Z","project":"braid-10-complete","target":"Braid terminal canonical visual states and keyboard flows","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/ui-test","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/ui-test","ts":"2026-08-29T18:53:17Z","project":"braid-10-complete","target":"Braid packed PTY keyboard and responsive terminal flows","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/verify","ts":"2026-08-29T19:50:02Z","project":"braid-10-complete","target":"reconcile Braid release tracked edits and remove intermediate Tangle artifacts","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} diff --git a/docs/08-verification.md b/docs/08-verification.md index 30001480..7ed7823d 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -544,7 +544,7 @@ In that snapshot, `LIVE-03` and `LIVE-08` were attempted through their built-in In that snapshot, `LIVE-06`, `LIVE-07`, `LIVE-09`, and `LIVE-10` were also unavailable for the same reason, and no live claim in that record came from a simulated provider. -Current dependency evidence (2026-08-29) is documented in [Runtime contracts](04-runtime-contracts.md): interface `1.8.0`, Runtime `0.178.0`, eval `0.170.0`, CLI Bridge adapter `0.10.0`, Tangle adapter `0.14.3`, and Sandbox `0.34.3`. +Current dependency evidence (2026-08-29) is documented in the machine-checked table in [Runtime contracts](04-runtime-contracts.md). The historical test counts above do not represent verification of this current cohort. diff --git a/scripts/check-dependencies.mjs b/scripts/check-dependencies.mjs index ac3b403a..c7743447 100644 --- a/scripts/check-dependencies.mjs +++ b/scripts/check-dependencies.mjs @@ -1,8 +1,11 @@ import { execFileSync } from 'node:child_process' +import { readFileSync } from 'node:fs' + +const root = new URL('../', import.meta.url) const graph = JSON.parse( execFileSync('pnpm', ['list', '--prod', '--depth', 'Infinity', '--json'], { - cwd: new URL('../', import.meta.url), + cwd: root, encoding: 'utf8', env: { ...process.env, FORCE_COLOR: '0' }, }), @@ -31,15 +34,40 @@ if (!packages.has('@earendil-works/pi-tui')) { violations.push('missing @earendil-works/pi-tui') } +const manifest = JSON.parse(readFileSync(new URL('package.json', root), 'utf8')) +const runtimeContracts = readFileSync(new URL('docs/04-runtime-contracts.md', root), 'utf8') +const documentedCohort = [ + '@tangle-network/agent-interface', + '@tangle-network/agent-runtime', + '@tangle-network/agent-eval', + '@tangle-network/agent-provider-cli-bridge', + '@tangle-network/agent-provider-tangle', + '@tangle-network/sandbox', +] +for (const name of documentedCohort) { + const expected = manifest.dependencies?.[name] + const row = runtimeContracts + .split('\n') + .find((line) => line.startsWith('|') && line.split('|')[1]?.includes(name)) + const documented = row?.split('|')[2]?.trim().replaceAll('`', '') + if (typeof expected !== 'string') { + violations.push(`missing direct dependency ${name}`) + } else if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u.test(expected)) { + violations.push(`${name} must use an exact version; found ${expected}`) + } else if (documented !== expected) { + violations.push(`${name} documentation is ${documented ?? 'missing'}; expected ${expected}`) + } +} + if (violations.length > 0) { - process.stderr.write(`Forbidden dependency graph entries:\n${violations.join('\n')}\n`) + process.stderr.write(`Dependency checks failed:\n${violations.join('\n')}\n`) process.exitCode = 1 process.exit() } try { execFileSync('pnpm', ['audit', '--prod', '--audit-level', 'high'], { - cwd: new URL('../', import.meta.url), + cwd: root, stdio: 'inherit', }) } catch { @@ -49,5 +77,5 @@ try { if (process.exitCode !== 1) process.stdout.write( - `Production dependency graph: ${packages.size} packages; Pi TUI present; no copied agent application; no high or critical audit finding\n`, + `Production dependency graph: ${packages.size} packages; documented cohort matches; Pi TUI present; no copied agent application; no high or critical audit finding\n`, ) diff --git a/scripts/live-required/supervisor.mjs b/scripts/live-required/supervisor.mjs index 5d11583c..937c7e11 100644 --- a/scripts/live-required/supervisor.mjs +++ b/scripts/live-required/supervisor.mjs @@ -217,12 +217,20 @@ async function waitForSnapshot({ } } -async function waitForAcknowledgement({ read, eventDir, operationId, label, timeoutMs, pollMs }) { +async function waitForAcknowledgement({ + read, + eventDir, + operationId, + label, + timeoutMs, + pollMs, + accepted, +}) { const deadline = Date.now() + timeoutMs let latest while (true) { latest = read(eventDir, operationId) - if (latest !== undefined) return latest + if (latest !== undefined && (accepted === undefined || accepted(latest))) return latest if (Date.now() >= deadline) throw new Error( `${label} was not acknowledged before ${timeoutMs}ms: ${JSON.stringify({ operationId, response: latest })}`, @@ -732,6 +740,7 @@ export async function runSupervisorFlow({ label: 'worker cancellation acknowledgement', timeoutMs, pollMs, + accepted: (value) => value?.effect !== 'cancel_requested', }) assertCancellationAcknowledgement(cancellationAcknowledgement, workerId, cancelOperationId) diff --git a/scripts/run-tests.mjs b/scripts/run-tests.mjs index 8121154c..73da4376 100644 --- a/scripts/run-tests.mjs +++ b/scripts/run-tests.mjs @@ -71,6 +71,7 @@ const scopeFiles = { 'analysis-model-call-roundtrip.test.js', 'application.test.js', 'conversation-branch-effects.test.js', + 'cli-bridge-context-transfer.test.js', 'cli-bridge-interactions.test.js', 'cli-bridge-profile-contract.test.js', 'cli-bridge-retained-restart.test.js', From 65f8f5795a23193db8692c729f5d5b651a5383c3 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 13:53:44 -0600 Subject: [PATCH 078/136] fix(live): validate Tangle aggregate measurements --- scripts/live-required/tangle.mjs | 64 +++++++++++++++++++++--------- test/tangle-live07-wiring.test.mjs | 51 ++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 18 deletions(-) diff --git a/scripts/live-required/tangle.mjs b/scripts/live-required/tangle.mjs index 4ed195b3..9957b348 100644 --- a/scripts/live-required/tangle.mjs +++ b/scripts/live-required/tangle.mjs @@ -14,16 +14,29 @@ import { runHeadlessCancellation, runHeadlessTurn, } from './headless.mjs' -import { runBraidSandboxSoak } from './tangle-sandbox-braid-soak.mjs' -import { runInteractiveProof } from './tangle-sandbox-braid-interactive.mjs' import { assertMultirunProof } from './multirun-contract.mjs' +import { runInteractiveProof } from './tangle-sandbox-braid-interactive.mjs' import { runProof as runMultirunProof } from './tangle-sandbox-braid-multirun.mjs' +import { runBraidSandboxSoak } from './tangle-sandbox-braid-soak.mjs' import { runConfidentialProof, runWorkspaceForkProof } from './tangle-workspace-proof.mjs' const TANGLE_ROWS = Object.freeze(['LIVE-06', 'LIVE-07', 'LIVE-08', 'LIVE-09', 'LIVE-10']) const MINIMUM_SANDBOX_STRESS_RUNS = 3 const MINIMUM_SANDBOX_STRESS_CONCURRENCY = 2 +function requiredMeasurement(row, result) { + if (result?.status === 'unavailable') return undefined + if (result?.status !== 'passed') { + throw new Error( + `${row} live proof returned invalid status ${String(result?.status ?? 'missing')}`, + ) + } + if (result.measurement?.name !== row) { + throw new Error(`${row} live proof passed without its required measurement`) + } + return result.measurement +} + function tokenMarker(name) { return `LIVE_BRAID_${name}_OK` } @@ -270,34 +283,49 @@ export async function runTangleFlows({ let inference try { inference = await inferenceRunner({ repository, environment, binary, invocationId }) - setFlow('LIVE-06', { row: 'LIVE-06', status: inference.status, evidence: inference.evidence }) - measurements.push(inference.measurement) + const measurement = requiredMeasurement('LIVE-06', inference) + if (measurement === undefined) { + addUnavailable('LIVE-06', inference.reason ?? 'Tangle inference proof is unavailable') + } else { + setFlow('LIVE-06', { row: 'LIVE-06', status: inference.status, evidence: inference.evidence }) + measurements.push(measurement) + } } catch (error) { const classified = classifyExternalFailure(error, 'Tangle inference', environment) addUnavailable('LIVE-06', classified.message) } try { const sandbox = await sandboxRunner({ repository, environment, binary, invocationId }) - setFlow('LIVE-07', { - row: 'LIVE-07', - status: sandbox.status, - evidence: sandbox.evidence, - observations: sandbox.observations, - }) - measurements.push(sandbox.measurement) - if (sandbox.unavailable) addUnavailable(sandbox.unavailable.row, sandbox.unavailable.reason) + const measurement = requiredMeasurement('LIVE-07', sandbox) + if (measurement === undefined) { + addUnavailable('LIVE-07', sandbox.reason ?? 'Tangle Sandbox proof is unavailable') + } else { + setFlow('LIVE-07', { + row: 'LIVE-07', + status: sandbox.status, + evidence: sandbox.evidence, + observations: sandbox.observations, + }) + measurements.push(measurement) + if (sandbox.unavailable) addUnavailable(sandbox.unavailable.row, sandbox.unavailable.reason) + } } catch (error) { const classified = classifyExternalFailure(error, 'Tangle sandbox', environment) addUnavailable('LIVE-07', classified.message) } try { const interactive = await interactiveRunner({ repository, environment, invocationId }) - setFlow('LIVE-08', { - row: 'LIVE-08', - status: interactive.status, - evidence: interactive.evidence, - }) - measurements.push(interactive.measurement) + const measurement = requiredMeasurement('LIVE-08', interactive) + if (measurement === undefined) { + addUnavailable('LIVE-08', interactive.reason ?? 'Tangle interactive proof is unavailable') + } else { + setFlow('LIVE-08', { + row: 'LIVE-08', + status: interactive.status, + evidence: interactive.evidence, + }) + measurements.push(measurement) + } } catch (error) { const classified = classifyExternalFailure(error, 'Tangle interactive session', environment) addUnavailable('LIVE-08', classified.message) diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 84eda784..25bb7dd5 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -335,6 +335,57 @@ test('built-in LIVE-07 and LIVE-08 wiring emits evidence and deduped dispatch', ) }) +test('Tangle aggregate records unavailable rows and rejects invalid passed rows', async () => { + const unavailable = await runTangleFlows({ + repository, + environment: {}, + inferenceRunner: async () => ({ status: 'unavailable', reason: 'inference unavailable' }), + sandboxRunner: async () => ({ status: 'unavailable', reason: 'sandbox unavailable' }), + interactiveRunner: async () => ({ status: 'unavailable', reason: 'interactive unavailable' }), + matrixRunner: async () => ({ status: 'unavailable', reason: 'matrix unavailable' }), + }) + + assert.equal(unavailable.status, 'partial') + assert.deepEqual(unavailable.measurements, []) + assert.deepEqual( + unavailable.unavailable.map((entry) => entry.row), + ['LIVE-06', 'LIVE-07', 'LIVE-08', 'LIVE-09', 'LIVE-10'], + ) + + await assert.rejects( + runTangleFlows({ + repository, + environment: {}, + inferenceRunner: async () => ({ + status: 'failed', + measurement: { kind: 'scalar', name: 'LIVE-06', unit: 'verified-flow', value: 1 }, + }), + sandboxRunner: async () => ({ status: 'unavailable', reason: 'sandbox unavailable' }), + interactiveRunner: async () => ({ + status: 'unavailable', + reason: 'interactive unavailable', + }), + matrixRunner: async () => ({ status: 'unavailable', reason: 'matrix unavailable' }), + }), + /LIVE-06 live proof returned invalid status failed/u, + ) + + await assert.rejects( + runTangleFlows({ + repository, + environment: {}, + inferenceRunner: async () => ({ status: 'passed', evidence: null }), + sandboxRunner: async () => ({ status: 'unavailable', reason: 'sandbox unavailable' }), + interactiveRunner: async () => ({ + status: 'unavailable', + reason: 'interactive unavailable', + }), + matrixRunner: async () => ({ status: 'unavailable', reason: 'matrix unavailable' }), + }), + /LIVE-06 live proof passed without its required measurement/u, + ) +}) + test('LIVE-07 rejects a passing canary presented as a stress cohort', async () => { const cohort = passedStressCohort() await assert.rejects( From 35c3e2bdddad509ec56294de7579248566f58948 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 14:06:35 -0600 Subject: [PATCH 079/136] fix(release): bind publication proof to candidate bytes --- .agent/skill-runs.jsonl | 2 ++ .github/workflows/release.yml | 4 +++ scripts/release/prepare-candidate.mjs | 11 ++++--- scripts/release/publication-proof.mjs | 10 ++++++ scripts/release/smoke-package.mjs | 7 ++-- test/scripts.test.ts | 47 +++++++++++++++++++++++++-- 6 files changed, 72 insertions(+), 9 deletions(-) diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index 84161fed..fb6e7d4f 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -96,3 +96,5 @@ {"skill":"/product-design-audit","ts":"2026-08-29T18:53:17Z","project":"braid-10-complete","target":"Braid terminal canonical visual states and keyboard flows","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/ui-test","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/ui-test","ts":"2026-08-29T18:53:17Z","project":"braid-10-complete","target":"Braid packed PTY keyboard and responsive terminal flows","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/verify","ts":"2026-08-29T19:50:02Z","project":"braid-10-complete","target":"reconcile Braid release tracked edits and remove intermediate Tangle artifacts","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/release-conductor","ts":"2026-08-29T20:12:02Z","project":"braid-10-complete","target":"Braid 0.3.0 immutable candidate release path","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/verify","ts":"2026-08-29T20:12:02Z","project":"braid-10-complete","target":"Braid release automation fix and full local verification","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8e484830..c7b21e49 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -105,6 +105,7 @@ jobs: KEY="$RUNNER_TEMP/braid-release-key.pem" mkdir -p "$ENDORSEMENT" trap 'rm -f "$KEY"' EXIT + test -z "$(find "$ROOT" -type l -print -quit)" printf '%s' "$SIGNING_KEY_BASE64" | base64 --decode > "$KEY" chmod 600 "$KEY" find "$ROOT" -type f ! -path "$ENDORSEMENT/*" -print0 | @@ -213,6 +214,7 @@ jobs: set -euo pipefail ROOT="$RUNNER_TEMP/braid-release" ENDORSEMENT="$ROOT/endorsement/candidate" + test -z "$(find "$ROOT" -type l -print -quit)" cmp release/endorsement-public-key.pem "$ENDORSEMENT/public-key.pem" openssl pkeyutl -verify -rawin -pubin -inkey "$ENDORSEMENT/public-key.pem" \ -in "$ENDORSEMENT/statement.txt" -sigfile "$ENDORSEMENT/signature.bin" @@ -402,6 +404,7 @@ jobs: KEY="$RUNNER_TEMP/braid-release-key.pem" mkdir -p "$ENDORSEMENT" trap 'rm -f "$KEY"' EXIT + test -z "$(find "$ROOT" -type l -print -quit)" printf '%s' "$SIGNING_KEY_BASE64" | base64 --decode > "$KEY" chmod 600 "$KEY" find "$ROOT" -type f ! -path "$ENDORSEMENT/*" -print0 | @@ -456,6 +459,7 @@ jobs: set -euo pipefail ROOT="$RUNNER_TEMP/braid-release" ENDORSEMENT="$ROOT/endorsement/final" + test -z "$(find "$ROOT" -type l -print -quit)" cmp release/endorsement-public-key.pem "$ENDORSEMENT/public-key.pem" openssl pkeyutl -verify -rawin -pubin -inkey "$ENDORSEMENT/public-key.pem" \ -in "$ENDORSEMENT/statement.txt" -sigfile "$ENDORSEMENT/signature.bin" diff --git a/scripts/release/prepare-candidate.mjs b/scripts/release/prepare-candidate.mjs index 66fc428c..8a1a9aa9 100644 --- a/scripts/release/prepare-candidate.mjs +++ b/scripts/release/prepare-candidate.mjs @@ -1,9 +1,10 @@ import { spawn } from 'node:child_process' import { createHash } from 'node:crypto' -import { lstat, mkdir, readFile, realpath, stat } from 'node:fs/promises' +import { lstat, mkdir, readFile, realpath } from 'node:fs/promises' import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path' import { pnpmInvocation } from './platform.mjs' +import { readRegularFileNoFollow } from '../release-files.mjs' function assert(condition, message) { if (!condition) throw new Error(message) @@ -33,7 +34,7 @@ async function run(file, args, options = {}) { async function sha256(path) { return createHash('sha256') - .update(await readFile(path)) + .update(await readRegularFileNoFollow(path)) .digest('hex') } @@ -71,8 +72,8 @@ const archiveName = `${packageJson.name.replace(/^@/u, '').replace('/', '-')}-${ const candidateRoot = join(artifactRoot, 'candidate') const tarballPath = join(candidateRoot, archiveName) const packageProofPath = join(artifactRoot, 'w6', 'package-proof.json') -const existingTarball = await stat(tarballPath).catch(() => undefined) -const existingProof = await stat(packageProofPath).catch(() => undefined) +const existingTarball = await lstat(tarballPath).catch(() => undefined) +const existingProof = await lstat(packageProofPath).catch(() => undefined) assert(Boolean(existingTarball) === Boolean(existingProof), 'Restored candidate is incomplete') if (!existingTarball) { @@ -91,7 +92,7 @@ if (!existingTarball) { ) } -const packageProof = JSON.parse(await readFile(packageProofPath, 'utf8')) +const packageProof = JSON.parse((await readRegularFileNoFollow(packageProofPath)).toString('utf8')) const head = await new Promise((resolvePromise, reject) => { let stdout = '' const child = spawn('git', ['rev-parse', 'HEAD'], { diff --git a/scripts/release/publication-proof.mjs b/scripts/release/publication-proof.mjs index f71f9e4c..77047594 100644 --- a/scripts/release/publication-proof.mjs +++ b/scripts/release/publication-proof.mjs @@ -109,6 +109,16 @@ export async function createPublicationProof({ completedAt = new Date().toISOString(), }) { const root = resolve(artifactRoot) + const candidatePath = containedPath( + root, + join('candidate', packageProof.tarball), + 'Candidate package archive', + ) + const candidateBytes = await readRegularFileNoFollow(candidatePath) + assert( + sha256(candidateBytes) === packageProof.sha256, + 'Candidate package archive digest differs from package proof', + ) const candidate = await readPhase({ artifactRoot: root, phase: 'candidate', packageProof }) const registry = await readPhase({ artifactRoot: root, phase: 'registry', packageProof }) const provenance = await readAndValidateNpmProvenance({ artifactRoot: root, packageProof }) diff --git a/scripts/release/smoke-package.mjs b/scripts/release/smoke-package.mjs index 58231a45..d80c3556 100644 --- a/scripts/release/smoke-package.mjs +++ b/scripts/release/smoke-package.mjs @@ -5,6 +5,7 @@ import { tmpdir } from 'node:os' import { basename, dirname, join, relative, resolve } from 'node:path' import { fileURLToPath } from 'node:url' import { npmInvocation, portableEvidencePath } from './platform.mjs' +import { readRegularFileNoFollow } from '../release-files.mjs' function assert(condition, message) { if (!condition) throw new Error(message) @@ -127,7 +128,7 @@ async function runPlainFlow(binary, cwd) { async function sha256(path) { return createHash('sha256') - .update(await readFile(path)) + .update(await readRegularFileNoFollow(path)) .digest('hex') } @@ -140,7 +141,9 @@ const expectedArchitecture = option('--expect-architecture') ?? process.env.BRAID_EXPECT_ARCHITECTURE assert(artifactRootValue, '--artifact-root is required') const artifactRoot = resolve(artifactRootValue) -const proof = JSON.parse(await readFile(join(artifactRoot, 'w6', 'package-proof.json'), 'utf8')) +const proof = JSON.parse( + (await readRegularFileNoFollow(join(artifactRoot, 'w6', 'package-proof.json'))).toString('utf8'), +) const smokeRoot = await realpath(await mkdtemp(join(tmpdir(), 'braid-platform-smoke-'))) let smokeResult diff --git a/test/scripts.test.ts b/test/scripts.test.ts index dcd9350b..cd9d0d28 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -1,7 +1,7 @@ import assert from 'node:assert/strict' import { execFileSync, spawnSync } from 'node:child_process' import { createHash } from 'node:crypto' -import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' +import { mkdir, mkdtemp, readFile, rm, symlink, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import test from 'node:test' @@ -607,9 +607,45 @@ test('release subprocesses and recorded paths are portable to Windows', async () 'utf8', ) assert.match(candidatePreparation, /pnpmInvocation\(\['run', 'build'\]\)/u) + assert.match(candidatePreparation, /readRegularFileNoFollow/u) assert.doesNotMatch(candidatePreparation, /run\('pnpm'/u) }) +test('package smoke rejects symlinked restored candidate archives', async () => { + const artifactRoot = await mkdtemp(join(tmpdir(), 'braid-release-symlink-')) + const outsideRoot = await mkdtemp(join(tmpdir(), 'braid-release-symlink-target-')) + const archive = 'tangle-network-braid-0.3.0.tgz' + const archiveBytes = Buffer.from('candidate archive') + try { + await mkdir(join(artifactRoot, 'candidate'), { recursive: true }) + await mkdir(join(artifactRoot, 'w6'), { recursive: true }) + const target = join(outsideRoot, archive) + await writeFile(target, archiveBytes) + await symlink(target, join(artifactRoot, 'candidate', archive)) + await writeFile( + join(artifactRoot, 'w6', 'package-proof.json'), + `${JSON.stringify({ + version: '0.3.0', + tarball: archive, + sha256: createHash('sha256').update(archiveBytes).digest('hex'), + })}\n`, + ) + assert.throws( + () => + execFileSync(process.execPath, ['scripts/release/smoke-package.mjs'], { + cwd: process.cwd(), + env: { ...process.env, BRAID_RELEASE_ARTIFACT_ROOT: artifactRoot }, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'], + }), + /Regular non-symlink file required/u, + ) + } finally { + await rm(artifactRoot, { recursive: true, force: true }) + await rm(outsideRoot, { recursive: true, force: true }) + } +}) + test('upstream requirements require successful owning-repository checks', () => { type Owner = { readonly package: string; readonly check: string } type Artifact = { @@ -969,7 +1005,7 @@ test('the final release proof requires matching candidate and registry smokes on version: '0.1.0', gitCommit: 'a'.repeat(40), tarball: 'tangle-network-braid-0.1.0.tgz', - sha256: 'b'.repeat(64), + sha256: createHash('sha256').update(Buffer.from('candidate archive bytes')).digest('hex'), } const completedAt = '2026-08-09T01:00:00.000Z' try { @@ -1098,6 +1134,13 @@ test('the final release proof requires matching candidate and registry smokes on assert.equal(augmented.evidence.requirements['VR-10'].artifacts.length, 7) assert.equal(augmented.evidence.artifacts.length, 7) + await writeFile(join(candidateDirectory, packageProof.tarball), Buffer.from('tampered archive')) + await assert.rejects( + createPublicationProof({ artifactRoot, packageProof, completedAt }), + /Candidate package archive digest differs/u, + ) + await writeFile(join(candidateDirectory, packageProof.tarball), candidateBytes) + const registryPath = join(artifactRoot, 'publication', 'registry', 'linux-x64.json') const mismatched = JSON.parse(await readFile(registryPath, 'utf8')) mismatched.tarballSha256 = 'd'.repeat(64) From 9ecc4fa472ecff596d8b49a03c627c8112db07c1 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 14:58:40 -0600 Subject: [PATCH 080/136] fix(conversations): resolve inherited source runs for handoffs Cross-runner planning must retain provider-bound source context when the selected branch inherits its boundary from an ancestor. Resolve only visible runs in the same conversation and add a child-branch regression test. Roadmap: W10 conversations and forks; restores the cross-runner handoff requirement. --- src/app/conversation-branches.ts | 19 ++++++++++-- src/app/conversation-context.ts | 17 +++++++++-- test/conversation-branch-effects.test.ts | 37 ++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/app/conversation-branches.ts b/src/app/conversation-branches.ts index 1a146534..ce4ea989 100644 --- a/src/app/conversation-branches.ts +++ b/src/app/conversation-branches.ts @@ -583,13 +583,28 @@ function sourceRunForBranch( branchId: BranchRecord['id'], preferredRunId: MessageRecord['runId'], ): BraidState['runs'][number] | undefined { + const branch = state.branches.find((candidate) => candidate.id === branchId) + if (branch === undefined) return undefined + const visibleRunIds = new Set( + messagesVisibleOnBranch(state, branchId) + .map((message) => message.runId) + .filter((runId): runId is string => runId !== undefined), + ) if (preferredRunId !== undefined) { const preferred = state.runs.find( - (candidate) => candidate.id === preferredRunId && candidate.branchId === branchId, + (candidate) => + candidate.id === preferredRunId && + candidate.conversationId === branch.conversationId && + visibleRunIds.has(candidate.id), ) if (preferred !== undefined) return preferred } - return state.runs.filter((candidate) => candidate.branchId === branchId).at(-1) + return state.runs + .filter( + (candidate) => + candidate.conversationId === branch.conversationId && visibleRunIds.has(candidate.id), + ) + .at(-1) } function contextTransferPort( diff --git a/src/app/conversation-context.ts b/src/app/conversation-context.ts index 3d9a97a9..bad28439 100644 --- a/src/app/conversation-context.ts +++ b/src/app/conversation-context.ts @@ -535,16 +535,27 @@ function sourceRunForBoundary( messageId: string, messageRunId: string | undefined, ): BraidState['runs'][number] | undefined { + const branch = state.branches.find((candidate) => candidate.id === branchId) + if (branch === undefined) return undefined + const boundary = messagesVisibleOnBranch(state, branchId).find( + (message) => message.id === messageId, + ) + if (boundary === undefined) return undefined if (messageRunId !== undefined) { - const direct = state.runs.find((run) => run.id === messageRunId && run.branchId === branchId) + const direct = state.runs.find( + (run) => + run.id === messageRunId && + run.conversationId === branch.conversationId && + run.id === boundary.runId, + ) if (direct !== undefined) return direct } return state.runs .filter( (run) => - run.branchId === branchId && + run.conversationId === branch.conversationId && run.controlRef !== undefined && - state.messages.some((message) => message.id === messageId && message.runId === run.id), + run.id === boundary.runId, ) .at(-1) } diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts index e3b2a879..70e8c33e 100644 --- a/test/conversation-branch-effects.test.ts +++ b/test/conversation-branch-effects.test.ts @@ -454,6 +454,43 @@ test('cross-runner handoff transfers canonical history and replays after restart ) }) +test('cross-runner planning resolves a completed run inherited by a child branch', async () => { + const contextState: ContextProviderState = { transfers: [] } + const execution = executionFor({ + capabilities: branchCapabilities(), + contextState, + }) + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + }) + await prepareSource(app) + const source = await app.send({ operationId: 'op-inherited-source', text: 'source history' }) + .completion + const sourceRun = source.runs.find((run) => run.operationId === 'op-inherited-source') + assert(sourceRun) + const boundary = app.state().messages.find((message) => message.runId === sourceRun.id) + assert(boundary) + const child = await app.conversations.branches.create({ + operationId: 'op-inherited-child', + throughMessageId: boundary.id, + }) + + const plan = app.conversations.branches.plan({ + operationId: 'op-inherited-cross-runner', + kind: 'cross-runner', + branchId: child.id, + runner: 'codex', + destinationProvider: TARGET_PROVIDER, + }) + + assert.equal(plan.allowed, true) + assert.equal(plan.sourceRunId, sourceRun.id) + assert.equal(plan.sourceEnvironmentId, sourceRun.environmentId) + assert.equal(plan.portableContextPlan?.source.source.runId, sourceRun.id) +}) + test('cross-runner planning binds the exact destination profile after redaction and overrides', async () => { const contextState: ContextProviderState = { transfers: [] } const profile = defineAgentProfile({ From 3e5510361c356287b84c9bc9e8d6ded2ede41c9e Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 15:44:43 -0600 Subject: [PATCH 081/136] docs(upstream): align Pi TUI table version --- docs/10-upstream-strategy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/10-upstream-strategy.md b/docs/10-upstream-strategy.md index f68a59b8..29f0308e 100644 --- a/docs/10-upstream-strategy.md +++ b/docs/10-upstream-strategy.md @@ -34,7 +34,7 @@ The deciding question was how much source can be reused while preserving `AgentP | Source | Commit or version | License | Measured relevant TypeScript | Role in decision | | --- | --- | --- | ---: | --- | -| [Pi TUI](https://github.com/earendil-works/pi/tree/main/packages/tui) | repository `cd6852a`; TUI `87142a8d50640e93d43fcb35123439d642bc0304`; npm `0.84.1` | MIT | 32,585 lines | Selected renderer dependency | +| [Pi TUI](https://github.com/earendil-works/pi/tree/main/packages/tui) | repository `cd6852a`; TUI `87142a8d50640e93d43fcb35123439d642bc0304`; npm `0.84.4` | MIT | 32,585 lines | Selected renderer dependency | | [Pi coding-agent interactive mode](https://github.com/earendil-works/pi/tree/main/packages/coding-agent/src/modes/interactive) | repository `cd6852a`; interactive mode `87142a8d50640e93d43fcb35123439d642bc0304` | MIT | 17,379 lines, including a 6,399-line coordinator | Selective behavior and component source | | [Kimi Code terminal app](https://github.com/MoonshotAI/kimi-code/tree/main/apps/kimi-code/src/tui) | `0401ec4286f37929d1d298527c05f5351850bf8a` | MIT | No refreshed size claim | Selective interaction and controller source | | [Kimi private Pi TUI fork](https://github.com/MoonshotAI/kimi-code/tree/main/packages/pi-tui) | `0401ec4286f37929d1d298527c05f5351850bf8a` | MIT | Included in repository inspection | Patch and regression reference only | From b2379604abd9ce37c4fd964381d537fedecfc91b Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 17:31:16 -0600 Subject: [PATCH 082/136] fix(live): require explicit stale interactive identity code --- .../tangle-sandbox-interactive-continuity.mjs | 39 +++++++++++++------ ...le-sandbox-interactive-continuity.test.mjs | 33 ++++++++++++++-- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-interactive-continuity.mjs b/scripts/live-required/tangle-sandbox-interactive-continuity.mjs index cfeee601..dcb101f4 100644 --- a/scripts/live-required/tangle-sandbox-interactive-continuity.mjs +++ b/scripts/live-required/tangle-sandbox-interactive-continuity.mjs @@ -62,6 +62,14 @@ function identityText(ref) { .join('/') } +/** + * Accept the explicit identity conflict returned by the Sandbox sidecar. + * A mismatched incarnation is a rejected lookup, not an absent session. + */ +export function isStaleInteractiveIdentityError(error) { + return error?.code === 'STALE_INCARNATION' +} + function directCredentialEnvironment(environment) { const hasSandboxCredential = [ 'BRAID_TANGLE_SANDBOX_AUTH', @@ -763,26 +771,35 @@ export async function runInteractiveContinuityProof({ incarnationId: `${ref.incarnationId}-stale`, } const staleHandle = session.interactive({ ref: staleRef, control: startInfo.control }) - const staleStatus = await bounded( - `Stale identity status [${identityText(staleRef)}]`, - () => staleHandle.status(), - timeoutMs, - ) - assert.equal( - staleStatus, - null, - `Stale identity [${identityText(staleRef)}] resolved to a live process`, + let staleStatusError + await assert.rejects( + () => + bounded( + `Stale identity status [${identityText(staleRef)}]`, + () => staleHandle.status(), + timeoutMs, + ), + (error) => { + staleStatusError = error + assert.equal( + isStaleInteractiveIdentityError(error), + true, + `Stale identity [${identityText(staleRef)}] returned an unrelated status error`, + ) + return true + }, ) await assert.rejects( () => staleHandle.attach({ cols: DEFAULT_COLS, rows: DEFAULT_ROWS }), (error) => { - const message = safeMessage(error, environment) - return /stale|identity|not running|exists/iu.test(message) + return isStaleInteractiveIdentityError(error) }, ) checks.push( checkRecord('stale-identity-rejected', box.id, ref, { rejectedIncarnationId: staleRef.incarnationId, + statusErrorCode: + typeof staleStatusError?.code === 'string' ? staleStatusError.code : null, }), ) diff --git a/scripts/live-required/tangle-sandbox-interactive-continuity.test.mjs b/scripts/live-required/tangle-sandbox-interactive-continuity.test.mjs index ec66493c..6c49b60b 100644 --- a/scripts/live-required/tangle-sandbox-interactive-continuity.test.mjs +++ b/scripts/live-required/tangle-sandbox-interactive-continuity.test.mjs @@ -7,6 +7,7 @@ import { assertSameInteractiveRef, assertStatusForRef, buildExactInteractiveStart, + isStaleInteractiveIdentityError, safeErrorRecord, } from './tangle-sandbox-interactive-continuity.mjs' @@ -121,6 +122,8 @@ class FakeTerminalWebSocket { } } +const EXACT_INCARNATION_ID = '00000000-0000-4000-8000-000000000001' + test('missing exact public methods are a hard unavailable result', () => { assert.throws( () => @@ -200,6 +203,30 @@ test('same-ref assertions reject a changed incarnation and accept an exact repla ) }) +test('stale identity requires the explicit sidecar conflict code', () => { + const stale = Object.assign(new Error('Interactive session incarnation is stale'), { + code: 'STALE_INCARNATION', + }) + assert.equal(isStaleInteractiveIdentityError(stale), true) + assert.equal( + isStaleInteractiveIdentityError(new Error('Interactive session identity is stale')), + false, + ) + assert.equal( + isStaleInteractiveIdentityError( + Object.assign(new Error('stale'), { code: 'stale_incarnation' }), + ), + false, + ) + assert.equal(isStaleInteractiveIdentityError(new Error('Interactive session not found')), false) + assert.equal( + isStaleInteractiveIdentityError( + Object.assign(new Error('identity service unavailable'), { code: 'TRANSPORT' }), + ), + false, + ) +}) + test('status and control assertions stay bound to the exact process', () => { const ref = { run: { @@ -253,7 +280,7 @@ test('public TerminalStream proves input, detach, and same-connection replay wit url: 'https://sandbox.test/terminals/session-unit/ws', token: 'unit-token', connectionId: 'session-unit', - incarnationId: 'incarnation-unit', + incarnationId: EXACT_INCARNATION_ID, control, handlers: { onData(data) { @@ -301,9 +328,9 @@ test('public TerminalStream proves input, detach, and same-connection replay wit true, ) if (Object.hasOwn(initFrames[0].frame, 'incarnationId')) { - assert.equal(initFrames[0].frame.incarnationId, 'incarnation-unit') + assert.equal(initFrames[0].frame.incarnationId, EXACT_INCARNATION_ID) assert.deepEqual(initFrames[0].frame.control, control) - assert.equal(initFrames[1].frame.incarnationId, 'incarnation-unit') + assert.equal(initFrames[1].frame.incarnationId, EXACT_INCARNATION_ID) assert.deepEqual(initFrames[1].frame.control, control) } } finally { From 569e0c2816d832020dc0fd81b5cad5cbe95dabe8 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 18:23:32 -0600 Subject: [PATCH 083/136] fix(live): clean materialized interactive fallback --- .../tangle-sandbox-braid-interactive.mjs | 9 +-- test/tangle-live07-wiring.test.mjs | 69 +++++++++++++++++++ 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 4860be50..3dd540ef 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -881,12 +881,7 @@ export async function finalizeInteractiveProof({ } let providerMaterialization if (executionStarted && resolvedIdentity === undefined) { - if ( - materialization !== undefined && - materialization.materialized === false && - (materialization.phase === 'interactive_intent' || materialization.phase === null) && - materialization.runId !== undefined - ) { + if (materialization?.runId !== undefined) { if (client === undefined) { errors.push( new Error( @@ -894,7 +889,7 @@ export async function finalizeInteractiveProof({ ), ) } else { - const observed = await attemptCleanup(errors, 'pre-environment Sandbox absence', () => + const observed = await attemptCleanup(errors, 'run-derived Sandbox cleanup', () => cleanupInteractiveBeforeEnvironment(client, materialization), ) if (observed.ok) providerMaterialization = observed.value diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 25bb7dd5..18476448 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -678,6 +678,75 @@ test('LIVE-08 deletes and confirms one exact resource when the Runtime phase is }) }) +test('LIVE-08 deletes the run-derived resource when provider materialization exists without a record', async () => { + let listCalls = 0 + let getCalls = 0 + const materialization = interactiveMaterializationEvidence({ + state: { + runs: [ + { + id: 'run-materialized-without-record', + status: 'detached', + controlRef: { environmentId: 'sandbox-materialized-without-record' }, + }, + ], + }, + }) + assert.deepEqual(materialization, { + runId: 'run-materialized-without-record', + phase: null, + materialized: true, + boundary: 'provider-environment-identity', + }) + const resource = { + id: 'sandbox-materialized-without-record', + name: 'braid-interactive-run-materialized-without-record', + metadata: { owner: 'braid', lifecycle: 'retained', surface: 'interactive-agent' }, + deleted: false, + async delete() { + this.deleted = true + }, + } + const result = await finalizeInteractiveProof({ + client: { + async list() { + listCalls += 1 + return resource.deleted ? [] : [resource] + }, + async get(id) { + getCalls += 1 + return id === resource.id && !resource.deleted ? resource : null + }, + }, + executionStarted: true, + recordPath: '/does/not/exist/without-a-persisted-run.json', + materialization, + }) + assert.equal(resource.deleted, true) + assert.equal(listCalls, 2) + assert.equal(getCalls, 2) + assert.deepEqual(result.providerMaterialization, { + confirmed: true, + mode: 'pre-environment-owned-resource-set', + phase: null, + runId: 'run-materialized-without-record', + expectedName: 'braid-interactive-run-materialized-without-record', + matchedCount: 1, + observedIds: ['sandbox-materialized-without-record'], + removedIds: ['sandbox-materialized-without-record'], + deletions: [ + { + id: 'sandbox-materialized-without-record', + observed: true, + resolved: true, + deleted: true, + confirmed: true, + }, + ], + remainingIds: [], + }) +}) + test('LIVE-08 confirms absence when the observed resource races away before deletion', async () => { let listCalls = 0 const resource = { From 36dc8401105c958339019d3fff64525484ed0f79 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 18:27:20 -0600 Subject: [PATCH 084/136] refactor(live): name run-derived cleanup accurately --- .../tangle-sandbox-braid-interactive.mjs | 20 +++++++++---------- test/tangle-live07-wiring.test.mjs | 8 ++++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 3dd540ef..88a91608 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -343,7 +343,7 @@ export function interactiveMaterializationEvidence(record) { function interactiveResourceName(runId) { if (typeof runId !== 'string' || !/^[A-Za-z0-9._:-]{1,95}$/u.test(runId)) { - throw new Error('Interactive pre-environment cleanup requires a bounded Braid run identity') + throw new Error('Interactive run-derived cleanup requires a bounded Braid run identity') } return `braid-interactive-${runId}` } @@ -362,12 +362,12 @@ function sameNameInteractiveResources(resources, expectedName, predicate) { const matches = resources.filter((resource) => resource?.name === expectedName) if (matches.length > 1) { throw new Error( - `Interactive pre-environment cleanup found ${String(matches.length)} same-name Sandbox resources; cleanup refused`, + `Interactive run-derived cleanup found ${String(matches.length)} same-name Sandbox resources; cleanup refused`, ) } if (matches.length === 1 && !predicate(matches[0])) { throw new Error( - `Interactive pre-environment resource ${String(matches[0]?.id ?? 'without-id')} failed exact ownership validation`, + `Interactive run-derived resource ${String(matches[0]?.id ?? 'without-id')} failed exact ownership validation`, ) } return matches @@ -392,7 +392,7 @@ async function listAllSandboxResources(client) { } } -async function cleanupInteractiveBeforeEnvironment(client, materialization) { +async function cleanupInteractiveByRunId(client, materialization) { const runId = materialization?.runId const expectedName = interactiveResourceName(runId) const predicate = (resource) => isOwnedInteractiveResource(resource, expectedName) @@ -417,12 +417,12 @@ async function cleanupInteractiveBeforeEnvironment(client, materialization) { } if (!predicate(exact)) { throw new Error( - `Interactive pre-environment resource ${resource.id} failed exact ownership validation`, + `Interactive run-derived resource ${resource.id} failed exact ownership validation`, ) } await exact.delete() if ((await client.get(resource.id)) !== null) { - throw new Error(`Interactive pre-environment resource ${resource.id} remained after delete`) + throw new Error(`Interactive run-derived resource ${resource.id} remained after delete`) } removedIds.push(resource.id) deletions.push({ @@ -440,12 +440,12 @@ async function cleanupInteractiveBeforeEnvironment(client, materialization) { ) if (remaining.length > 0) { throw new Error( - `Interactive pre-environment cleanup left ${String(remaining.length)} same-name Sandbox resources`, + `Interactive run-derived cleanup left ${String(remaining.length)} same-name Sandbox resources`, ) } return { confirmed: true, - mode: listed.length === 0 ? 'pre-environment-absence' : 'pre-environment-owned-resource-set', + mode: listed.length === 0 ? 'run-derived-absence' : 'run-derived-owned-resource-set', phase: materialization.phase, runId, expectedName, @@ -885,12 +885,12 @@ export async function finalizeInteractiveProof({ if (client === undefined) { errors.push( new Error( - 'Sandbox observation client was unavailable; pre-environment absence could not be confirmed', + 'Sandbox observation client was unavailable; run-derived absence could not be confirmed', ), ) } else { const observed = await attemptCleanup(errors, 'run-derived Sandbox cleanup', () => - cleanupInteractiveBeforeEnvironment(client, materialization), + cleanupInteractiveByRunId(client, materialization), ) if (observed.ok) providerMaterialization = observed.value } diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 18476448..81e48957 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -613,7 +613,7 @@ test('LIVE-08 confirms Sandbox absence for a provider rejection before interacti assert.equal(listCalls, 2) assert.deepEqual(result.providerMaterialization, { confirmed: true, - mode: 'pre-environment-absence', + mode: 'run-derived-absence', phase: 'interactive_intent', runId: 'run-pre-environment', expectedName: 'braid-interactive-run-pre-environment', @@ -658,7 +658,7 @@ test('LIVE-08 deletes and confirms one exact resource when the Runtime phase is assert.equal(resource.deleted, true) assert.deepEqual(result.providerMaterialization, { confirmed: true, - mode: 'pre-environment-owned-resource-set', + mode: 'run-derived-owned-resource-set', phase: null, runId: 'run-pre-environment', expectedName: 'braid-interactive-run-pre-environment', @@ -727,7 +727,7 @@ test('LIVE-08 deletes the run-derived resource when provider materialization exi assert.equal(getCalls, 2) assert.deepEqual(result.providerMaterialization, { confirmed: true, - mode: 'pre-environment-owned-resource-set', + mode: 'run-derived-owned-resource-set', phase: null, runId: 'run-materialized-without-record', expectedName: 'braid-interactive-run-materialized-without-record', @@ -774,7 +774,7 @@ test('LIVE-08 confirms absence when the observed resource races away before dele }) assert.deepEqual(result.providerMaterialization, { confirmed: true, - mode: 'pre-environment-owned-resource-set', + mode: 'run-derived-owned-resource-set', phase: null, runId: 'run-pre-environment', expectedName: 'braid-interactive-run-pre-environment', From e87da83530514a78089b7c58cad417c8caaad6db Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 18:49:08 -0600 Subject: [PATCH 085/136] chore(deps): update Tangle interactive stack --- docs/04-runtime-contracts.md | 8 ++++---- package.json | 4 ++-- pnpm-lock.yaml | 30 +++++++++++++++--------------- pnpm-workspace.yaml | 4 ++-- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index 70a2e0ca..059fad5c 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -18,14 +18,14 @@ The following published versions were resolved in this worktree, and their insta | [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.180.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | | [`@tangle-network/agent-eval`](https://github.com/tangle-network/agent-eval) | `0.170.0` | Run records, judges, trace analysts, comparisons, and feedback trajectories | | `@tangle-network/agent-provider-cli-bridge` | `0.11.1` | CLI Bridge environment adapter with capability discovery, native retained sessions, bounded terminal results, live streaming, replay, retry-safe turns, retained control, durable interaction response, and explicit cancel | -| `@tangle-network/agent-provider-tangle` | `0.14.3` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations | -| `@tangle-network/sandbox` | `0.34.3` | Tangle cloud client used by the provider, including keyed checkpoint/fork and interactive-agent operations | +| `@tangle-network/agent-provider-tangle` | `0.14.4` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations | +| `@tangle-network/sandbox` | `0.34.4` | Tangle cloud client used by the provider, including keyed checkpoint/fork and interactive-agent operations | The installed runtime publishes `agent-eval >=0.170.0 <0.171.0`, `agent-interface ^1.9.0`, and `sandbox >=0.34.3 <0.35.0` as peer ranges. -The installed Tangle provider publishes `sandbox >=0.34.0 <1.0.0` as a peer range. +The installed Tangle provider publishes `sandbox >=0.34.4 <1.0.0` as a peer range. -Sandbox `0.34.3` publishes peers `@mastra/core ^1.36.0`, `@modelcontextprotocol/sdk ^1.30.0`, `ai ^6.0.175`, `openai ^6.36.0`, and `viem ^2.0.0`. +Sandbox `0.34.4` publishes peers `@mastra/core ^1.36.0`, `@modelcontextprotocol/sdk ^1.30.0`, `ai ^6.0.175`, `openai ^6.36.0`, and `viem ^2.0.0`. Braid exercises the exact dependency cohort in the table above. diff --git a/package.json b/package.json index b0a8ab50..f7177fa3 100644 --- a/package.json +++ b/package.json @@ -105,9 +105,9 @@ "@tangle-network/agent-eval": "0.170.0", "@tangle-network/agent-interface": "1.9.0", "@tangle-network/agent-provider-cli-bridge": "0.11.1", - "@tangle-network/agent-provider-tangle": "0.14.3", + "@tangle-network/agent-provider-tangle": "0.14.4", "@tangle-network/agent-runtime": "0.180.0", - "@tangle-network/sandbox": "0.34.3", + "@tangle-network/sandbox": "0.34.4", "@tangle-network/tcloud-attestation": "0.1.1", "better-sqlite3-multiple-ciphers": "13.0.3", "chalk": "6.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b74d2f61..74b121ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,14 +33,14 @@ importers: specifier: 0.11.1 version: 0.11.1 '@tangle-network/agent-provider-tangle': - specifier: 0.14.3 - version: 0.14.3(@tangle-network/sandbox@0.34.3) + specifier: 0.14.4 + version: 0.14.4(@tangle-network/sandbox@0.34.4) '@tangle-network/agent-runtime': specifier: 0.180.0 - version: 0.180.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.3) + version: 0.180.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4) '@tangle-network/sandbox': - specifier: 0.34.3 - version: 0.34.3 + specifier: 0.34.4 + version: 0.34.4 '@tangle-network/tcloud-attestation': specifier: 0.1.1 version: 0.1.1 @@ -541,10 +541,10 @@ packages: '@tangle-network/agent-provider-cli-bridge@0.11.1': resolution: {integrity: sha512-KwzNK1iBS9fZ8KgpMS+/wpBQ4EvvNwPJxioraiiJ7lbuosFesrS3v9hJb4R/02+gDNf5z7D/YS4XExc1KtFx7Q==} - '@tangle-network/agent-provider-tangle@0.14.3': - resolution: {integrity: sha512-4EAfWp+8F3U0UKq/Bu+UIcRbDt2EGf2nY3drtgho37UsAj0KpOh+DykoKNFevlyM179jPutw9CEuvIqSztDTeg==} + '@tangle-network/agent-provider-tangle@0.14.4': + resolution: {integrity: sha512-3LSBaK1FZyhKOgTkLYiSJCOsUTYDnVm6YSYpjnVVQD4vI7GOQdxYgfQPHE4MLCqYk6MazjiLZ5iR8sQeaTWAqw==} peerDependencies: - '@tangle-network/sandbox': '>=0.34.0 <1.0.0' + '@tangle-network/sandbox': '>=0.34.4 <1.0.0' '@tangle-network/agent-runtime@0.180.0': resolution: {integrity: sha512-/OI/YavBGIF8RgdoS+jXh6OUdJCUySM3meAJqMsGaCsPZ2fnQZANsXCgWi3VGe/zqQE8QN8rIrSO8NATOqFzQw==} @@ -561,8 +561,8 @@ packages: '@tangle-network/agent-trace-contract@1.0.2': resolution: {integrity: sha512-v7uMh56jkEp4vckevEU9xKsIatbs5dqzGPp69dFLSSXUVit0RP6VD6EANMXVlTCUk+6wVKBLHJx23XspVCEiIA==} - '@tangle-network/sandbox@0.34.3': - resolution: {integrity: sha512-Zy+DsmQD6qG+2yf8Zox3TCLVAcMOUwQsiVs9uz6OTb1rrz3yDemdoT3dGNUrpbV/wmt/62K+e/5nb7E0F2xNfg==} + '@tangle-network/sandbox@0.34.4': + resolution: {integrity: sha512-j0tkH1zZ0xdk718m4qaZVeUGGh2xA7LhP8uS/VivpEWyFVTrlpJWowMTUD11tNtIFjU3tWrIQRVVhNMk7rBoOw==} peerDependencies: '@mastra/core': ^1.36.0 '@modelcontextprotocol/sdk': ^1.30.0 @@ -1201,12 +1201,12 @@ snapshots: '@tangle-network/agent-interface': 1.9.0 undici: 7.29.0 - '@tangle-network/agent-provider-tangle@0.14.3(@tangle-network/sandbox@0.34.3)': + '@tangle-network/agent-provider-tangle@0.14.4(@tangle-network/sandbox@0.34.4)': dependencies: '@tangle-network/agent-interface': 1.9.0 - '@tangle-network/sandbox': 0.34.3 + '@tangle-network/sandbox': 0.34.4 - '@tangle-network/agent-runtime@0.180.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.3)': + '@tangle-network/agent-runtime@0.180.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4)': dependencies: '@tangle-network/agent-core': 0.9.5 '@tangle-network/agent-eval': 0.170.0 @@ -1216,7 +1216,7 @@ snapshots: '@tangle-network/agent-trace-contract': 1.0.2 tar-stream: 3.2.1 optionalDependencies: - '@tangle-network/sandbox': 0.34.3 + '@tangle-network/sandbox': 0.34.4 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bare-abort-controller @@ -1225,7 +1225,7 @@ snapshots: '@tangle-network/agent-trace-contract@1.0.2': {} - '@tangle-network/sandbox@0.34.3': + '@tangle-network/sandbox@0.34.4': dependencies: '@tangle-network/agent-core': 0.9.5 '@tangle-network/agent-interface': 1.9.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6124063b..53fcc58e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,8 +17,8 @@ minimumReleaseAgeExclude: - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0 || 10.8.0' - '@tangle-network/agent-profile-materialize@0.10.2 || 0.13.1 || 0.14.0 || 0.14.2 || 0.15.1 || 0.15.2 || 0.17.1' - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0 || 0.11.0 || 0.11.1' - - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2 || 0.14.3' - - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0 || 0.34.3' + - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2 || 0.14.3 || 0.14.4' + - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0 || 0.34.3 || 0.34.4' - hono@4.13.0 - '@esbuild/aix-ppc64@0.28.2' - '@esbuild/android-arm64@0.28.2' From 82327decca64720d58a3930daa6d30a41b58847e Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 19:10:39 -0600 Subject: [PATCH 086/136] fix(release): bind candidate publication to source identity --- .agent/skill-runs.jsonl | 1 + .github/workflows/release.yml | 8 +++ scripts/release/build-identity.mjs | 52 ++++++++++++++++++- scripts/release/prepare-candidate.mjs | 40 +++----------- scripts/release/release-collector.test.mjs | 33 +++++++++++- scripts/release/verify-candidate-identity.mjs | 45 ++++++++++++++++ test/scripts.test.ts | 3 +- 7 files changed, 146 insertions(+), 36 deletions(-) create mode 100644 scripts/release/verify-candidate-identity.mjs diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index fb6e7d4f..e0a369ba 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -98,3 +98,4 @@ {"skill":"/verify","ts":"2026-08-29T19:50:02Z","project":"braid-10-complete","target":"reconcile Braid release tracked edits and remove intermediate Tangle artifacts","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/release-conductor","ts":"2026-08-29T20:12:02Z","project":"braid-10-complete","target":"Braid 0.3.0 immutable candidate release path","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/verify","ts":"2026-08-29T20:12:02Z","project":"braid-10-complete","target":"Braid release automation fix and full local verification","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/harden","ts":"2026-08-30T01:12:35Z","project":"braid-release-provenance-fix","target":"Braid release candidate source-to-archive identity and npm publish boundary","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c7b21e49..353d7347 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -233,6 +233,14 @@ jobs: INDEX_SHA256="$(sha256sum "$ENDORSEMENT/files.sha256" | cut -d ' ' -f 1)" grep -Fx "index_sha256=$INDEX_SHA256" "$ENDORSEMENT/statement.txt" + - name: Re-verify exact candidate source and archive identity + env: + BRAID_RELEASE_ARTIFACT_ROOT: ${{ runner.temp }}/braid-release + BRAID_RELEASE_CHECKOUT: ${{ github.workspace }} + BRAID_RELEASE_EXPECT_COMMIT: ${{ inputs.commit }} + BRAID_RELEASE_EXPECT_VERSION: ${{ needs.candidate.outputs.version }} + run: node scripts/release/verify-candidate-identity.mjs + - name: Install the pinned npm client run: | npm install --global npm@11.18.0 diff --git a/scripts/release/build-identity.mjs b/scripts/release/build-identity.mjs index d4c3669d..2927c088 100644 --- a/scripts/release/build-identity.mjs +++ b/scripts/release/build-identity.mjs @@ -1,6 +1,6 @@ import { execFileSync } from 'node:child_process' import { createHash } from 'node:crypto' -import { readdir } from 'node:fs/promises' +import { lstat, readdir, realpath } from 'node:fs/promises' import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path' import { REQUIREMENT_PATTERN } from '../release-check-catalog.mjs' @@ -40,6 +40,11 @@ function sourceTreeChanges(repository) { return [...changed].sort() } +function inside(root, target) { + const path = relative(root, target) + return path === '' || (!isAbsolute(path) && path !== '..' && !path.startsWith(`..${sep}`)) +} + async function filesBelow(root) { const files = [] for (const entry of await readdir(root, { withFileTypes: true })) { @@ -300,3 +305,48 @@ export async function readBuildIdentity({ tarballPath: tarballRelative, } } + +export async function readCandidateIdentity({ + repository, + artifactRoot, + expectedCommit, + expectedVersion, +} = {}) { + const root = resolve(repository) + const evidenceRoot = resolve(artifactRoot) + assert(!inside(root, evidenceRoot), 'Release artifacts must be outside the source checkout') + const evidenceInfo = await lstat(evidenceRoot) + assert( + evidenceInfo.isDirectory() && !evidenceInfo.isSymbolicLink(), + 'Release artifact root is not real', + ) + assert( + (await realpath(evidenceRoot)) === evidenceRoot, + 'Release artifact root resolves indirectly', + ) + const packageProofPath = join(evidenceRoot, 'w6', 'package-proof.json') + const packageProof = await readPackageProof({ + repository: root, + packageProofRoot: evidenceRoot, + packageProofPath: 'w6/package-proof.json', + }) + assert( + packageProof && typeof packageProof === 'object' && !Array.isArray(packageProof), + 'Package proof is not an object', + ) + assert( + typeof packageProof.tarball === 'string' && packageProof.tarball.length > 0, + 'Package proof has no tarball filename', + ) + const identity = await readBuildIdentity({ + repository: root, + artifactRoot: evidenceRoot, + tarballPath: join(evidenceRoot, 'candidate', packageProof.tarball), + packageProof, + }) + if (expectedCommit !== undefined) + assert(identity.gitCommit === expectedCommit, 'Candidate commit differs from expectation') + if (expectedVersion !== undefined) + assert(identity.braidVersion === expectedVersion, 'Candidate version differs from expectation') + return { identity, packageProof, packageProofPath } +} diff --git a/scripts/release/prepare-candidate.mjs b/scripts/release/prepare-candidate.mjs index 8a1a9aa9..2f5b2227 100644 --- a/scripts/release/prepare-candidate.mjs +++ b/scripts/release/prepare-candidate.mjs @@ -1,10 +1,9 @@ import { spawn } from 'node:child_process' -import { createHash } from 'node:crypto' import { lstat, mkdir, readFile, realpath } from 'node:fs/promises' -import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path' +import { isAbsolute, join, relative, resolve, sep } from 'node:path' +import { readCandidateIdentity } from './build-identity.mjs' import { pnpmInvocation } from './platform.mjs' -import { readRegularFileNoFollow } from '../release-files.mjs' function assert(condition, message) { if (!condition) throw new Error(message) @@ -32,12 +31,6 @@ async function run(file, args, options = {}) { }) } -async function sha256(path) { - return createHash('sha256') - .update(await readRegularFileNoFollow(path)) - .digest('hex') -} - const repository = resolve(new URL('../../', import.meta.url).pathname) const artifactRootValue = process.env.BRAID_RELEASE_ARTIFACT_ROOT assert(artifactRootValue, 'BRAID_RELEASE_ARTIFACT_ROOT is required') @@ -92,36 +85,19 @@ if (!existingTarball) { ) } -const packageProof = JSON.parse((await readRegularFileNoFollow(packageProofPath)).toString('utf8')) -const head = await new Promise((resolvePromise, reject) => { - let stdout = '' - const child = spawn('git', ['rev-parse', 'HEAD'], { - cwd: repository, - shell: false, - stdio: ['ignore', 'pipe', 'inherit'], - }) - child.stdout.setEncoding('utf8') - child.stdout.on('data', (chunk) => { - stdout += chunk - }) - child.once('error', reject) - child.once('close', (code) => - code === 0 ? resolvePromise(stdout.trim()) : reject(new Error(`git rev-parse exited ${code}`)), - ) +const { identity } = await readCandidateIdentity({ + repository, + artifactRoot, + expectedVersion: packageJson.version, }) -assert(packageProof.version === packageJson.version, 'Package proof version differs') -assert(packageProof.gitCommit === head, 'Restored candidate commit differs') -assert(packageProof.tarball === basename(tarballPath), 'Package proof archive name differs') -assert(packageProof.sha256 === (await sha256(tarballPath)), 'Package proof archive digest differs') -assert(packageProof.packageFileManifest?.entries?.length > 0, 'Package proof has no file manifest') process.stdout.write( `${JSON.stringify( { version: packageJson.version, - commit: packageProof.gitCommit, + commit: identity.gitCommit, tarball: tarballPath, - tarballSha256: packageProof.sha256, + tarballSha256: identity.tarballSha256, packageProof: packageProofPath, }, null, diff --git a/scripts/release/release-collector.test.mjs b/scripts/release/release-collector.test.mjs index f6293f8c..4b1a0d39 100644 --- a/scripts/release/release-collector.test.mjs +++ b/scripts/release/release-collector.test.mjs @@ -2,7 +2,7 @@ import { strict as assert } from 'node:assert' import { execFileSync } from 'node:child_process' import { createHash } from 'node:crypto' import { EventEmitter } from 'node:events' -import { chmod, mkdir, mkdtemp, readdir, readFile, rm, writeFile } from 'node:fs/promises' +import { chmod, copyFile, mkdir, mkdtemp, readdir, readFile, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { PassThrough } from 'node:stream' @@ -10,7 +10,12 @@ import { test } from 'node:test' import { gzipSync } from 'node:zlib' import { writeJsonAtomic } from './atomic-storage.mjs' -import { bindingForCheck, readBuildIdentity, readRequirementIds } from './build-identity.mjs' +import { + bindingForCheck, + readBuildIdentity, + readCandidateIdentity, + readRequirementIds, +} from './build-identity.mjs' import { releaseChildEnvironment } from './child-environment.mjs' import { structuredChildEvidence } from './collection-contract.mjs' import { collectReleaseEvidence } from './collector.mjs' @@ -726,6 +731,30 @@ test('build identity binds clean HEAD, explicit Git-tree algorithm, tarball dige }) }) +test('candidate identity rejects restored proof metadata tampering', async () => { + await withRepo(async ({ root, artifactRoot, tarballPath, proof }) => { + await mkdir(join(artifactRoot, 'candidate'), { recursive: true }) + await mkdir(join(artifactRoot, 'w6'), { recursive: true }) + await copyFile(tarballPath, join(artifactRoot, 'candidate', proof.tarball)) + const proofPath = join(artifactRoot, 'w6', 'package-proof.json') + await writeFile(proofPath, `${JSON.stringify(proof)}\n`) + + const candidate = await readCandidateIdentity({ + repository: root, + artifactRoot, + expectedCommit: proof.gitCommit, + expectedVersion: proof.version, + }) + assert.equal(candidate.identity.tarballSha256, proof.sha256) + + await writeFile(proofPath, `${JSON.stringify({ ...proof, sourceDigest: '0'.repeat(64) })}\n`) + await expectRejectAsync( + () => readCandidateIdentity({ repository: root, artifactRoot }), + /source digest differs/iu, + ) + }) +}) + test('atomic interruption leaves no partial file and permits a clean retry', async () => { const root = await mkdtemp(join(tmpdir(), 'braid-atomic-')) try { diff --git a/scripts/release/verify-candidate-identity.mjs b/scripts/release/verify-candidate-identity.mjs new file mode 100644 index 00000000..eef8665e --- /dev/null +++ b/scripts/release/verify-candidate-identity.mjs @@ -0,0 +1,45 @@ +import { resolve } from 'node:path' + +import { readCandidateIdentity } from './build-identity.mjs' + +function assert(condition, message) { + if (!condition) throw new Error(message) +} + +const repository = resolve( + process.env.BRAID_RELEASE_CHECKOUT ?? new URL('../../', import.meta.url).pathname, +) +const artifactRootValue = process.env.BRAID_RELEASE_ARTIFACT_ROOT +const expectedCommit = process.env.BRAID_RELEASE_EXPECT_COMMIT +const expectedVersion = process.env.BRAID_RELEASE_EXPECT_VERSION +assert(artifactRootValue, 'BRAID_RELEASE_ARTIFACT_ROOT is required') +assert( + /^[a-f0-9]{40}$/u.test(expectedCommit ?? ''), + 'BRAID_RELEASE_EXPECT_COMMIT must be a full SHA', +) +assert(expectedVersion, 'BRAID_RELEASE_EXPECT_VERSION is required') + +const { identity, packageProof } = await readCandidateIdentity({ + repository, + artifactRoot: artifactRootValue, + expectedCommit, + expectedVersion, +}) + +process.stdout.write( + `${JSON.stringify( + { + schema: 'braid.candidate-identity.v1', + version: identity.braidVersion, + gitCommit: identity.gitCommit, + treeSha256: identity.treeSha256, + sourceDigest: packageProof.sourceDigest, + tarballSha256: identity.tarballSha256, + packageIntegrity: identity.packageIntegrity, + packageFileManifestDigest: identity.packageFileManifestDigest, + tarballPath: identity.tarballPath, + }, + null, + 2, + )}\n`, +) diff --git a/test/scripts.test.ts b/test/scripts.test.ts index cd9d0d28..0ac5331d 100644 --- a/test/scripts.test.ts +++ b/test/scripts.test.ts @@ -607,7 +607,7 @@ test('release subprocesses and recorded paths are portable to Windows', async () 'utf8', ) assert.match(candidatePreparation, /pnpmInvocation\(\['run', 'build'\]\)/u) - assert.match(candidatePreparation, /readRegularFileNoFollow/u) + assert.match(candidatePreparation, /readCandidateIdentity/u) assert.doesNotMatch(candidatePreparation, /run\('pnpm'/u) }) @@ -967,6 +967,7 @@ test('release keys stay isolated while publication uses the installed product', const publish = job('publish', 'post-publish-smoke') assert.doesNotMatch(publish, /already exists; checking|if npm view/iu) assert.match(publish, /node scripts\/release\/check-registry-collision\.mjs/u) + assert.match(publish, /node scripts\/release\/verify-candidate-identity\.mjs/u) assert.match(publish, /if: steps\.registry\.outputs\.status == 'available'/u) const candidateSmoke = job('platform-smoke', 'publish') From a17e469c521e6da3053421be31d4dbe14692890b Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 19:15:54 -0600 Subject: [PATCH 087/136] style(live): format continuity evidence --- .../live-required/tangle-sandbox-interactive-continuity.mjs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-interactive-continuity.mjs b/scripts/live-required/tangle-sandbox-interactive-continuity.mjs index dcb101f4..b2aa340b 100644 --- a/scripts/live-required/tangle-sandbox-interactive-continuity.mjs +++ b/scripts/live-required/tangle-sandbox-interactive-continuity.mjs @@ -798,8 +798,7 @@ export async function runInteractiveContinuityProof({ checks.push( checkRecord('stale-identity-rejected', box.id, ref, { rejectedIncarnationId: staleRef.incarnationId, - statusErrorCode: - typeof staleStatusError?.code === 'string' ? staleStatusError.code : null, + statusErrorCode: typeof staleStatusError?.code === 'string' ? staleStatusError.code : null, }), ) From b5b58827d9f6e9365491a1aed81105df7b286530 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 20:02:25 -0600 Subject: [PATCH 088/136] fix(tui): align focused run controls --- .agent/skill-runs.jsonl | 2 + artifacts/verification/w6/120x40-plain.txt | 4 +- artifacts/verification/w6/120x40.png | Bin 22649 -> 22649 bytes artifacts/verification/w6/200x60-plain.txt | 4 +- artifacts/verification/w6/200x60.png | Bin 10379 -> 10379 bytes artifacts/verification/w6/40x12-plain.txt | 4 +- artifacts/verification/w6/40x12.png | Bin 14275 -> 14275 bytes .../verification/w6/80x24-automation.gif | Bin 14866 -> 22889 bytes artifacts/verification/w6/80x24-plain.txt | 4 +- .../w6/80x24-transcript-keyboard.gif | Bin 362293 -> 362293 bytes artifacts/verification/w6/80x24.png | Bin 18510 -> 18510 bytes .../verification/w6/capture-manifest.json | 156 +++++----- .../w6/raw/transcript-keyboard.cast | 141 ++++----- .../w6/states/active-streaming.json | 36 +-- .../w6/states/active-streaming.png | Bin 15091 -> 15091 bytes .../verification/w6/states/analysis.json | 8 +- artifacts/verification/w6/states/analysis.png | Bin 58389 -> 58389 bytes .../verification/w6/states/automation.json | 8 +- .../verification/w6/states/automation.png | Bin 4156 -> 4156 bytes .../w6/states/command-palette-120.json | 8 +- .../w6/states/command-palette-120.png | Bin 36822 -> 36822 bytes .../w6/states/command-palette-40.json | 8 +- .../w6/states/command-palette-40.png | Bin 9482 -> 9482 bytes .../w6/states/command-palette-80.json | 8 +- .../w6/states/command-palette-80.png | Bin 35276 -> 35276 bytes .../verification/w6/states/comparison.json | 8 +- .../verification/w6/states/comparison.png | Bin 64782 -> 64782 bytes artifacts/verification/w6/states/empty.json | 8 +- artifacts/verification/w6/states/empty.png | Bin 5782 -> 5782 bytes .../w6/states/failure-or-reconnect.json | 46 +-- .../w6/states/failure-or-reconnect.png | Bin 18786 -> 18786 bytes .../verification/w6/states/fork-preview.json | 8 +- .../verification/w6/states/fork-preview.png | Bin 9878 -> 9878 bytes .../w6/states/graph-or-analysis.json | 8 +- .../w6/states/graph-or-analysis.png | Bin 20641 -> 20641 bytes .../verification/w6/states/interaction.json | 8 +- .../verification/w6/states/interaction.png | Bin 28820 -> 28820 bytes .../verification/w6/states/multi-run.json | 268 +++++++++--------- .../verification/w6/states/multi-run.png | Bin 24549 -> 24549 bytes artifacts/verification/w6/states/narrow.json | 8 +- artifacts/verification/w6/states/narrow.png | Bin 9639 -> 9639 bytes artifacts/verification/w6/states/profile.json | 8 +- artifacts/verification/w6/states/profile.png | Bin 6355 -> 6355 bytes .../verification/w6/states/supervision.json | 126 ++++---- .../verification/w6/states/supervision.png | Bin 24507 -> 24507 bytes src/adapters/tui/ui-capabilities.ts | 8 +- src/adapters/tui/ui-command-dispatch.ts | 10 +- src/views/shared/run-selection.ts | 40 +++ src/views/tui/terminal-input-controller.ts | 14 +- src/views/tui/terminal-surface-overlays.ts | 10 +- test/intelligence-dispatch.test.ts | 90 ++++++ test/tui-core-workflows.test.ts | 32 ++- test/tui.test.ts | 127 +++++++++ 53 files changed, 741 insertions(+), 477 deletions(-) create mode 100644 src/views/shared/run-selection.ts diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index e0a369ba..8229d066 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -99,3 +99,5 @@ {"skill":"/release-conductor","ts":"2026-08-29T20:12:02Z","project":"braid-10-complete","target":"Braid 0.3.0 immutable candidate release path","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/verify","ts":"2026-08-29T20:12:02Z","project":"braid-10-complete","target":"Braid release automation fix and full local verification","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/harden","ts":"2026-08-30T01:12:35Z","project":"braid-release-provenance-fix","target":"Braid release candidate source-to-archive identity and npm publish boundary","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/ui-test","ts":"2026-08-30T02:01:21Z","project":"braid-keyboard-flow-fix","target":"packed Braid PTY keyboard workflows","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/product-design","ts":"2026-08-30T02:01:21Z","project":"braid-keyboard-flow-fix","target":"packed Braid keyboard workflow capture","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/ui-test","operatorOverride":null,"transcriptPath":null,"traceDir":null} diff --git a/artifacts/verification/w6/120x40-plain.txt b/artifacts/verification/w6/120x40-plain.txt index ba6dae3b..987fcf63 100644 --- a/artifacts/verification/w6/120x40-plain.txt +++ b/artifacts/verification/w6/120x40-plain.txt @@ -1,4 +1,4 @@ -Braid ready — /home/drew/code/.worktrees/braid-10-complete +Braid ready — /home/drew/code/.worktrees/braid-keyboard-flow-fix status: ready for a message conversation: New conversation; branch: branch-1 profile: Braid starter; runner: pi; connection: deterministic fixture @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-ac2d7215-e805-4ac0-91bb-a09a1ea556a5","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"9380ed48-4109-4a2a-b2d6-58177854c637","backend":"executor","status":"active","createdAt":"2026-08-29T18:48:58.763Z","updatedAt":"2026-08-29T18:48:58.763Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-65367645-2b6b-46ae-a6c2-4603a5b288f8","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"47f133db-f726-48c9-baf1-703b9a04a47a","backend":"executor","status":"active","createdAt":"2026-08-30T01:57:41.242Z","updatedAt":"2026-08-30T01:57:41.242Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/120x40.png b/artifacts/verification/w6/120x40.png index 0e3351321632221c22265f86d6843caa7ce3730b..3e9079a96772541d6c6a7d4b0ab4f95b9701a727 100644 GIT binary patch delta 21 ccmeylf$`@C#tB&*a*UQnHah+)8;jT@0A0)nJ^%m! delta 21 dcmeylf$`@C#tB&*vOn3kLv9X9f0sv^02>bv5 diff --git a/artifacts/verification/w6/200x60-plain.txt b/artifacts/verification/w6/200x60-plain.txt index ba6dae3b..987fcf63 100644 --- a/artifacts/verification/w6/200x60-plain.txt +++ b/artifacts/verification/w6/200x60-plain.txt @@ -1,4 +1,4 @@ -Braid ready — /home/drew/code/.worktrees/braid-10-complete +Braid ready — /home/drew/code/.worktrees/braid-keyboard-flow-fix status: ready for a message conversation: New conversation; branch: branch-1 profile: Braid starter; runner: pi; connection: deterministic fixture @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-ac2d7215-e805-4ac0-91bb-a09a1ea556a5","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"9380ed48-4109-4a2a-b2d6-58177854c637","backend":"executor","status":"active","createdAt":"2026-08-29T18:48:58.763Z","updatedAt":"2026-08-29T18:48:58.763Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-65367645-2b6b-46ae-a6c2-4603a5b288f8","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"47f133db-f726-48c9-baf1-703b9a04a47a","backend":"executor","status":"active","createdAt":"2026-08-30T01:57:41.242Z","updatedAt":"2026-08-30T01:57:41.242Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/200x60.png b/artifacts/verification/w6/200x60.png index 4cc5a9814a76b4a3cfb6cf519bd4549923817646..98674add5766be325daa4f23a138b9ecdd7d08ec 100644 GIT binary patch delta 21 dcmeAU><-+pi-|*y(bD9q|0}`GhnP;P0svUU2t5D* delta 21 dcmeAU><-+pi-|*4$dJ=hd*1oYhnP;P0svFc2iyPv diff --git a/artifacts/verification/w6/40x12-plain.txt b/artifacts/verification/w6/40x12-plain.txt index ba6dae3b..987fcf63 100644 --- a/artifacts/verification/w6/40x12-plain.txt +++ b/artifacts/verification/w6/40x12-plain.txt @@ -1,4 +1,4 @@ -Braid ready — /home/drew/code/.worktrees/braid-10-complete +Braid ready — /home/drew/code/.worktrees/braid-keyboard-flow-fix status: ready for a message conversation: New conversation; branch: branch-1 profile: Braid starter; runner: pi; connection: deterministic fixture @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-ac2d7215-e805-4ac0-91bb-a09a1ea556a5","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"9380ed48-4109-4a2a-b2d6-58177854c637","backend":"executor","status":"active","createdAt":"2026-08-29T18:48:58.763Z","updatedAt":"2026-08-29T18:48:58.763Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-65367645-2b6b-46ae-a6c2-4603a5b288f8","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"47f133db-f726-48c9-baf1-703b9a04a47a","backend":"executor","status":"active","createdAt":"2026-08-30T01:57:41.242Z","updatedAt":"2026-08-30T01:57:41.242Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/40x12.png b/artifacts/verification/w6/40x12.png index 288d16a6a044215b3145c9b877c339b470100121..90c8ba9e7ac9b44589fe0b87489d02ca870b3f29 100644 GIT binary patch delta 19 acmX?{e>i_a7Ka?8rJjbaaQ4QcKyv^{BL-^# delta 19 bcmX?{e>i_a7Kf~mA@j}8;1QL3e0E%=%?-(pp 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 ae+%5;3U|1~Ev|8oi`?WYce%d^1OPiarE2j2 delta 12666 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 diff --git a/artifacts/verification/w6/80x24-plain.txt b/artifacts/verification/w6/80x24-plain.txt index ba6dae3b..987fcf63 100644 --- a/artifacts/verification/w6/80x24-plain.txt +++ b/artifacts/verification/w6/80x24-plain.txt @@ -1,4 +1,4 @@ -Braid ready — /home/drew/code/.worktrees/braid-10-complete +Braid ready — /home/drew/code/.worktrees/braid-keyboard-flow-fix status: ready for a message conversation: New conversation; branch: branch-1 profile: Braid starter; runner: pi; connection: deterministic fixture @@ -6,7 +6,7 @@ appearance: none; high contrast off; reduced motion off event 2: draft.changed; status: ready for a message event 3: run.requested; status: admitted: W6 plain proof event 4: effect.upserted; status: streaming -event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-ac2d7215-e805-4ac0-91bb-a09a1ea556a5","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"9380ed48-4109-4a2a-b2d6-58177854c637","backend":"executor","status":"active","createdAt":"2026-08-29T18:48:58.763Z","updatedAt":"2026-08-29T18:48:58.763Z","metadata":"[unavailable]"}," +event 5: run.provider.event; status: streaming: {"type":"backend_start","task":{"id":"turn-65367645-2b6b-46ae-a6c2-4603a5b288f8","intent":"W6 plain proof","metadata":{"identity":{"profileDigest":"sha256:8344a03c82d5cb9207910fe0cb05ef0757b58b8cea9a7cc82f36055694d58983","taskDigest":"sha256:d36c141186589fc69f020dd03cda71443909176c6bbf640d87724c3ad0297c66"}}},"session":{"id":"47f133db-f726-48c9-baf1-703b9a04a47a","backend":"executor","status":"active","createdAt":"2026-08-30T01:57:41.242Z","updatedAt":"2026-08-30T01:57:41.242Z","metadata":"[unavailable]"}," event 6: run.usage; status: streaming event 7: run.artifact; status: streaming: agent-turn-result event 8: run.finished; status: completed: Fixture response through pi: W6 plain proof diff --git a/artifacts/verification/w6/80x24-transcript-keyboard.gif b/artifacts/verification/w6/80x24-transcript-keyboard.gif index 0b27dcded1205b5c058bc104901b24f100cd3a60..0c8ef179d00dea64587c2ac37b9298c7a0bb2a02 100644 GIT binary patch delta 232 zcmdnmC$_auY=RP_-bUqltc>iN53#W0Ziw4HaF>+2` zWi2!L>`Knfv-0nWGV)CSsKFw$d1|Y)3M1R*jVqr?F!D~`xKeoY>OWrB$m z{w-FSUgXIvzWui%;8BCnp*LN^lmol=03=^9Ul;+K zuM8@^ed;}?yIG8!5Vb%Vw(b3%%zCAaTyWh&+n?=Y<^rnO4m2;ejFDrz|9qBb&jFH^ BQ`P_g delta 213 zcmdnmC$_auY=RP_!batJtc)z153#)#AT$@D$l zDvWH?KWeauZU3#vI3;cR6GcYx=>Zu`oZHuTFj|*__-fk){xNE1fu*(srS!@`Oxf+T v?=fA6h=Me*ZSVJF)&pzM-2QAIGZ#c^a(^q^c3w>u$1+CF?f&ywo;?QuV0KVW diff --git a/artifacts/verification/w6/80x24.png b/artifacts/verification/w6/80x24.png index 3ef6acc7452949c15affb9bde88a427eefce48a9..c31ab4239273be10ce65abdda010e4a4d01672d0 100644 GIT binary patch delta 21 dcmX>%f$`h~#tB&*a*UP+mz4B4HWuA+2LM+-2e|+M delta 21 dcmX>%f$`h~#tB&*vO$>8 diff --git a/artifacts/verification/w6/capture-manifest.json b/artifacts/verification/w6/capture-manifest.json index 00fc2583..440692f7 100644 --- a/artifacts/verification/w6/capture-manifest.json +++ b/artifacts/verification/w6/capture-manifest.json @@ -1,11 +1,11 @@ { "schemaVersion": 3, - "generatedAt": "2026-08-29T18:49:38.773Z", + "generatedAt": "2026-08-30T01:58:27.105Z", "command": "pnpm capture:visual", "binary": "clean npm install from generated tarball", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9", + "tarballSha256": "7945e73863a9cd764dd4d80a258af49faff0233718162e89e7d731e5b342add7", "stateFixture": "deterministic", "liveDemoCommand": "pnpm capture:demo:live", "terminal": "node-pty/xterm-256color", @@ -255,14 +255,14 @@ }, { "path": "40x12-plain.txt", - "sha256": "88ebcf94c6950e0cebe6736fde7bc67a8f636fcad2ba96272ab86453e6fb2622", + "sha256": "f6738d2d40b7b3f04c64809530ae99cbdce7b701ef2c02eb5a04da99cc8a7924", "kind": "plain-frame", "columns": 40, "rows": 12 }, { "path": "40x12.png", - "sha256": "d0903d3cc2504312980d3d6bdfad9d77f17edec4b155512a04a2e9ecf5ff6df1", + "sha256": "4be490c7924cc119db0511d0edd59c703354552f1e81b72e6aff132bd9302ae7", "kind": "png", "columns": 40, "rows": 12 @@ -276,14 +276,14 @@ }, { "path": "80x24-plain.txt", - "sha256": "88ebcf94c6950e0cebe6736fde7bc67a8f636fcad2ba96272ab86453e6fb2622", + "sha256": "f6738d2d40b7b3f04c64809530ae99cbdce7b701ef2c02eb5a04da99cc8a7924", "kind": "plain-frame", "columns": 80, "rows": 24 }, { "path": "80x24.png", - "sha256": "36ecd364dec5235b4b7520d7702ea37f16fc673d4ca56fb369ac65b22af66bca", + "sha256": "21580d87d315f4010eccb04ded27650a1fbd2a2aa096a006f2b5e9fac4ac3188", "kind": "png", "columns": 80, "rows": 24 @@ -297,14 +297,14 @@ }, { "path": "120x40-plain.txt", - "sha256": "88ebcf94c6950e0cebe6736fde7bc67a8f636fcad2ba96272ab86453e6fb2622", + "sha256": "f6738d2d40b7b3f04c64809530ae99cbdce7b701ef2c02eb5a04da99cc8a7924", "kind": "plain-frame", "columns": 120, "rows": 40 }, { "path": "120x40.png", - "sha256": "8b459f71f72b077c585cd49a3e27303aded77cbd7cbb01ab8385c0aa5f9306cd", + "sha256": "43466897b66b8d849528dc6503553112da5ff98b094062937a08977fc218ac5e", "kind": "png", "columns": 120, "rows": 40 @@ -318,21 +318,21 @@ }, { "path": "200x60-plain.txt", - "sha256": "88ebcf94c6950e0cebe6736fde7bc67a8f636fcad2ba96272ab86453e6fb2622", + "sha256": "f6738d2d40b7b3f04c64809530ae99cbdce7b701ef2c02eb5a04da99cc8a7924", "kind": "plain-frame", "columns": 200, "rows": 60 }, { "path": "200x60.png", - "sha256": "0aefed5d63acdd2f2bffb282cbfef64bce682e3f1e8f9910d3e19f3118933cd7", + "sha256": "84a3e39e6c8ee10a0e79dd4e335e0f2aea9cf8cfd516817ae9b3856958e09906", "kind": "png", "columns": 200, "rows": 60 }, { "path": "states/command-palette-40.json", - "sha256": "f8a9434eeaa51366cda6e8bd4f7a36bb40a05aee2ecf1654faca0da89d9be8f9", + "sha256": "0be6083e4b654bde73269982e088495e945d34d2dab50929b35de4e84b072d8e", "kind": "semantic-state", "state": "command-palette-40", "columns": 40, @@ -348,7 +348,7 @@ }, { "path": "raw/command-palette-40.cast", - "sha256": "bd1716f9a734d5303d98c210e5b1d85fe85b0a71ffdc5c45473683debda949e3", + "sha256": "48f43d5ffab94acb4776e0854cfadc759bbd6c69b5792a6b0c1977c1adbbda28", "kind": "asciicast", "state": "command-palette-40", "columns": 40, @@ -356,7 +356,7 @@ }, { "path": "states/command-palette-40.ansi", - "sha256": "3297fade4a163c3fe6b78237db4f23599a26201c27c693b5c84de806da3bc082", + "sha256": "4a1bf884d4773f44dd243f81ef778d1540cc7f9fa94bec4bb6a074b43d211bad", "kind": "ansi", "state": "command-palette-40", "columns": 40, @@ -364,7 +364,7 @@ }, { "path": "states/command-palette-40.png", - "sha256": "4e166185c79222039aea145ca448216b7f782213af45aaa4fdf00296b11abb3a", + "sha256": "dd738b530c4396c7331d5e2d7c8a293b06f607bfbe18d575f78f025b2771974f", "kind": "png", "state": "command-palette-40", "columns": 40, @@ -372,7 +372,7 @@ }, { "path": "states/command-palette-80.json", - "sha256": "da0f576e17b8c34d722aa63a60670ae4d7356eda43320031562a67426d415078", + "sha256": "999f89767981b760e4aec43f681117709b078dffee21aec99020aa71e4b88504", "kind": "semantic-state", "state": "command-palette-80", "columns": 80, @@ -388,7 +388,7 @@ }, { "path": "raw/command-palette-80.cast", - "sha256": "e657763442961bb82a96d276b6a97e4a9cce783c2225792a9c7c3eb428ef3652", + "sha256": "6f1ca089e21062fda27b4062b0a21edc2e900dcb423973c832670eaa3574547f", "kind": "asciicast", "state": "command-palette-80", "columns": 80, @@ -396,7 +396,7 @@ }, { "path": "states/command-palette-80.ansi", - "sha256": "55ef7cf6d440ff0b214f341581092a219f6f7d04499f2a558a22c65d9fbb79ce", + "sha256": "89498b1a701a8990585e385cf3ba2aa19354bcd68e27c3b8fbd5eb97e13ff615", "kind": "ansi", "state": "command-palette-80", "columns": 80, @@ -404,7 +404,7 @@ }, { "path": "states/command-palette-80.png", - "sha256": "b61cffc8c0d0ef0b619a6ee7010e52ba855616a5346fad25ffeb3209c4433aa3", + "sha256": "dc6cf9d8c40b6adcd347e0f4e8efff5a8bba5bb09843733cd7c9806dc7aee1e4", "kind": "png", "state": "command-palette-80", "columns": 80, @@ -412,7 +412,7 @@ }, { "path": "states/command-palette-120.json", - "sha256": "ebebb853471835f503e7ae4f25d6144bf45659f1f9349efc5b8c8a6ea9911a31", + "sha256": "2b17900ea7b132768652acd648587bddf1bbb0476de34e423aec99a55c3d191f", "kind": "semantic-state", "state": "command-palette-120", "columns": 120, @@ -428,7 +428,7 @@ }, { "path": "raw/command-palette-120.cast", - "sha256": "43134eda39f477069f203714c25c608d73f0547a8594f06c4a3e84e4a4e009fb", + "sha256": "259760eb0f8d7bbcd206dd948618a3820217b68616137df2acc7783cabb04e08", "kind": "asciicast", "state": "command-palette-120", "columns": 120, @@ -436,7 +436,7 @@ }, { "path": "states/command-palette-120.ansi", - "sha256": "66eb92ca74e749e6c99623810b3af1e04d100fe083d0b62135d83192a3df00c3", + "sha256": "000bdc1eb2836b9f85f11ef378df014810e3b5e7e12d1eaf58acb218e612d586", "kind": "ansi", "state": "command-palette-120", "columns": 120, @@ -444,7 +444,7 @@ }, { "path": "states/command-palette-120.png", - "sha256": "1ccacd89d917d48d98377ea057d5232202bd865f367cf06a935c14acfb971bfa", + "sha256": "2c3dac0a3b15babf42d4e2feea036d4e6a2a0fe4ff84ce0d3e0cf861f9557adf", "kind": "png", "state": "command-palette-120", "columns": 120, @@ -452,7 +452,7 @@ }, { "path": "states/empty.json", - "sha256": "47afd8a5e0d6717f420063d4ea9e4df1f84445883ed6e1debf87cd2ec767ac0a", + "sha256": "032d8fb7fc50bbb1ddfe81d57f351a4b19fd9030e0696d94380339746e10208f", "kind": "semantic-state", "state": "empty", "columns": 80, @@ -468,7 +468,7 @@ }, { "path": "raw/empty.cast", - "sha256": "c5248633d81acf407a023475137c2943d590754d2bb5ac3e1788b149dddfbe96", + "sha256": "0ab9ba958f5d7f0e09a34805c6524b5be4153ee8dc1d322c9c3a5b0110fd16a5", "kind": "asciicast", "state": "empty", "columns": 80, @@ -476,7 +476,7 @@ }, { "path": "states/empty.ansi", - "sha256": "283855aa491310320ea63a83568a94614c6553d7f864653ef8ffa88d19289f16", + "sha256": "de80c2a0fbaec53ceecd1bc6cd5e22f63a7627983bd5fe7f609fabcb9dbace39", "kind": "ansi", "state": "empty", "columns": 80, @@ -484,7 +484,7 @@ }, { "path": "states/empty.png", - "sha256": "74e8a83242e4a6b8f638f4ed22f6edfe68e9a5b4716d3012e1033e47d2ba085c", + "sha256": "8e153b8bed8dfac8521a2b2cf55d605d302257418d7a4007bdbaebf9fc7306a9", "kind": "png", "state": "empty", "columns": 80, @@ -492,7 +492,7 @@ }, { "path": "states/active-streaming.json", - "sha256": "71c56959646e2fe001522acc8bd8b5de659578ff620732661fc90339e5a905a7", + "sha256": "f232dbcca8a358baf49eba2201d2f6e9984bd84193bf070f809c11a8d9572ab4", "kind": "semantic-state", "state": "active-streaming", "columns": 80, @@ -508,7 +508,7 @@ }, { "path": "raw/active-streaming.cast", - "sha256": "79b86246efe93a8ece606676e5c962b5a7693118e4690b15ad4313584e02ff7f", + "sha256": "70ea4486d0402e11f402ea67b98d670801b2ccd6d1dbece3d22071b6b26b5ae7", "kind": "asciicast", "state": "active-streaming", "columns": 80, @@ -516,7 +516,7 @@ }, { "path": "states/active-streaming.ansi", - "sha256": "8f257fe6cc7f6acb7a2ca7ded88fe993da932eb85fbbb67a52e299418b2d7424", + "sha256": "3da9013952f7c12a97464accad9c32d49e5726de2c8931e34763ec2fbd20c0b4", "kind": "ansi", "state": "active-streaming", "columns": 80, @@ -524,7 +524,7 @@ }, { "path": "states/active-streaming.png", - "sha256": "429dcb7b94418bc66579dcae6a07a0dabb4413fa32406ec0e6556bcc6dc7f81e", + "sha256": "04a93a58783b6c4aa5a30f80ced64cd0480271bf23fb91f60252a301d355ef74", "kind": "png", "state": "active-streaming", "columns": 80, @@ -532,7 +532,7 @@ }, { "path": "states/multi-run.json", - "sha256": "4d6088df334a92a138a5ac8d63a48a4ec560475aa9340e0f1968fd4befaff563", + "sha256": "8433d90b0afcc439f343ba1e14ba24531982aa3d6ab447d98d4f05588348f590", "kind": "semantic-state", "state": "multi-run", "columns": 80, @@ -548,7 +548,7 @@ }, { "path": "raw/multi-run.cast", - "sha256": "5bde3ca6f4a2174dcc90dcec7394c33c171dea373c9be51b2dc861f1bd05e959", + "sha256": "460d24038fa54a66beb3c22f6b8708aea9c01a890e8bc324f7064461195b6b24", "kind": "asciicast", "state": "multi-run", "columns": 80, @@ -556,7 +556,7 @@ }, { "path": "states/multi-run.ansi", - "sha256": "c4c75e26b7a9f5736994f0424f06acb7dba65b6c473844b83413322a7f6dbe72", + "sha256": "1717494819d35fd929583b425e82668f0fcefe4e5f99fcc5ded6b67c14bb1476", "kind": "ansi", "state": "multi-run", "columns": 80, @@ -564,7 +564,7 @@ }, { "path": "states/multi-run.png", - "sha256": "13fcf78ca1940db056be73b182943887bbb8ebcf31d53d95f9ffecf84ac03161", + "sha256": "02339b72433be97fdc030478529f218c7384eb5d041648e50e0823b1f28f2409", "kind": "png", "state": "multi-run", "columns": 80, @@ -572,7 +572,7 @@ }, { "path": "states/supervision.json", - "sha256": "a6388ad92cd504fc918a57951128d20eb111e5a73bf068c5d1ad08914f5d167a", + "sha256": "24d4cc6a0fd3f941403ebd02ab8df4343af0fa5bfafdbaa14ce54d35f5c8f095", "kind": "semantic-state", "state": "supervision", "columns": 80, @@ -588,7 +588,7 @@ }, { "path": "raw/supervision.cast", - "sha256": "b1e0935e7b6b21d23764539e8c24eb5c3a3151aafd9d2c24005cf297c64b6e9c", + "sha256": "ed769f8e1a6efbf0e53a0662e2936d571dac6f6360565f07ca5b3570fe0d265e", "kind": "asciicast", "state": "supervision", "columns": 80, @@ -596,7 +596,7 @@ }, { "path": "states/supervision.ansi", - "sha256": "809554e977de5c9bc59371b2e3faa0c234c37f67de330e8a9e9529d4cdfea8a0", + "sha256": "609fdfbddfa529d94f108bcba91f3a9563d4b7be79d20be02b0646d5eb3eacb1", "kind": "ansi", "state": "supervision", "columns": 80, @@ -604,7 +604,7 @@ }, { "path": "states/supervision.png", - "sha256": "be6b14047938f26e4a79571ea67963266ba07f9d664d757efd311259dcbe1d66", + "sha256": "a8bd4cd852ecb2142ee3c4c7dcbc6c890379add160d827d95e9f013b8f5213e0", "kind": "png", "state": "supervision", "columns": 80, @@ -612,7 +612,7 @@ }, { "path": "states/interaction.json", - "sha256": "6d264fc07a1001ad19b23f47587153e053b350869eb0fcc20b380ff4ab420d64", + "sha256": "1f207085bc0974b5020bbf5b857ff60a296572dc6bdf923ce8cfa38d7200b7d9", "kind": "semantic-state", "state": "interaction", "columns": 80, @@ -628,7 +628,7 @@ }, { "path": "raw/interaction.cast", - "sha256": "7de991d2ce3adceb73472ffb82f1fb0311e1b21a50c1bab742882462b853fc5c", + "sha256": "a3d95fa21515c8608fbb39c298c3c2d1eb74cf4b98e083f965517643f740bd3a", "kind": "asciicast", "state": "interaction", "columns": 80, @@ -636,7 +636,7 @@ }, { "path": "states/interaction.ansi", - "sha256": "cf227250e34267978db20f710bc7a25e88ff43f49c964edc5f07efb35b1c77a5", + "sha256": "c49d758dac4fc4d97ef17708abb1634a945aae5098cada80ed6b2476b1710fcd", "kind": "ansi", "state": "interaction", "columns": 80, @@ -644,7 +644,7 @@ }, { "path": "states/interaction.png", - "sha256": "e3609d5ea5d5e781ecc94e643922926ea29d14f7068b9cc6ec2d4c5ccacbca5b", + "sha256": "b8a819550cfc520f5c16aab2372211ad9d18794b3b0d6e5563eec6379ae8ff98", "kind": "png", "state": "interaction", "columns": 80, @@ -652,7 +652,7 @@ }, { "path": "states/automation.json", - "sha256": "9e42bcbcb423c76905a88eada957bd2a821ef71843fe77fba5115397b1e2a7c0", + "sha256": "1f8338093c08cf703e2f3bc171a7037a39eaceaf8a4b3ce7ea2de5bc03b02891", "kind": "semantic-state", "state": "automation", "columns": 80, @@ -668,7 +668,7 @@ }, { "path": "raw/automation.cast", - "sha256": "b6f313d3d0d85a03eed062496d469b6d5532f97640ffdeeaf88a7c12a148b8b1", + "sha256": "d8d4de391af21be4408cb93199e67c0fbc8cd5f780ebc49ca77f5b44b99451eb", "kind": "asciicast", "state": "automation", "columns": 80, @@ -676,7 +676,7 @@ }, { "path": "states/automation.ansi", - "sha256": "eb00e926c0e22e2e5d1b045852f314151d51d7da8dd15de4339ee0b298e7cd2a", + "sha256": "66d2b98519ab6b8b229794f80adfd9a74777276499d82350279632a48a699d04", "kind": "ansi", "state": "automation", "columns": 80, @@ -684,7 +684,7 @@ }, { "path": "states/automation.png", - "sha256": "29789fa8f4dc0e14d7b359fdccabdff22bbeac13f949c007c43fb2a329d4607b", + "sha256": "d8023c1952a6d66a15c2cb1ae3c8ee053520da48121769e7d91d6cf0e3cfdff4", "kind": "png", "state": "automation", "columns": 80, @@ -692,7 +692,7 @@ }, { "path": "states/fork-preview.json", - "sha256": "61f8a2799dab35f4b47ee2d78f7254937e18b47e199aabeb2dda00c2559607ad", + "sha256": "94374294de2e84dedb620e42c97bfb34b75a79906c5cbc7d49bb08302675ad7c", "kind": "semantic-state", "state": "fork-preview", "columns": 80, @@ -708,7 +708,7 @@ }, { "path": "raw/fork-preview.cast", - "sha256": "b186f2d25e06db8339e430067a86ea5a479d91b921d1e6b1a32cd031f33c1963", + "sha256": "dd4bdf325ead57b2293293c7009f5b128f1a9944e8b6267dba2f22542bc6a086", "kind": "asciicast", "state": "fork-preview", "columns": 80, @@ -716,7 +716,7 @@ }, { "path": "states/fork-preview.ansi", - "sha256": "f936788b83f84226e76bd20bc64dccada054cfc5686890c6303d43a902a848d9", + "sha256": "b57bd9120c828993340bf5d91dcbb87d635ec406ddb91f90d488eb98334b5983", "kind": "ansi", "state": "fork-preview", "columns": 80, @@ -724,7 +724,7 @@ }, { "path": "states/fork-preview.png", - "sha256": "53e46b17876b351baba8af3609f3dc5cfea28fc26bb79d2266dc8c898581f24e", + "sha256": "0720eb99aac7c8311fe17fb070228aedd23f30cdeca06d4d044a06fcaa22d706", "kind": "png", "state": "fork-preview", "columns": 80, @@ -732,7 +732,7 @@ }, { "path": "states/graph-or-analysis.json", - "sha256": "900bf81ae4a50231d249dfc298b4c6e8c7b49e9eebc2e518b1788cd0beb10821", + "sha256": "ac62660d394084c6c680871a073450d788e2625394b4fb9d6d346d15b4d3e49a", "kind": "semantic-state", "state": "graph-or-analysis", "columns": 80, @@ -748,7 +748,7 @@ }, { "path": "raw/graph-or-analysis.cast", - "sha256": "5d539182123592304407d6771914d69e6bb2833205abd978af09b7e20e198871", + "sha256": "d14a9cecf7a62c868546be71bb6f5aad81e55e9a77858a2198b85dc7faf369c2", "kind": "asciicast", "state": "graph-or-analysis", "columns": 80, @@ -756,7 +756,7 @@ }, { "path": "states/graph-or-analysis.ansi", - "sha256": "5b7fc46ca79db3e75ff0de00e6d8168e3585e2e3765892e4fd692e735fc5e230", + "sha256": "8dffae3bad44b74c817b773a600208072ac8f5a1fd1774e9c10c4d114ddb2b42", "kind": "ansi", "state": "graph-or-analysis", "columns": 80, @@ -764,7 +764,7 @@ }, { "path": "states/graph-or-analysis.png", - "sha256": "a371550ca924acc6aeff097404847ac28a91702a4b3bfcb59f0d38177484fdf3", + "sha256": "b2b4afc12c3c5ea0b77ed4f7792ea0f315893796e3e0622d4bbe689412436ed4", "kind": "png", "state": "graph-or-analysis", "columns": 80, @@ -772,7 +772,7 @@ }, { "path": "states/analysis.json", - "sha256": "828a3caf3daf27888d148593f1879d7c89a199b929c24723c5442a5dd38e7ff1", + "sha256": "9ec9d295ab4880e9d415e52bd000483bbb8dc7c034238144a704d55226342569", "kind": "semantic-state", "state": "analysis", "columns": 80, @@ -788,7 +788,7 @@ }, { "path": "raw/analysis.cast", - "sha256": "41b99c0a6604c92f8b691d1aebc2e6847d488992f54d504bcc89a3812dadc1fa", + "sha256": "95e6669e62d7d6d778a28793bea5aae0d9fdb3a68b2a58512421633a268d71e9", "kind": "asciicast", "state": "analysis", "columns": 80, @@ -796,7 +796,7 @@ }, { "path": "states/analysis.ansi", - "sha256": "af70e39675929e6c9346f7f4a9eee39f40275473fef2f2f549279087bf75bc04", + "sha256": "db6aeb76bc267dde79a21ca6cc9de8f859ea44c75065c6652570228801cb7197", "kind": "ansi", "state": "analysis", "columns": 80, @@ -804,7 +804,7 @@ }, { "path": "states/analysis.png", - "sha256": "c9fedc97f5f59d770f76e967056e8a06aeaa0a1f189b63a5edceff0c94a06cbc", + "sha256": "b791527c394aeb10e20635b467bfab98b13293a58ebbb4d6245d0852e20bc6f5", "kind": "png", "state": "analysis", "columns": 80, @@ -812,7 +812,7 @@ }, { "path": "states/comparison.json", - "sha256": "2bdcf736791ea2a7b6014ff77017c42de2929f9058a3951b4df0e5fcae8c9ea1", + "sha256": "2a1c6893cf09a186f9c15e7a165fcd8a772ebf676f5ac674831ac5cc31a85b91", "kind": "semantic-state", "state": "comparison", "columns": 80, @@ -828,7 +828,7 @@ }, { "path": "raw/comparison.cast", - "sha256": "4c849b0a38fad8c9ba063dd1558b3464dc757497a081c0ef990e30eccbca9d39", + "sha256": "3582e3e8796fcf8b190f48d23a3d8c17bffebd7cac53c02af43641c99914a5ca", "kind": "asciicast", "state": "comparison", "columns": 80, @@ -836,7 +836,7 @@ }, { "path": "states/comparison.ansi", - "sha256": "b600eb3a4cb1a96ce1a75847ee567a8d851fa7f9be9b963e5bb582e2eb3b553b", + "sha256": "cb2f4b4f15ddde18a30d004822a90efa924effeda9128bee7e3133167910219a", "kind": "ansi", "state": "comparison", "columns": 80, @@ -844,7 +844,7 @@ }, { "path": "states/comparison.png", - "sha256": "47a8581b83d535fe47c69bb005f52702483c2c3fdd18c75c022b3ceaf4dec8c7", + "sha256": "5c2f3fdb02184b1884d5709776b1a44f88cdfff9a6409e0fce599a8a1156263c", "kind": "png", "state": "comparison", "columns": 80, @@ -852,7 +852,7 @@ }, { "path": "states/profile.json", - "sha256": "8e07e14991194c9ac4f561d6f9897fa7fd827aac320b186ab979ba3c58225ecd", + "sha256": "ace9a9d3990233181c0a2f69259952d104f2cda2b98c374eb739833fbf8c080d", "kind": "semantic-state", "state": "profile", "columns": 80, @@ -868,7 +868,7 @@ }, { "path": "raw/profile.cast", - "sha256": "e6c6cb5b437b5e2f0f79da9592471a50e4bd774cce85e37b6102786e47feff90", + "sha256": "0ef5c6e6e726f1cd7108d274866710855aef01724c4d761f6f4f6b065913faa3", "kind": "asciicast", "state": "profile", "columns": 80, @@ -876,7 +876,7 @@ }, { "path": "states/profile.ansi", - "sha256": "ffb1eb651a9330eaefd79413840c312aa5d9224d6cf4a752d3c74ab5c25f4e12", + "sha256": "c3e26b310abad6c77acec67b4e8eeb201845ed86e5610c69de7e2ac16ec5e8f3", "kind": "ansi", "state": "profile", "columns": 80, @@ -884,7 +884,7 @@ }, { "path": "states/profile.png", - "sha256": "d56bd3ca3bbb73bb2d19fe2085356c76ba77bf1cae09b55180c88ff51b088845", + "sha256": "e489e002fe90431213dddfa02ffcc2c7ffa7ce31ba1152103eeee94c107a8af9", "kind": "png", "state": "profile", "columns": 80, @@ -892,7 +892,7 @@ }, { "path": "states/narrow.json", - "sha256": "8629d632c3779e5bf4a3d8f0d2caccf1c1e018d2745f8c6779180199a5d84806", + "sha256": "607492c46a2ff0880d35085d3816af121209473369ba4954c9f1c1140be8472a", "kind": "semantic-state", "state": "narrow", "columns": 40, @@ -908,7 +908,7 @@ }, { "path": "raw/narrow.cast", - "sha256": "3126e030c4695d8e2a60d8b36ad00af3d1775bf620503ff774ed171593f58705", + "sha256": "bb5bf8f408ab80ed89f73284f39e7d28fa9cdf99f72efb857849e30d87f66662", "kind": "asciicast", "state": "narrow", "columns": 40, @@ -916,7 +916,7 @@ }, { "path": "states/narrow.ansi", - "sha256": "586d4b24ef4d000c7c9174774727320adedcc7e142533e622475e87022e93a28", + "sha256": "cd0bea7f91d925fbd68f9f3d99857613601dc780f578a43c52c7b63c2760fec9", "kind": "ansi", "state": "narrow", "columns": 40, @@ -924,7 +924,7 @@ }, { "path": "states/narrow.png", - "sha256": "ac0aec3c515c06e4adae078eabf3e3a657ad5535c6993d03220e9c93a1d349f0", + "sha256": "7a3dbc37f30a52afe57951f09bd2db379f3bdcf9f6229c41d3fabcfb354e0834", "kind": "png", "state": "narrow", "columns": 40, @@ -932,7 +932,7 @@ }, { "path": "states/failure-or-reconnect.json", - "sha256": "c1fa226d09fdbe4169cc8c15a0e7c225e9cac6413abf46b90e62193ee9795c3a", + "sha256": "a459c49dfa17154e20b75780c7f457c1c8edbb753c8991500783f71db298641d", "kind": "semantic-state", "state": "failure-or-reconnect", "columns": 80, @@ -948,7 +948,7 @@ }, { "path": "raw/failure-or-reconnect.cast", - "sha256": "3f2e8a831b9f8749df3f125fa332f7dde7cb4294b12062b2e50b922e408444f4", + "sha256": "051a94cb6c19a4a683e11c9a90d74fc539fbcc448d5e291ac5302263e4269363", "kind": "asciicast", "state": "failure-or-reconnect", "columns": 80, @@ -956,7 +956,7 @@ }, { "path": "states/failure-or-reconnect.ansi", - "sha256": "98e8bd63f25dd0993a7d4efa8179a2aee8762930df7f3bcec90cd74ec8b09294", + "sha256": "1a6a60ac0080c486ed5ad6b6fa47b80d6b3a6d0f328ab85079244467eb08f1f9", "kind": "ansi", "state": "failure-or-reconnect", "columns": 80, @@ -964,7 +964,7 @@ }, { "path": "states/failure-or-reconnect.png", - "sha256": "4dc9e1f3e330b00e03a955f0e8f63af67d84728a6a6580386478650cba18a90b", + "sha256": "5a431a83ff5392bb23cddbbfc5071595244849bcbfbc8061156758a0df676471", "kind": "png", "state": "failure-or-reconnect", "columns": 80, @@ -979,7 +979,7 @@ }, { "path": "80x24-automation.gif", - "sha256": "352145984fba2e0f9a648e30e128e381066ef5e57275893bdaa2bc30e82c81bf", + "sha256": "78b04b71c3244e051057381adeb6c92c8b2ea22e129ecf8e17de0c3fb868f889", "kind": "automation-flow", "state": "automation", "columns": 80, @@ -987,7 +987,7 @@ }, { "path": "80x24-multirun.gif", - "sha256": "b46bb222d0225943056d7a32c0dd467a84d0e45c69a43e754e68fccb66d547f0", + "sha256": "5df706e380804174ddfd05c57688065e0903fff3ca8ad7ee4d5dd6262dddb64b", "kind": "multi-run-flow", "state": "multi-run", "columns": 80, @@ -995,14 +995,14 @@ }, { "path": "raw/transcript-keyboard.cast", - "sha256": "0679841ed1b1a28278ae3474de5a76456930495a47ca319c968f17baa351c3ab", + "sha256": "d8f07e9bd51fbc0e8f3e43e33409e1ef28a37b25d0adb0093b1261fb5856537a", "kind": "keyboard-asciicast", "columns": 80, "rows": 24 }, { "path": "80x24-transcript-keyboard.gif", - "sha256": "c9b4affd2aa045b8514c817546f71bd70a9f522387f2e9a2f0a3f2551da0d22b", + "sha256": "408fec6fd99590436ea74313cf4229767fc91cb8f8b4cee97d721c77cdb8fe79", "kind": "keyboard-flow", "columns": 80, "rows": 24 diff --git a/artifacts/verification/w6/raw/transcript-keyboard.cast b/artifacts/verification/w6/raw/transcript-keyboard.cast index a162e209..753a424f 100644 --- a/artifacts/verification/w6/raw/transcript-keyboard.cast +++ b/artifacts/verification/w6/raw/transcript-keyboard.cast @@ -1,80 +1,61 @@ -{"version":2,"width":80,"height":24,"timestamp":1788029378,"duration":1.78627,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} -[0.322567,"o","\u001b[?2004h"] -[0.322727,"o","\u001b[>7u\u001b[?u\u001b[c"] -[0.322739,"o","\u001b[?1049h"] -[0.322744,"o","\u001b[2J\u001b[H"] -[0.322758,"o","\u001b[?25l"] -[0.330883,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.330929,"o","\u001b[3A\u001b[2G\u001b[?25l"] -[0.356859,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-10-complete\u0007"] -[0.36038,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.360404,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.361536,"i","keyboard-flow-01"] -[0.361583,"i","\r"] -[0.365955,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-01\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] -[0.365989,"o","\u001b[?25l"] -[0.367321,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G"] -[0.36736,"o","\u001b[?25l"] -[0.40859,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.468357,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] -[0.468409,"o","\u001b[?25l"] -[0.562206,"i","keyboard-flow-02"] -[0.562276,"i","\r"] -[0.566147,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G"] -[0.56619,"o","\u001b[?25l"] -[0.568135,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.568144,"o","\u001b[15G"] -[0.568149,"o","\u001b[?25l"] -[0.584656,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.584682,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[0.636771,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.636831,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[0.723678,"i","keyboard-flow-03"] -[0.723749,"i","\r"] -[0.726097,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-03\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.726135,"o","\u001b[31G\u001b[?25l"] -[0.727942,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.744462,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[0.744509,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[0.798614,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[0.886597,"i","keyboard-flow-04"] -[0.886692,"i","\r"] -[0.889233,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-04\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[0.891338,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[0.906988,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[0.966684,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.048501,"i","keyboard-flow-05"] -[1.048568,"i","\r"] -[1.053495,"o","\u001b[15G\u001b[?25l"] -[1.068593,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.126936,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.209763,"i","keyboard-flow-06"] -[1.209829,"i","\r"] -[1.211641,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-06\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.213517,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G"] -[1.213525,"o","\u001b[?25l"] -[1.230168,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.230216,"o","\u001b[4A\u001b[12G\u001b[?25l"] -[1.287134,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.370074,"i","keyboard-flow-07"] -[1.370144,"i","\r"] -[1.371958,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-07\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.374444,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.374483,"o","\u001b[15G\u001b[?25l"] -[1.393488,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.454533,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.530449,"i","keyboard-flow-08"] -[1.530533,"i","\r"] -[1.532999,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] -[1.535527,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] -[1.550823,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] -[1.61134,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] -[1.692165,"i","\u001b[5~"] -[1.692246,"i","\u001b[1;3H"] -[1.694459,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] -[1.694498,"o","\u001b[?25l"] -[1.773162,"i","\u001b[6~"] -[1.773235,"i","\u001b[1;3F"] -[1.776199,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] -[1.77627,"o","\u001b[4A\u001b[15G\u001b[?25l"] -[1.78627,"o","\u001b[0m"] +{"version":2,"width":80,"height":24,"timestamp":1788055106,"duration":2.219311,"idle_time_limit":1,"command":"packed braid --fixture deterministic","title":"Braid transcript keyboard navigation","env":{"TERM":"xterm-256color"},"stdin":true} +[0.462986,"o","\u001b[?2004h\u001b[>7u\u001b[?u\u001b[c\u001b[?1049h\u001b[2J\u001b[H\u001b[?25l"] +[0.481112,"o","\u001b[?2026h\u001b[2J\u001b[H\u001b[3J \u001b[0m\u001b]8;;\u0007\r\r\n Ask Braid starter anything. \u001b[0m\u001b]8;;\u0007\r\r\n \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;111m›\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia no connection\u001b[39m \u001b[38;5;115mready\u001b[39m · \u001b[38;5;195mCtrl+P commands\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[0.481227,"o","\u001b[3A\u001b[2G\u001b[?25l"] +[0.522972,"o","\u001b]0;Braid — /home/drew/code/.worktrees/braid-keyboard-flow-fix\u0007"] +[0.528933,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145mAsk Braid starter anything.\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.544477,"i","keyboard-flow-01"] +[0.544572,"i","\r"] +[0.552931,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-01\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.553887,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.612926,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[0.676345,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E details\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.766092,"i","keyboard-flow-02"] +[0.766188,"i","\r"] +[0.773172,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-02\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[0.776588,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[0.800181,"o","\u001b[?2026h\u001b[15A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G"] +[0.80025,"o","\u001b[?25l"] +[0.864982,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/2\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (2/2)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[0.949327,"i","keyboard-flow-03"] +[0.949431,"i","\r"] +[0.956332,"o","\u001b[15G\u001b[?25l"] +[0.979694,"o","\u001b[?2026h\u001b[11A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.043039,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/3\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (3/3)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.130337,"i","keyboard-flow-04"] +[1.130433,"i","\r"] +[1.139822,"o","\u001b[15G\u001b[?25l"] +[1.165666,"o","\u001b[?2026h\u001b[7A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.23861,"o","\u001b[?2026h\u001b[17A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (4/4)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.33091,"i","keyboard-flow-05"] +[1.331001,"i","\r"] +[1.337376,"o","\u001b[15G"] +[1.337471,"o","\u001b[?25l"] +[1.374117,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/4\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.374188,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[1.451701,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (5/5)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G"] +[1.451843,"o","\u001b[?25l"] +[1.534932,"i","keyboard-flow-06"] +[1.535034,"i","\r"] +[1.541144,"o","\u001b[15G\u001b[?25l"] +[1.572,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/5\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[1.643938,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (6/6)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.738122,"i","keyboard-flow-07"] +[1.738226,"i","\r"] +[1.744134,"o","\u001b[15G\u001b[?25l"] +[1.781278,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/6\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l"] +[1.781376,"o","\u001b[4A\u001b[12G\u001b[?25l"] +[1.853953,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (7/7)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[1.940572,"i","keyboard-flow-08"] +[1.940666,"i","\r"] +[1.943488,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m keyboard-flow-08\u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[31G\u001b[?25l"] +[1.94639,"o","\u001b[?2026h\r\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[15G\u001b[?25l"] +[1.970998,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/7\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;222mworking…\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› queue #1\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;222mCtrl+C cancel\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[12G\u001b[?25l"] +[2.04357,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[2.124294,"i","\u001b[5~"] +[2.124397,"i","\u001b[1;3H"] +[2.127642,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 1/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-01 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 2/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-02 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 3/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-03 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mPgUp/PgDn history · End follow\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[2.204961,"i","\u001b[6~"] +[2.205054,"i","\u001b[1;3F"] +[2.209311,"o","\u001b[?2026h\u001b[19A\r\u001b[2K \u001b[38;5;145m· run result\u001b[39m 4/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-04 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 5/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-05 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 6/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-06 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 7/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-07 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;111m› \u001b[39mkeyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[38;5;145m· run result\u001b[39m 8/8\u001b[38;5;145m · Ctrl+E details\u001b[39m \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K Fixture response through pi: keyboard-flow-08 \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;111m────────────────────────────────────────────────────────────────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;222m› new message\u001b[39m \u001b[7m \u001b[0m \u001b[0m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K \u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;145m───────────────────\u001b[39m\u001b[38;5;111m type / for commands · Alt+Enter · paste \u001b[39m\u001b[38;5;145m────────────────────\u001b[39m\u001b[0m\u001b]8;;\u0007\r\r\n\u001b[2K\u001b[38;5;195mprofile Braid starter\u001b[39m · \u001b[38;5;195mpi\u001b[39m · \u001b[38;5;195mvia local\u001b[39m \u001b[38;5;195mCtrl+E next detail (8/8)\u001b[39m\u001b[0m\u001b]8;;\u0007\u001b[?2026l\u001b[4A\u001b[15G\u001b[?25l"] +[2.219311,"o","\u001b[0m"] diff --git a/artifacts/verification/w6/states/active-streaming.json b/artifacts/verification/w6/states/active-streaming.json index 97a7ebca..473c225e 100644 --- a/artifacts/verification/w6/states/active-streaming.json +++ b/artifacts/verification/w6/states/active-streaming.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" + "tarballSha256": "7945e73863a9cd764dd4d80a258af49faff0233718162e89e7d731e5b342add7" }, "dimensions": { "columns": 80, @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 5, "sequence": 5, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -171,7 +171,7 @@ }, "view": { "revision": 5, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -320,7 +320,7 @@ "title": "event backend_start", "status": "running", "detail": "sequence 1", - "occurredAt": "2026-08-29T18:49:16.505Z", + "occurredAt": "2026-08-30T01:58:01.170Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -585,7 +585,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-complete" + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix" } } }, @@ -697,10 +697,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-384ad0e49fd4fa9cd2f39550", + "id": "effect-op-terminal-000002-7157e62077a4d509410071b5", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "384ad0e49fd4fa9cd2f395509b8c735ea1efe909192cfc3300f4a250d4f387f4", + "requestDigest": "7157e62077a4d509410071b5c2a6a9850f6901ef9e508c8792e90dbbc23c2412", "kind": "send", "status": "pending", "attempt": 1, @@ -719,13 +719,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T18:49:16.505Z", + "occurredAt": "2026-08-30T01:58:01.170Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-97b7e310-3db8-42ec-94d3-f108d406e483", + "id": "turn-60d0823b-561e-4135-ae12-78539348502d", "intent": "W6 active streaming", "metadata": { "identity": { @@ -735,11 +735,11 @@ } }, "session": { - "id": "50f1dbda-ac67-4d26-ace8-961ede571f25", + "id": "e71aaa92-0529-414f-9748-268367dde511", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T18:49:16.505Z", - "updatedAt": "2026-08-29T18:49:16.505Z", + "createdAt": "2026-08-30T01:58:01.170Z", + "updatedAt": "2026-08-30T01:58:01.170Z", "metadata": "[unavailable]" }, "backend": "router", @@ -761,16 +761,16 @@ }, "execution": { "kind": "request", - "id": "turn-97b7e310-3db8-42ec-94d3-f108d406e483" + "id": "turn-60d0823b-561e-4135-ae12-78539348502d" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-97b7e310-3db8-42ec-94d3-f108d406e483:attempt:96894925-0be1-41ec-96f2-44cc1ce8211d", - "materializationReceiptDigest": "sha256:a63914682a3f6212d6a1f19fc5d502d858c3740c5edfca9a20d38d4b9e5b117f", - "bindingDigest": "sha256:b625a98a0d03b9d7cfd3ecb14ca9d943a4740d3dea2c9b66b36a8afa6d9aa880", + "attemptId": "turn-60d0823b-561e-4135-ae12-78539348502d:attempt:5d00fbfd-42ba-461f-a300-6f5358758ce5", + "materializationReceiptDigest": "sha256:46f5e809a9bd69d915ad69aaaaf7a9b1aaadaae30b422f784aa6431b77d4ad9f", + "bindingDigest": "sha256:7a208eb1a90c51ce7206583ea18beffc6814409992b3f4674cf07827984ee4a0", "descriptor": { "kind": "router-request", "transport": "http", @@ -782,10 +782,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T18:49:16.503Z" + "startedAt": "2026-08-30T01:58:01.166Z" } }, - "timestamp": "2026-08-29T18:49:16.505Z" + "timestamp": "2026-08-30T01:58:01.170Z" } } } diff --git a/artifacts/verification/w6/states/active-streaming.png b/artifacts/verification/w6/states/active-streaming.png index 12a57c396aeb7b3aab054a652d42c460d893f772..fd30cd7b6b9c6cd9b7b97833236d85ecaadb20a0 100644 GIT binary patch delta 19 acmexd`nhyM7Ka?86_eo&9q)}rjaC3tdk2gF delta 19 acmexd`nhyM7Kf~mp+7yw*$2`K;o diff --git a/artifacts/verification/w6/states/automation.json b/artifacts/verification/w6/states/automation.json index 8d47c659..670ef7dd 100644 --- a/artifacts/verification/w6/states/automation.json +++ b/artifacts/verification/w6/states/automation.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" + "tarballSha256": "7945e73863a9cd764dd4d80a258af49faff0233718162e89e7d731e5b342add7" }, "dimensions": { "columns": 80, @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -409,7 +409,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-complete" + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix" } } } diff --git a/artifacts/verification/w6/states/automation.png b/artifacts/verification/w6/states/automation.png index 88c9d5433a3bd0a71254e67d244d4a8a6707aba0..b963f66d91e225e9c3c094a7d27a7ce6badf0504 100644 GIT binary patch delta 21 dcmdm^ut#CTRz?mvMk_9R<|UPz_cGS=0RT@+2Il|( delta 21 dcmdm^ut#CTRz?n4Awvn}+52oa?`5p#0{~M+2UY+8 diff --git a/artifacts/verification/w6/states/command-palette-120.json b/artifacts/verification/w6/states/command-palette-120.json index 77079471..24ff1e19 100644 --- a/artifacts/verification/w6/states/command-palette-120.json +++ b/artifacts/verification/w6/states/command-palette-120.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" + "tarballSha256": "7945e73863a9cd764dd4d80a258af49faff0233718162e89e7d731e5b342add7" }, "dimensions": { "columns": 120, @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -408,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-complete" + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix" } } } diff --git a/artifacts/verification/w6/states/command-palette-120.png b/artifacts/verification/w6/states/command-palette-120.png index a1bfb70200b42ab075a09fe3b3b56f19277ca2f7..d8ae87ccfba0ee8485eaeed3363e7d9ab7b7606c 100644 GIT binary patch delta 21 dcmcaMpXu6srU_Xba*UQ%M&FN%Z7fRZ2LN9s2%i7| delta 21 dcmcaMpXu6srU_XbvOhhY9#UaONX=d%%ZM(5(h6(^b1_oRJ delta 19 acmeD3>hhY9#UU$X$aO*KeCfub87croSO+Qq diff --git a/artifacts/verification/w6/states/command-palette-80.json b/artifacts/verification/w6/states/command-palette-80.json index d74c7049..aa738f05 100644 --- a/artifacts/verification/w6/states/command-palette-80.json +++ b/artifacts/verification/w6/states/command-palette-80.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" + "tarballSha256": "7945e73863a9cd764dd4d80a258af49faff0233718162e89e7d731e5b342add7" }, "dimensions": { "columns": 80, @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -408,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-complete" + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix" } } } diff --git a/artifacts/verification/w6/states/command-palette-80.png b/artifacts/verification/w6/states/command-palette-80.png index 4259ae4078792d73b838bd360d8f3977e8331a87..fb1cc17e8694df5a451e2cb7490bd792551f22d0 100644 GIT binary patch delta 21 dcmX>znd!`ArU_Xba*UQ1cYZFj+E^6T2>@XO2@n7P delta 21 ccmX>znd!`ArU_XbvO@qZPybYrg55E16}50ZwHG)Bpeg delta 21 ccmbQHJ56^(Av1@pkfDICgBkzkN@iJM071S5Gynhq diff --git a/artifacts/verification/w6/states/failure-or-reconnect.json b/artifacts/verification/w6/states/failure-or-reconnect.json index a992cdd1..8685e1ff 100644 --- a/artifacts/verification/w6/states/failure-or-reconnect.json +++ b/artifacts/verification/w6/states/failure-or-reconnect.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" + "tarballSha256": "7945e73863a9cd764dd4d80a258af49faff0233718162e89e7d731e5b342add7" }, "dimensions": { "columns": 80, @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 8, "sequence": 8, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -176,7 +176,7 @@ }, "view": { "revision": 8, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -336,7 +336,7 @@ "title": "event backend_start", "status": "failed", "detail": "sequence 1", - "occurredAt": "2026-08-29T18:49:35.058Z", + "occurredAt": "2026-08-30T01:58:22.556Z", "sourceEventId": "run-000001:runtime:1", "runId": "run-000001", "entityType": "run", @@ -348,7 +348,7 @@ "title": "error", "status": "failed", "detail": "RUNTIME_BACKEND_ERROR", - "occurredAt": "2026-08-29T18:49:35.062Z", + "occurredAt": "2026-08-30T01:58:22.564Z", "sourceEventId": "run-000001:runtime:2", "runId": "run-000001", "entityType": "run", @@ -613,7 +613,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-complete" + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix" } } }, @@ -725,10 +725,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-12c768a101dbda06afca5deb", + "id": "effect-op-terminal-000002-c0460178e561c45076aed92a", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "12c768a101dbda06afca5deb7d9dcae1c76a81c2075fe222c7c8be66c0bd421b", + "requestDigest": "c0460178e561c45076aed92a9b2cff61367e21c190d7aa6804c45969710af805", "kind": "send", "status": "pending", "attempt": 1, @@ -747,13 +747,13 @@ "source": { "eventId": "run-000001:runtime:1", "providerSequence": 1, - "occurredAt": "2026-08-29T18:49:35.058Z", + "occurredAt": "2026-08-30T01:58:22.556Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "unknown": { "type": "backend_start", "task": { - "id": "turn-d42e6be9-24b7-4230-818b-38afb5d626ea", + "id": "turn-ebae6941-fa1b-4202-a1bc-e366a4062dbd", "intent": "W6 failure state", "metadata": { "identity": { @@ -763,11 +763,11 @@ } }, "session": { - "id": "2e03c87a-08b5-43b3-aa03-093d7ab31dc4", + "id": "1a16fd5b-50ea-4e1b-9a19-5cd16497bb9d", "backend": "executor", "status": "active", - "createdAt": "2026-08-29T18:49:35.058Z", - "updatedAt": "2026-08-29T18:49:35.058Z", + "createdAt": "2026-08-30T01:58:22.556Z", + "updatedAt": "2026-08-30T01:58:22.556Z", "metadata": "[unavailable]" }, "backend": "router", @@ -789,16 +789,16 @@ }, "execution": { "kind": "request", - "id": "turn-d42e6be9-24b7-4230-818b-38afb5d626ea" + "id": "turn-ebae6941-fa1b-4202-a1bc-e366a4062dbd" }, "materializer": "router-prompt-model" }, "executionBindings": [ { "status": "known", - "attemptId": "turn-d42e6be9-24b7-4230-818b-38afb5d626ea:attempt:58676d50-c9e3-4233-8e0e-1f4aac8064ce", - "materializationReceiptDigest": "sha256:04ae2d1c383de26ce002261980b27455265eea81238c78b1a6b6cd479da758e4", - "bindingDigest": "sha256:47d4bb00ab4f9cbfaaad069f1111dd4a7b03e62d5792097ad7014f08c133ca50", + "attemptId": "turn-ebae6941-fa1b-4202-a1bc-e366a4062dbd:attempt:a200bbab-b620-4f83-85b3-4170211c0477", + "materializationReceiptDigest": "sha256:3d182cfb1cb1c23685b28d769bfa89c36a6244fe30d8dbf74d7cfc97a5f5eda7", + "bindingDigest": "sha256:69c4d390d5bc9a7f656262a2ea53513a82b48c25e1f9f2bbfb25fa564eb037a4", "descriptor": { "kind": "router-request", "transport": "http", @@ -810,10 +810,10 @@ "timeoutMs": null }, "timing": { - "startedAt": "2026-08-29T18:49:35.056Z" + "startedAt": "2026-08-30T01:58:22.554Z" } }, - "timestamp": "2026-08-29T18:49:35.058Z" + "timestamp": "2026-08-30T01:58:22.556Z" } } }, @@ -826,7 +826,7 @@ "source": { "eventId": "run-000001:runtime:2", "providerSequence": 2, - "occurredAt": "2026-08-29T18:49:35.062Z", + "occurredAt": "2026-08-30T01:58:22.564Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "error": { @@ -845,7 +845,7 @@ "source": { "eventId": "run-000001:runtime:3", "providerSequence": 3, - "occurredAt": "2026-08-29T18:49:35.066Z", + "occurredAt": "2026-08-30T01:58:22.569Z", "receivedAt": "2026-08-01T00:00:00.000Z" }, "status": "failed", @@ -869,10 +869,10 @@ "value": { "kind": "effect.upserted", "effect": { - "id": "effect-op-terminal-000002-12c768a101dbda06afca5deb", + "id": "effect-op-terminal-000002-c0460178e561c45076aed92a", "operationId": "op-terminal-000002", "effectKind": "run.execute", - "requestDigest": "12c768a101dbda06afca5deb7d9dcae1c76a81c2075fe222c7c8be66c0bd421b", + "requestDigest": "c0460178e561c45076aed92a9b2cff61367e21c190d7aa6804c45969710af805", "kind": "send", "status": "failed", "attempt": 1, diff --git a/artifacts/verification/w6/states/failure-or-reconnect.png b/artifacts/verification/w6/states/failure-or-reconnect.png index ba3c6f4d6a57ead60de666dbac930a3ddd56c0de..38a51e9c214abf52fe47640ceae758009582132a 100644 GIT binary patch delta 21 dcmaDfiSf}S#tB&*a*S4D+Dt#pHWq#G003EM2oeAQ delta 21 dcmaDfiSf}S#tB&*vO diff --git a/artifacts/verification/w6/states/graph-or-analysis.json b/artifacts/verification/w6/states/graph-or-analysis.json index 631f102c..2cf473f6 100644 --- a/artifacts/verification/w6/states/graph-or-analysis.json +++ b/artifacts/verification/w6/states/graph-or-analysis.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" + "tarballSha256": "7945e73863a9cd764dd4d80a258af49faff0233718162e89e7d731e5b342add7" }, "dimensions": { "columns": 80, @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -408,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-complete" + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix" } } } diff --git a/artifacts/verification/w6/states/graph-or-analysis.png b/artifacts/verification/w6/states/graph-or-analysis.png index 465a8b08241ed8c3ee61d95ebc3f8bc30b863170..4d61507c5c096e66021cce8d63507bbf33390ef9 100644 GIT binary patch delta 21 ccmZ3uka6Kc#tB&*a*S4d7I_H?8;kS<08obp_y7O^ delta 21 dcmZ3uka6Kc#tB&*vOHQmvOjQ9&jt5u( diff --git a/artifacts/verification/w6/states/profile.json b/artifacts/verification/w6/states/profile.json index 6bde8f37..50d28fa3 100644 --- a/artifacts/verification/w6/states/profile.json +++ b/artifacts/verification/w6/states/profile.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" + "tarballSha256": "7945e73863a9cd764dd4d80a258af49faff0233718162e89e7d731e5b342add7" }, "dimensions": { "columns": 80, @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -408,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-complete" + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix" } } } diff --git a/artifacts/verification/w6/states/profile.png b/artifacts/verification/w6/states/profile.png index 2412abf3971de392f569819fe4e637f00eec92bb..08a8e76ab08a528e4128252fe1dcec283a369c6d 100644 GIT binary patch delta 21 dcmca?c-e4+B@>4nqm{@}o|#gc9hoMH0RT?a28#dy delta 21 ccmca?c-e4+B@>6NkfCDDJTueHj!cup08gF diff --git a/artifacts/verification/w6/states/supervision.json b/artifacts/verification/w6/states/supervision.json index 9f8eadad..23d06d26 100644 --- a/artifacts/verification/w6/states/supervision.json +++ b/artifacts/verification/w6/states/supervision.json @@ -5,7 +5,7 @@ "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "2ff0d7cf65eb929cc55b1669821b23c5381f401eb271002c0a16679a450efbe9" + "tarballSha256": "7945e73863a9cd764dd4d80a258af49faff0233718162e89e7d731e5b342add7" }, "dimensions": { "columns": 80, @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 12, "sequence": 12, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 12, - "workspace": "/home/drew/code/.worktrees/braid-10-complete", + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -196,7 +196,7 @@ "interactions": [], "activity": [ { - "id": "supervisor:supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "id": "supervisor:supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "kind": "supervisor", "title": "prove the Braid release", "status": "running", @@ -204,11 +204,11 @@ "startedAt": "2026-08-28T19:59:53.800Z", "occurredAt": "2026-08-28T20:00:00.000Z", "entityType": "supervisor", - "entityId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "entityId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "depth": 0 }, { - "id": "worker:worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af", + "id": "worker:worker-runtime-b1864da9f9a7c3cc04f70aed544514566797a1f7", "kind": "worker", "title": "stream and replay", "status": "running", @@ -217,13 +217,13 @@ "startedAt": "2026-08-28T19:59:55.800Z", "occurredAt": "2026-08-28T20:00:00.000Z", "entityType": "worker", - "entityId": "worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af", - "parentId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "entityId": "worker-runtime-b1864da9f9a7c3cc04f70aed544514566797a1f7", + "parentId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "depth": 1, - "supervisorId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" + "supervisorId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129" }, { - "id": "worker:worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", + "id": "worker:worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150", "kind": "worker", "title": "terminal proof", "status": "running", @@ -232,13 +232,13 @@ "startedAt": "2026-08-28T19:59:56.900Z", "occurredAt": "2026-08-28T20:00:00.000Z", "entityType": "worker", - "entityId": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", - "parentId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "entityId": "worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150", + "parentId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "depth": 1, - "supervisorId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" + "supervisorId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129" }, { - "id": "worker:worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf", + "id": "worker:worker-runtime-babd8b83dd224161a13130b0005c8fa0878b947c", "kind": "worker", "title": "release review", "status": "running", @@ -247,10 +247,10 @@ "startedAt": "2026-08-28T19:59:58.800Z", "occurredAt": "2026-08-28T20:00:00.000Z", "entityType": "worker", - "entityId": "worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf", - "parentId": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", + "entityId": "worker-runtime-babd8b83dd224161a13130b0005c8fa0878b947c", + "parentId": "worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150", "depth": 2, - "supervisorId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" + "supervisorId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129" } ], "graph": [ @@ -276,7 +276,7 @@ "startedAt": "2026-08-01T00:00:00.000Z" }, { - "id": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "id": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "type": "supervisor", "title": "prove the Braid release", "status": "running", @@ -284,42 +284,42 @@ "startedAt": "2026-08-28T19:59:53.800Z" }, { - "id": "worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af", + "id": "worker-runtime-b1864da9f9a7c3cc04f70aed544514566797a1f7", "type": "worker", "title": "stream and replay", "status": "running", "depth": 1, "edgeLabel": "spawned", "parentIds": [ - "supervisor:supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" + "supervisor:supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129" ], "elapsedMs": 4200, "startedAt": "2026-08-28T19:59:55.800Z", "costUsd": 0.021 }, { - "id": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", + "id": "worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150", "type": "worker", "title": "terminal proof", "status": "running", "depth": 1, "edgeLabel": "spawned", "parentIds": [ - "supervisor:supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" + "supervisor:supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129" ], "elapsedMs": 3100, "startedAt": "2026-08-28T19:59:56.900Z", "costUsd": 0.028 }, { - "id": "worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf", + "id": "worker-runtime-babd8b83dd224161a13130b0005c8fa0878b947c", "type": "worker", "title": "release review", "status": "running", "depth": 2, "edgeLabel": "spawned", "parentIds": [ - "worker:worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2" + "worker:worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150" ], "elapsedMs": 1200, "startedAt": "2026-08-28T19:59:58.800Z", @@ -330,11 +330,11 @@ "entityDetails": [ { "entityType": "supervisor", - "entityId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "entityId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "title": "prove the Braid release", "status": "running", "lines": [ - "id: supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "id: supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "runtime id: runtime-supervisor-release", "run: unbound workspace activity", "status: running", @@ -347,14 +347,14 @@ }, { "entityType": "worker", - "entityId": "worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af", + "entityId": "worker-runtime-b1864da9f9a7c3cc04f70aed544514566797a1f7", "title": "stream and replay", "status": "running", "lines": [ - "id: worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af", + "id: worker-runtime-b1864da9f9a7c3cc04f70aed544514566797a1f7", "runtime id: runtime-worker-stream", "status: running", - "supervisor: supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "supervisor: supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "cost: ≥$0.0210", "input tokens: ≥1104", "output tokens: ≥736", @@ -364,14 +364,14 @@ }, { "entityType": "worker", - "entityId": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", + "entityId": "worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150", "title": "terminal proof", "status": "running", "lines": [ - "id: worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", + "id: worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150", "runtime id: runtime-worker-ui", "status: running", - "supervisor: supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "supervisor: supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "cost: ≥$0.0280", "input tokens: ≥1386", "output tokens: ≥924", @@ -381,16 +381,16 @@ }, { "entityType": "worker", - "entityId": "worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf", + "entityId": "worker-runtime-babd8b83dd224161a13130b0005c8fa0878b947c", "title": "release review", "status": "running", "lines": [ - "id: worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf", + "id: worker-runtime-babd8b83dd224161a13130b0005c8fa0878b947c", "runtime id: runtime-worker-review", "status: running", - "supervisor: supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "supervisor: supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "runtime parent: terminal proof", - "parent worker: worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", + "parent worker: worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150", "cost: ≥$0.0120", "input tokens: ≥564", "output tokens: ≥376", @@ -584,7 +584,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-complete" + "workspace": "/home/drew/code/.worktrees/braid-keyboard-flow-fix" } } }, @@ -596,9 +596,9 @@ "value": { "kind": "supervisor.upserted", "supervisor": { - "id": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "id": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "runtimeId": "runtime-supervisor-release", - "runtimeRoot": "/home/drew/code/.worktrees/braid-10-complete", + "runtimeRoot": "/home/drew/code/.worktrees/braid-keyboard-flow-fix", "status": "running", "title": "prove the Braid release", "driverUsage": { @@ -631,9 +631,9 @@ "value": { "kind": "worker.upserted", "worker": { - "id": "worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af", + "id": "worker-runtime-b1864da9f9a7c3cc04f70aed544514566797a1f7", "runtimeId": "runtime-worker-stream", - "supervisorId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "supervisorId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "status": "running", "spendUsd": 0.021, "inputTokens": "[redacted]", @@ -656,9 +656,9 @@ "value": { "kind": "worker.upserted", "worker": { - "id": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", + "id": "worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150", "runtimeId": "runtime-worker-ui", - "supervisorId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "supervisorId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "status": "running", "spendUsd": 0.028, "inputTokens": "[redacted]", @@ -681,11 +681,11 @@ "value": { "kind": "worker.upserted", "worker": { - "id": "worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf", + "id": "worker-runtime-babd8b83dd224161a13130b0005c8fa0878b947c", "runtimeId": "runtime-worker-review", - "supervisorId": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713", + "supervisorId": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129", "parentRuntimeRef": "terminal proof", - "parentWorkerId": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2", + "parentWorkerId": "worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150", "status": "running", "spendUsd": 0.012, "inputTokens": "[redacted]", @@ -708,10 +708,10 @@ "value": { "kind": "graph.node.upserted", "node": { - "id": "node-817106315e3655a201c128d85d7ad264", + "id": "node-f3c8aa000066c566c2195c1b80b51696", "reference": { "kind": "supervisor", - "id": "supervisor-runtime-17f28841363c5a582daa5cfeebc5e07921727713" + "id": "supervisor-runtime-76deaf63157fd7bba58c59f7df98ae45a27fd129" }, "title": "prove the Braid release", "createdAt": "2026-08-28T19:59:53.800Z", @@ -729,10 +729,10 @@ "value": { "kind": "graph.node.upserted", "node": { - "id": "node-5c7ea4ca8725acf9c9dd2e864be77b2d", + "id": "node-77d651a814c8a9f7e1da525eedd84e08", "reference": { "kind": "worker", - "id": "worker-runtime-546f17b897a565c1ed7752325dc8c03f2973e9af" + "id": "worker-runtime-b1864da9f9a7c3cc04f70aed544514566797a1f7" }, "title": "stream and replay", "createdAt": "2026-08-28T19:59:55.800Z", @@ -750,10 +750,10 @@ "value": { "kind": "graph.node.upserted", "node": { - "id": "node-7ca1a4db2e2ba68a4234b9616d01cbba", + "id": "node-7d8451b335e542fc632390c19a06f958", "reference": { "kind": "worker", - "id": "worker-runtime-be2e9d01bddc0222d57bf39ef6fac517b53366b2" + "id": "worker-runtime-8f73d7a11d4753defb1be0895111d9d766a21150" }, "title": "terminal proof", "createdAt": "2026-08-28T19:59:56.900Z", @@ -771,10 +771,10 @@ "value": { "kind": "graph.node.upserted", "node": { - "id": "node-77ce14da605f109bfa47f3834808e4c5", + "id": "node-eb56cb37bfbb47fd4e6cb4822c5f2c50", "reference": { "kind": "worker", - "id": "worker-runtime-99c4380b68d73f31a3abce90264be84860618ecf" + "id": "worker-runtime-babd8b83dd224161a13130b0005c8fa0878b947c" }, "title": "release review", "createdAt": "2026-08-28T19:59:58.800Z", @@ -792,10 +792,10 @@ "value": { "kind": "graph.edge.upserted", "edge": { - "id": "edge-f68acca76303e30b5f6b12accbed6de5", + "id": "edge-550d907d7b945aac1ec985cf7d7ca97e", "kind": "spawned", - "source": "node-817106315e3655a201c128d85d7ad264", - "destination": "node-5c7ea4ca8725acf9c9dd2e864be77b2d", + "source": "node-f3c8aa000066c566c2195c1b80b51696", + "destination": "node-77d651a814c8a9f7e1da525eedd84e08", "provenance": {}, "createdAt": "2026-08-28T19:59:55.800Z" } @@ -810,10 +810,10 @@ "value": { "kind": "graph.edge.upserted", "edge": { - "id": "edge-a41d481832e00a1d2f051c10f195c651", + "id": "edge-18b8e0b93cdf87c316f048b024a5bd98", "kind": "spawned", - "source": "node-817106315e3655a201c128d85d7ad264", - "destination": "node-7ca1a4db2e2ba68a4234b9616d01cbba", + "source": "node-f3c8aa000066c566c2195c1b80b51696", + "destination": "node-7d8451b335e542fc632390c19a06f958", "provenance": {}, "createdAt": "2026-08-28T19:59:56.900Z" } @@ -828,10 +828,10 @@ "value": { "kind": "graph.edge.upserted", "edge": { - "id": "edge-4295a4768e0bd5880702763302ab4df3", + "id": "edge-6f48af364fc6369e76f6fd904248dfda", "kind": "spawned", - "source": "node-7ca1a4db2e2ba68a4234b9616d01cbba", - "destination": "node-77ce14da605f109bfa47f3834808e4c5", + "source": "node-7d8451b335e542fc632390c19a06f958", + "destination": "node-eb56cb37bfbb47fd4e6cb4822c5f2c50", "provenance": {}, "createdAt": "2026-08-28T19:59:58.800Z" } diff --git a/artifacts/verification/w6/states/supervision.png b/artifacts/verification/w6/states/supervision.png index 35fb38bc9a361257a4c9e52005a50140cbdec535..60e9f6f4661660638214ebb1a56b5d48362ab980 100644 GIT binary patch delta 21 dcmdnJpK run.id === state.focusedRunId) : undefined const focusedActive = focusedRun !== undefined && isLiveRunStatus(focusedRun.status) + const focusedDetachedCancellation = + focusedRun?.status === 'detached' && focusedRun.capabilities.controls.cancel const deterministicFixture = state.profile.model?.default === 'fixture/deterministic' const configuredConnection = state.selectedConnectionId !== null const capabilities: Record< @@ -200,14 +202,16 @@ export function capabilityMap( } } capabilities['run.cancel'] = - focusedActive && canCancel + (focusedActive && canCancel) || focusedDetachedCancellation ? { available: true, source: 'runtime' } : { available: false, source: 'runtime', reason: focusedActive ? 'The current runtime does not acknowledge provider cancellation' - : 'There is no active run to cancel', + : focusedRun?.status === 'detached' + ? 'The detached run does not advertise remote cancellation' + : 'There is no active run to cancel', } const focusedRecoverable = focusedRun !== undefined && isRecoverableRun(focusedRun) ? focusedRun : undefined diff --git a/src/adapters/tui/ui-command-dispatch.ts b/src/adapters/tui/ui-command-dispatch.ts index 930ab137..72666060 100644 --- a/src/adapters/tui/ui-command-dispatch.ts +++ b/src/adapters/tui/ui-command-dispatch.ts @@ -1,7 +1,8 @@ -import { commandAvailability, isMutatingCommand } from '../../views/shared/command-registry.js' import { isRecoverableRun } from '../../domain/state.js' +import { commandAvailability, isMutatingCommand } from '../../views/shared/command-registry.js' import type { BraidIntent, UiDispatchResult } from '../../views/shared/intents.js' import type { InteractionOutcome, InteractionView } from '../../views/shared/models.js' +import { runIdForControl } from '../../views/shared/run-selection.js' import { dispatchAutomationCommand } from './ui-automation-command.js' import { dispatchConversationRunCommand } from './ui-conversation-dispatch.js' import { dispatchCoreIntent } from './ui-core-dispatch.js' @@ -32,15 +33,12 @@ export async function dispatchCommandIntent( } if (intent.command === 'cancel') { const view = context.view() + const runId = runIdForControl(view, { allowDetached: true }) return dispatchCoreIntent( { type: 'cancel-run', operationId: intent.operationId ?? '', - ...(view.activeRunId === undefined - ? view.focusedRunId === undefined - ? {} - : { runId: view.focusedRunId } - : { runId: view.activeRunId }), + ...(runId === undefined ? {} : { runId }), }, context, ) diff --git a/src/views/shared/run-selection.ts b/src/views/shared/run-selection.ts new file mode 100644 index 00000000..a9e713cf --- /dev/null +++ b/src/views/shared/run-selection.ts @@ -0,0 +1,40 @@ +import type { BraidViewModel } from './models.js' + +const NON_CANCELLABLE_RUN_STATUSES = new Set([ + 'completed', + 'cancelled', + 'failed', + 'expired', + 'unknown', +]) + +interface RunSelectionOptions { + /** Include a retained remote run when its provider exposes remote cancellation. */ + readonly allowDetached?: boolean +} + +/** Selects a focused controllable run before the selected branch's active run. */ +export function runIdForControl( + view: Pick, + options: RunSelectionOptions = {}, +): string | undefined { + const allowDetached = options.allowDetached === true + for (const runId of [view.focusedRunId, view.activeRunId]) { + if (runId === undefined) continue + const run = view.runs.find((candidate) => candidate.id === runId) + if ( + run !== undefined && + !NON_CANCELLABLE_RUN_STATUSES.has(run.status) && + (allowDetached || run.status !== 'detached') + ) + return runId + } + return undefined +} + +/** Selects the focused local run before the selected branch's active run. */ +export function liveRunId( + view: Pick, +): string | undefined { + return runIdForControl(view) +} diff --git a/src/views/tui/terminal-input-controller.ts b/src/views/tui/terminal-input-controller.ts index 66f38f3c..c76a26c6 100644 --- a/src/views/tui/terminal-input-controller.ts +++ b/src/views/tui/terminal-input-controller.ts @@ -1,6 +1,7 @@ import { matchesKey, type TUI } from '@earendil-works/pi-tui' import { commandAvailability } from '../shared/command-registry.js' import type { BraidIntent, BraidUiController, UiDispatchResult } from '../shared/intents.js' +import { liveRunId } from '../shared/run-selection.js' import type { ComposerMode } from './composer-view.js' import { type BraidKeymap, isTextInputSequence, matchesKeyAction } from './keyboard.js' import type { ModalCoordinator } from './modal-coordinator.js' @@ -224,16 +225,3 @@ export class TerminalInputController { this.#stateChanged() } } - -function liveRunId(view: ReturnType): string | undefined { - for (const runId of [view.focusedRunId, view.activeRunId]) { - if (runId === undefined) continue - const run = view.runs.find((candidate) => candidate.id === runId) - if ( - run !== undefined && - !['completed', 'cancelled', 'failed', 'expired', 'unknown', 'detached'].includes(run.status) - ) - return runId - } - return undefined -} diff --git a/src/views/tui/terminal-surface-overlays.ts b/src/views/tui/terminal-surface-overlays.ts index d64ec11d..7bce0637 100644 --- a/src/views/tui/terminal-surface-overlays.ts +++ b/src/views/tui/terminal-surface-overlays.ts @@ -290,7 +290,7 @@ export class TerminalSurfaceOverlays { }) }, }) - this.#options.modals.open(prompt, { anchor: 'center', width: '72%', maxHeight: 10 }) + this.#options.modals.open(prompt, { anchor: 'center', width: '72%', maxHeight: 10 }, false) } #openActivityCancel(selected: ActivityItemView): void { @@ -333,7 +333,11 @@ export class TerminalSurfaceOverlays { }) }, }) - this.#options.modals.open(confirmation, { anchor: 'center', width: '78%', maxHeight: 10 }) + this.#options.modals.open( + confirmation, + { anchor: 'center', width: '78%', maxHeight: 10 }, + false, + ) } async #attachWorker(selected: ActivityItemView): Promise { @@ -417,7 +421,7 @@ export class TerminalSurfaceOverlays { }) }, }) - this.#options.modals.open(selector, { anchor: 'center', width: '84%', maxHeight: '80%' }) + this.#options.modals.open(selector, { anchor: 'center', width: '84%', maxHeight: '80%' }, false) } #hasActivity(id: string): boolean { diff --git a/test/intelligence-dispatch.test.ts b/test/intelligence-dispatch.test.ts index b7e53f4f..697c7827 100644 --- a/test/intelligence-dispatch.test.ts +++ b/test/intelligence-dispatch.test.ts @@ -702,6 +702,96 @@ test('an empty live supervisor snapshot is normal before any worker activity exi await app.close() }) +test('nested worker actions return to the activity browser after submission', async () => { + const raw = createSupervisionSnapshot({ + root: '/workspace', + supervisors: [ + { + id: 'runtime-supervisor-nested-action', + workers: [{ id: 'runtime-worker-nested-action', label: 'worker-nested-action' }], + }, + ], + }) + const watcher = new RuntimeSupervisorWatcher(() => raw) + const runtimeController = new RuntimeSupervisorController({ + watcher, + write: (_rootDir, _supervisorId, worker, options) => ({ + worker, + file: '/workspace/.agent/inbox/request.json', + request: { + schemaVersion: 1, + operationId: options.operationId, + requestDigest: `sha256:${'a'.repeat(64)}`, + at: NOW, + worker, + message: options.message, + source: options.source ?? 'braid', + interrupt: options.interrupt === true, + }, + replayed: false, + }), + }) + const app = createBraidApplication({ + fixture: 'deterministic', + intelligence: { + supervisorWatcher: watcher, + supervisorController: runtimeController, + }, + }) + app.initialize('/workspace') + const controller = createApplicationUiController(app) + const refreshed = await controller.dispatch({ type: 'refresh-supervision' }) + assert.equal(refreshed.kind, 'accepted') + + const terminal = new VirtualTerminal(100, 30) + const tui = new TuiMainScreen(terminal) + const view = new BraidTerminalApp({ + controller, + tui, + theme: createBraidTheme(false), + workspace: '/workspace', + nextOperationId: () => 'op-nested-worker-action', + }) + const done = view.start() + try { + terminal.sendInput('/activity') + terminal.sendInput('\r') + await terminal.waitForRender() + for (let attempt = 0; attempt < 4; attempt += 1) { + if (/^\s*workers\b/iu.test(terminal.getViewport()[0] ?? '')) break + terminal.sendInput('\t') + await terminal.waitForRender() + } + assert.match(terminal.getViewport().join('\n'), /^\s*workers\b/mu) + + terminal.sendInput('s') + await terminal.waitForRender() + assert.match(terminal.getViewport().join('\n'), /steer worker/u) + terminal.sendInput('continue safely') + terminal.sendInput('\r') + await waitUntil( + () => + /^\s*workers\b/mu.test(terminal.getViewport().join('\n')) && + !/steer worker/u.test(terminal.getViewport().join('\n')), + ) + const afterSteer = terminal.getViewport().join('\n') + assert.match(afterSteer, /s steer/u) + assert.doesNotMatch(afterSteer, /steer worker/u) + + terminal.sendInput('x') + await terminal.waitForRender() + assert.match(terminal.getViewport().join('\n'), /cancel worker/u) + terminal.sendInput('n') + await waitUntil(() => /^\s*workers\b/mu.test(terminal.getViewport().join('\n'))) + await terminal.waitForRender() + assert.doesNotMatch(terminal.getViewport().join('\n'), /cancel worker/u) + } finally { + view.stop() + await done + await app.close() + } +}) + test('the terminal opens saved ask and comparison results instead of reducing them to notices', async () => { const app = createTestApplication() const baselineRunId = await createCompletedRun(app, 'terminal baseline') diff --git a/test/tui-core-workflows.test.ts b/test/tui-core-workflows.test.ts index 073812ba..cf8155bd 100644 --- a/test/tui-core-workflows.test.ts +++ b/test/tui-core-workflows.test.ts @@ -9,9 +9,10 @@ import { createApplicationUiController } from '../src/adapters/tui/application-u import { capabilityMap } from '../src/adapters/tui/ui-capabilities.js' import type { AnalysisComparisonResult } from '../src/app/analysis-comparison-contracts.js' import { createBraidApplication } from '../src/app/composition.js' +import { type BraidState, initialState } from '../src/domain/state.js' import { DEFAULT_RUN_CAPABILITIES } from '../src/ports/execution.js' -import { initialState, type BraidState } from '../src/domain/state.js' import type { BraidViewModel, InteractionView } from '../src/views/shared/models.js' +import { liveRunId, runIdForControl } from '../src/views/shared/run-selection.js' import { ActivityBrowserPanel } from '../src/views/tui/activity-browser.js' import { AnalysisViewPanel } from '../src/views/tui/analysis.js' import { @@ -65,6 +66,35 @@ test('background recoverable runs remain available while another branch is activ } as unknown as BraidState assert.equal(capabilityMap(viewState)['run.reconnect']?.available, true) + const detachedFocused = { + ...viewState, + focusedRunId: 'run-background', + activeRunId: 'run-background', + } + assert.equal(capabilityMap(detachedFocused)['run.cancel']?.available, true) +}) + +test('local interrupt selection skips detached work while cancel preserves remote focus', () => { + const view = { + focusedRunId: 'run-detached', + activeRunId: 'run-live', + runs: [ + { id: 'run-detached', status: 'detached', completeness: 'streaming' }, + { id: 'run-live', status: 'running', completeness: 'streaming' }, + ], + } as unknown as Pick + + assert.equal(liveRunId(view), 'run-live') + assert.equal(runIdForControl(view, { allowDetached: true }), 'run-detached') + const detachedRun = view.runs.find((run) => run.id === 'run-detached') + assert.ok(detachedRun) + assert.equal( + runIdForControl( + { ...view, activeRunId: 'run-detached', runs: [detachedRun] }, + { allowDetached: true }, + ), + 'run-detached', + ) }) async function waitUntil(predicate: () => boolean, timeoutMs = 1_000): Promise { diff --git a/test/tui.test.ts b/test/tui.test.ts index 72d4849f..1bf8c794 100644 --- a/test/tui.test.ts +++ b/test/tui.test.ts @@ -620,6 +620,133 @@ test('conversation commands work through the real terminal input path', async () await done }) +test('cancel command follows the focused live run across conversations', async () => { + const app = createBraidApplication({ fixture: 'deterministic', chunkDelayMs: 10_000 }) + app.initialize('/workspace') + await app.conversations.lifecycle.create({ + operationId: 'op-tui-focus-cancel-create-first', + title: 'Parallel run A', + }) + const firstRun = app.send({ + operationId: 'op-tui-focus-cancel-first', + text: 'parallel run A', + }) + await firstRun.admissionReady + await waitUntil(() => app.state().activeRuns.length === 1) + + const second = await app.conversations.lifecycle.create({ + operationId: 'op-tui-focus-cancel-create-second', + title: 'Parallel run B', + }) + const secondRun = app.send({ + operationId: 'op-tui-focus-cancel-second', + text: 'parallel run B', + }) + await secondRun.admissionReady + await waitUntil(() => app.state().activeRuns.length === 2) + app.focusRun({ operationId: 'op-tui-focus-cancel-focus-first', runId: firstRun.runId }) + + const controller = createApplicationUiController(app) + const before = controller.view() + assert.equal(before.conversationId, second.id) + assert.equal(before.conversationTitle, second.title) + assert.equal(before.activeRunId, secondRun.runId) + assert.equal(before.focusedRunId, firstRun.runId) + + const terminal = new VirtualTerminal(80, 24) + const tui = new TuiMainScreen(terminal) + const view = new BraidTerminalApp({ + controller, + tui, + theme: createBraidTheme(false), + workspace: '/workspace', + nextOperationId: () => 'op-tui-focus-cancel-command', + }) + const done = view.start() + try { + terminal.sendInput('/cancel') + terminal.sendInput('\r') + await waitUntil( + () => app.state().runs.find((run) => run.id === firstRun.runId)?.status === 'aborted', + ) + assert.equal(app.state().runs.find((run) => run.id === secondRun.runId)?.status, 'streaming') + } finally { + view.stop() + await done + if (app.state().runs.find((run) => run.id === secondRun.runId)?.status === 'streaming') { + const cleanup = await app.cancelRun({ + operationId: 'op-tui-focus-cancel-cleanup', + runId: secondRun.runId, + terminalStatus: 'aborted', + }) + await cleanup.completion + } + await app.close() + } +}) + +test('cancel command preserves a focused detached run for remote cancellation', async () => { + let releaseStream: (() => void) | undefined + let cancellationCalls = 0 + const execution: ExecutionPort = { + capabilities: () => ({ + ...DEFAULT_RUN_CAPABILITIES, + streaming: { ...DEFAULT_RUN_CAPABILITIES.streaming, replay: true, detach: true }, + controls: { ...DEFAULT_RUN_CAPABILITIES.controls, recreate: true }, + }), + async *streamTurn(input): AsyncIterable { + await new Promise((resolve) => { + releaseStream = resolve + if (input.signal.aborted) resolve() + else input.signal.addEventListener('abort', () => resolve(), { once: true }) + }) + yield* [] + }, + detachRun: async (input) => { + releaseStream?.() + return { operationId: input.operationId, outcome: 'accepted' as const } + }, + cancelRun: async (input) => { + cancellationCalls += 1 + return { operationId: input.operationId, outcome: 'accepted' as const } + }, + } + const app = createBraidApplication({ fixture: 'deterministic', execution }) + app.initialize('/workspace') + const active = app.send({ operationId: 'op-tui-detached-send', text: 'retain this run' }) + await active.admissionReady + await waitUntil(() => app.state().activeRunId !== null) + const detached = await app.detachRun({ + operationId: 'op-tui-detached-detach', + runId: active.runId, + }) + await detached.completion + assert.equal(app.state().runs.find((run) => run.id === active.runId)?.status, 'detached') + + const terminal = new VirtualTerminal(80, 24) + const tui = new TuiMainScreen(terminal) + const view = new BraidTerminalApp({ + controller: createApplicationUiController(app), + tui, + theme: createBraidTheme(false), + workspace: '/workspace', + nextOperationId: () => 'op-tui-detached-cancel', + }) + const done = view.start() + try { + terminal.sendInput('/cancel') + terminal.sendInput('\r') + await waitUntil( + () => app.state().runs.find((run) => run.id === active.runId)?.status === 'aborted', + ) + assert.equal(cancellationCalls, 1) + } finally { + view.stop() + await done + await app.close() + } +}) + test('the terminal saves and restores independent unsent conversation drafts', async () => { const terminal = new VirtualTerminal(100, 30) const tui = new TuiMainScreen(terminal) From b2b3d4e54ebebb5092afa0e6b9513f0727719c48 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 20:04:23 -0600 Subject: [PATCH 089/136] test(tui): cover activity modal back path --- test/intelligence-dispatch.test.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/intelligence-dispatch.test.ts b/test/intelligence-dispatch.test.ts index 697c7827..8a48bc1a 100644 --- a/test/intelligence-dispatch.test.ts +++ b/test/intelligence-dispatch.test.ts @@ -702,7 +702,7 @@ test('an empty live supervisor snapshot is normal before any worker activity exi await app.close() }) -test('nested worker actions return to the activity browser after submission', async () => { +test('nested worker actions return to the activity browser after each action', async () => { const raw = createSupervisionSnapshot({ root: '/workspace', supervisors: [ @@ -778,6 +778,16 @@ test('nested worker actions return to the activity browser after submission', as assert.match(afterSteer, /s steer/u) assert.doesNotMatch(afterSteer, /steer worker/u) + terminal.sendInput('s') + await terminal.waitForRender() + assert.match(terminal.getViewport().join('\n'), /steer worker/u) + terminal.sendInput('\u001b') + await waitUntil( + () => + /^\s*workers\b/mu.test(terminal.getViewport().join('\n')) && + !/steer worker/u.test(terminal.getViewport().join('\n')), + ) + terminal.sendInput('x') await terminal.waitForRender() assert.match(terminal.getViewport().join('\n'), /cancel worker/u) From e7f5ff25dcf770805cd192d9f8ba8dd6af143fa5 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 22:20:08 -0600 Subject: [PATCH 090/136] fix(models): update current GLM defaults --- scripts/live-required/tangle-sandbox-braid-interactive.mjs | 2 +- src/eval/execution.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 88a91608..8189b14c 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -142,7 +142,7 @@ export function sandboxConfiguration(environment) { runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], fallbackEndpoint: 'https://sandbox.tangle.tools', - fallbackModel: 'tangle-router/glm-5.2', + fallbackModel: 'tangle-router/glm-5.3', fallbackRunner: 'pi', fallbackProvider: 'tangle', }) diff --git a/src/eval/execution.ts b/src/eval/execution.ts index 42c4d460..fa5d5d61 100644 --- a/src/eval/execution.ts +++ b/src/eval/execution.ts @@ -10,7 +10,7 @@ import { evalSha256, redactEvalValue } from './records.js' import type { EvalProviderIdentity, RecordedJudgeCall } from './types.js' export const DEFAULT_EVAL_BASE_URL = 'https://router.tangle.tools/v1' -export const DEFAULT_EVAL_MODEL = 'glm-5.2' +export const DEFAULT_EVAL_MODEL = 'glm-5.3' export const EVAL_TOTAL_COMPLETION_TOKENS = 2_048 export const DEFAULT_EVAL_CALL_TIMEOUT_MS = 120_000 export const DEFAULT_EVAL_TOTAL_TIMEOUT_MS = 15 * 60_000 From 80bb609101b5cc7cb62c789dd07452a9e28705ac Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 22:32:24 -0600 Subject: [PATCH 091/136] chore(deps): refresh agent runtime --- docs/04-runtime-contracts.md | 2 +- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- pnpm-workspace.yaml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index 059fad5c..a1ec28f0 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -15,7 +15,7 @@ The following published versions were resolved in this worktree, and their insta | Package | Installed version | Braid boundary | | --- | ---: | --- | | [`@tangle-network/agent-interface`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) | `1.9.0` | Canonical profile, capabilities, environment, stream, portable context, native continuation, and interaction contracts | -| [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.180.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | +| [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.182.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | | [`@tangle-network/agent-eval`](https://github.com/tangle-network/agent-eval) | `0.170.0` | Run records, judges, trace analysts, comparisons, and feedback trajectories | | `@tangle-network/agent-provider-cli-bridge` | `0.11.1` | CLI Bridge environment adapter with capability discovery, native retained sessions, bounded terminal results, live streaming, replay, retry-safe turns, retained control, durable interaction response, and explicit cancel | | `@tangle-network/agent-provider-tangle` | `0.14.4` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations | diff --git a/package.json b/package.json index f7177fa3..9ed09c7a 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "@tangle-network/agent-interface": "1.9.0", "@tangle-network/agent-provider-cli-bridge": "0.11.1", "@tangle-network/agent-provider-tangle": "0.14.4", - "@tangle-network/agent-runtime": "0.180.0", + "@tangle-network/agent-runtime": "0.182.0", "@tangle-network/sandbox": "0.34.4", "@tangle-network/tcloud-attestation": "0.1.1", "better-sqlite3-multiple-ciphers": "13.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74b121ff..cf817d2d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: 0.14.4 version: 0.14.4(@tangle-network/sandbox@0.34.4) '@tangle-network/agent-runtime': - specifier: 0.180.0 - version: 0.180.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4) + specifier: 0.182.0 + version: 0.182.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4) '@tangle-network/sandbox': specifier: 0.34.4 version: 0.34.4 @@ -546,8 +546,8 @@ packages: peerDependencies: '@tangle-network/sandbox': '>=0.34.4 <1.0.0' - '@tangle-network/agent-runtime@0.180.0': - resolution: {integrity: sha512-/OI/YavBGIF8RgdoS+jXh6OUdJCUySM3meAJqMsGaCsPZ2fnQZANsXCgWi3VGe/zqQE8QN8rIrSO8NATOqFzQw==} + '@tangle-network/agent-runtime@0.182.0': + resolution: {integrity: sha512-0uCrvS73+ZFNBJIMhJxCCg1fnmstvf56vjP15GIPFjhlg+WtxjoHWt7TPswqG8ZKH0BPJUnmVAJ2eYaNvzH8ew==} engines: {node: '>=22.13.0'} hasBin: true peerDependencies: @@ -1206,7 +1206,7 @@ snapshots: '@tangle-network/agent-interface': 1.9.0 '@tangle-network/sandbox': 0.34.4 - '@tangle-network/agent-runtime@0.180.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4)': + '@tangle-network/agent-runtime@0.182.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4)': dependencies: '@tangle-network/agent-core': 0.9.5 '@tangle-network/agent-eval': 0.170.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 53fcc58e..702b56a1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -11,7 +11,7 @@ allowBuilds: node-pty: true ignoreScripts: false minimumReleaseAgeExclude: - - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0 || 0.178.0 || 0.179.0 || 0.180.0' + - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0 || 0.178.0 || 0.179.0 || 0.180.0 || 0.182.0' - '@tangle-network/agent-eval@0.143.0 || 0.144.0 || 0.144.1 || 0.144.3 || 0.144.4 || 0.144.6 || 0.144.8 || 0.144.10 || 0.144.11 || 0.144.13 || 0.145.0 || 0.145.1 || 0.145.2 || 0.145.3 || 0.145.9 || 0.145.10 || 0.145.11 || 0.145.14 || 0.145.15 || 0.145.21 || 0.149.0 || 0.163.2 || 0.170.0' - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0 || 1.7.0 || 1.7.1 || 1.8.0 || 1.9.0' - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0 || 10.8.0' From ccb27f87ee848ad0b2023e9b25b2387523dcc423 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 22:54:28 -0600 Subject: [PATCH 092/136] style(docs): remove trailing blank lines --- docs/components/analysis.md | 1 - docs/components/automation.md | 1 - docs/components/comparison.md | 1 - docs/components/conversation-navigation.md | 1 - docs/components/entity-browser.md | 1 - docs/components/fork-preview.md | 1 - docs/components/help-and-capability-states.md | 1 - docs/components/interactions.md | 1 - docs/components/safe-rendering.md | 1 - docs/components/selectors-and-commands.md | 1 - docs/components/transcript-composer.md | 1 - 11 files changed, 11 deletions(-) diff --git a/docs/components/analysis.md b/docs/components/analysis.md index f3cd8cd2..ee6aa03c 100644 --- a/docs/components/analysis.md +++ b/docs/components/analysis.md @@ -87,4 +87,3 @@ Live proof requires real analyst model calls, settled usage and cost, resolved c Analysis does not become another conversation turn or provider session. The UI does not invent a verdict when analyst evidence is incomplete. - diff --git a/docs/components/automation.md b/docs/components/automation.md index 0b766a19..6fa4b263 100644 --- a/docs/components/automation.md +++ b/docs/components/automation.md @@ -73,4 +73,3 @@ Tests cover create, once, session, persistent confirmation, maximum uses, disabl The panel does not predict an answer or create a rule from text similarity alone. It does not store secret-designated answers. - diff --git a/docs/components/comparison.md b/docs/components/comparison.md index afbf73e6..22f203ab 100644 --- a/docs/components/comparison.md +++ b/docs/components/comparison.md @@ -77,4 +77,3 @@ Tests cover zero and null values, unequal arms, missing telemetry, different ter The component does not run an evaluation or choose a winner from incomplete evidence. It does not summarize away fields captured by the source result. - diff --git a/docs/components/conversation-navigation.md b/docs/components/conversation-navigation.md index 0354864a..a2c01c8d 100644 --- a/docs/components/conversation-navigation.md +++ b/docs/components/conversation-navigation.md @@ -92,4 +92,3 @@ Keyboard tests cover open, filter, switch, branch, rename, cancel, and focus res Conversation navigation does not perform workspace fork or native provider continuation. It does not stop a background run merely because selection changed. - diff --git a/docs/components/entity-browser.md b/docs/components/entity-browser.md index 8653b3d1..d5a93807 100644 --- a/docs/components/entity-browser.md +++ b/docs/components/entity-browser.md @@ -80,4 +80,3 @@ Resize tests prove selection and detail continuity across all layout modes. The browser does not own entity state, refresh intervals, or mutations. It does not introduce a dashboard beside the transcript. - diff --git a/docs/components/fork-preview.md b/docs/components/fork-preview.md index cf0b9bab..9783d7c6 100644 --- a/docs/components/fork-preview.md +++ b/docs/components/fork-preview.md @@ -91,4 +91,3 @@ The terminal recording reviews and executes a real plan through the same panel. The preview does not promise provider-session continuity across runners. It does not display raw checkpoint data or provider-private fields. - diff --git a/docs/components/help-and-capability-states.md b/docs/components/help-and-capability-states.md index e1077675..ad0169a7 100644 --- a/docs/components/help-and-capability-states.md +++ b/docs/components/help-and-capability-states.md @@ -74,4 +74,3 @@ Fixtures cover unavailable runner actions, workspace fork, attach, interaction, Help does not become product documentation inside the main transcript. An unavailable panel does not silently change the selected profile or connection. - diff --git a/docs/components/interactions.md b/docs/components/interactions.md index fa27745b..350205aa 100644 --- a/docs/components/interactions.md +++ b/docs/components/interactions.md @@ -94,4 +94,3 @@ Live proof must keep a retained cloud interaction answerable after Braid reconne The component does not invent an approval policy or default answer. It does not store credential values for later reuse. - diff --git a/docs/components/safe-rendering.md b/docs/components/safe-rendering.md index c91e005a..db66ea50 100644 --- a/docs/components/safe-rendering.md +++ b/docs/components/safe-rendering.md @@ -87,4 +87,3 @@ Captures compare semantic cells and raster output at the four required dimension Sanitization does not interpret provider-native protocol output. Responsive layout does not hide a blocking status, missing value, or capability reason. - diff --git a/docs/components/selectors-and-commands.md b/docs/components/selectors-and-commands.md index 8bd42dc0..07f92cbe 100644 --- a/docs/components/selectors-and-commands.md +++ b/docs/components/selectors-and-commands.md @@ -88,4 +88,3 @@ The keyboard recording opens the palette, filters an action, selects it, and ret Selectors do not fetch provider capabilities or mutate entities. Autocomplete does not search outside the workspace or execute a command. - diff --git a/docs/components/transcript-composer.md b/docs/components/transcript-composer.md index f94833b0..fa78f5e6 100644 --- a/docs/components/transcript-composer.md +++ b/docs/components/transcript-composer.md @@ -101,4 +101,3 @@ PTY recordings prove prompt entry, editing, streaming, queueing, and cancellatio The transcript does not parse provider-native output. The composer does not decide admission, continuation, queue order, or steering support. - From 929b430cbec47856ea9912f7826c9c52f0fe4f2c Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 22:54:56 -0600 Subject: [PATCH 093/136] chore(verify): record final check --- .agent/skill-runs.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index 8229d066..3f948d7b 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -101,3 +101,4 @@ {"skill":"/harden","ts":"2026-08-30T01:12:35Z","project":"braid-release-provenance-fix","target":"Braid release candidate source-to-archive identity and npm publish boundary","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/ui-test","ts":"2026-08-30T02:01:21Z","project":"braid-keyboard-flow-fix","target":"packed Braid PTY keyboard workflows","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/product-design","ts":"2026-08-30T02:01:21Z","project":"braid-keyboard-flow-fix","target":"packed Braid keyboard workflow capture","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/ui-test","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/verify","ts":"2026-08-30T04:54:46Z","project":"braid-10-complete","target":"Braid feat/braid-10-complete final pnpm check","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} From e433c7382669278140d2d84229e4a657d993019b Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 23:00:01 -0600 Subject: [PATCH 094/136] fix(live): centralize current Tangle model defaults --- docs/08-verification.md | 2 +- scripts/live-required/model-defaults.mjs | 2 ++ scripts/live-required/supervisor.mjs | 3 ++- .../tangle-sandbox-braid-execution-soak.mjs | 5 ++-- .../tangle-sandbox-braid-interactive.mjs | 3 ++- .../tangle-sandbox-braid-multirun.mjs | 5 ++-- .../live-required/tangle-sandbox-worker.mjs | 6 ++--- .../live-required/tangle-workspace-proof.mjs | 6 ++--- test/tangle-live07-wiring.test.mjs | 26 +++++++++++++++++++ 9 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 scripts/live-required/model-defaults.mjs diff --git a/docs/08-verification.md b/docs/08-verification.md index 7ed7823d..18e6eb6c 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -339,7 +339,7 @@ The judge executes through Runtime with one exact `AgentProfile` and a direct Ta `BRAID_EVAL_API_KEY` supplies the protected credential. -`BRAID_EVAL_BASE_URL` defaults to `https://router.tangle.tools/v1`, and `BRAID_EVAL_MODEL` defaults to `glm-5.2`. +`BRAID_EVAL_BASE_URL` defaults to `https://router.tangle.tools/v1`, and `BRAID_EVAL_MODEL` defaults to `glm-5.3`. The profile sets a 2,048-token total completion limit through `max_completion_tokens`. diff --git a/scripts/live-required/model-defaults.mjs b/scripts/live-required/model-defaults.mjs new file mode 100644 index 00000000..5ec17dce --- /dev/null +++ b/scripts/live-required/model-defaults.mjs @@ -0,0 +1,2 @@ +export const DEFAULT_TANGLE_ROUTER_MODEL_ID = 'glm-5.3' +export const DEFAULT_TANGLE_ROUTER_MODEL = `tangle-router/${DEFAULT_TANGLE_ROUTER_MODEL_ID}` diff --git a/scripts/live-required/supervisor.mjs b/scripts/live-required/supervisor.mjs index 937c7e11..46e3ba0a 100644 --- a/scripts/live-required/supervisor.mjs +++ b/scripts/live-required/supervisor.mjs @@ -8,6 +8,7 @@ import { safeMessage, scalarMeasurement, } from './contracts.mjs' +import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' const SUPERVISOR_CHECKS = Object.freeze([ 'snapshot', @@ -21,7 +22,7 @@ const SUPERVISOR_CHECKS = Object.freeze([ const DEFAULT_TIMEOUT_MS = 60_000 const DEFAULT_POLL_INTERVAL_MS = 100 const DEFAULT_SUPERVISOR_RUNNER = 'opencode' -const DEFAULT_SUPERVISOR_MODEL = 'tangle-router/glm-5.3' +const DEFAULT_SUPERVISOR_MODEL = DEFAULT_TANGLE_ROUTER_MODEL const DEFAULT_SUPERVISOR_MODEL_PROVIDER = 'tangle-router' const DEFAULT_SANDBOX_ENDPOINT = 'https://sandbox.tangle.tools' const DEFAULT_SUPERVISOR_CONNECTION_KIND = 'tangle-sandbox' diff --git a/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs b/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs index eba397b3..163adaa9 100644 --- a/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs +++ b/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs @@ -18,6 +18,7 @@ import { resourceDelta, runObservations, } from './tangle-sandbox-braid-stress-support.mjs' +import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' const repository = resolve(dirname(fileURLToPath(import.meta.url)), '../..') const DEFAULT_RUNS = 3 @@ -57,13 +58,13 @@ export function executionLatencyDistribution(attempts) { } } -function sandboxEnvironment(environment) { +export function sandboxEnvironment(environment) { return { ...environment, BRAID_TANGLE_SANDBOX_ENDPOINT: environment.BRAID_TANGLE_SANDBOX_ENDPOINT?.trim() || 'https://sandbox.tangle.tools', BRAID_TANGLE_SANDBOX_MODEL: - environment.BRAID_TANGLE_SANDBOX_MODEL?.trim() || 'tangle-router/glm-5.2', + environment.BRAID_TANGLE_SANDBOX_MODEL?.trim() || DEFAULT_TANGLE_ROUTER_MODEL, BRAID_TANGLE_SANDBOX_RUNNER: environment.BRAID_TANGLE_SANDBOX_RUNNER?.trim() || 'opencode', BRAID_TANGLE_SANDBOX_PROVIDER: environment.BRAID_TANGLE_SANDBOX_PROVIDER?.trim() || 'tangle-router', diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 8189b14c..a07b73be 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -54,6 +54,7 @@ import { usage, } from './tangle-sandbox-braid-stress.mjs' import { resourceDelta } from './tangle-sandbox-braid-stress-support.mjs' +import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') @@ -142,7 +143,7 @@ export function sandboxConfiguration(environment) { runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], fallbackEndpoint: 'https://sandbox.tangle.tools', - fallbackModel: 'tangle-router/glm-5.3', + fallbackModel: DEFAULT_TANGLE_ROUTER_MODEL, fallbackRunner: 'pi', fallbackProvider: 'tangle', }) diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 9ac5e451..d68986ad 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -24,6 +24,7 @@ import { cleanupRetainedResourceByControlRef, observeRetainedResource, } from './tangle-sandbox-braid-stress.mjs' +import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') @@ -84,7 +85,7 @@ function sanitizedEnvironment(environment) { return child } -function sandboxConfiguration(environment) { +export function sandboxConfiguration(environment) { return connectionConfiguration(configurationEnvironment(environment), { prefix: 'BRAID_TANGLE_SANDBOX', kind: 'tangle-sandbox', @@ -93,7 +94,7 @@ function sandboxConfiguration(environment) { runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], fallbackEndpoint: 'https://sandbox.tangle.tools', - fallbackModel: 'tangle-router/glm-5.2', + fallbackModel: DEFAULT_TANGLE_ROUTER_MODEL, fallbackRunner: 'opencode', fallbackProvider: 'tangle', }) diff --git a/scripts/live-required/tangle-sandbox-worker.mjs b/scripts/live-required/tangle-sandbox-worker.mjs index 1031aad3..62754d1e 100644 --- a/scripts/live-required/tangle-sandbox-worker.mjs +++ b/scripts/live-required/tangle-sandbox-worker.mjs @@ -2,10 +2,10 @@ import { createInterface } from 'node:readline' import { resolve } from 'node:path' import { fileURLToPath } from 'node:url' import { Sandbox } from '@tangle-network/sandbox' +import { DEFAULT_TANGLE_ROUTER_MODEL_ID } from './model-defaults.mjs' const DEFAULT_SANDBOX_ENDPOINT = 'https://sandbox.tangle.tools' const DEFAULT_MODEL_ENDPOINT = 'https://router.tangle.tools/v1' -const DEFAULT_MODEL = 'glm-5.2' const DEFAULT_MODEL_PROVIDER = 'openai-compat' function argument(name, argv = process.argv) { @@ -35,9 +35,9 @@ function clientConfiguration(environment = process.env) { } } -function backendConfiguration(environment = process.env) { +export function backendConfiguration(environment = process.env) { const provider = environment.BRAID_TANGLE_SANDBOX_MODEL_PROVIDER?.trim() || DEFAULT_MODEL_PROVIDER - const model = environment.BRAID_TANGLE_SANDBOX_MODEL?.trim() || DEFAULT_MODEL + const model = environment.BRAID_TANGLE_SANDBOX_MODEL?.trim() || DEFAULT_TANGLE_ROUTER_MODEL_ID const baseUrl = environment.BRAID_TANGLE_SANDBOX_MODEL_ENDPOINT?.trim() || DEFAULT_MODEL_ENDPOINT const apiKey = requiredEnvironment( 'BRAID_TANGLE_SANDBOX_MODEL_API_KEY', diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index 9c17d6c5..8e1037d6 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -19,10 +19,10 @@ import { scalarMeasurement, } from './contracts.mjs' import { configEvidence, prepareProductionWorkspace } from './headless.mjs' +import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' const DEFAULT_REPOSITORY = resolve(dirname(fileURLToPath(import.meta.url)), '../..') const DEFAULT_ENDPOINT = 'https://sandbox.tangle.tools' -const DEFAULT_MODEL = 'tangle-router/glm-5.2' const DEFAULT_RUNNER = 'opencode' const DEFAULT_PROVIDER = 'tangle' const DEFAULT_IDLE_TTL_SECONDS = 1_800 @@ -42,7 +42,7 @@ function configurationEnvironment(environment) { return environment } -function sandboxConfiguration(environment) { +export function sandboxConfiguration(environment) { return connectionConfiguration(configurationEnvironment(environment), { prefix: 'BRAID_TANGLE_SANDBOX', kind: 'tangle-sandbox', @@ -51,7 +51,7 @@ function sandboxConfiguration(environment) { runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], fallbackEndpoint: DEFAULT_ENDPOINT, - fallbackModel: DEFAULT_MODEL, + fallbackModel: DEFAULT_TANGLE_ROUTER_MODEL, fallbackRunner: DEFAULT_RUNNER, fallbackProvider: DEFAULT_PROVIDER, }) diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 81e48957..5f0d8590 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -3,6 +3,10 @@ import { resolve } from 'node:path' import test from 'node:test' import { PROOF_OPERATIONS, proofReceipt } from '../scripts/live-required/contracts.mjs' import { MULTIRUN_REQUIRED_PHASES } from '../scripts/live-required/multirun-contract.mjs' +import { + DEFAULT_TANGLE_ROUTER_MODEL, + DEFAULT_TANGLE_ROUTER_MODEL_ID, +} from '../scripts/live-required/model-defaults.mjs' import { runSandbox, runTangleFlows } from '../scripts/live-required/tangle.mjs' import { assertInteractiveOwnedResourceCleanup, @@ -11,15 +15,37 @@ import { finalizeInteractiveProof, interactiveFailureMessages, interactiveMaterializationEvidence, + sandboxConfiguration as interactiveSandboxConfiguration, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' +import { sandboxConfiguration as multirunSandboxConfiguration } from '../scripts/live-required/tangle-sandbox-braid-multirun.mjs' +import { sandboxEnvironment } from '../scripts/live-required/tangle-sandbox-braid-execution-soak.mjs' import { assertSingleExecutionAttemptLedger, cleanupOwnedRetainedResources, cleanupRetainedResourceByRunId, } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' +import { sandboxConfiguration as workspaceSandboxConfiguration } from '../scripts/live-required/tangle-workspace-proof.mjs' +import { backendConfiguration as workerBackendConfiguration } from '../scripts/live-required/tangle-sandbox-worker.mjs' +import { supervisorProfile } from '../scripts/live-required/supervisor.mjs' const repository = resolve(new URL('../', import.meta.url).pathname) +test('active Tangle Sandbox checks share the current router model default', () => { + const environment = { + BRAID_TANGLE_SANDBOX_API_KEY: 'test-only-placeholder', + BRAID_TANGLE_SANDBOX_MODEL_API_KEY: 'test-only-placeholder', + } + const expectedProfileModel = DEFAULT_TANGLE_ROUTER_MODEL + assert.equal(DEFAULT_TANGLE_ROUTER_MODEL_ID, 'glm-5.3') + assert.equal(workspaceSandboxConfiguration(environment).model, expectedProfileModel) + assert.equal(multirunSandboxConfiguration(environment).model, expectedProfileModel) + assert.equal(interactiveSandboxConfiguration(environment).model, expectedProfileModel) + assert.equal(sandboxEnvironment({}).BRAID_TANGLE_SANDBOX_MODEL, expectedProfileModel) + assert.equal(workerBackendConfiguration(environment).model.model, DEFAULT_TANGLE_ROUTER_MODEL_ID) + assert.equal(workerBackendConfiguration(environment).profile.model.default, expectedProfileModel) + assert.equal(supervisorProfile({}).model.default, expectedProfileModel) +}) + function passedStressProof() { const first = { id: 'run-first', environmentId: 'environment-local' } return { From 618e11e74c1e6dc4ac618e8742ab782532bb2507 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 23:00:31 -0600 Subject: [PATCH 095/136] chore(verification): record model freshness run --- .agent/skill-runs.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index 3f948d7b..2e914739 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -102,3 +102,4 @@ {"skill":"/ui-test","ts":"2026-08-30T02:01:21Z","project":"braid-keyboard-flow-fix","target":"packed Braid PTY keyboard workflows","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/product-design","ts":"2026-08-30T02:01:21Z","project":"braid-keyboard-flow-fix","target":"packed Braid keyboard workflow capture","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/ui-test","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/verify","ts":"2026-08-30T04:54:46Z","project":"braid-10-complete","target":"Braid feat/braid-10-complete final pnpm check","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/model-freshness","ts":"2026-08-30T05:00:20Z","project":"braid-10-complete","target":"Braid active Tangle model defaults","operatorPrompt":"","durationMin":null,"verdict":"FRESH","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} From eff750db1189725b2d8f339ee93b6ace420eb53d Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sat, 29 Aug 2026 23:05:20 -0600 Subject: [PATCH 096/136] chore(verify): record final exact-head check --- .agent/skill-runs.jsonl | 1 + 1 file changed, 1 insertion(+) diff --git a/.agent/skill-runs.jsonl b/.agent/skill-runs.jsonl index 2e914739..a5c00b5c 100644 --- a/.agent/skill-runs.jsonl +++ b/.agent/skill-runs.jsonl @@ -103,3 +103,4 @@ {"skill":"/product-design","ts":"2026-08-30T02:01:21Z","project":"braid-keyboard-flow-fix","target":"packed Braid keyboard workflow capture","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/ui-test","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/verify","ts":"2026-08-30T04:54:46Z","project":"braid-10-complete","target":"Braid feat/braid-10-complete final pnpm check","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} {"skill":"/model-freshness","ts":"2026-08-30T05:00:20Z","project":"braid-10-complete","target":"Braid active Tangle model defaults","operatorPrompt":"","durationMin":null,"verdict":"FRESH","dispatchedTo":"/verify","operatorOverride":null,"transcriptPath":null,"traceDir":null} +{"skill":"/verify","ts":"2026-08-30T05:05:16Z","project":"braid-10-complete","target":"Braid 618e11e final exact-head pnpm check","operatorPrompt":"","durationMin":null,"verdict":"PASS","dispatchedTo":"/stop","operatorOverride":null,"transcriptPath":null,"traceDir":null} From 6299ef66dc02d5b954aef28a941286956979ef4d Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 00:20:22 -0600 Subject: [PATCH 097/136] fix(live): separate sandbox transport and model providers --- scripts/live-required/configuration.mjs | 7 ++++ scripts/live-required/headless.mjs | 7 ++-- .../tangle-sandbox-braid-execution-soak.mjs | 9 +++-- .../tangle-sandbox-braid-interactive.mjs | 5 ++- .../tangle-sandbox-braid-multirun.mjs | 5 ++- .../tangle-sandbox-braid-stress.mjs | 2 ++ .../tangle-sandbox-interactive-continuity.mjs | 6 ++-- .../live-required/tangle-workspace-proof.mjs | 3 ++ test/tangle-live07-wiring.test.mjs | 35 ++++++++++++++++--- 9 files changed, 65 insertions(+), 14 deletions(-) diff --git a/scripts/live-required/configuration.mjs b/scripts/live-required/configuration.mjs index b9ed06ba..29360be3 100644 --- a/scripts/live-required/configuration.mjs +++ b/scripts/live-required/configuration.mjs @@ -30,10 +30,12 @@ export function connectionConfiguration( modelNames = [], runnerNames = [], providerNames = [], + modelProviderNames = [], fallbackEndpoint, fallbackModel, fallbackRunner, fallbackProvider = 'tangle', + fallbackModelProvider, credentialFallbacks = [], }, ) { @@ -43,6 +45,10 @@ export function connectionConfiguration( const runner = firstValue(environment, [`${prefix}_RUNNER`, ...runnerNames]) ?? fallbackRunner const provider = firstValue(environment, [`${prefix}_PROVIDER`, ...providerNames]) ?? fallbackProvider + const modelProvider = + firstValue(environment, [`${prefix}_MODEL_PROVIDER`, ...modelProviderNames]) ?? + fallbackModelProvider ?? + provider const missing = [ [endpoint, `${prefix}_ENDPOINT`, 'provider endpoint'], [model, `${prefix}_MODEL`, 'profile model'], @@ -62,6 +68,7 @@ export function connectionConfiguration( model, runner, provider, + modelProvider, ...credential(environment, prefix, credentialFallbacks), } } diff --git a/scripts/live-required/headless.mjs b/scripts/live-required/headless.mjs index 7b3760b1..224088fb 100644 --- a/scripts/live-required/headless.mjs +++ b/scripts/live-required/headless.mjs @@ -43,13 +43,13 @@ function validCredentialId(value) { return candidate } -function profileFor({ kind, model, runner, provider }) { +function profileFor({ kind, model, runner, modelProvider }) { return { name: `Braid live ${kind}`, description: 'Protected release flow profile', version: '1.0.0', harness: runner, - model: { provider, default: model, reasoningEffort: 'none' }, + model: { provider: modelProvider, default: model, reasoningEffort: 'none' }, prompt: { instructions: ['Follow the release prompt exactly and return the requested marker.'], }, @@ -247,6 +247,7 @@ export async function prepareProductionWorkspace({ model, runner, provider, + modelProvider = provider, connectionName, providerOptions = {}, confidentialAttestationPolicy, @@ -271,7 +272,7 @@ export async function prepareProductionWorkspace({ : `credential-live-${kindId}-${randomUUID().replaceAll('-', '')}` const selectedCredentialId = generatedCredentialId ?? credentialRef if (selectedCredentialId !== undefined) validCredentialId(selectedCredentialId) - const profile = profileFor({ kind, model, runner, provider }) + const profile = profileFor({ kind, model, runner, modelProvider }) const profileFile = `profile-${kindId}.json` const profilePath = join(profileDirectory, profileFile) const now = timestamp() diff --git a/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs b/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs index 163adaa9..6dac1b74 100644 --- a/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs +++ b/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs @@ -13,12 +13,12 @@ import { resolveBinary, runHeadlessTurn, } from './headless.mjs' +import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' import { environmentForRun, resourceDelta, runObservations, } from './tangle-sandbox-braid-stress-support.mjs' -import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' const repository = resolve(dirname(fileURLToPath(import.meta.url)), '../..') const DEFAULT_RUNS = 3 @@ -66,8 +66,9 @@ export function sandboxEnvironment(environment) { BRAID_TANGLE_SANDBOX_MODEL: environment.BRAID_TANGLE_SANDBOX_MODEL?.trim() || DEFAULT_TANGLE_ROUTER_MODEL, BRAID_TANGLE_SANDBOX_RUNNER: environment.BRAID_TANGLE_SANDBOX_RUNNER?.trim() || 'opencode', - BRAID_TANGLE_SANDBOX_PROVIDER: - environment.BRAID_TANGLE_SANDBOX_PROVIDER?.trim() || 'tangle-router', + BRAID_TANGLE_SANDBOX_PROVIDER: environment.BRAID_TANGLE_SANDBOX_PROVIDER?.trim() || 'tangle', + BRAID_TANGLE_SANDBOX_MODEL_PROVIDER: + environment.BRAID_TANGLE_SANDBOX_MODEL_PROVIDER?.trim() || 'tangle-router', ...(!environment.BRAID_TANGLE_SANDBOX_API_KEY && environment.TANGLE_API_KEY ? { BRAID_TANGLE_SANDBOX_API_KEY: environment.TANGLE_API_KEY } : {}), @@ -82,6 +83,8 @@ function sandboxConfiguration(environment) { modelNames: ['BRAID_TANGLE_MODEL'], runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], + modelProviderNames: ['BRAID_TANGLE_SANDBOX_MODEL_PROVIDER'], + fallbackModelProvider: 'tangle-router', }) } diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index a07b73be..76adc389 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -38,6 +38,7 @@ import { rpcRequest, rpcState, } from './headless.mjs' +import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' import { accountIdentity, assertSingleExecutionAttemptLedger, @@ -54,7 +55,6 @@ import { usage, } from './tangle-sandbox-braid-stress.mjs' import { resourceDelta } from './tangle-sandbox-braid-stress-support.mjs' -import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') @@ -142,10 +142,12 @@ export function sandboxConfiguration(environment) { modelNames: ['BRAID_TANGLE_MODEL'], runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], + modelProviderNames: ['BRAID_TANGLE_SANDBOX_MODEL_PROVIDER'], fallbackEndpoint: 'https://sandbox.tangle.tools', fallbackModel: DEFAULT_TANGLE_ROUTER_MODEL, fallbackRunner: 'pi', fallbackProvider: 'tangle', + fallbackModelProvider: 'tangle-router', }) } @@ -1118,6 +1120,7 @@ async function runProof({ model: values.model, runner: values.runner, provider: values.provider, + modelProvider: values.modelProvider, providerOptions: { lifecycle: 'retained', idleTtlSeconds }, credentialRef: values.credentialRef, credentialValue: values.credentialValue, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index d68986ad..8eac830d 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -19,12 +19,12 @@ import { pause } from '../live-demo/terminal.mjs' import { connectionConfiguration } from './configuration.mjs' import { safeJson, safeMessage } from './contracts.mjs' import { configEvidence, prepareProductionWorkspace, resolveBinary } from './headless.mjs' +import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' import { MULTIRUN_PROOF_SCHEMA } from './multirun-contract.mjs' import { cleanupRetainedResourceByControlRef, observeRetainedResource, } from './tangle-sandbox-braid-stress.mjs' -import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') @@ -93,10 +93,12 @@ export function sandboxConfiguration(environment) { modelNames: ['BRAID_TANGLE_MODEL'], runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], + modelProviderNames: ['BRAID_TANGLE_SANDBOX_MODEL_PROVIDER'], fallbackEndpoint: 'https://sandbox.tangle.tools', fallbackModel: DEFAULT_TANGLE_ROUTER_MODEL, fallbackRunner: 'opencode', fallbackProvider: 'tangle', + fallbackModelProvider: 'tangle-router', }) } @@ -678,6 +680,7 @@ export async function runProof({ model: values.model, runner: values.runner, provider: values.provider, + modelProvider: values.modelProvider, providerOptions: { lifecycle: 'retained', idleTtlSeconds: 1_800 }, credentialRef: values.credentialRef, credentialValue: values.credentialValue, diff --git a/scripts/live-required/tangle-sandbox-braid-stress.mjs b/scripts/live-required/tangle-sandbox-braid-stress.mjs index 100cbf89..22f447c7 100644 --- a/scripts/live-required/tangle-sandbox-braid-stress.mjs +++ b/scripts/live-required/tangle-sandbox-braid-stress.mjs @@ -101,6 +101,8 @@ function sandboxConfiguration(environment) { modelNames: ['BRAID_TANGLE_MODEL'], runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], + modelProviderNames: ['BRAID_TANGLE_SANDBOX_MODEL_PROVIDER'], + fallbackModelProvider: 'tangle-router', }) } diff --git a/scripts/live-required/tangle-sandbox-interactive-continuity.mjs b/scripts/live-required/tangle-sandbox-interactive-continuity.mjs index b2aa340b..f5cb6b88 100644 --- a/scripts/live-required/tangle-sandbox-interactive-continuity.mjs +++ b/scripts/live-required/tangle-sandbox-interactive-continuity.mjs @@ -212,6 +212,8 @@ function configuration(environment) { modelNames: ['BRAID_TANGLE_MODEL'], runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], + modelProviderNames: ['BRAID_TANGLE_SANDBOX_MODEL_PROVIDER'], + fallbackModelProvider: 'tangle-router', }) if (!values.credentialValue?.trim()) { throw capabilityUnavailable( @@ -567,7 +569,7 @@ export async function runInteractiveContinuityProof({ harness: values.runner, model: { default: values.model, - provider: values.provider, + provider: values.modelProvider, }, } const options = createOptions(values, createProfile, exactProofId) @@ -620,7 +622,7 @@ export async function runInteractiveContinuityProof({ proofId: exactProofId, runner: values.runner, model: values.model, - modelProvider: values.provider, + modelProvider: values.modelProvider, }) startInfo = await bounded( `Interactive start [${identityText(exact.start)}]`, diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index 8e1037d6..d302c720 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -50,10 +50,12 @@ export function sandboxConfiguration(environment) { modelNames: ['BRAID_TANGLE_MODEL'], runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_SANDBOX_PROVIDER'], + modelProviderNames: ['BRAID_TANGLE_SANDBOX_MODEL_PROVIDER'], fallbackEndpoint: DEFAULT_ENDPOINT, fallbackModel: DEFAULT_TANGLE_ROUTER_MODEL, fallbackRunner: DEFAULT_RUNNER, fallbackProvider: DEFAULT_PROVIDER, + fallbackModelProvider: 'tangle-router', }) } @@ -600,6 +602,7 @@ async function runWorkspaceProof({ model: values.model, runner: values.runner, provider: values.provider, + modelProvider: values.modelProvider, credentialRef: values.credentialRef, credentialValue: values.credentialValue, providerOptions: { diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 5f0d8590..d3182f89 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -2,12 +2,15 @@ import assert from 'node:assert/strict' import { resolve } from 'node:path' import test from 'node:test' import { PROOF_OPERATIONS, proofReceipt } from '../scripts/live-required/contracts.mjs' -import { MULTIRUN_REQUIRED_PHASES } from '../scripts/live-required/multirun-contract.mjs' +import { prepareProductionWorkspace } from '../scripts/live-required/headless.mjs' import { DEFAULT_TANGLE_ROUTER_MODEL, DEFAULT_TANGLE_ROUTER_MODEL_ID, } from '../scripts/live-required/model-defaults.mjs' +import { MULTIRUN_REQUIRED_PHASES } from '../scripts/live-required/multirun-contract.mjs' +import { supervisorProfile } from '../scripts/live-required/supervisor.mjs' import { runSandbox, runTangleFlows } from '../scripts/live-required/tangle.mjs' +import { sandboxEnvironment } from '../scripts/live-required/tangle-sandbox-braid-execution-soak.mjs' import { assertInteractiveOwnedResourceCleanup, assertInteractiveTelemetry, @@ -18,15 +21,13 @@ import { sandboxConfiguration as interactiveSandboxConfiguration, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' import { sandboxConfiguration as multirunSandboxConfiguration } from '../scripts/live-required/tangle-sandbox-braid-multirun.mjs' -import { sandboxEnvironment } from '../scripts/live-required/tangle-sandbox-braid-execution-soak.mjs' import { assertSingleExecutionAttemptLedger, cleanupOwnedRetainedResources, cleanupRetainedResourceByRunId, } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' -import { sandboxConfiguration as workspaceSandboxConfiguration } from '../scripts/live-required/tangle-workspace-proof.mjs' import { backendConfiguration as workerBackendConfiguration } from '../scripts/live-required/tangle-sandbox-worker.mjs' -import { supervisorProfile } from '../scripts/live-required/supervisor.mjs' +import { sandboxConfiguration as workspaceSandboxConfiguration } from '../scripts/live-required/tangle-workspace-proof.mjs' const repository = resolve(new URL('../', import.meta.url).pathname) @@ -38,14 +39,40 @@ test('active Tangle Sandbox checks share the current router model default', () = const expectedProfileModel = DEFAULT_TANGLE_ROUTER_MODEL assert.equal(DEFAULT_TANGLE_ROUTER_MODEL_ID, 'glm-5.3') assert.equal(workspaceSandboxConfiguration(environment).model, expectedProfileModel) + assert.equal(workspaceSandboxConfiguration(environment).provider, 'tangle') + assert.equal(workspaceSandboxConfiguration(environment).modelProvider, 'tangle-router') assert.equal(multirunSandboxConfiguration(environment).model, expectedProfileModel) + assert.equal(multirunSandboxConfiguration(environment).provider, 'tangle') + assert.equal(multirunSandboxConfiguration(environment).modelProvider, 'tangle-router') assert.equal(interactiveSandboxConfiguration(environment).model, expectedProfileModel) + assert.equal(interactiveSandboxConfiguration(environment).provider, 'tangle') + assert.equal(interactiveSandboxConfiguration(environment).modelProvider, 'tangle-router') assert.equal(sandboxEnvironment({}).BRAID_TANGLE_SANDBOX_MODEL, expectedProfileModel) + assert.equal(sandboxEnvironment({}).BRAID_TANGLE_SANDBOX_PROVIDER, 'tangle') + assert.equal(sandboxEnvironment({}).BRAID_TANGLE_SANDBOX_MODEL_PROVIDER, 'tangle-router') assert.equal(workerBackendConfiguration(environment).model.model, DEFAULT_TANGLE_ROUTER_MODEL_ID) assert.equal(workerBackendConfiguration(environment).profile.model.default, expectedProfileModel) assert.equal(supervisorProfile({}).model.default, expectedProfileModel) }) +test('Tangle Sandbox workspace profiles keep transport and model providers distinct', async () => { + const values = interactiveSandboxConfiguration({ + BRAID_TANGLE_SANDBOX_CREDENTIAL_REF: 'credential-ref-live-provider-split', + }) + const config = await prepareProductionWorkspace({ + repository, + environment: {}, + ...values, + }) + try { + assert.equal(config.connection.kind, 'tangle-sandbox') + assert.equal(config.profile.model.provider, 'tangle-router') + assert.equal(config.profile.model.default, DEFAULT_TANGLE_ROUTER_MODEL) + } finally { + await config.cleanup() + } +}) + function passedStressProof() { const first = { id: 'run-first', environmentId: 'environment-local' } return { From 26034bee50e779a8d4d58656af2059872f243138 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 00:32:02 -0600 Subject: [PATCH 098/136] fix(live): keep model provider identity explicit --- scripts/live-required.test.mjs | 114 +++++++++++++++++- scripts/live-required/analysis.mjs | 1 + scripts/live-required/configuration.mjs | 36 ++++-- scripts/live-required/headless.mjs | 15 ++- scripts/live-required/supervisor.mjs | 9 +- .../tangle-sandbox-braid-execution-soak.mjs | 5 +- .../tangle-sandbox-braid-interactive.mjs | 2 - .../tangle-sandbox-braid-multirun.mjs | 3 +- .../tangle-sandbox-interactive-continuity.mjs | 10 +- ...le-sandbox-interactive-continuity.test.mjs | 1 + .../live-required/tangle-workspace-proof.mjs | 3 - scripts/live-required/tangle.mjs | 1 + test/tangle-live07-wiring.test.mjs | 7 +- 13 files changed, 166 insertions(+), 41 deletions(-) diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index cf95534d..dbf3ed5c 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -25,6 +25,7 @@ import { configEvidence, initializedSession, prepareProductionWorkspace, + profileFor, runHeadlessTurn, } from './live-required/headless.mjs' import { @@ -50,6 +51,7 @@ import { runStressProof, } from './live-required/tangle-sandbox-stress.mjs' import { runWorker } from './live-required/tangle-sandbox-worker.mjs' +import { sandboxConfiguration as workspaceSandboxConfiguration } from './live-required/tangle-workspace-proof.mjs' import './live-required/tangle-sandbox-braid-multirun.test.mjs' import { MULTIRUN_REQUIRED_PHASES } from './live-required/multirun-contract.mjs' import { readLiveTangleProof } from './release/live-tangle-proof.mjs' @@ -89,6 +91,105 @@ test('config evidence accepts connections without optional provider options', () ) }) +test('live model-provider resolution preserves qualified and unqualified model ids', () => { + const options = { + prefix: 'BRAID_TANGLE', + kind: 'tangle-inference', + fallbackRunner: 'cli-base', + fallbackModelProvider: 'tangle-router', + providerNames: ['BRAID_TANGLE_PROVIDER'], + } + const qualified = connectionConfiguration( + { + BRAID_TANGLE_ENDPOINT: 'https://router.tangle.tools', + BRAID_TANGLE_MODEL: 'zai/glm-5.3', + BRAID_TANGLE_CREDENTIAL_REF: 'credential-ref-model-provider-qualified', + }, + options, + ) + assert.equal(qualified.model, 'zai/glm-5.3') + assert.equal(qualified.modelProvider, 'tangle-router') + + const unqualified = connectionConfiguration( + { + BRAID_TANGLE_ENDPOINT: 'https://router.tangle.tools', + BRAID_TANGLE_MODEL: 'glm-5.3', + BRAID_TANGLE_CREDENTIAL_REF: 'credential-ref-model-provider-unqualified', + }, + options, + ) + assert.equal(unqualified.model, 'glm-5.3') + assert.equal(unqualified.modelProvider, 'tangle-router') + + const explicit = connectionConfiguration( + { + BRAID_TANGLE_ENDPOINT: 'https://router.tangle.tools', + BRAID_TANGLE_MODEL: 'zai/glm-5.3', + BRAID_TANGLE_MODEL_PROVIDER: 'custom-router', + BRAID_TANGLE_CREDENTIAL_REF: 'credential-ref-model-provider-explicit', + }, + options, + ) + assert.equal(explicit.model, 'zai/glm-5.3') + assert.equal(explicit.modelProvider, 'custom-router') + + const currentAlias = connectionConfiguration( + { + BRAID_TANGLE_ENDPOINT: 'https://router.tangle.tools', + BRAID_TANGLE_MODEL: 'glm-5.3', + BRAID_TANGLE_PROVIDER: 'legacy-router-alias', + BRAID_TANGLE_CREDENTIAL_REF: 'credential-ref-model-provider-alias', + }, + options, + ) + assert.equal(currentAlias.model, 'glm-5.3') + assert.equal(currentAlias.modelProvider, 'legacy-router-alias') + + const sandboxDefault = workspaceSandboxConfiguration({ + BRAID_TANGLE_SANDBOX_CREDENTIAL_REF: 'credential-ref-model-provider-sandbox-default', + }) + assert.equal(sandboxDefault.model, 'tangle-router/glm-5.3') + assert.equal(sandboxDefault.modelProvider, 'tangle-router') +}) + +test('generic unqualified live profiles fail closed without a model provider', () => { + assert.throws( + () => profileFor({ kind: 'generic', model: 'glm-5.3', runner: 'pi' }), + (error) => { + assert.equal(error.code, 'PROTECTED_MODEL_PROVIDER_REQUIRED') + return true + }, + ) +}) + +test('live profile and evidence preserve the full portable model id', () => { + const profile = profileFor({ + kind: 'tangle-sandbox', + model: 'zai/glm-5.3', + runner: 'opencode', + modelProvider: 'tangle-router', + }) + assert.equal(profile.model.default, 'zai/glm-5.3') + assert.equal(profile.model.provider, 'tangle-router') + assert.deepEqual( + configEvidence({ + endpoint: { scheme: 'https', host: 'sandbox.tangle.tools' }, + connection: { id: 'connection-model-provider', kind: 'tangle-sandbox' }, + credentialConfigured: true, + profile, + }), + { + endpoint: { scheme: 'https', host: 'sandbox.tangle.tools' }, + connectionId: 'connection-model-provider', + connectionKind: 'tangle-sandbox', + credentialConfigured: true, + model: 'zai/glm-5.3', + modelProvider: 'tangle-router', + runner: 'opencode', + }, + ) +}) + function protectedEnvironment() { const environment = { ...process.env } for (const name of [ @@ -101,6 +202,8 @@ function protectedEnvironment() { 'BRAID_ANALYSIS_BEARER', 'BRAID_TANGLE_ENDPOINT', 'BRAID_TANGLE_MODEL', + 'BRAID_TANGLE_MODEL_PROVIDER', + 'BRAID_TANGLE_INFERENCE_MODEL_PROVIDER', 'BRAID_TANGLE_RUNNER', 'BRAID_TANGLE_CREDENTIAL_REF', 'BRAID_TANGLE_AUTH', @@ -108,6 +211,7 @@ function protectedEnvironment() { 'BRAID_TANGLE_BEARER', 'BRAID_TANGLE_SANDBOX_ENDPOINT', 'BRAID_TANGLE_SANDBOX_MODEL', + 'BRAID_TANGLE_SANDBOX_MODEL_PROVIDER', 'BRAID_TANGLE_SANDBOX_RUNNER', 'BRAID_TANGLE_SANDBOX_CREDENTIAL_REF', 'BRAID_TANGLE_SANDBOX_AUTH', @@ -1454,7 +1558,7 @@ test('configured headless checks execute the real Braid RPC process and validate endpoint: 'http://127.0.0.1:3344', model: 'openai-codex/gpt-5.6-luna', runner: 'pi', - provider: 'openai-codex', + modelProvider: 'openai-codex', }) try { const turn = await runHeadlessTurn({ @@ -1495,7 +1599,7 @@ test('production live workspaces remove every raw authentication alias from chil endpoint: 'https://router.tangle.tools', model: 'openai/gpt-5', runner: 'pi', - provider: 'tangle', + modelProvider: 'tangle-router', credentialRef: 'credential-ref-live-required-test', }) try { @@ -1515,7 +1619,7 @@ test('generated live credentials use the same protected store as production Brai endpoint: 'https://router.tangle.tools', model: 'glm-5.2', runner: 'cli-base', - provider: 'tangle', + modelProvider: 'tangle-router', credentialValue: secret, }) let session @@ -1548,7 +1652,7 @@ test('generated credential cleanup disposes failed removal, cleans root, and ret endpoint: 'https://router.tangle.tools', model: 'glm-5.2', runner: 'cli-base', - provider: 'tangle', + modelProvider: 'tangle-router', credentialValue: secret, credentialContextFactory: () => ({ store: { @@ -1624,7 +1728,7 @@ test('temporary-root cleanup retries after a transient failure without repeating endpoint: 'https://router.tangle.tools', model: 'glm-5.2', runner: 'cli-base', - provider: 'tangle', + modelProvider: 'tangle-router', credentialValue: 'live-required-root-cleanup-canary-154d', credentialContextFactory: () => ({ store: { diff --git a/scripts/live-required/analysis.mjs b/scripts/live-required/analysis.mjs index 63da2b23..fee0118a 100644 --- a/scripts/live-required/analysis.mjs +++ b/scripts/live-required/analysis.mjs @@ -75,6 +75,7 @@ export async function runTraceAnalysis({ repository, environment }) { modelNames: ['BRAID_TANGLE_MODEL'], runnerNames: ['BRAID_TANGLE_RUNNER'], providerNames: ['BRAID_TANGLE_PROVIDER'], + fallbackModelProvider: 'tangle-router', fallbackRunner: 'cli-base', credentialFallbacks: ['BRAID_TANGLE_CREDENTIAL_REF'], }) diff --git a/scripts/live-required/configuration.mjs b/scripts/live-required/configuration.mjs index 29360be3..e7398250 100644 --- a/scripts/live-required/configuration.mjs +++ b/scripts/live-required/configuration.mjs @@ -1,9 +1,24 @@ import { protectedUnavailable } from './contracts.mjs' +function textValue(value) { + return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined +} + function firstValue(environment, names) { return names .map((name) => environment[name]) - .find((value) => typeof value === 'string' && value.trim()) + .map(textValue) + .find((value) => value !== undefined) +} + +/** + * Resolve the model provider without changing the portable model id. + * + * The caller supplies the owning path's fallback because a model prefix can + * identify an upstream model, not the connection's provider. + */ +export function resolveModelProvider({ override, fallback } = {}) { + return textValue(override) ?? textValue(fallback) } function credential(environment, prefix, fallbacks = []) { @@ -34,7 +49,6 @@ export function connectionConfiguration( fallbackEndpoint, fallbackModel, fallbackRunner, - fallbackProvider = 'tangle', fallbackModelProvider, credentialFallbacks = [], }, @@ -43,12 +57,15 @@ export function connectionConfiguration( firstValue(environment, [`${prefix}_ENDPOINT`, ...endpointNames]) ?? fallbackEndpoint const model = firstValue(environment, [`${prefix}_MODEL`, ...modelNames]) ?? fallbackModel const runner = firstValue(environment, [`${prefix}_RUNNER`, ...runnerNames]) ?? fallbackRunner - const provider = - firstValue(environment, [`${prefix}_PROVIDER`, ...providerNames]) ?? fallbackProvider - const modelProvider = - firstValue(environment, [`${prefix}_MODEL_PROVIDER`, ...modelProviderNames]) ?? - fallbackModelProvider ?? - provider + const modelProvider = resolveModelProvider({ + override: firstValue(environment, [ + `${prefix}_MODEL_PROVIDER`, + ...modelProviderNames, + `${prefix}_PROVIDER`, + ...providerNames, + ]), + fallback: fallbackModelProvider, + }) const missing = [ [endpoint, `${prefix}_ENDPOINT`, 'provider endpoint'], [model, `${prefix}_MODEL`, 'profile model'], @@ -67,8 +84,7 @@ export function connectionConfiguration( endpoint, model, runner, - provider, - modelProvider, + ...(modelProvider === undefined ? {} : { modelProvider }), ...credential(environment, prefix, credentialFallbacks), } } diff --git a/scripts/live-required/headless.mjs b/scripts/live-required/headless.mjs index 224088fb..ef030fae 100644 --- a/scripts/live-required/headless.mjs +++ b/scripts/live-required/headless.mjs @@ -12,6 +12,7 @@ import { stateForRun, terminalMessage, } from '../live-bridge/protocol.mjs' +import { resolveModelProvider } from './configuration.mjs' import { endpointEvidence, protectedUnavailable, safeMessage } from './contracts.mjs' const AUTH_ENVIRONMENT_NAMES = Object.freeze([ @@ -43,7 +44,14 @@ function validCredentialId(value) { return candidate } -function profileFor({ kind, model, runner, modelProvider }) { +export function profileFor({ kind, model, runner, modelProvider }) { + const provider = resolveModelProvider({ override: modelProvider }) + if (provider === undefined) { + throw protectedUnavailable( + 'PROTECTED_MODEL_PROVIDER_REQUIRED', + `The ${kind} live check requires an explicit model provider for model '${model}'`, + ) + } return { name: `Braid live ${kind}`, description: 'Protected release flow profile', @@ -246,8 +254,7 @@ export async function prepareProductionWorkspace({ endpoint, model, runner, - provider, - modelProvider = provider, + modelProvider, connectionName, providerOptions = {}, confidentialAttestationPolicy, @@ -571,12 +578,14 @@ export async function runHeadlessCancellation({ binary, config, marker, prompt, export function configEvidence(config) { const providerOptions = config.connection.providerOptions ?? {} + const modelProvider = config.profile.model.provider return { endpoint: config.endpoint, connectionId: config.connection.id, connectionKind: config.connection.kind, credentialConfigured: config.credentialConfigured, model: config.profile.model.default, + ...(modelProvider === undefined ? {} : { modelProvider }), runner: config.profile.harness, ...(providerOptions.lifecycle === undefined ? {} : { lifecycle: providerOptions.lifecycle }), ...(providerOptions.idleTtlSeconds === undefined diff --git a/scripts/live-required/supervisor.mjs b/scripts/live-required/supervisor.mjs index 46e3ba0a..aec3eb9d 100644 --- a/scripts/live-required/supervisor.mjs +++ b/scripts/live-required/supervisor.mjs @@ -1,5 +1,6 @@ import { createHash } from 'node:crypto' +import { resolveModelProvider } from './configuration.mjs' import { PROOF_OPERATIONS, proofInvocation, @@ -314,14 +315,16 @@ function proofConfig(environment) { export function supervisorProfile(environment) { const runner = environment.BRAID_SUPERVISOR_RUNNER?.trim() || DEFAULT_SUPERVISOR_RUNNER const model = environment.BRAID_SUPERVISOR_MODEL?.trim() || DEFAULT_SUPERVISOR_MODEL - const provider = - environment.BRAID_SUPERVISOR_MODEL_PROVIDER?.trim() || DEFAULT_SUPERVISOR_MODEL_PROVIDER + const modelProvider = resolveModelProvider({ + override: environment.BRAID_SUPERVISOR_MODEL_PROVIDER, + fallback: DEFAULT_SUPERVISOR_MODEL_PROVIDER, + }) return { name: 'Braid live supervisor', description: 'Protected LIVE-11 supervisor profile', version: '1.0.0', harness: runner, - model: { provider, default: model, reasoningEffort: 'none' }, + model: { provider: modelProvider, default: model, reasoningEffort: 'none' }, prompt: { instructions: ['Remain available for the protected LIVE-11 supervisor proof.'], }, diff --git a/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs b/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs index 6dac1b74..953205cf 100644 --- a/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs +++ b/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs @@ -66,9 +66,6 @@ export function sandboxEnvironment(environment) { BRAID_TANGLE_SANDBOX_MODEL: environment.BRAID_TANGLE_SANDBOX_MODEL?.trim() || DEFAULT_TANGLE_ROUTER_MODEL, BRAID_TANGLE_SANDBOX_RUNNER: environment.BRAID_TANGLE_SANDBOX_RUNNER?.trim() || 'opencode', - BRAID_TANGLE_SANDBOX_PROVIDER: environment.BRAID_TANGLE_SANDBOX_PROVIDER?.trim() || 'tangle', - BRAID_TANGLE_SANDBOX_MODEL_PROVIDER: - environment.BRAID_TANGLE_SANDBOX_MODEL_PROVIDER?.trim() || 'tangle-router', ...(!environment.BRAID_TANGLE_SANDBOX_API_KEY && environment.TANGLE_API_KEY ? { BRAID_TANGLE_SANDBOX_API_KEY: environment.TANGLE_API_KEY } : {}), @@ -365,7 +362,7 @@ export async function runBraidSandboxExecutionSoak({ credentialConfigured: true, profile: { model: { default: values.model }, harness: values.runner }, }), - provider: values.provider, + modelProvider: values.modelProvider, }, account: { stable: failures.includes('Sandbox account identity changed during the cohort') === false, diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 76adc389..07cefa61 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -146,7 +146,6 @@ export function sandboxConfiguration(environment) { fallbackEndpoint: 'https://sandbox.tangle.tools', fallbackModel: DEFAULT_TANGLE_ROUTER_MODEL, fallbackRunner: 'pi', - fallbackProvider: 'tangle', fallbackModelProvider: 'tangle-router', }) } @@ -1119,7 +1118,6 @@ async function runProof({ endpoint: values.endpoint, model: values.model, runner: values.runner, - provider: values.provider, modelProvider: values.modelProvider, providerOptions: { lifecycle: 'retained', idleTtlSeconds }, credentialRef: values.credentialRef, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 8eac830d..d051999c 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -97,7 +97,6 @@ export function sandboxConfiguration(environment) { fallbackEndpoint: 'https://sandbox.tangle.tools', fallbackModel: DEFAULT_TANGLE_ROUTER_MODEL, fallbackRunner: 'opencode', - fallbackProvider: 'tangle', fallbackModelProvider: 'tangle-router', }) } @@ -679,7 +678,6 @@ export async function runProof({ endpoint: values.endpoint, model: values.model, runner: values.runner, - provider: values.provider, modelProvider: values.modelProvider, providerOptions: { lifecycle: 'retained', idleTtlSeconds: 1_800 }, credentialRef: values.credentialRef, @@ -1047,6 +1045,7 @@ export async function runProof({ endpoint: values.endpoint, runner: values.runner, model: values.model, + modelProvider: values.modelProvider, lifecycle: 'retained', credentialConfigured: Boolean(values.credentialValue || values.credentialRef), }, diff --git a/scripts/live-required/tangle-sandbox-interactive-continuity.mjs b/scripts/live-required/tangle-sandbox-interactive-continuity.mjs index f5cb6b88..1695f56b 100644 --- a/scripts/live-required/tangle-sandbox-interactive-continuity.mjs +++ b/scripts/live-required/tangle-sandbox-interactive-continuity.mjs @@ -259,10 +259,14 @@ export function buildExactInteractiveStart({ proofId, runner, model, - modelProvider = 'tangle', + modelProvider, cols = DEFAULT_COLS, rows = DEFAULT_ROWS, }) { + if (typeof modelProvider !== 'string' || modelProvider.trim().length === 0) { + throw new Error('Interactive start requires an explicit model provider') + } + const selectedModelProvider = modelProvider.trim() const exactEnvironmentId = safeIdentifier(environmentId, 'environmentId') const exactSessionId = safeIdentifier(sessionId, 'sessionId') const exactExecutionId = safeIdentifier(executionId, 'executionId') @@ -272,7 +276,7 @@ export function buildExactInteractiveStart({ harness: runner, model: { default: model, - provider: modelProvider, + provider: selectedModelProvider, }, } const requestedProfileDigest = interfaceModule.canonicalAgentProfileDigest(profile) @@ -882,7 +886,7 @@ export async function runInteractiveContinuityProof({ credentialConfigured: true, model: values.model, runner: values.runner, - provider: values.provider, + modelProvider: values.modelProvider, }, run: { environmentId: box.id, diff --git a/scripts/live-required/tangle-sandbox-interactive-continuity.test.mjs b/scripts/live-required/tangle-sandbox-interactive-continuity.test.mjs index 6c49b60b..ed5b7edc 100644 --- a/scripts/live-required/tangle-sandbox-interactive-continuity.test.mjs +++ b/scripts/live-required/tangle-sandbox-interactive-continuity.test.mjs @@ -165,6 +165,7 @@ test('exact start material binds one run to one profile and session', () => { proofId: 'proof-1', runner: 'pi', model: 'test-model', + modelProvider: 'tangle-router', }) assert.equal(exact.start.run.environmentId, 'sandbox-1') assert.equal(exact.start.run.sessionId, 'session-1') diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index d302c720..db9b833a 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -24,7 +24,6 @@ import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' const DEFAULT_REPOSITORY = resolve(dirname(fileURLToPath(import.meta.url)), '../..') const DEFAULT_ENDPOINT = 'https://sandbox.tangle.tools' const DEFAULT_RUNNER = 'opencode' -const DEFAULT_PROVIDER = 'tangle' const DEFAULT_IDLE_TTL_SECONDS = 1_800 const DEFAULT_ABSENCE_ATTEMPTS = 6 const DEFAULT_ABSENCE_DELAY_MS = 500 @@ -54,7 +53,6 @@ export function sandboxConfiguration(environment) { fallbackEndpoint: DEFAULT_ENDPOINT, fallbackModel: DEFAULT_TANGLE_ROUTER_MODEL, fallbackRunner: DEFAULT_RUNNER, - fallbackProvider: DEFAULT_PROVIDER, fallbackModelProvider: 'tangle-router', }) } @@ -601,7 +599,6 @@ async function runWorkspaceProof({ endpoint: values.endpoint, model: values.model, runner: values.runner, - provider: values.provider, modelProvider: values.modelProvider, credentialRef: values.credentialRef, credentialValue: values.credentialValue, diff --git a/scripts/live-required/tangle.mjs b/scripts/live-required/tangle.mjs index 9957b348..816bd42d 100644 --- a/scripts/live-required/tangle.mjs +++ b/scripts/live-required/tangle.mjs @@ -50,6 +50,7 @@ async function runInference({ repository, environment, binary, invocationId }) { modelNames: ['BRAID_TANGLE_INFERENCE_MODEL'], runnerNames: ['BRAID_TANGLE_INFERENCE_RUNNER'], providerNames: ['BRAID_TANGLE_INFERENCE_PROVIDER'], + fallbackModelProvider: 'tangle-router', fallbackRunner: 'cli-base', }) const config = await prepareProductionWorkspace({ diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index d3182f89..89b4311f 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -39,23 +39,18 @@ test('active Tangle Sandbox checks share the current router model default', () = const expectedProfileModel = DEFAULT_TANGLE_ROUTER_MODEL assert.equal(DEFAULT_TANGLE_ROUTER_MODEL_ID, 'glm-5.3') assert.equal(workspaceSandboxConfiguration(environment).model, expectedProfileModel) - assert.equal(workspaceSandboxConfiguration(environment).provider, 'tangle') assert.equal(workspaceSandboxConfiguration(environment).modelProvider, 'tangle-router') assert.equal(multirunSandboxConfiguration(environment).model, expectedProfileModel) - assert.equal(multirunSandboxConfiguration(environment).provider, 'tangle') assert.equal(multirunSandboxConfiguration(environment).modelProvider, 'tangle-router') assert.equal(interactiveSandboxConfiguration(environment).model, expectedProfileModel) - assert.equal(interactiveSandboxConfiguration(environment).provider, 'tangle') assert.equal(interactiveSandboxConfiguration(environment).modelProvider, 'tangle-router') assert.equal(sandboxEnvironment({}).BRAID_TANGLE_SANDBOX_MODEL, expectedProfileModel) - assert.equal(sandboxEnvironment({}).BRAID_TANGLE_SANDBOX_PROVIDER, 'tangle') - assert.equal(sandboxEnvironment({}).BRAID_TANGLE_SANDBOX_MODEL_PROVIDER, 'tangle-router') assert.equal(workerBackendConfiguration(environment).model.model, DEFAULT_TANGLE_ROUTER_MODEL_ID) assert.equal(workerBackendConfiguration(environment).profile.model.default, expectedProfileModel) assert.equal(supervisorProfile({}).model.default, expectedProfileModel) }) -test('Tangle Sandbox workspace profiles keep transport and model providers distinct', async () => { +test('Tangle Sandbox workspace profiles pin model identity separately from connection kind', async () => { const values = interactiveSandboxConfiguration({ BRAID_TANGLE_SANDBOX_CREDENTIAL_REF: 'credential-ref-live-provider-split', }) From 157cc33dfdaebe8a9ba207d11b29b1994cab1bec Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 01:09:49 -0600 Subject: [PATCH 099/136] fix(live): recover workspace cleanup identities --- .../live-required/tangle-workspace-proof.mjs | 178 +++++++++++++++--- test/tangle-workspace-proof.test.mjs | 116 ++++++++++++ 2 files changed, 263 insertions(+), 31 deletions(-) diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index db9b833a..7878f0db 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -27,6 +27,15 @@ const DEFAULT_RUNNER = 'opencode' const DEFAULT_IDLE_TTL_SECONDS = 1_800 const DEFAULT_ABSENCE_ATTEMPTS = 6 const DEFAULT_ABSENCE_DELAY_MS = 500 +const SOURCE_TERMINAL_STATUSES = new Set([ + 'completed', + 'failed', + 'aborted', + 'cancelled', + 'blocked', + 'expired', + 'unknown', +]) function configurationEnvironment(environment) { if ( @@ -194,6 +203,20 @@ function sourceEnvironmentRecord(state, run) { return { environment, providerId } } +export function sourceIdentityForRun(state, runId) { + const run = state.runs.find((candidate) => candidate.id === runId) + if (run === undefined || run.controlRef === undefined) return undefined + try { + return Object.freeze({ run, ...sourceEnvironmentRecord(state, run) }) + } catch { + return undefined + } +} + +export function checkpointIdForOperation(state, operationId) { + return state.checkpoints.find((candidate) => candidate.operationId === operationId)?.id +} + function sourceRunFor(state, runId) { const run = state.runs.find((candidate) => candidate.id === runId) if (run === undefined) throw new Error(`Source run ${runId} is missing from durable state`) @@ -337,7 +360,7 @@ function sourcePrompt(marker, path) { ].join(' ') } -async function sendSource(app, proofId) { +async function sendSource(app, proofId, onIdentity = () => {}) { const initial = app.state() const marker = markerFor(proofId, 'SOURCE') const path = markerPath(proofId) @@ -348,8 +371,28 @@ async function sendSource(app, proofId) { branchId: initial.branchId, text: sourcePrompt(marker, path), }) - await receipt.admissionReady - const terminal = await receipt.completion + const captureIdentity = () => { + const identity = sourceIdentityForRun(app.state(), receipt.runId) + if (identity === undefined) return + onIdentity( + Object.freeze({ + marker, + path, + operationId, + receipt, + ...identity, + }), + ) + } + let terminal + try { + await receipt.admissionReady + captureIdentity() + terminal = await receipt.completion + } catch (error) { + captureIdentity() + throw error + } const run = sourceRunFor(terminal, receipt.runId) const source = sourceEnvironmentRecord(terminal, run) return Object.freeze({ @@ -507,6 +550,21 @@ async function destroySource(adapters, sourceProviderEnvironmentId) { ) } +async function cancelSourceRun(app, source, operationId) { + const run = app.state().runs.find((candidate) => candidate.id === source.run.id) + if (run === undefined || SOURCE_TERMINAL_STATUSES.has(run.status)) return + if (typeof app.cancelRun !== 'function') + throw new Error('Braid did not expose source-run cancellation for cleanup') + const cancellation = await app.cancelRun({ + operationId: `${operationId}:source-cancel`, + runId: run.id, + reason: 'LIVE-09 proof cleanup', + terminalStatus: 'aborted', + legacy: true, + }) + await cancellation.completion +} + function checkpointIdForDestination(state, destinationId) { const edge = state.graphEdges.find((candidate) => { const source = state.graphNodes.find((node) => node.id === candidate.source) @@ -524,6 +582,74 @@ function checkpointIdForDestination(state, destinationId) { return state.checkpoints.find((candidate) => candidate.id === source.reference.id)?.id } +export async function cleanupWorkspaceProofResources({ + cleanupOwner, + adapters, + source, + destination, + resources, + branchOperationId, + cleanupOperationId, + proofId, + cleanupResult, + sourceDestroyed = false, +}) { + let cleanupError + let resolvedCleanupOperationId = cleanupOperationId + let resolvedCleanupResult = cleanupResult + let resolvedSourceDestroyed = sourceDestroyed + if (cleanupOwner !== undefined && source !== undefined) { + const cleanupCheckpointId = + resources?.checkpoint.id ?? + (branchOperationId === undefined + ? undefined + : checkpointIdForOperation(cleanupOwner.app.state(), branchOperationId)) ?? + (destination === undefined + ? undefined + : checkpointIdForDestination(cleanupOwner.app.state(), destination.id)) + if (cleanupCheckpointId !== undefined && resolvedCleanupResult === undefined) { + resolvedCleanupOperationId ??= `op-live-required-${proofId}-cleanup` + try { + resolvedCleanupResult = await cleanupOwner.app.conversations.branches.cleanup({ + operationId: resolvedCleanupOperationId, + checkpointId: String(cleanupCheckpointId), + ...(destination === undefined ? {} : { environmentId: String(destination.id) }), + }) + } catch (error) { + cleanupError ??= error + } + } + if (!resolvedSourceDestroyed) { + try { + await cancelSourceRun( + cleanupOwner.app, + source, + resolvedCleanupOperationId ?? `op-live-required-${proofId}-cleanup`, + ) + } catch (error) { + cleanupError ??= error + } + } + if (!resolvedSourceDestroyed) { + try { + const sourceAdapters = adapters ?? providerAdapters(cleanupOwner) + resolvedSourceDestroyed = await destroySource( + sourceAdapters, + source.providerId, + ) + } catch (error) { + cleanupError ??= error + } + } + } + return { + cleanupError, + cleanupOperationId: resolvedCleanupOperationId, + cleanupResult: resolvedCleanupResult, + sourceDestroyed: resolvedSourceDestroyed, + } +} + function confidentialExpected(source, destinationProviderEnvironmentId, requestDigest) { return { provider: source.provider, @@ -636,7 +762,9 @@ async function runWorkspaceProof({ ) } const adapters = providerAdapters(opened) - source = await sendSource(opened.app, proofId) + source = await sendSource(opened.app, proofId, (candidate) => { + source ??= candidate + }) sourceBefore = await readWorkspace(adapters, source.providerId, source.path, 'source') assertCondition( sourceBefore.content.trim() === source.marker, @@ -956,34 +1084,22 @@ async function runWorkspaceProof({ cleanupError ??= error } } - const cleanupCheckpointId = - resources?.checkpoint.id ?? - (cleanupOwner === undefined || destination === undefined - ? undefined - : checkpointIdForDestination(cleanupOwner.app.state(), destination.id)) - if ( - cleanupOwner !== undefined && - destination !== undefined && - cleanupCheckpointId !== undefined && - cleanupResult === undefined - ) { - cleanupOperationId ??= `op-live-required-${proofId}-cleanup` - try { - cleanupResult = await cleanupOwner.app.conversations.branches.cleanup({ - operationId: cleanupOperationId, - checkpointId: String(cleanupCheckpointId), - environmentId: String(destination.id), - }) - } catch (error) { - cleanupError ??= error - } - } if (cleanupOwner !== undefined && !sourceDestroyed) { - try { - sourceDestroyed = await destroySource(providerAdapters(cleanupOwner), source.providerId) - } catch (error) { - cleanupError ??= error - } + const cleanup = await cleanupWorkspaceProofResources({ + cleanupOwner, + source, + destination, + resources, + branchOperationId, + cleanupOperationId, + proofId, + cleanupResult, + sourceDestroyed, + }) + cleanupError ??= cleanup.cleanupError + cleanupOperationId = cleanup.cleanupOperationId + cleanupResult = cleanup.cleanupResult + sourceDestroyed = cleanup.sourceDestroyed } } if (rescueOwner && cleanupOwner !== undefined) { diff --git a/test/tangle-workspace-proof.test.mjs b/test/tangle-workspace-proof.test.mjs index 2e34d942..c81d0c5f 100644 --- a/test/tangle-workspace-proof.test.mjs +++ b/test/tangle-workspace-proof.test.mjs @@ -14,8 +14,11 @@ import { proofReceipt, } from '../scripts/live-required/contracts.mjs' import { + checkpointIdForOperation, confidentialNegativeChecks, + cleanupWorkspaceProofResources, parseConfidentialTrustPolicy, + sourceIdentityForRun, } from '../scripts/live-required/tangle-workspace-proof.mjs' const DIGEST = `sha256:${'1'.repeat(64)}` @@ -115,6 +118,119 @@ test('LIVE-10 negative checks reject nonce, measurement, and self-echo mutations }) }) +test('LIVE-09 failure cleanup can recover partial source and checkpoint identities', () => { + const run = { + id: 'run-live-09-partial', + operationId: 'op-live-09-source', + environmentId: 'environment-local-source', + status: 'running', + complete: false, + controlRef: { + provider: 'tangle-sandbox', + environmentId: 'sandbox-source-partial', + sessionId: 'session-live-09-partial', + executionId: 'execution-live-09-partial', + runId: 'run-live-09-partial', + requestDigest: DIGEST, + }, + } + const state = { + runs: [run], + environments: [ + { + id: run.environmentId, + providerEnvironmentId: run.controlRef.environmentId, + }, + ], + checkpoints: [{ id: 'checkpoint-live-09-partial', operationId: 'op-live-09-fork' }], + } + + const recovered = sourceIdentityForRun(state, run.id) + assert.equal(recovered?.run, run) + assert.equal(recovered?.providerId, run.controlRef.environmentId) + assert.equal(checkpointIdForOperation(state, 'op-live-09-fork'), 'checkpoint-live-09-partial') + assert.equal(sourceIdentityForRun(state, 'missing-run'), undefined) + assert.equal( + sourceIdentityForRun( + { + ...state, + environments: [{ ...state.environments[0], providerEnvironmentId: 'wrong-source' }], + }, + run.id, + ), + undefined, + ) +}) + +test('LIVE-09 fault cleanup releases a partial checkpoint and source run', async () => { + const sourceRun = { + id: 'run-live-09-cleanup', + environmentId: 'environment-local-source', + status: 'running', + complete: false, + } + let state = { + runs: [sourceRun], + checkpoints: [{ id: 'checkpoint-live-09-cleanup', operationId: 'op-live-09-fork' }], + } + const events = [] + const cleanupInputs = [] + let sourceExists = true + const app = { + state: () => state, + cancelRun: async (input) => { + events.push('source-cancel') + assert.equal(input.runId, sourceRun.id) + state = { + ...state, + runs: [{ ...sourceRun, status: input.terminalStatus, complete: true }], + } + return { completion: Promise.resolve() } + }, + conversations: { + branches: { + cleanup: async (input) => { + events.push('checkpoint-cleanup') + cleanupInputs.push(input) + return { checkpoint: 'deleted', environment: 'not_requested' } + }, + }, + }, + } + const adapters = { + freshEnvironment: async (environmentId) => { + assert.equal(environmentId, 'sandbox-source') + if (!sourceExists) return null + return { + destroy: async () => { + events.push('source-destroy') + sourceExists = false + }, + } + }, + } + + const result = await cleanupWorkspaceProofResources({ + cleanupOwner: { app }, + adapters, + source: { run: sourceRun, providerId: 'sandbox-source' }, + branchOperationId: 'op-live-09-fork', + proofId: 'live-09-cleanup', + }) + + assert.deepEqual(events, ['checkpoint-cleanup', 'source-cancel', 'source-destroy']) + assert.deepEqual(cleanupInputs, [ + { + operationId: 'op-live-required-live-09-cleanup-cleanup', + checkpointId: 'checkpoint-live-09-cleanup', + }, + ]) + assert.equal(result.cleanupResult?.checkpoint, 'deleted') + assert.equal(result.sourceDestroyed, true) + assert.equal(sourceExists, false) + assert.equal(state.runs[0].status, 'aborted') +}) + test('LIVE-10 policy parsing is typed, bounded, and immutable', () => { const parsed = parseConfidentialTrustPolicy(policyEnvironment()) assert.deepEqual(parsed, { From 4ff1f02aff6abfabeb59fa51015c026596ca950e Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 01:18:29 -0600 Subject: [PATCH 100/136] fix(live): preserve model provider in proof receipts --- scripts/live-required.test.mjs | 11 +++++++++++ scripts/live-required/contracts.mjs | 3 +++ test/tangle-live07-wiring.test.mjs | 2 ++ test/tangle-workspace-proof.test.mjs | 3 ++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index dbf3ed5c..3f87aa6d 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -453,6 +453,7 @@ function validTangleSandboxReceiptInput(overrides = {}) { connectionKind: 'tangle-sandbox', credentialConfigured: true, model: 'glm-5.2', + modelProvider: 'tangle-router', runner: 'pi', }, runIds: ['local-run-1', 'local-run-follow-up', 'local-run-cancelled'], @@ -723,6 +724,7 @@ test('receipts use a fixed schema and bind to one operation and invocation', () connectionKind: 'tangle-sandbox', credentialConfigured: true, model: 'glm-5.2', + modelProvider: 'tangle-router', runner: 'pi', }, runIds: ['run-live-test'], @@ -742,6 +744,7 @@ test('receipts use a fixed schema and bind to one operation and invocation', () checks: ['marker', 'environment-id'], }) assert.equal(receipt.schema, PUBLIC_EVIDENCE_SCHEMA) + assert.equal(receipt.connection.modelProvider, 'tangle-router') assert.deepEqual(Object.keys(receipt).sort(), [ 'checks', 'completedAt', @@ -764,6 +767,14 @@ test('receipts use a fixed schema and bind to one operation and invocation', () ), /outside the public schema/u, ) + assert.throws( + () => + assertProofReceipt({ + ...receipt, + connection: { ...receipt.connection, modelProvider: 42 }, + }), + /modelProvider must be a non-empty string or null/u, + ) assert.throws( () => assertProofReceipt({ ...receipt, invocationId: 'different-invocation' }, { invocationId }), diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index 190e419d..082edde6 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -204,6 +204,7 @@ const PROOF_CONNECTION_KEYS = Object.freeze([ 'connectionKind', 'credentialConfigured', 'model', + 'modelProvider', 'runner', ]) const PROOF_RUN_KEYS = Object.freeze(['ids', 'environmentId', 'materializationDigest']) @@ -819,6 +820,7 @@ export function assertProofReceipt(receipt, { invocationId, operation } = {}) { ) throw new Error('Live proof credentialConfigured must be boolean or null') validNullableString(receipt.connection.model, 'Live proof model') + validNullableString(receipt.connection.modelProvider, 'Live proof modelProvider') validNullableString(receipt.connection.runner, 'Live proof runner') validateObservations(receipt.observations) exactKeys(receipt.run, PROOF_RUN_KEYS, 'Live proof run') @@ -901,6 +903,7 @@ export function proofReceipt({ credentialConfigured: typeof config?.credentialConfigured === 'boolean' ? config.credentialConfigured : null, model: config?.model ?? null, + modelProvider: config?.modelProvider ?? null, runner: config?.runner ?? null, }, run: { diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 89b4311f..6d30cc59 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -78,6 +78,7 @@ function passedStressProof() { connectionKind: 'tangle-sandbox', credentialConfigured: true, model: 'glm-5.2', + modelProvider: 'tangle-router', runner: 'pi', }, runs: { @@ -281,6 +282,7 @@ function passedInteractiveProof( connectionKind: 'tangle-sandbox', credentialConfigured: true, model: 'tangle-router/glm-5.2', + modelProvider: 'tangle-router', runner, }, runIds: ['run-interactive'], diff --git a/test/tangle-workspace-proof.test.mjs b/test/tangle-workspace-proof.test.mjs index c81d0c5f..08f90007 100644 --- a/test/tangle-workspace-proof.test.mjs +++ b/test/tangle-workspace-proof.test.mjs @@ -15,8 +15,8 @@ import { } from '../scripts/live-required/contracts.mjs' import { checkpointIdForOperation, - confidentialNegativeChecks, cleanupWorkspaceProofResources, + confidentialNegativeChecks, parseConfidentialTrustPolicy, sourceIdentityForRun, } from '../scripts/live-required/tangle-workspace-proof.mjs' @@ -300,6 +300,7 @@ test('LIVE-10 passed receipts require external verification and every negative c connectionKind: 'tangle-sandbox', credentialConfigured: true, model: 'glm-5.2', + modelProvider: 'tangle-router', runner: 'opencode', }, runIds: ['run-live-10'], From 64dbfdef991ddeef82d4e79151cc4928ba4c262f Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 01:20:55 -0600 Subject: [PATCH 101/136] style(live): format workspace cleanup --- scripts/live-required/tangle-workspace-proof.mjs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index 7878f0db..d4f37b7d 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -633,10 +633,7 @@ export async function cleanupWorkspaceProofResources({ if (!resolvedSourceDestroyed) { try { const sourceAdapters = adapters ?? providerAdapters(cleanupOwner) - resolvedSourceDestroyed = await destroySource( - sourceAdapters, - source.providerId, - ) + resolvedSourceDestroyed = await destroySource(sourceAdapters, source.providerId) } catch (error) { cleanupError ??= error } From 7e13a4d074001af9a27abfe57c3d38ffdbbc1f45 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 02:00:21 -0600 Subject: [PATCH 102/136] fix(live): wait for retained interactive admission --- .../tangle-sandbox-braid-interactive.mjs | 209 +++++++++++++----- test/tangle-live07-wiring.test.mjs | 77 +++++++ 2 files changed, 233 insertions(+), 53 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 07cefa61..03961dd8 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -1,12 +1,9 @@ import assert from 'node:assert/strict' import { randomUUID } from 'node:crypto' -import { readFile, rm, writeFile } from 'node:fs/promises' +import { readFile, rm, stat, writeFile } from 'node:fs/promises' import { dirname, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' -import { - AgentExactRunControlRefSchema, - AgentInteractiveSessionRefSchema, -} from '@tangle-network/agent-interface' +import { AgentExactRunControlRefSchema } from '@tangle-network/agent-interface' import { Sandbox } from '@tangle-network/sandbox' import xterm from '@xterm/headless' import * as pty from 'node-pty' @@ -44,9 +41,7 @@ import { assertSingleExecutionAttemptLedger, assertStableAccountIdentity, assertVerifiedProcessCleanup, - cleanupOwnedRetainedResources, executionAttemptLedgerPath, - observeRetainedResource, providerWorkspaceReadbackEvidence, publicAccountIdentityEvidence, readRetainedWorkspaceFile, @@ -314,8 +309,8 @@ function stateDiagnostic(frame) { return runs.map((run) => ({ id: typeof run?.id === 'string' ? run.id : null, status: typeof run?.status === 'string' ? run.status : null, - retainedAdmission: - typeof run?.retainedAdmission?.phase === 'string' ? run.retainedAdmission.phase : null, + retainedAdmission: interactiveAdmissionPhase(frame, run?.id), + controlRef: AgentExactRunControlRefSchema.safeParse(run?.controlRef).success, })) } @@ -323,9 +318,8 @@ export function interactiveMaterializationEvidence(record) { const runs = Array.isArray(record?.state?.runs) ? record.state.runs : [] if (runs.length !== 1) return undefined const run = runs[0] - const phase = - typeof run?.retainedAdmission?.phase === 'string' ? run.retainedAdmission.phase : null const runId = typeof run?.id === 'string' && run.id.length > 0 ? run.id : undefined + const phase = interactiveAdmissionPhase(record, runId) const materialized = phase === 'interactive_environment' || phase === 'interactive_started' || @@ -394,6 +388,37 @@ async function listAllSandboxResources(client) { } } +async function observeInteractiveResource(client, controlRef, runId) { + const expectedName = interactiveResourceName(runId) + const box = await client.get(controlRef.environmentId) + if (box === null) { + throw new Error(`Interactive Sandbox ${controlRef.environmentId} was not visible`) + } + if (!isOwnedInteractiveResource(box, expectedName)) { + throw new Error( + `Interactive Sandbox ${controlRef.environmentId} failed exact Braid ownership validation`, + ) + } + const matches = sameNameInteractiveResources( + await listAllSandboxResources(client), + expectedName, + (resource) => isOwnedInteractiveResource(resource, expectedName), + ) + if (matches.length !== 1 || matches[0]?.id !== box.id) { + throw new Error('Interactive Sandbox control identity did not match its owned resource census') + } + return { + observed: true, + id: box.id, + name: expectedName, + metadata: { + owner: 'braid', + lifecycle: 'retained', + surface: 'interactive-agent', + }, + } +} + async function cleanupInteractiveByRunId(client, materialization) { const runId = materialization?.runId const expectedName = interactiveResourceName(runId) @@ -559,14 +584,19 @@ function createPty(binary, config, statePath, exitTimeoutMs) { } async function captureStateFrame(runtime, recordPath, timeoutMs) { - await rm(`${recordPath}.frame`, { force: true }) + const framePath = `${recordPath}.frame` + const previousVersion = await stateFrameVersion(framePath) process.kill(runtime.child.pid, 'SIGUSR2') return waitFor( 'atomic Braid interactive state frame', async () => { try { - return JSON.parse(await readFile(`${recordPath}.frame`, 'utf8')) - } catch { + const version = await stateFrameVersion(framePath) + if (version === undefined || version === previousVersion) return undefined + const frame = JSON.parse(await readFile(framePath, 'utf8')) + return (await stateFrameVersion(framePath)) === version ? frame : undefined + } catch (error) { + if (error?.code !== 'ENOENT' && !(error instanceof SyntaxError)) throw error return undefined } }, @@ -574,6 +604,16 @@ async function captureStateFrame(runtime, recordPath, timeoutMs) { ) } +async function stateFrameVersion(path) { + try { + const value = await stat(path, { bigint: true }) + return `${value.dev}:${value.ino}:${value.mtimeNs}:${value.size}` + } catch (error) { + if (error?.code === 'ENOENT') return undefined + throw error + } +} + async function proveTuiReturned(runtime, timeoutMs, label) { const before = runtime.output.length runtime.write('/help\r') @@ -592,7 +632,9 @@ function eventKind(event) { } function eventRunId(event) { - return event?.runId ?? event?.event?.runId + return ( + event?.runId ?? event?.event?.runId ?? event?.payload?.runId ?? event?.payload?.value?.runId + ) } function assertOrderedRunEvents(events, runId, required) { @@ -624,37 +666,59 @@ function assertControlRefsEqual(expected, actual, label) { return actualRef } -function interactiveAdmissionIdentity(run) { - const admission = run?.retainedAdmission +function projectedRetainedAdmission(event) { + if (eventKind(event) !== 'run.retained.admitted') return undefined + const value = event?.payload?.value ?? event?.event ?? event + const admission = value?.admission ?? event?.payload?.admission + return admission && typeof admission === 'object' ? admission : undefined +} + +function interactiveAdmissions(record, runId) { + const events = Array.isArray(record?.events) ? record.events : [] + return events.flatMap((event) => { + const admission = projectedRetainedAdmission(event) + if (admission === undefined) return [] + const admittedRunId = eventRunId(event) + return admittedRunId === undefined || admittedRunId === runId ? [admission] : [] + }) +} + +function interactiveAdmissionPhase(record, runId) { + if (typeof runId !== 'string' || runId.length === 0) return null + const projected = interactiveAdmissions(record, runId).at(-1)?.phase + if (typeof projected === 'string') return projected + const run = Array.isArray(record?.state?.runs) + ? record.state.runs.find((candidate) => candidate?.id === runId) + : undefined + return typeof run?.retainedAdmission?.phase === 'string' ? run.retainedAdmission.phase : null +} + +function interactiveAdmissionIdentity(record, run) { + const admission = interactiveAdmissions(record, run?.id).findLast( + (candidate) => candidate?.phase === 'interactive_started', + ) assert.equal( admission?.phase, 'interactive_started', 'interactive proof requires the canonical interactive_started admission phase', ) - assert.equal( - typeof admission?.interactiveIdempotencyKey, - 'string', - 'interactive_started admission omitted interactiveIdempotencyKey', - ) - assert.ok( - admission.interactiveIdempotencyKey.length > 0, - 'interactive_started admission has an empty interactiveIdempotencyKey', + const startedControlRef = exactControlRef( + admission.ref?.run, + 'interactive_started admission control reference', ) - const parsedRef = AgentInteractiveSessionRefSchema.safeParse(admission.ref) - assert.ok(parsedRef.success, 'interactive_started admission ref is invalid') const controlRef = assertControlRefsEqual( run.controlRef, - parsedRef.data.run, + startedControlRef, 'interactive admission control reference', ) if (run.providerSessionId !== undefined) { assert.equal( - parsedRef.data.run.sessionId, + startedControlRef.sessionId, run.providerSessionId, 'interactive admission session differs from the stored provider session', ) } - return { admission, ref: parsedRef.data, controlRef } + return { admission, ref: { run: startedControlRef }, controlRef } } export function recoverInteractiveIdentity(record) { @@ -663,7 +727,7 @@ export function recoverInteractiveIdentity(record) { return undefined const run = runs[0] try { - const { admission, ref, controlRef } = interactiveAdmissionIdentity(run) + const { admission, ref, controlRef } = interactiveAdmissionIdentity(record, run) return { run, admission, @@ -676,11 +740,33 @@ export function recoverInteractiveIdentity(record) { } } +export async function waitForInteractiveIdentityFrame({ captureFrame, timeoutMs }) { + assert.equal( + typeof captureFrame, + 'function', + 'interactive identity polling requires captureFrame', + ) + assert.ok( + Number.isFinite(timeoutMs) && timeoutMs > 0, + 'interactive identity timeout must be positive', + ) + const deadline = performance.now() + timeoutMs + for (;;) { + const frame = await captureFrame() + const identity = recoverInteractiveIdentity(frame) + if (identity !== undefined) return { frame, identity } + if (performance.now() >= deadline) { + throw new Error(`retained interactive identity timed out after ${timeoutMs}ms`) + } + await sleep(50) + } +} + export function assertInteractiveRecord(record) { const runs = Array.isArray(record?.state?.runs) ? record.state.runs : [] assert.equal(runs.length, 1, 'interactive proof must retain exactly one local run') const run = runs[0] - const { controlRef } = interactiveAdmissionIdentity(run) + const { controlRef } = interactiveAdmissionIdentity(record, run) assert.equal(controlRef.provider, 'tangle-sandbox') const events = Array.isArray(record?.events) ? record.events : [] const kinds = events.map(eventKind) @@ -706,8 +792,15 @@ export function assertStoppedTerminal(terminal) { return { terminal, stopped: true } } -async function observeSandbox(client, controlRef, timeoutMs, expectedRunning, expectedGeometry) { - const resource = await observeRetainedResource(client, controlRef) +async function observeSandbox( + client, + controlRef, + runId, + timeoutMs, + expectedRunning, + expectedGeometry, +) { + const resource = await observeInteractiveResource(client, controlRef, runId) const box = await client.get(controlRef.environmentId) assert.equal(box?.id, resource.id, 'Sandbox observation changed environment identity') assert.ok(box.terminals && typeof box.terminals.get === 'function') @@ -766,11 +859,10 @@ async function observeSandbox(client, controlRef, timeoutMs, expectedRunning, ex } async function cleanupExactSandbox(client, identity) { - const observed = await observeRetainedResource(client, identity.controlRef) - const cleanup = await cleanupOwnedRetainedResources(client, { - controlRef: identity.controlRef, - firstRunId: identity.run.id, - operationId: identity.run.operationId ?? identity.admission?.interactiveIdempotencyKey, + const observed = await observeInteractiveResource(client, identity.controlRef, identity.run.id) + const cleanup = await cleanupInteractiveByRunId(client, { + runId: identity.run.id, + phase: 'interactive_started', }) return assertInteractiveOwnedResourceCleanup(cleanup, observed.id) } @@ -840,8 +932,8 @@ export async function finalizeInteractiveProof({ stopResult, stop = ({ binary, targetConfig, runId, timeout }) => stopThroughBraid(binary, targetConfig, runId, timeout), - observe = (targetClient, controlRef, timeout) => - observeSandbox(targetClient, controlRef, timeout, false), + observe = (targetClient, controlRef, runId, timeout) => + observeSandbox(targetClient, controlRef, runId, timeout, false), cleanupSandbox = cleanupExactSandbox, } = {}) { const errors = [] @@ -945,7 +1037,7 @@ export async function finalizeInteractiveProof({ ) } else { const observed = await attemptCleanup(errors, 'stopped Sandbox observation', () => - observe(client, resolvedIdentity.controlRef, timeoutMs), + observe(client, resolvedIdentity.controlRef, resolvedIdentity.run.id, timeoutMs), ) if (observed.ok) { afterStop = observed.value @@ -1160,13 +1252,16 @@ async function runProof({ }, timeoutMs, ) - const initialFrame = await captureStateFrame(runtime, recordPath, timeoutMs) + const { frame: initialFrame, identity: initialIdentity } = + await waitForInteractiveIdentityFrame({ + captureFrame: () => captureStateFrame(runtime, recordPath, timeoutMs), + timeoutMs, + }) runObserved = stateDiagnostic(initialFrame).length > 0 - const initialIdentity = recoverInteractiveIdentity(initialFrame) - assert.ok(initialIdentity, 'interactive frame did not contain one exact Braid run identity') const initialAttach = await observeSandbox( client, initialIdentity.controlRef, + initialIdentity.run.id, timeoutMs, true, { cols: 120, rows: 36 }, @@ -1186,10 +1281,14 @@ async function runProof({ runtime.write(`${attach}\r`) await sleep(250) runtime.resize(100, 30) - const resized = await observeSandbox(client, initialIdentity.controlRef, timeoutMs, true, { - cols: 100, - rows: 30, - }) + const resized = await observeSandbox( + client, + initialIdentity.controlRef, + initialIdentity.run.id, + timeoutMs, + true, + { cols: 100, rows: 30 }, + ) const reconnectedFrame = await captureStateFrame(runtime, recordPath, timeoutMs) const reconnectedIdentity = recoverInteractiveIdentity(reconnectedFrame) assert.ok(reconnectedIdentity, 'reconnected frame did not contain one exact Braid run identity') @@ -1244,10 +1343,14 @@ async function runProof({ initialIdentity.controlRef[field] === reconnectedIdentity.controlRef[field] && initialIdentity.controlRef[field] === identity.controlRef[field], ) - const beforeStop = await observeSandbox(client, identity.controlRef, timeoutMs, true, { - cols: 100, - rows: 30, - }) + const beforeStop = await observeSandbox( + client, + identity.controlRef, + identity.run.id, + timeoutMs, + true, + { cols: 100, rows: 30 }, + ) const stop = await stopThroughBraid(packed.binary, config, identity.run.id, timeoutMs) stopped = true proofData = { diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 6d30cc59..3d8cb748 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -19,6 +19,7 @@ import { interactiveFailureMessages, interactiveMaterializationEvidence, sandboxConfiguration as interactiveSandboxConfiguration, + waitForInteractiveIdentityFrame, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' import { sandboxConfiguration as multirunSandboxConfiguration } from '../scripts/live-required/tangle-sandbox-braid-multirun.mjs' import { @@ -498,6 +499,82 @@ test('LIVE-08 rejects a non-Pi runner from the native interactive proof', () => ) }) +test('LIVE-08 waits past streamed output until retained admission is durable', async () => { + const controlRef = { + provider: 'tangle-sandbox', + environmentId: 'environment-live-08-admission', + sessionId: 'session-live-08-admission', + executionId: 'execution-live-08-admission', + runId: 'provider-run-live-08-admission', + requestDigest: `sha256:${'a'.repeat(64)}`, + } + const incomplete = { + state: { + runs: [{ id: 'local-run-live-08-admission', status: 'streaming', retainedAdmission: null }], + }, + } + const admitted = { + state: { + runs: [ + { + id: 'local-run-live-08-admission', + status: 'streaming', + controlRef, + providerSessionId: controlRef.sessionId, + }, + ], + }, + events: [ + { + kind: 'run.retained.admitted', + payload: { + runId: 'local-run-live-08-admission', + value: { + kind: 'run.retained.admitted', + runId: 'local-run-live-08-admission', + admission: { phase: 'interactive_intent' }, + }, + }, + }, + { + kind: 'run.retained.admitted', + payload: { + runId: 'local-run-live-08-admission', + value: { + kind: 'run.retained.admitted', + runId: 'local-run-live-08-admission', + admission: { phase: 'interactive_environment' }, + }, + }, + }, + { + kind: 'run.retained.admitted', + payload: { + runId: 'local-run-live-08-admission', + value: { + kind: 'run.retained.admitted', + runId: 'local-run-live-08-admission', + admission: { phase: 'interactive_started', ref: { run: controlRef } }, + }, + }, + }, + ], + } + const frames = [incomplete, admitted] + let captures = 0 + const result = await waitForInteractiveIdentityFrame({ + captureFrame: async () => { + captures += 1 + return frames.shift() + }, + timeoutMs: 1_000, + }) + assert.equal(captures, 2) + assert.equal(result.frame, admitted) + assert.equal(result.identity.run.id, 'local-run-live-08-admission') + assert.deepEqual(result.identity.controlRef, controlRef) +}) + test('LIVE-08 rejects status-only observations from a passed receipt', () => { assert.throws( () => From 440fa3e80d0d4e1bf65b0b792dff37245d3316f4 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 02:36:32 -0600 Subject: [PATCH 103/136] fix(live): recover interactive identity from public events --- .../tangle-sandbox-braid-interactive.mjs | 32 ++-- test/tangle-live07-wiring.test.mjs | 179 +++++++----------- 2 files changed, 90 insertions(+), 121 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 03961dd8..305959af 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -628,13 +628,11 @@ async function proveTuiReturned(runtime, timeoutMs, label) { } function eventKind(event) { - return event?.kind ?? event?.event?.kind ?? event?.type + return event?.kind } function eventRunId(event) { - return ( - event?.runId ?? event?.event?.runId ?? event?.payload?.runId ?? event?.payload?.value?.runId - ) + return event?.payload?.runId } function assertOrderedRunEvents(events, runId, required) { @@ -642,9 +640,7 @@ function assertOrderedRunEvents(events, runId, required) { for (const kind of required) { const found = events.findIndex( (event, index) => - index >= nextIndex && - eventKind(event) === kind && - (eventRunId(event) === undefined || eventRunId(event) === runId), + index >= nextIndex && eventKind(event) === kind && eventRunId(event) === runId, ) assert.ok(found >= nextIndex, `interactive record omitted ordered ${kind}`) nextIndex = found + 1 @@ -668,8 +664,18 @@ function assertControlRefsEqual(expected, actual, label) { function projectedRetainedAdmission(event) { if (eventKind(event) !== 'run.retained.admitted') return undefined - const value = event?.payload?.value ?? event?.event ?? event - const admission = value?.admission ?? event?.payload?.admission + const value = event?.payload?.value + if ( + value === null || + typeof value !== 'object' || + Array.isArray(value) || + value.kind !== 'run.retained.admitted' || + typeof value.runId !== 'string' || + value.runId.length === 0 || + event?.payload?.runId !== value.runId + ) + return undefined + const admission = value.admission return admission && typeof admission === 'object' ? admission : undefined } @@ -679,18 +685,14 @@ function interactiveAdmissions(record, runId) { const admission = projectedRetainedAdmission(event) if (admission === undefined) return [] const admittedRunId = eventRunId(event) - return admittedRunId === undefined || admittedRunId === runId ? [admission] : [] + return admittedRunId === runId ? [admission] : [] }) } function interactiveAdmissionPhase(record, runId) { if (typeof runId !== 'string' || runId.length === 0) return null const projected = interactiveAdmissions(record, runId).at(-1)?.phase - if (typeof projected === 'string') return projected - const run = Array.isArray(record?.state?.runs) - ? record.state.runs.find((candidate) => candidate?.id === runId) - : undefined - return typeof run?.retainedAdmission?.phase === 'string' ? run.retainedAdmission.phase : null + return typeof projected === 'string' ? projected : null } function interactiveAdmissionIdentity(record, run) { diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 3d8cb748..3da7c4c4 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -1,6 +1,7 @@ import assert from 'node:assert/strict' import { resolve } from 'node:path' import test from 'node:test' +import { toEvent } from '../dist/adapters/tui/ui-projection.js' import { PROOF_OPERATIONS, proofReceipt } from '../scripts/live-required/contracts.mjs' import { prepareProductionWorkspace } from '../scripts/live-required/headless.mjs' import { @@ -12,7 +13,6 @@ import { supervisorProfile } from '../scripts/live-required/supervisor.mjs' import { runSandbox, runTangleFlows } from '../scripts/live-required/tangle.mjs' import { sandboxEnvironment } from '../scripts/live-required/tangle-sandbox-braid-execution-soak.mjs' import { - assertInteractiveOwnedResourceCleanup, assertInteractiveTelemetry, assertProviderBoundEvidence, finalizeInteractiveProof, @@ -22,11 +22,7 @@ import { waitForInteractiveIdentityFrame, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' import { sandboxConfiguration as multirunSandboxConfiguration } from '../scripts/live-required/tangle-sandbox-braid-multirun.mjs' -import { - assertSingleExecutionAttemptLedger, - cleanupOwnedRetainedResources, - cleanupRetainedResourceByRunId, -} from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' +import { assertSingleExecutionAttemptLedger } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' import { backendConfiguration as workerBackendConfiguration } from '../scripts/live-required/tangle-sandbox-worker.mjs' import { sandboxConfiguration as workspaceSandboxConfiguration } from '../scripts/live-required/tangle-workspace-proof.mjs' @@ -510,7 +506,7 @@ test('LIVE-08 waits past streamed output until retained admission is durable', a } const incomplete = { state: { - runs: [{ id: 'local-run-live-08-admission', status: 'streaming', retainedAdmission: null }], + runs: [{ id: 'local-run-live-08-admission', status: 'streaming' }], }, } const admitted = { @@ -525,39 +521,33 @@ test('LIVE-08 waits past streamed output until retained admission is durable', a ], }, events: [ - { - kind: 'run.retained.admitted', - payload: { + toEvent({ + sequence: 1, + revision: 1, + event: { + kind: 'run.retained.admitted', runId: 'local-run-live-08-admission', - value: { - kind: 'run.retained.admitted', - runId: 'local-run-live-08-admission', - admission: { phase: 'interactive_intent' }, - }, + admission: { phase: 'interactive_intent' }, }, - }, - { - kind: 'run.retained.admitted', - payload: { + }), + toEvent({ + sequence: 2, + revision: 2, + event: { + kind: 'run.retained.admitted', runId: 'local-run-live-08-admission', - value: { - kind: 'run.retained.admitted', - runId: 'local-run-live-08-admission', - admission: { phase: 'interactive_environment' }, - }, + admission: { phase: 'interactive_environment' }, }, - }, - { - kind: 'run.retained.admitted', - payload: { + }), + toEvent({ + sequence: 3, + revision: 3, + event: { + kind: 'run.retained.admitted', runId: 'local-run-live-08-admission', - value: { - kind: 'run.retained.admitted', - runId: 'local-run-live-08-admission', - admission: { phase: 'interactive_started', ref: { run: controlRef } }, - }, + admission: { phase: 'interactive_started', ref: { run: controlRef } }, }, - }, + }), ], } const frames = [incomplete, admitted] @@ -620,38 +610,6 @@ test('LIVE-07 and LIVE-08 reject duplicate provider execution attempts', () => { ) }) -test('LIVE-08 cleanup census finds and reports duplicate owned resources', async () => { - const controlRef = { sessionId: 'session-duplicate', environmentId: 'sandbox-primary' } - const boxes = ['sandbox-primary', 'sandbox-duplicate'].map((id) => ({ - id, - name: 'braid-session-duplicate', - metadata: { - owner: 'braid', - lifecycle: 'retained', - providerSessionId: 'session-duplicate', - }, - deleted: false, - async delete() { - this.deleted = true - }, - })) - const client = { - async list() { - return boxes.filter((box) => !box.deleted) - }, - async get(id) { - return boxes.find((box) => box.id === id && !box.deleted) ?? null - }, - } - const cleanup = await cleanupOwnedRetainedResources(client, { controlRef }) - assert.equal(cleanup.confirmed, true) - assert.equal(cleanup.matchedCount, 2) - assert.throws( - () => assertInteractiveOwnedResourceCleanup(cleanup, controlRef.environmentId), - /expected one/u, - ) -}) - test('LIVE-08 reports sanitized nested proof and cleanup failures', () => { const secret = 'live-interactive-secret' const failure = new AggregateError( @@ -703,10 +661,20 @@ test('LIVE-08 confirms Sandbox absence for a provider rejection before interacti { id: 'run-pre-environment', status: 'streaming', - retainedAdmission: { phase: 'interactive_intent' }, }, ], }, + events: [ + toEvent({ + sequence: 1, + revision: 1, + event: { + kind: 'run.retained.admitted', + runId: 'run-pre-environment', + admission: { phase: 'interactive_intent' }, + }, + }), + ], }) assert.deepEqual(materialization, { runId: 'run-pre-environment', @@ -754,6 +722,44 @@ test('LIVE-08 confirms Sandbox absence for a provider rejection before interacti assert.equal(packedCleanup, 1) }) +test('LIVE-08 ignores internal retained admission state absent from projected events', () => { + const state = { + state: { + runs: [ + { + id: 'run-hidden-admission', + status: 'streaming', + retainedAdmission: { phase: 'interactive_intent' }, + }, + ], + }, + } + assert.deepEqual(interactiveMaterializationEvidence(state), { + runId: 'run-hidden-admission', + phase: null, + materialized: false, + boundary: 'unknown', + }) + assert.deepEqual( + interactiveMaterializationEvidence({ + state: state.state, + events: [ + { + kind: 'run.retained.admitted', + runId: 'run-hidden-admission', + admission: { phase: 'interactive_intent' }, + }, + ], + }), + { + runId: 'run-hidden-admission', + phase: null, + materialized: false, + boundary: 'unknown', + }, + ) +}) + test('LIVE-08 deletes and confirms one exact resource when the Runtime phase is unavailable', async () => { const resource = { id: 'sandbox-pre-environment', @@ -1062,42 +1068,3 @@ test('LIVE-08 refuses cloud cleanup when a run existed without exact identity', }, ) }) - -test('fail-safe cleanup derives one exact Braid resource from the first local run ID', async () => { - const firstRunId = 'local/run-1' - const box = { - id: 'environment-fallback', - name: 'braid-session-braid-local-run-1', - metadata: { - owner: 'braid', - lifecycle: 'retained', - providerSessionId: 'session-braid-local-run-1', - }, - deleted: false, - async delete() { - this.deleted = true - }, - } - const other = { - id: 'environment-other', - name: box.name, - metadata: { - owner: 'other', - lifecycle: 'retained', - providerSessionId: box.metadata.providerSessionId, - }, - } - const client = { - async list() { - return [other, box] - }, - async get(id) { - return id === box.id && !box.deleted ? box : null - }, - } - - const cleanup = await cleanupRetainedResourceByRunId(client, firstRunId) - assert.equal(cleanup.confirmed, true) - assert.equal(cleanup.id, box.id) - assert.equal(box.deleted, true) -}) From f9fe5e491de5aa5327d7402887dbd6ac9157d4c4 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 02:48:01 -0600 Subject: [PATCH 104/136] fix(rpc): acknowledge shutdown after lifecycle close --- src/views/headless/rpc.ts | 4 +- test/rpc.test.ts | 91 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/src/views/headless/rpc.ts b/src/views/headless/rpc.ts index ad45a7d4..a4028868 100644 --- a/src/views/headless/rpc.ts +++ b/src/views/headless/rpc.ts @@ -381,6 +381,8 @@ export async function runRpc( await respond(errorResponse(result, request.requestId)) break } + if (result.completion) await result.completion + await closeApplication() await respond({ version: BRAID_PROTOCOL_VERSION, type: 'ack', @@ -389,8 +391,6 @@ export async function runRpc( operationId: request.operationId, command: request.command, }) - if (result.completion) await result.completion - await closeApplication() await outputQueue.flush() if (outputFailure !== undefined) throw outputFailure return 0 diff --git a/test/rpc.test.ts b/test/rpc.test.ts index ab72bf43..2d5e0d12 100644 --- a/test/rpc.test.ts +++ b/test/rpc.test.ts @@ -13,6 +13,7 @@ import { type ExecutionPort, UNKNOWN_RUN_CAPABILITIES, } from '../src/ports/execution.js' +import type { BraidUiController } from '../src/views/shared/intents.js' import type { BraidResponse } from '../src/views/headless/protocol.js' import { MAX_RPC_LINE_BYTES } from '../src/views/headless/protocol-limits.js' import { RPC_REPLAY_MAX_BYTES, RPC_REPLAY_MAX_ENTRIES, runRpc } from '../src/views/headless/rpc.js' @@ -145,6 +146,96 @@ test('JSONL send acknowledges before events and returns final semantic state', a assert.equal(typeof finalState.state.runs[0]?.usdKnown, 'boolean') }) +test('JSONL shutdown acknowledges only after application completion and close', async () => { + const app = createBraidApplication({ fixture: 'deterministic' }) + const realController = controllerFor(app) + const completion = deferred() + const closeCompletion = deferred() + const shutdownDispatched = deferred() + const order: string[] = [] + const responses: BraidResponse[] = [] + const controller: BraidUiController = { + view: () => realController.view(), + state: () => realController.state(), + events: () => realController.events(), + subscribe: (subscriber, options) => realController.subscribe(subscriber, options), + initialize: (workspace) => realController.initialize(workspace), + waitForIdle: () => realController.waitForIdle(), + dispatch: async (intent) => { + const result = await realController.dispatch(intent) + if (intent.type !== 'shutdown' || result.kind !== 'accepted') return result + order.push('shutdown-dispatched') + shutdownDispatched.resolve() + const realCompletion = result.completion ?? Promise.resolve() + return { + ...result, + completion: Promise.all([realCompletion, completion.promise]).then(() => undefined), + } + }, + close: async () => { + order.push('close-start') + const realClose = realController.close() + await closeCompletion.promise + await realClose + order.push('close-finish') + }, + } + + const running = runRpc( + controller, + requestInput([ + { + version: 1, + requestId: 'req-order-init', + command: 'initialize', + params: { workspace: '/workspace' }, + }, + { + version: 1, + requestId: 'req-order-shutdown', + operationId: 'op-order-shutdown', + command: 'shutdown', + }, + ]), + { + write: (chunk) => { + const response = JSON.parse(chunk) as BraidResponse + responses.push(response) + if (response.type === 'ack' && response.requestId === 'req-order-shutdown') + order.push('shutdown-ack') + return true + }, + }, + ) + + await shutdownDispatched.promise + assert.equal( + responses.some( + (response) => response.type === 'ack' && response.requestId === 'req-order-shutdown', + ), + false, + ) + order.push('completion-finish') + completion.resolve() + await new Promise((resolve) => setImmediate(resolve)) + assert.equal(order.includes('close-start'), true) + assert.equal( + responses.some( + (response) => response.type === 'ack' && response.requestId === 'req-order-shutdown', + ), + false, + ) + closeCompletion.resolve() + assert.equal(await running, 0) + assert.deepEqual(order, [ + 'shutdown-dispatched', + 'completion-finish', + 'close-start', + 'close-finish', + 'shutdown-ack', + ]) +}) + test('JSONL drives the complete canonical conversation lifecycle', async () => { const app = createBraidApplication({ fixture: 'deterministic' }) const responses: BraidResponse[] = [] From bd2deff58c5f84c74e491d839c81b37f80ed4757 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:03:04 -0600 Subject: [PATCH 105/136] fix(runtime): stop after terminal stream events --- src/app/run-execution.ts | 2 ++ test/application.test.ts | 41 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/app/run-execution.ts b/src/app/run-execution.ts index f96f41df..bfa71aa0 100644 --- a/src/app/run-execution.ts +++ b/src/app/run-execution.ts @@ -58,6 +58,7 @@ export async function executeRun( if (result.accepted && runtimeEvent.event.type === 'final') { terminalSeen = true await context.flush() + break } continue } @@ -76,6 +77,7 @@ export async function executeRun( if (result.accepted && runtimeEvent.type === 'final') { terminalSeen = true await context.flush() + break } } if (context.ledger.isDetached(admission.runId)) return diff --git a/test/application.test.ts b/test/application.test.ts index 862dae2d..14affb96 100644 --- a/test/application.test.ts +++ b/test/application.test.ts @@ -1527,6 +1527,47 @@ test('events after the first final result are ignored', async () => { assert.equal(app.events().filter((entry) => entry.event.kind === 'run.text.delta').length, 0) }) +test('a terminal final result does not pull from a pending execution iterator', async () => { + const tailRequested = deferred() + const releaseTail = deferred() + const app = createBraidApplication({ + fixture: 'deterministic', + execution: { + async *streamTurn(): AsyncIterable { + yield { + type: 'final', + status: 'failed', + reason: 'failed final pending stream', + text: '', + metadata: { tokenUsage: { input: 1, output: 0 } }, + task: { id: 'task-pending-final', intent: 'pending final stream' }, + timestamp: '2026-08-30T00:00:00.000Z', + } + tailRequested.resolve() + await releaseTail.promise + }, + }, + }) + + try { + app.initialize('/workspace') + const completion = app.send({ + operationId: 'op-pending-final', + text: 'failed final', + }).completion + const outcome = await Promise.race([ + completion.then((state) => ({ kind: 'completed' as const, state })), + tailRequested.promise.then(() => ({ kind: 'tail-requested' as const })), + ]) + + assert.equal(outcome.kind, 'completed') + if (outcome.kind === 'completed') assert.equal(outcome.state.runs[0]?.status, 'failed') + } finally { + releaseTail.resolve() + await app.close() + } +}) + test('provider errors and profile values are redacted before state and journal commit', async () => { let providerSawRawProfile = false const execution: ExecutionPort = { From c3f56f1a12cb4a10f4abe7aea5336e4883b15a96 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:07:04 -0600 Subject: [PATCH 106/136] fix(live): use native shell for interactive proof --- .../tangle-sandbox-braid-interactive.mjs | 18 +++++++++---- test/tangle-live07-wiring.test.mjs | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 305959af..40fd298d 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -155,16 +155,24 @@ export function interactiveProofCommandSequence(markers) { const attempt = markers.executionAttempt ?? `ATTEMPT_${proofId.replaceAll(/[^A-Za-z0-9]/gu, '_')}` return [ `/interactive Use a shell command with append redirection (>>) in the current Tangle Sandbox workspace to write exactly ${attempt} followed by a newline to ${attemptPath}; never overwrite this file. Then reply with exactly the uppercase version of ${markers.outputSeed}.`, - `Use a shell command in the current Tangle Sandbox workspace to write exactly ${input} followed by a newline to ${inputPath}. Read it back and reply with exactly ${input}.`, + interactiveShellMutationCommand(input, inputPath), DETACH, '/help', '/attach', - `Use a shell command in the current Tangle Sandbox workspace to write exactly ${reconnect} followed by a newline to ${reconnectPath}. Read it back and reply with exactly ${reconnect}.`, + interactiveShellMutationCommand(reconnect, reconnectPath), DETACH, '/help', ] } +function shellLiteral(value) { + return `'${String(value).replaceAll("'", "'\"'\"'")}'` +} + +function interactiveShellMutationCommand(value, path) { + return `!!printf '%s\\n' ${shellLiteral(value)} >> ${shellLiteral(path)}` +} + function occurrences(value, marker) { if (!marker) return 0 let count = 0 @@ -1238,7 +1246,7 @@ async function runProof({ markers.reconnectPath = `.braid-live/${markers.proofId}/native-reconnect.txt` markers.attemptPath = executionAttemptLedgerPath(markers.proofId) - const [interactiveCommand, inputPrompt, detach, , attach, reconnectPrompt] = + const [interactiveCommand, inputCommand, detach, , attach, reconnectCommand] = interactiveProofCommandSequence(markers) const promptCount = occurrences(runtime.output, markers.output) runtime.write(`${interactiveCommand}\r`) @@ -1268,7 +1276,7 @@ async function runProof({ true, { cols: 120, rows: 36 }, ) - runtime.write(`${inputPrompt}\r`) + runtime.write(`${inputCommand}\r`) const inputEvidence = await waitForProviderReadback( client, initialIdentity.controlRef, @@ -1304,7 +1312,7 @@ async function runProof({ reconnectedIdentity.controlRef, 'native reconnect provider control reference', ) - runtime.write(`${reconnectPrompt}\r`) + runtime.write(`${reconnectCommand}\r`) const reconnectEvidence = await waitForProviderReadback( client, initialIdentity.controlRef, diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 3da7c4c4..a4f6d2d7 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -18,6 +18,7 @@ import { finalizeInteractiveProof, interactiveFailureMessages, interactiveMaterializationEvidence, + interactiveProofCommandSequence, sandboxConfiguration as interactiveSandboxConfiguration, waitForInteractiveIdentityFrame, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' @@ -495,6 +496,30 @@ test('LIVE-08 rejects a non-Pi runner from the native interactive proof', () => ) }) +test('LIVE-08 uses Pi native shell input for non-model workspace mutations', () => { + const commands = interactiveProofCommandSequence({ + proofId: 'proof-quote', + outputSeed: 'output-seed', + input: 'INPUT_VALUE', + reconnect: 'RECONNECT_VALUE', + inputPath: '.braid-live/proof-quote/input file.txt', + reconnectPath: ".braid-live/proof-quote/reconnect's file.txt", + attemptPath: '.braid-live/proof-quote/attempts/one.txt', + executionAttempt: 'ATTEMPT_VALUE', + }) + + assert.match(commands[0], /\/interactive/iu) + assert.equal( + commands[1], + "!!printf '%s\\n' 'INPUT_VALUE' >> '.braid-live/proof-quote/input file.txt'", + ) + assert.equal( + commands[5], + `!!printf '%s\\n' 'RECONNECT_VALUE' >> '.braid-live/proof-quote/reconnect'"'"'s file.txt'`, + ) + assert.equal(commands.filter((command) => command.startsWith('!!')).length, 2) +}) + test('LIVE-08 waits past streamed output until retained admission is durable', async () => { const controlRef = { provider: 'tangle-sandbox', From 3853103593f5a46b70cdd2a99fd04b60ecd8f4c0 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:26:23 -0600 Subject: [PATCH 107/136] fix(live): wait for interactive terminal stability --- .../tangle-sandbox-braid-interactive.mjs | 40 +++++++++++++++++++ test/tangle-live07-wiring.test.mjs | 25 ++++++++++++ 2 files changed, 65 insertions(+) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 40fd298d..f2c19da5 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -56,6 +56,8 @@ const repository = resolve(dirname(scriptPath), '../..') const DEFAULT_TIMEOUT_MS = 180_000 const DEFAULT_IDLE_TTL_SECONDS = 1_800 const DEFAULT_PROCESS_EXIT_TIMEOUT_MS = 10_000 +const DEFAULT_TERMINAL_QUIET_MS = 250 +const DEFAULT_TERMINAL_POLL_MS = 25 const SANDBOX_LIST_PAGE_SIZE = 100 const DETACH = '\u001d' const RUN_STATUS_AFTER_STOP = new Set(['aborted', 'cancelled']) @@ -502,6 +504,40 @@ async function waitFor(label, predicate, timeoutMs) { } } +export async function waitForTerminalOutputStability({ + readOutputSize, + timeoutMs, + quietMs = DEFAULT_TERMINAL_QUIET_MS, + pollMs = DEFAULT_TERMINAL_POLL_MS, + now = () => performance.now(), + pause = sleep, +}) { + assert.equal(typeof readOutputSize, 'function', 'terminal output reader must be a function') + assert.ok( + Number.isFinite(timeoutMs) && timeoutMs > 0, + 'terminal stability timeout must be positive', + ) + assert.ok(Number.isFinite(quietMs) && quietMs > 0, 'terminal quiet interval must be positive') + assert.ok(Number.isFinite(pollMs) && pollMs > 0, 'terminal stability poll must be positive') + const startedAt = now() + const deadline = startedAt + timeoutMs + let lastOutputSize = readOutputSize() + let lastOutputAt = startedAt + for (;;) { + const observedAt = now() + const outputSize = readOutputSize() + if (outputSize !== lastOutputSize) { + lastOutputSize = outputSize + lastOutputAt = observedAt + } else if (observedAt - lastOutputAt >= quietMs) { + return { outputBytes: outputSize, quietMs, waitedMs: observedAt - startedAt } + } + if (observedAt >= deadline) + throw new Error(`terminal output did not stabilize after ${timeoutMs}ms`) + await pause(Math.min(pollMs, Math.max(1, deadline - observedAt))) + } +} + function createPty(binary, config, statePath, exitTimeoutMs) { const terminal = new xterm.Terminal({ cols: 120, rows: 36, allowProposedApi: true }) const environment = processTreeEnvironment({ @@ -1262,6 +1298,10 @@ async function runProof({ }, timeoutMs, ) + await waitForTerminalOutputStability({ + readOutputSize: () => runtime.output.length, + timeoutMs, + }) const { frame: initialFrame, identity: initialIdentity } = await waitForInteractiveIdentityFrame({ captureFrame: () => captureStateFrame(runtime, recordPath, timeoutMs), diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index a4f6d2d7..15f5385f 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -21,6 +21,7 @@ import { interactiveProofCommandSequence, sandboxConfiguration as interactiveSandboxConfiguration, waitForInteractiveIdentityFrame, + waitForTerminalOutputStability, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' import { sandboxConfiguration as multirunSandboxConfiguration } from '../scripts/live-required/tangle-sandbox-braid-multirun.mjs' import { assertSingleExecutionAttemptLedger } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' @@ -520,6 +521,30 @@ test('LIVE-08 uses Pi native shell input for non-model workspace mutations', () assert.equal(commands.filter((command) => command.startsWith('!!')).length, 2) }) +test('LIVE-08 waits for Pi terminal output to settle before native shell input', async () => { + let clock = 0 + let outputSize = 0 + let nextSpinnerAt = 80 + const result = await waitForTerminalOutputStability({ + readOutputSize: () => outputSize, + timeoutMs: 2_000, + quietMs: 250, + pollMs: 25, + now: () => clock, + pause: async (milliseconds) => { + clock += milliseconds + while (nextSpinnerAt <= clock && nextSpinnerAt <= 400) { + outputSize += 1 + nextSpinnerAt += 80 + } + }, + }) + + assert.equal(outputSize, 5) + assert.equal(result.quietMs, 250) + assert.ok(result.waitedMs >= 650) +}) + test('LIVE-08 waits past streamed output until retained admission is durable', async () => { const controlRef = { provider: 'tangle-sandbox', From cb751134fbd84541a91f4e49fb53c4f75db5d4e7 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:26:01 -0600 Subject: [PATCH 108/136] fix(live): clean up streaming interactive failures --- .../tangle-sandbox-braid-interactive.mjs | 32 ++++- test/tangle-live07-wiring.test.mjs | 116 ++++++++++++++++++ 2 files changed, 142 insertions(+), 6 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index f2c19da5..89e09bb3 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -61,6 +61,16 @@ const DEFAULT_TERMINAL_POLL_MS = 25 const SANDBOX_LIST_PAGE_SIZE = 100 const DETACH = '\u001d' const RUN_STATUS_AFTER_STOP = new Set(['aborted', 'cancelled']) +const CANCELLABLE_INTERACTIVE_RUN_STATUSES = new Set([ + 'prepared', + 'starting', + 'running', + 'streaming', + 'waiting', + 'detached', + 'reconnecting', + 'cancelling', +]) const CONTROL_REF_FIELDS = Object.freeze([ 'provider', 'environmentId', @@ -147,6 +157,16 @@ export function sandboxConfiguration(environment) { }) } +export function isCancellableInteractiveRunStatus(status) { + return typeof status === 'string' && CANCELLABLE_INTERACTIVE_RUN_STATUSES.has(status) +} + +export function stoppedRunFromState(response, runId) { + if (!stateForRun(response, runId)) return undefined + const run = runFromState(response.state, runId) + return run !== undefined && RUN_STATUS_AFTER_STOP.has(run.status) ? run : undefined +} + export function interactiveProofCommandSequence(markers) { const input = markers.input ?? markers.inputSeed?.toUpperCase() const reconnect = markers.reconnect ?? markers.reconnectSeed?.toUpperCase() @@ -1167,7 +1187,10 @@ async function stopThroughBraid(binary, config, runId, timeoutMs) { controlRef: exactControlRef(beforeRun.controlRef, 'already-stopped Braid run'), } } else { - assert.equal(beforeRun?.status, 'detached', 'Braid stop must target the detached run') + assert.ok( + isCancellableInteractiveRunStatus(beforeRun?.status), + `Braid stop cannot target run status ${beforeRun?.status ?? 'missing'}`, + ) const operationId = `live-interactive-stop-${randomUUID()}` const acknowledgement = await rpcRequest( initialized.session, @@ -1181,13 +1204,10 @@ async function stopThroughBraid(binary, config, runId, timeoutMs) { ) const terminal = await initialized.session.waitFor( 'Braid interactive stop state', - (candidate) => { - const run = stateForRun(candidate, runId) - return run !== undefined && RUN_STATUS_AFTER_STOP.has(run.status) - }, + (candidate) => stoppedRunFromState(candidate, runId) !== undefined, timeoutMs, ) - const stoppedRun = runFromState(terminal.state, runId) + const stoppedRun = stoppedRunFromState(terminal, runId) assert.ok(stoppedRun, 'Braid stop did not return the target run') assert.ok(RUN_STATUS_AFTER_STOP.has(stoppedRun.status)) const controlRef = assertControlRefsEqual( diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 15f5385f..8f7eb88b 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -20,6 +20,8 @@ import { interactiveMaterializationEvidence, interactiveProofCommandSequence, sandboxConfiguration as interactiveSandboxConfiguration, + isCancellableInteractiveRunStatus, + stoppedRunFromState, waitForInteractiveIdentityFrame, waitForTerminalOutputStability, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' @@ -545,6 +547,120 @@ test('LIVE-08 waits for Pi terminal output to settle before native shell input', assert.ok(result.waitedMs >= 650) }) +test('LIVE-08 cancels a streaming run before exact cleanup after an early flow failure', async () => { + const controlRef = { + provider: 'tangle-sandbox', + environmentId: 'environment-live-08-streaming-failure', + sessionId: 'session-live-08-streaming-failure', + executionId: 'execution-live-08-streaming-failure', + runId: 'provider-run-live-08-streaming-failure', + requestDigest: `sha256:${'b'.repeat(64)}`, + } + const identity = { + run: { id: 'run-live-08-streaming-failure', status: 'streaming', controlRef }, + controlRef, + } + const events = [] + let processExited = false + let processGroupExited = false + const runtime = { + get exited() { + return processExited + }, + get processCleanup() { + return processGroupExited ? { supported: true, gone: true } : undefined + }, + async forceClose() { + events.push('process-exit') + processExited = true + processGroupExited = true + }, + dispose() { + events.push('terminal-dispose') + }, + } + const stoppedRun = { ...identity.run, status: 'cancelled' } + const cleanup = { + confirmed: true, + removedIds: [controlRef.environmentId], + remainingIds: [], + matchedCount: 1, + } + const result = await finalizeInteractiveProof({ + packed: { + binary: '/tmp/braid', + cleanup: async () => { + events.push('packed-cleanup') + }, + }, + config: { + cleanup: async () => { + events.push('workspace-cleanup') + return { credentialRemoved: true, temporaryRootRemoved: true } + }, + }, + runtime, + executionStarted: true, + identity, + client: {}, + stop: async ({ runId }) => { + events.push(`cancel:${runId}`) + assert.equal(runId, identity.run.id) + return { run: stoppedRun, controlRef } + }, + observe: async (_client, observedRef, runId) => { + events.push('stopped-observation') + assert.equal(runId, identity.run.id) + assert.deepEqual(observedRef, controlRef) + return { stopped: true } + }, + cleanupSandbox: async (_client, cleanupIdentity) => { + events.push('exact-delete') + assert.equal(cleanupIdentity.run.id, identity.run.id) + assert.deepEqual(cleanupIdentity.controlRef, controlRef) + return cleanup + }, + }) + + assert.deepEqual(events, [ + 'process-exit', + 'terminal-dispose', + `cancel:${identity.run.id}`, + 'stopped-observation', + 'exact-delete', + 'workspace-cleanup', + 'packed-cleanup', + ]) + assert.equal(result.processExited, true) + assert.equal(result.processGroupExited, true) + assert.equal(result.stop.run.status, 'cancelled') + assert.deepEqual(result.cleanup, cleanup) +}) + +test('LIVE-08 only permits active public run statuses for cancellation cleanup', () => { + assert.equal(isCancellableInteractiveRunStatus('streaming'), true) + assert.equal(isCancellableInteractiveRunStatus('detached'), true) + assert.equal(isCancellableInteractiveRunStatus('running'), true) + assert.equal(isCancellableInteractiveRunStatus('completed'), false) + assert.equal(isCancellableInteractiveRunStatus('failed'), false) + assert.equal(isCancellableInteractiveRunStatus('unknown'), false) + assert.equal(isCancellableInteractiveRunStatus(undefined), false) +}) + +test('LIVE-08 reads the stopped run from the terminal state response', () => { + const run = { id: 'run-live-08-stopped', status: 'cancelled' } + const response = { type: 'state', state: { runs: [run] } } + assert.deepEqual(stoppedRunFromState(response, run.id), run) + assert.equal( + stoppedRunFromState( + { type: 'state', state: { runs: [{ ...run, status: 'streaming' }] } }, + run.id, + ), + undefined, + ) + assert.equal(stoppedRunFromState({ type: 'event', state: { runs: [run] } }, run.id), undefined) +}) + test('LIVE-08 waits past streamed output until retained admission is durable', async () => { const controlRef = { provider: 'tangle-sandbox', From c2d8158b7bdc14cc359fd4737480ce9304edc578 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:30:08 -0600 Subject: [PATCH 109/136] fix(live): recover workspace forks after partial commit --- .../live-required/tangle-workspace-proof.mjs | 171 +++++++++++++++++- src/app/conversation-branch-effects.ts | 29 ++- test/conversation-branch-effects.test.ts | 33 +++- test/tangle-workspace-proof.test.mjs | 162 +++++++++++++++++ 4 files changed, 383 insertions(+), 12 deletions(-) diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index d4f37b7d..1bd4d90a 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -5,8 +5,12 @@ import { fileURLToPath, pathToFileURL } from 'node:url' import { confidentialExecutionVerified, forkedEnvironmentConfidentialityVerified, + workspaceCleanupAcknowledgementMatches, workspaceCheckpointRequestDigest, + workspaceCheckpointResultMatchesRequest, + workspaceCleanupRequestDigest, workspaceForkRequestDigest, + workspaceForkResultMatchesRequest, } from '@tangle-network/agent-interface' import { generateAttestationNonce } from '@tangle-network/sandbox' @@ -437,6 +441,9 @@ function checkpointAndForkRequests(state, plan, operationId, sourceRun, destinat const providerCheckpointId = operation?.result?.providerCheckpointId if (typeof providerCheckpointId !== 'string' || providerCheckpointId.length === 0) throw new Error('Braid did not persist the provider checkpoint identity') + const persistedForkDigest = operation?.result?.forkRequestDigest + if (typeof persistedForkDigest !== 'string' || persistedForkDigest.length === 0) + throw new Error('Braid did not persist the provider fork request identity') const source = structuredClone(sourceRun.controlRef) const checkpointMaterial = { source, @@ -473,6 +480,10 @@ function checkpointAndForkRequests(state, plan, operationId, sourceRun, destinat }, } const forkRequestDigest = workspaceForkRequestDigest(forkMaterial) + assertCondition( + sha256Digest(persistedForkDigest) === forkRequestDigest, + 'Persisted fork request identity does not match Braid request material', + ) const graphEdge = state.graphEdges.find((candidate) => { const sourceNode = state.graphNodes.find((node) => node.id === candidate.source) const destinationNode = state.graphNodes.find((node) => node.id === candidate.destination) @@ -515,6 +526,10 @@ async function lookupAfterRestart(adapters, sourceProviderEnvironmentId, request }) if (checkpoint.status !== 'found') throw new Error(`Restart checkpoint lookup returned ${checkpoint.status}`) + assertCondition( + workspaceCheckpointResultMatchesRequest(requests.checkpointRequest, checkpoint), + 'Restart checkpoint lookup returned another checkpoint request', + ) assertCondition( checkpoint.checkpoint.checkpointId === requests.checkpointRef.checkpointId, 'Restart checkpoint lookup returned another checkpoint', @@ -525,6 +540,10 @@ async function lookupAfterRestart(adapters, sourceProviderEnvironmentId, request requestDigest: requests.forkRequest.requestDigest, }) if (fork.status !== 'found') throw new Error(`Restart fork lookup returned ${fork.status}`) + assertCondition( + workspaceForkResultMatchesRequest(requests.forkRequest, fork), + 'Restart fork lookup returned another fork request', + ) assertCondition( fork.environment.sourceEnvironmentId === sourceProviderEnvironmentId, 'Restart fork lookup returned another source environment', @@ -582,6 +601,116 @@ function checkpointIdForDestination(state, destinationId) { return state.checkpoints.find((candidate) => candidate.id === source.reference.id)?.id } +function forkRequestForRecovery(state, plan, operationId, source) { + if (plan === undefined || operationId === undefined || source?.run?.controlRef === undefined) + return undefined + if (!Array.isArray(state.checkpoints) || !Array.isArray(state.operations)) return undefined + const checkpoint = state.checkpoints.find((candidate) => candidate.operationId === operationId) + const operation = state.operations.find((candidate) => candidate.id === operationId) + const providerCheckpointId = operation?.result?.providerCheckpointId + const persistedForkDigest = operation?.result?.forkRequestDigest + if ( + checkpoint === undefined || + typeof providerCheckpointId !== 'string' || + providerCheckpointId.length === 0 || + typeof persistedForkDigest !== 'string' || + persistedForkDigest.length === 0 + ) + return undefined + const sourceRef = structuredClone(source.run.controlRef) + const checkpointMaterial = { + source: sourceRef, + name: `braid checkpoint ${plan.sourceBranchId}`, + metadata: { + braidOperationId: operationId, + sourceBranchId: String(plan.sourceBranchId), + ...(plan.throughMessageId === undefined ? {} : { throughMessageId: plan.throughMessageId }), + }, + } + const checkpointRequestDigest = workspaceCheckpointRequestDigest(checkpointMaterial) + const checkpointRef = { + checkpointId: providerCheckpointId, + provider: sourceRef.provider, + source: sourceRef, + idempotencyKey: `${operationId}:checkpoint`, + requestDigest: checkpointRequestDigest, + createdAt: checkpoint.createdAt, + metadata: checkpointMaterial.metadata, + } + const forkMaterial = { + checkpoint: checkpointRef, + name: `braid fork ${plan.destinationBranchId}`, + placement: plan.placement ?? { kind: 'provider' }, + ...(plan.confidential === undefined ? {} : { confidential: plan.confidential }), + metadata: { + braidOperationId: operationId, + destinationBranchId: String(plan.destinationBranchId), + }, + } + const requestDigest = workspaceForkRequestDigest(forkMaterial) + assertCondition( + sha256Digest(persistedForkDigest) === requestDigest, + 'Persisted fork request identity does not match Braid request material', + ) + return Object.freeze({ + ...forkMaterial, + idempotencyKey: `${operationId}:fork`, + requestDigest, + }) +} + +async function cleanupProviderFork( + adapters, + source, + request, + cleanupOperationId, + providerEnvironmentId, +) { + // Use provider lookup only when Braid lacks the local destination edge. + // Normal cleanup remains the application path and records local lifecycle state. + if (adapters === undefined || source?.providerId === undefined || request === undefined) + return undefined + const branching = await adapters.freshBranching(source.providerId) + const lookup = await branching.lookupFork({ + idempotencyKey: request.idempotencyKey, + requestDigest: request.requestDigest, + }) + if (lookup.status === 'not_found' && providerEnvironmentId === undefined) return 'already_absent' + if (lookup.status !== 'found' && lookup.status !== 'not_found') + throw new Error(`Fork cleanup lookup returned ${lookup.status}`) + if (lookup.status === 'found') { + assertCondition( + workspaceForkResultMatchesRequest(request, lookup), + 'Fork cleanup lookup returned another fork request', + ) + assertCondition( + lookup.environment.sourceEnvironmentId === source.providerId, + 'Fork cleanup lookup returned another source environment', + ) + } + const material = { + kind: 'fork', + targetId: lookup.status === 'found' ? lookup.environment.environmentId : providerEnvironmentId, + provider: + lookup.status === 'found' ? lookup.environment.provider : source.run.controlRef.provider, + } + const cleanupRequest = { + operationId: `${cleanupOperationId}:fork-cleanup`, + ...material, + requestDigest: workspaceCleanupRequestDigest(material), + } + const acknowledgement = await branching.destroyFork({ ...cleanupRequest, kind: 'fork' }) + assertCondition( + workspaceCleanupAcknowledgementMatches(cleanupRequest, acknowledgement), + 'Fork cleanup acknowledgement does not match its request', + ) + if (acknowledgement.status === 'deleted' || acknowledgement.status === 'already_absent') + return acknowledgement.status + throw new Error( + `Fork cleanup returned ${acknowledgement.status}${acknowledgement.message === undefined ? '' : `: ${acknowledgement.message}`}`, + ) +} + export async function cleanupWorkspaceProofResources({ cleanupOwner, adapters, @@ -592,6 +721,7 @@ export async function cleanupWorkspaceProofResources({ cleanupOperationId, proofId, cleanupResult, + plan, sourceDestroyed = false, }) { let cleanupError @@ -619,6 +749,43 @@ export async function cleanupWorkspaceProofResources({ cleanupError ??= error } } + const cleanupState = cleanupOwner.app.state() + const operation = + branchOperationId === undefined || !Array.isArray(cleanupState.operations) + ? undefined + : cleanupState.operations.find((candidate) => candidate.id === branchOperationId) + const persistedForkDigest = operation?.result?.forkRequestDigest + let forkRequest = resources?.forkRequest + const hasForkIdentity = + forkRequest !== undefined || + typeof persistedForkDigest === 'string' || + typeof operation?.result?.providerEnvironmentId === 'string' + const forkCleanupComplete = + resolvedCleanupResult?.environment === 'deleted' || + resolvedCleanupResult?.environment === 'already_absent' + if (hasForkIdentity && !forkCleanupComplete) { + resolvedCleanupOperationId ??= `op-live-required-${proofId}-cleanup` + try { + forkRequest ??= forkRequestForRecovery(cleanupState, plan, branchOperationId, source) + if (forkRequest === undefined) + throw new Error('Braid did not persist enough fork identity for provider cleanup') + const forkOutcome = await cleanupProviderFork( + adapters ?? providerAdapters(cleanupOwner), + source, + forkRequest, + resolvedCleanupOperationId, + destination?.providerEnvironmentId ?? operation?.result?.providerEnvironmentId, + ) + if (forkOutcome !== undefined) { + resolvedCleanupResult = { + checkpoint: resolvedCleanupResult?.checkpoint ?? 'not_requested', + environment: forkOutcome, + } + } + } catch (error) { + cleanupError ??= error + } + } if (!resolvedSourceDestroyed) { try { await cancelSourceRun( @@ -743,6 +910,7 @@ async function runWorkspaceProof({ let cleanupOperationId let resources let cleanupResult + let plan let sourceDestroyed = false let primaryError let completedResult @@ -785,7 +953,7 @@ async function runWorkspaceProof({ } : {}), } - const plan = opened.app.conversations.branches.plan(planInput) + plan = opened.app.conversations.branches.plan(planInput) if (!plan.allowed) throw unavailable( 'PROTECTED_WORKSPACE_BRANCHING_UNAVAILABLE', @@ -1091,6 +1259,7 @@ async function runWorkspaceProof({ cleanupOperationId, proofId, cleanupResult, + plan, sourceDestroyed, }) cleanupError ??= cleanup.cleanupError diff --git a/src/app/conversation-branch-effects.ts b/src/app/conversation-branch-effects.ts index ca7dadeb..9c55a52e 100644 --- a/src/app/conversation-branch-effects.ts +++ b/src/app/conversation-branch-effects.ts @@ -429,14 +429,6 @@ async function executeWorkspace( }), }) } - await updateOperation(host, operationId, digest, { - status: 'pending', - result: { - checkpointId: String(checkpointRecord.id), - providerCheckpointId: checkpoint.checkpoint.checkpointId, - }, - }) - const placement: PlacementInfo = input.placement ?? { kind: 'provider' } const forkMaterial = { checkpoint: checkpoint.checkpoint, @@ -453,6 +445,19 @@ async function executeWorkspace( idempotencyKey: `${input.operationId}:fork`, requestDigest: workspaceForkRequestDigest(forkMaterial), } + const previousProviderEnvironmentId = existing?.result?.providerEnvironmentId + const pendingForkResult = { + checkpointId: String(checkpointRecord.id), + providerCheckpointId: checkpoint.checkpoint.checkpointId, + forkRequestDigest: forkRequest.requestDigest, + ...(typeof previousProviderEnvironmentId === 'string' + ? { providerEnvironmentId: previousProviderEnvironmentId } + : {}), + } + await updateOperation(host, operationId, digest, { + status: 'pending', + result: pendingForkResult, + }) const forkResult = await lookupOrFork(branching, forkRequest) if (!workspaceForkResultMatchesRequest(forkRequest, forkResult)) throw new AppError('FORK_CONFLICT', 'The environment fork result does not match its request') @@ -464,6 +469,13 @@ async function executeWorkspace( ) if (fork.environment.environmentId === source.environmentId) throw new AppError('FORK_PLAN_CONFLICT', 'The provider fork reused the source environment') + await updateOperation(host, operationId, digest, { + status: 'pending', + result: { + ...pendingForkResult, + providerEnvironmentId: fork.environment.environmentId, + }, + }) const destination = await recordForkedEnvironment(host, plan, fork.environment, forkRequest) const branch = await createBranch({ ...input, @@ -487,6 +499,7 @@ async function executeWorkspace( planDigest: plan.digest, checkpointId: String(checkpointRecord.id), providerCheckpointId: checkpoint.checkpoint.checkpointId, + forkRequestDigest: forkRequest.requestDigest, providerEnvironmentId: fork.environment.environmentId, }) return branch diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts index 70e8c33e..19619dcb 100644 --- a/test/conversation-branch-effects.test.ts +++ b/test/conversation-branch-effects.test.ts @@ -140,7 +140,9 @@ function contextResult(request: ContextTransferRequest): ContextTransferResult { } } -function workspaceProvider(): { +function workspaceProvider( + options: { readonly beforeFork?: (request: WorkspaceForkRequest) => void } = {}, +): { readonly branching: NonNullable readonly state: WorkspaceProviderState } { @@ -193,6 +195,7 @@ function workspaceProvider(): { } }, async fork(request) { + options.beforeFork?.(request) state.forkRequests.push(request) const confidential = request.confidential const confidentialAttestation = @@ -752,7 +755,17 @@ test('cross-runner retry reuses the original acceptance timestamp in its request }) test('workspace fork uses exact provider operations, isolates destination, and cleans both resources', async () => { - const provider = workspaceProvider() + let app: ReturnType | undefined + let operationAtFork: + | ReturnType['state']>['operations'][number] + | undefined + const provider = workspaceProvider({ + beforeFork: () => { + operationAtFork = app + ?.state() + .operations.find((operation) => operation.id === 'op-workspace-branch-effects') + }, + }) const sourceLookups: string[] = [] const workspaceBranchingProvider: AgentWorkspaceBranchingProvider = { async forEnvironment(sourceEnvironmentId) { @@ -765,7 +778,7 @@ test('workspace fork uses exact provider operations, isolates destination, and c workspaceBranchingProvider, }) const journal = new MemoryJournal(new FixedClock(AT)) - const app = createBraidApplication({ + app = createBraidApplication({ fixture: 'deterministic', execution, clock: new FixedClock(AT), @@ -784,8 +797,22 @@ test('workspace fork uses exact provider operations, isolates destination, and c kind: 'workspace', planDigest: plan.digest, }) + assert.equal(operationAtFork?.status, 'pending') + assert.deepEqual(operationAtFork?.result, { + checkpointId: String(app.state().checkpoints[0]?.id), + providerCheckpointId: 'provider-checkpoint-1', + forkRequestDigest: provider.state.forkRequests[0]?.requestDigest, + }) assert.equal(provider.state.checkpointRequests.length, 1) assert.equal(provider.state.forkRequests.length, 1) + const acknowledged = app + .state() + .operations.find((operation) => operation.id === 'op-workspace-branch-effects') + assert.equal(acknowledged?.status, 'acknowledged') + assert.equal( + acknowledged?.result?.forkRequestDigest, + provider.state.forkRequests[0]?.requestDigest, + ) assert.deepEqual(sourceLookups, ['provider-source-environment']) assert.notEqual(branch.environmentId, plan.sourceEnvironmentId) assert.equal( diff --git a/test/tangle-workspace-proof.test.mjs b/test/tangle-workspace-proof.test.mjs index 08f90007..bdf8a1f5 100644 --- a/test/tangle-workspace-proof.test.mjs +++ b/test/tangle-workspace-proof.test.mjs @@ -4,6 +4,7 @@ import test from 'node:test' import { fileURLToPath } from 'node:url' import { + workspaceCleanupRequestDigest, workspaceCheckpointRequestDigest, workspaceForkRequestDigest, } from '@tangle-network/agent-interface' @@ -23,6 +24,7 @@ import { const DIGEST = `sha256:${'1'.repeat(64)}` const SECOND_DIGEST = `sha256:${'2'.repeat(64)}` +const AT = '2026-08-28T00:00:00.000Z' function policyEnvironment(overrides = {}) { return { @@ -231,6 +233,166 @@ test('LIVE-09 fault cleanup releases a partial checkpoint and source run', async assert.equal(state.runs[0].status, 'aborted') }) +test('LIVE-09 failure cleanup recovers a provider fork by its durable request digest', async () => { + const branchOperationId = 'op-live-09-fork-recovery' + const sourceRun = { + id: 'run-live-09-fork-recovery', + environmentId: 'environment-local-source', + status: 'running', + complete: false, + controlRef: { + provider: 'tangle-sandbox', + environmentId: 'sandbox-source-recovery', + sessionId: 'session-live-09-recovery', + executionId: 'execution-live-09-recovery', + runId: 'run-live-09-fork-recovery', + requestDigest: DIGEST, + }, + } + const plan = { + sourceBranchId: 'branch-source-recovery', + destinationBranchId: 'branch-destination-recovery', + placement: { kind: 'provider' }, + } + const checkpointMaterial = { + source: sourceRun.controlRef, + name: `braid checkpoint ${plan.sourceBranchId}`, + metadata: { + braidOperationId: branchOperationId, + sourceBranchId: plan.sourceBranchId, + }, + } + const checkpointRef = { + checkpointId: 'provider-checkpoint-recovery', + provider: sourceRun.controlRef.provider, + source: sourceRun.controlRef, + idempotencyKey: `${branchOperationId}:checkpoint`, + requestDigest: workspaceCheckpointRequestDigest(checkpointMaterial), + createdAt: AT, + metadata: checkpointMaterial.metadata, + } + const forkMaterial = { + checkpoint: checkpointRef, + name: `braid fork ${plan.destinationBranchId}`, + placement: plan.placement, + metadata: { + braidOperationId: branchOperationId, + destinationBranchId: plan.destinationBranchId, + }, + } + const forkRequest = { + ...forkMaterial, + idempotencyKey: `${branchOperationId}:fork`, + requestDigest: workspaceForkRequestDigest(forkMaterial), + } + const forkEnvironment = { + provider: sourceRun.controlRef.provider, + environmentId: 'sandbox-destination-recovery', + sourceEnvironmentId: sourceRun.controlRef.environmentId, + source: sourceRun.controlRef, + sourceCheckpointId: checkpointRef.checkpointId, + idempotencyKey: forkRequest.idempotencyKey, + requestDigest: forkRequest.requestDigest, + createdAt: AT, + placement: forkRequest.placement, + confidentialRequested: false, + metadata: forkRequest.metadata, + } + let state = { + runs: [sourceRun], + checkpoints: [ + { id: 'checkpoint-live-09-fork-recovery', operationId: branchOperationId, createdAt: AT }, + ], + operations: [ + { + id: branchOperationId, + result: { + providerCheckpointId: checkpointRef.checkpointId, + forkRequestDigest: forkRequest.requestDigest, + }, + }, + ], + } + const calls = [] + let sourceExists = true + const app = { + state: () => state, + cancelRun: async (input) => { + calls.push(['source-cancel', input.runId]) + state = { + ...state, + runs: [{ ...sourceRun, status: input.terminalStatus, complete: true }], + } + return { completion: Promise.resolve() } + }, + conversations: { + branches: { + cleanup: async (input) => { + calls.push(['checkpoint-cleanup', input.checkpointId]) + assert.equal(input.environmentId, undefined) + return { checkpoint: 'deleted', environment: 'not_requested' } + }, + }, + }, + } + const adapters = { + freshBranching: async (sourceProviderId) => { + assert.equal(sourceProviderId, sourceRun.controlRef.environmentId) + return { + lookupFork: async (input) => { + calls.push(['fork-lookup', input]) + return { status: 'found', ...input, environment: forkEnvironment } + }, + destroyFork: async (input) => { + calls.push(['fork-destroy', input]) + const material = { + kind: 'fork', + targetId: forkEnvironment.environmentId, + provider: forkEnvironment.provider, + } + return { + operationId: input.operationId, + kind: 'fork', + targetId: material.targetId, + provider: material.provider, + requestDigest: workspaceCleanupRequestDigest(material), + status: 'deleted', + } + }, + } + }, + freshEnvironment: async (environmentId) => { + assert.equal(environmentId, sourceRun.controlRef.environmentId) + if (!sourceExists) return null + return { + destroy: async () => { + calls.push(['source-destroy']) + sourceExists = false + }, + } + }, + } + + const result = await cleanupWorkspaceProofResources({ + cleanupOwner: { app }, + adapters, + source: { run: sourceRun, providerId: sourceRun.controlRef.environmentId }, + plan, + branchOperationId, + proofId: 'live-09-fork-recovery', + }) + + assert.deepEqual(result.cleanupResult, { checkpoint: 'deleted', environment: 'deleted' }) + assert.deepEqual( + calls.map(([kind]) => kind), + ['checkpoint-cleanup', 'fork-lookup', 'fork-destroy', 'source-cancel', 'source-destroy'], + ) + assert.equal(calls[1][1].idempotencyKey, forkRequest.idempotencyKey) + assert.equal(calls[1][1].requestDigest, forkRequest.requestDigest) + assert.equal(sourceExists, false) + assert.equal(state.runs[0].status, 'aborted') +}) + test('LIVE-10 policy parsing is typed, bounded, and immutable', () => { const parsed = parseConfidentialTrustPolicy(policyEnvironment()) assert.deepEqual(parsed, { From 797c6b9eda8e9be6942e9897034bdcf9f7294af7 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:31:42 -0600 Subject: [PATCH 110/136] fix(live): wait for terminal renderer quiescence --- .../tangle-sandbox-braid-interactive.mjs | 56 +++-------- .../tangle-sandbox-braid-multirun.mjs | 17 +--- scripts/live-required/terminal-quiescence.mjs | 98 +++++++++++++++++++ test/tangle-live07-wiring.test.mjs | 96 +++++++++++++----- 4 files changed, 187 insertions(+), 80 deletions(-) create mode 100644 scripts/live-required/terminal-quiescence.mjs diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 89e09bb3..1b801591 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -50,14 +50,13 @@ import { usage, } from './tangle-sandbox-braid-stress.mjs' import { resourceDelta } from './tangle-sandbox-braid-stress-support.mjs' +import { createTerminalOutputTracker, waitForTerminalQuiescence } from './terminal-quiescence.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') const DEFAULT_TIMEOUT_MS = 180_000 const DEFAULT_IDLE_TTL_SECONDS = 1_800 const DEFAULT_PROCESS_EXIT_TIMEOUT_MS = 10_000 -const DEFAULT_TERMINAL_QUIET_MS = 250 -const DEFAULT_TERMINAL_POLL_MS = 25 const SANDBOX_LIST_PAGE_SIZE = 100 const DETACH = '\u001d' const RUN_STATUS_AFTER_STOP = new Set(['aborted', 'cancelled']) @@ -524,40 +523,6 @@ async function waitFor(label, predicate, timeoutMs) { } } -export async function waitForTerminalOutputStability({ - readOutputSize, - timeoutMs, - quietMs = DEFAULT_TERMINAL_QUIET_MS, - pollMs = DEFAULT_TERMINAL_POLL_MS, - now = () => performance.now(), - pause = sleep, -}) { - assert.equal(typeof readOutputSize, 'function', 'terminal output reader must be a function') - assert.ok( - Number.isFinite(timeoutMs) && timeoutMs > 0, - 'terminal stability timeout must be positive', - ) - assert.ok(Number.isFinite(quietMs) && quietMs > 0, 'terminal quiet interval must be positive') - assert.ok(Number.isFinite(pollMs) && pollMs > 0, 'terminal stability poll must be positive') - const startedAt = now() - const deadline = startedAt + timeoutMs - let lastOutputSize = readOutputSize() - let lastOutputAt = startedAt - for (;;) { - const observedAt = now() - const outputSize = readOutputSize() - if (outputSize !== lastOutputSize) { - lastOutputSize = outputSize - lastOutputAt = observedAt - } else if (observedAt - lastOutputAt >= quietMs) { - return { outputBytes: outputSize, quietMs, waitedMs: observedAt - startedAt } - } - if (observedAt >= deadline) - throw new Error(`terminal output did not stabilize after ${timeoutMs}ms`) - await pause(Math.min(pollMs, Math.max(1, deadline - observedAt))) - } -} - function createPty(binary, config, statePath, exitTimeoutMs) { const terminal = new xterm.Terminal({ cols: 120, rows: 36, allowProposedApi: true }) const environment = processTreeEnvironment({ @@ -578,13 +543,14 @@ function createPty(binary, config, statePath, exitTimeoutMs) { let exited = false let exitResult let processCleanup + const outputTracker = createTerminalOutputTracker() const waitForProcessCleanup = async () => { processCleanup ??= await waitForTreeGone(child, exitTimeoutMs) return processCleanup } child.onData((chunk) => { output += chunk - terminal.write(chunk) + outputTracker.observe(chunk, (settle) => terminal.write(chunk, settle)) }) child.onExit((result) => { exited = true @@ -605,6 +571,12 @@ function createPty(binary, config, statePath, exitTimeoutMs) { get processCleanup() { return processCleanup }, + get terminalOutputRevision() { + return outputTracker.snapshot().revision + }, + waitForTerminalQuiescence(timeoutMs, afterRevision) { + return waitForTerminalQuiescence(outputTracker, { timeoutMs, afterRevision, pause: sleep }) + }, write(value) { child.write(value) }, @@ -1318,10 +1290,7 @@ async function runProof({ }, timeoutMs, ) - await waitForTerminalOutputStability({ - readOutputSize: () => runtime.output.length, - timeoutMs, - }) + await runtime.waitForTerminalQuiescence(timeoutMs) const { frame: initialFrame, identity: initialIdentity } = await waitForInteractiveIdentityFrame({ captureFrame: () => captureStateFrame(runtime, recordPath, timeoutMs), @@ -1348,9 +1317,12 @@ async function runProof({ runtime.write(detach) await proveTuiReturned(runtime, timeoutMs, 'native interactive detach') + const attachOutputRevision = runtime.terminalOutputRevision runtime.write(`${attach}\r`) - await sleep(250) + await runtime.waitForTerminalQuiescence(timeoutMs, attachOutputRevision) + const resizeOutputRevision = runtime.terminalOutputRevision runtime.resize(100, 30) + await runtime.waitForTerminalQuiescence(timeoutMs, resizeOutputRevision) const resized = await observeSandbox( client, initialIdentity.controlRef, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index d051999c..754e8140 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -25,6 +25,7 @@ import { cleanupRetainedResourceByControlRef, observeRetainedResource, } from './tangle-sandbox-braid-stress.mjs' +import { createTerminalOutputTracker, waitForTerminalQuiescence } from './terminal-quiescence.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') @@ -176,8 +177,7 @@ function createTerminal( let output = '' let exited = false let exitResult - let pendingWrites = 0 - let lastOutputAt = performance.now() + const outputTracker = createTerminalOutputTracker({ quietIntervalMs: 100 }) let lastFrame let lastFrameError let processCleanup @@ -190,19 +190,10 @@ function createTerminal( }) child.onData((data) => { output += data - lastOutputAt = performance.now() - pendingWrites += 1 - terminal.write(data, () => { - pendingWrites -= 1 - }) + outputTracker.observe(data, (settle) => terminal.write(data, settle)) }) const waitForStable = async (timeoutMs = 10_000) => { - const deadline = performance.now() + timeoutMs - for (;;) { - if (pendingWrites === 0 && performance.now() - lastOutputAt >= 100) return - if (performance.now() >= deadline) throw new Error('terminal output did not become stable') - await pause(25) - } + await waitForTerminalQuiescence(outputTracker, { timeoutMs, pause }) } const captureState = async (timeoutMs = 10_000) => { // A live provider can keep writing stream frames without a quiet interval. diff --git a/scripts/live-required/terminal-quiescence.mjs b/scripts/live-required/terminal-quiescence.mjs new file mode 100644 index 00000000..1b1e3d35 --- /dev/null +++ b/scripts/live-required/terminal-quiescence.mjs @@ -0,0 +1,98 @@ +/** + * Track terminal output until the renderer has caught up and its animated + * status indicators have stopped producing frames. + * + * Pi's public Loader uses an 80ms default frame interval in 0.80.2, 0.82.1, + * and 0.84.4. Three complete intervals provide a renderer-observable quiet + * period that cannot occur while that indicator is still animating. + */ +export const PI_LOADER_INTERVAL_MS = 80 +export const TERMINAL_QUIET_INTERVAL_MS = PI_LOADER_INTERVAL_MS * 3 +export const TERMINAL_QUIET_POLL_INTERVAL_MS = 25 + +export function createTerminalOutputTracker({ + now = () => performance.now(), + quietIntervalMs = TERMINAL_QUIET_INTERVAL_MS, +} = {}) { + if (!Number.isFinite(quietIntervalMs) || quietIntervalMs <= 0) { + throw new RangeError('terminal quiet interval must be positive') + } + + let pendingWrites = 0 + let lastOutputAt = now() + let revision = 0 + + const observe = (data, write) => { + if (typeof data !== 'string' || data.length === 0) { + throw new TypeError('terminal output must be a non-empty string') + } + if (typeof write !== 'function') throw new TypeError('terminal output writer is required') + + lastOutputAt = now() + revision += 1 + pendingWrites += 1 + let settled = false + const settle = () => { + if (settled) return + settled = true + pendingWrites -= 1 + } + try { + write(settle) + } catch (error) { + settle() + throw error + } + } + + const snapshot = () => ({ + pendingWrites, + lastOutputAt, + revision, + quietForMs: Math.max(0, now() - lastOutputAt), + quietIntervalMs, + }) + + return { + observe, + isQuiescent: () => pendingWrites === 0 && now() - lastOutputAt >= quietIntervalMs, + snapshot, + } +} + +export async function waitForTerminalQuiescence( + tracker, + { + timeoutMs, + afterRevision, + now = () => performance.now(), + pause = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)), + } = {}, +) { + if ( + !tracker || + typeof tracker.isQuiescent !== 'function' || + typeof tracker.snapshot !== 'function' + ) { + throw new TypeError('terminal output tracker is required') + } + if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) { + throw new RangeError('terminal quiescence timeout must be positive') + } + if (afterRevision !== undefined && (!Number.isSafeInteger(afterRevision) || afterRevision < 0)) { + throw new RangeError('terminal output revision must be a non-negative safe integer') + } + + const deadline = now() + timeoutMs + for (;;) { + const snapshot = tracker.snapshot() + const observedAfterAction = afterRevision === undefined || snapshot.revision > afterRevision + if (observedAfterAction && tracker.isQuiescent()) return snapshot + if (now() >= deadline) { + throw new Error( + `terminal output did not become quiescent after ${timeoutMs}ms: ${JSON.stringify(snapshot)}`, + ) + } + await pause(Math.min(TERMINAL_QUIET_POLL_INTERVAL_MS, Math.max(0, deadline - now()))) + } +} diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 8f7eb88b..4cf950bb 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -23,12 +23,17 @@ import { isCancellableInteractiveRunStatus, stoppedRunFromState, waitForInteractiveIdentityFrame, - waitForTerminalOutputStability, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' import { sandboxConfiguration as multirunSandboxConfiguration } from '../scripts/live-required/tangle-sandbox-braid-multirun.mjs' import { assertSingleExecutionAttemptLedger } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' import { backendConfiguration as workerBackendConfiguration } from '../scripts/live-required/tangle-sandbox-worker.mjs' import { sandboxConfiguration as workspaceSandboxConfiguration } from '../scripts/live-required/tangle-workspace-proof.mjs' +import { + createTerminalOutputTracker, + PI_LOADER_INTERVAL_MS, + TERMINAL_QUIET_INTERVAL_MS, + waitForTerminalQuiescence, +} from '../scripts/live-required/terminal-quiescence.mjs' const repository = resolve(new URL('../', import.meta.url).pathname) @@ -523,30 +528,6 @@ test('LIVE-08 uses Pi native shell input for non-model workspace mutations', () assert.equal(commands.filter((command) => command.startsWith('!!')).length, 2) }) -test('LIVE-08 waits for Pi terminal output to settle before native shell input', async () => { - let clock = 0 - let outputSize = 0 - let nextSpinnerAt = 80 - const result = await waitForTerminalOutputStability({ - readOutputSize: () => outputSize, - timeoutMs: 2_000, - quietMs: 250, - pollMs: 25, - now: () => clock, - pause: async (milliseconds) => { - clock += milliseconds - while (nextSpinnerAt <= clock && nextSpinnerAt <= 400) { - outputSize += 1 - nextSpinnerAt += 80 - } - }, - }) - - assert.equal(outputSize, 5) - assert.equal(result.quietMs, 250) - assert.ok(result.waitedMs >= 650) -}) - test('LIVE-08 cancels a streaming run before exact cleanup after an early flow failure', async () => { const controlRef = { provider: 'tangle-sandbox', @@ -661,6 +642,71 @@ test('LIVE-08 reads the stopped run from the terminal state response', () => { assert.equal(stoppedRunFromState({ type: 'event', state: { runs: [run] } }, run.id), undefined) }) +test('LIVE-08 waits for renderer quiescence instead of guessing a sleep', async () => { + let now = 0 + const tracker = createTerminalOutputTracker({ now: () => now }) + tracker.observe('model output', (settle) => { + settle() + }) + + assert.equal(PI_LOADER_INTERVAL_MS, 80) + assert.equal(TERMINAL_QUIET_INTERVAL_MS, 240) + const markerRevision = tracker.snapshot().revision + let pendingNow = 0 + const pendingTracker = createTerminalOutputTracker({ now: () => pendingNow }) + let settlePending + pendingTracker.observe('renderer frame', (settle) => { + settlePending = settle + }) + pendingNow = TERMINAL_QUIET_INTERVAL_MS + assert.equal(pendingTracker.isQuiescent(), false, 'an incomplete renderer write must block input') + settlePending() + assert.equal(pendingTracker.isQuiescent(), true) + + let staleNow = 0 + const staleTracker = createTerminalOutputTracker({ now: () => staleNow }) + staleTracker.observe('previous action output', (settle) => { + settle() + }) + await assert.rejects( + waitForTerminalQuiescence(staleTracker, { + timeoutMs: TERMINAL_QUIET_INTERVAL_MS, + afterRevision: staleTracker.snapshot().revision, + now: () => staleNow, + pause: async (milliseconds) => { + staleNow += milliseconds + }, + }), + /did not become quiescent/iu, + 'stale output must not satisfy a post-action readiness check', + ) + + let spinnerFrames = 0 + let nextSpinnerAt = PI_LOADER_INTERVAL_MS + const waited = await waitForTerminalQuiescence(tracker, { + timeoutMs: 2_000, + afterRevision: markerRevision, + now: () => now, + pause: async (milliseconds) => { + const end = now + milliseconds + while (nextSpinnerAt <= end && nextSpinnerAt <= PI_LOADER_INTERVAL_MS * 5) { + now = nextSpinnerAt + spinnerFrames += 1 + tracker.observe('spinner frame', (settle) => { + settle() + }) + nextSpinnerAt += PI_LOADER_INTERVAL_MS + } + now = end + }, + }) + assert.equal(spinnerFrames, 5, 'the waiter must remain open across every spinner interval') + assert.ok(now >= 640, 'the waiter must observe three quiet intervals after the final frame') + assert.equal(waited.pendingWrites, 0) + assert.ok(waited.revision > markerRevision) + assert.equal(waited.quietIntervalMs, TERMINAL_QUIET_INTERVAL_MS) +}) + test('LIVE-08 waits past streamed output until retained admission is durable', async () => { const controlRef = { provider: 'tangle-sandbox', From 32ff351ff93709dc1f9629884b64c48cb9a02a74 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:53:24 -0600 Subject: [PATCH 111/136] fix(live): bound provider observation retries --- .../live-required/provider-observation.mjs | 65 +++++++++++++++++++ .../tangle-sandbox-braid-interactive.mjs | 19 ++++-- test/tangle-live07-wiring.test.mjs | 48 ++++++++++++++ 3 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 scripts/live-required/provider-observation.mjs diff --git a/scripts/live-required/provider-observation.mjs b/scripts/live-required/provider-observation.mjs new file mode 100644 index 00000000..ee26b58b --- /dev/null +++ b/scripts/live-required/provider-observation.mjs @@ -0,0 +1,65 @@ +import { NetworkError, QuotaError, ServerError, TimeoutError } from '@tangle-network/sandbox' + +import { sleep } from '../live-bridge/process.mjs' + +export const PROVIDER_OBSERVATION_INTERVAL_MS = 500 + +function transientDelay(error, intervalMs) { + if (error instanceof QuotaError) { + return Math.max(intervalMs, error.retryAfterMs ?? 0) + } + if (error instanceof NetworkError || error instanceof TimeoutError) return intervalMs + if (error instanceof ServerError && [502, 503, 504].includes(error.status)) return intervalMs + return undefined +} + +export async function waitForProviderObservation( + label, + observe, + timeoutMs, + { + intervalMs = PROVIDER_OBSERVATION_INTERVAL_MS, + now = () => performance.now(), + pause = sleep, + } = {}, +) { + if (typeof label !== 'string' || label.length === 0) { + throw new TypeError('provider observation label is required') + } + if (typeof observe !== 'function') throw new TypeError('provider observer is required') + if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) { + throw new RangeError('provider observation timeout must be positive') + } + if (!Number.isFinite(intervalMs) || intervalMs <= 0) { + throw new RangeError('provider observation interval must be positive') + } + + const deadline = now() + timeoutMs + let attempts = 0 + let transientFailures = 0 + let lastTransientError + for (;;) { + if (attempts > 0 && now() >= deadline) { + throw new Error( + `${label} timed out after ${timeoutMs}ms (${attempts} attempts, ${transientFailures} transient failures)`, + { cause: lastTransientError }, + ) + } + attempts += 1 + let delayMs = intervalMs + try { + const value = await observe() + if (value) return value + } catch (error) { + const retryDelayMs = transientDelay(error, intervalMs) + if (retryDelayMs === undefined) throw error + transientFailures += 1 + lastTransientError = error + delayMs = retryDelayMs + } + + const observedAt = now() + if (observedAt >= deadline) continue + await pause(Math.min(delayMs, Math.max(0, deadline - observedAt))) + } +} diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 1b801591..43db477a 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -36,6 +36,7 @@ import { rpcState, } from './headless.mjs' import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' +import { waitForProviderObservation } from './provider-observation.mjs' import { accountIdentity, assertSingleExecutionAttemptLedger, @@ -263,7 +264,7 @@ export function assertInteractiveOwnedResourceCleanup(cleanup, expectedEnvironme } async function waitForProviderReadback(client, controlRef, path, expectedValue, timeoutMs, label) { - const observation = await waitFor( + const observation = await waitForProviderObservation( `${label} provider readback`, () => readRetainedWorkspaceFile(client, controlRef, path, { label, allowMissing: true }).then( @@ -281,7 +282,7 @@ async function waitForExecutionAttempt(client, controlRef, path, expectedAttempt const expectedValue = `${expectedAttempt}\n` let previousValue let stableReads = 0 - const observation = await waitFor( + const observation = await waitForProviderObservation( 'single provider execution attempt', async () => { const value = await readRetainedWorkspaceFile(client, controlRef, path, { @@ -838,12 +839,20 @@ async function observeSandbox( expectedRunning, expectedGeometry, ) { - const resource = await observeInteractiveResource(client, controlRef, runId) - const box = await client.get(controlRef.environmentId) + const resource = await waitForProviderObservation( + 'interactive Sandbox identity', + () => observeInteractiveResource(client, controlRef, runId), + timeoutMs, + ) + const box = await waitForProviderObservation( + 'interactive Sandbox client', + () => client.get(controlRef.environmentId), + timeoutMs, + ) assert.equal(box?.id, resource.id, 'Sandbox observation changed environment identity') assert.ok(box.terminals && typeof box.terminals.get === 'function') let terminal - await waitFor( + await waitForProviderObservation( expectedRunning ? 'retained interactive terminal' : 'stopped retained interactive terminal', async () => { terminal = await box.terminals.get(controlRef.sessionId) diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 4cf950bb..25c8cc39 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -1,6 +1,7 @@ import assert from 'node:assert/strict' import { resolve } from 'node:path' import test from 'node:test' +import { AuthError, QuotaError } from '@tangle-network/sandbox' import { toEvent } from '../dist/adapters/tui/ui-projection.js' import { PROOF_OPERATIONS, proofReceipt } from '../scripts/live-required/contracts.mjs' import { prepareProductionWorkspace } from '../scripts/live-required/headless.mjs' @@ -9,6 +10,10 @@ import { DEFAULT_TANGLE_ROUTER_MODEL_ID, } from '../scripts/live-required/model-defaults.mjs' import { MULTIRUN_REQUIRED_PHASES } from '../scripts/live-required/multirun-contract.mjs' +import { + PROVIDER_OBSERVATION_INTERVAL_MS, + waitForProviderObservation, +} from '../scripts/live-required/provider-observation.mjs' import { supervisorProfile } from '../scripts/live-required/supervisor.mjs' import { runSandbox, runTangleFlows } from '../scripts/live-required/tangle.mjs' import { sandboxEnvironment } from '../scripts/live-required/tangle-sandbox-braid-execution-soak.mjs' @@ -528,6 +533,49 @@ test('LIVE-08 uses Pi native shell input for non-model workspace mutations', () assert.equal(commands.filter((command) => command.startsWith('!!')).length, 2) }) +test('LIVE-08 provider observation honors typed rate limits within one deadline', async () => { + let clock = 0 + let attempts = 0 + const pauses = [] + const result = await waitForProviderObservation( + 'provider readback', + async () => { + attempts += 1 + if (attempts === 1) { + throw new QuotaError('rate_limit', 'Too many requests', undefined, undefined, { + retryAfterMs: 750, + }) + } + return attempts === 3 ? { observed: true } : undefined + }, + 2_000, + { + now: () => clock, + pause: async (milliseconds) => { + pauses.push(milliseconds) + clock += milliseconds + }, + }, + ) + + assert.deepEqual(result, { observed: true }) + assert.deepEqual(pauses, [750, PROVIDER_OBSERVATION_INTERVAL_MS]) +}) + +test('LIVE-08 provider observation fails immediately for non-transient errors', async () => { + let pauses = 0 + const error = new AuthError('invalid test credential') + await assert.rejects( + waitForProviderObservation('provider readback', async () => Promise.reject(error), 2_000, { + pause: async () => { + pauses += 1 + }, + }), + (candidate) => candidate === error, + ) + assert.equal(pauses, 0) +}) + test('LIVE-08 cancels a streaming run before exact cleanup after an early flow failure', async () => { const controlRef = { provider: 'tangle-sandbox', From 8748e10744763a82a33fcb5c36ddfc8118fca73e Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:55:03 -0600 Subject: [PATCH 112/136] fix(process): account for detached owner groups --- scripts/live-bridge/process-tree.mjs | 13 ++-- scripts/live-bridge/process.test.mjs | 93 +++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 6 deletions(-) diff --git a/scripts/live-bridge/process-tree.mjs b/scripts/live-bridge/process-tree.mjs index 28fee222..bad23a26 100644 --- a/scripts/live-bridge/process-tree.mjs +++ b/scripts/live-bridge/process-tree.mjs @@ -344,17 +344,22 @@ class PosixProcessTreeTracker { const rootActive = root.identity !== undefined if (root.reused) this.failure = 'The POSIX owner PID was reused before cleanup completed' if (this.failure !== undefined) return unsupported(this.failure) + const processGroup = processGroupPresent(this.rootPid) + if (processGroup === undefined) + return unsupported(`The POSIX process group for ${this.rootPid} could not be inspected`) + // The detached owner group catches descendants that exit before lineage polling observes them. return { supported: true, - gone: !rootActive && active.length === 0, - present: rootActive || active.length > 0, + gone: !rootActive && active.length === 0 && !processGroup, + present: rootActive || active.length > 0 || processGroup, pids: active.map(({ pid }) => pid), roots: rootActive ? [this.rootPid] : [], - version: rootActive || active.length > 0 ? 0 : 1, + version: rootActive || active.length > 0 || processGroup ? 0 : 1, mechanism: 'posix-descendant-tracker', ownership: 'pid-start-time-and-descendant-lineage', observed: this.rootObserved, escaped: !rootActive && active.some(({ ppid }) => ppid !== this.rootPid), + processGroup, } } @@ -365,7 +370,7 @@ class PosixProcessTreeTracker { let sent = false let groupSent = false const root = this.entries.get(this.rootPid) - if (root !== undefined && root.processGroup === this.rootPid) { + if (root === undefined || root.processGroup === this.rootPid) { try { process.kill(-this.rootPid, signal) groupSent = true diff --git a/scripts/live-bridge/process.test.mjs b/scripts/live-bridge/process.test.mjs index a14397d8..06f505e6 100644 --- a/scripts/live-bridge/process.test.mjs +++ b/scripts/live-bridge/process.test.mjs @@ -1,11 +1,11 @@ import assert from 'node:assert/strict' -import { mkdtemp, readFile, rm } from 'node:fs/promises' +import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import test from 'node:test' import * as pty from 'node-pty' import { runCommand } from './command.mjs' -import { managedSpawn, terminateProcess } from './process.mjs' +import { managedSpawn, RpcSession, terminateProcess } from './process.mjs' import { processTreeEnvironment, processTreeStatus, @@ -182,3 +182,92 @@ test('detached descendants stay owned after their parent exits', { await rm(root, { recursive: true, force: true }) } }) + +test('RPC stop cleanup proves terminal state and kills an unmarked process-group descendant', { + skip: process.platform !== 'linux', +}, async () => { + const root = await mkdtemp(join(tmpdir(), 'braid-rpc-stop-cleanup-')) + const binary = join(root, 'rpc-child.mjs') + const pidPath = join(root, 'descendant.pid') + const source = `import { spawn } from 'node:child_process' +import { writeFileSync } from 'node:fs' + +let buffer = '' +const run = { id: 'run-stop-proof', status: 'streaming' } +const emit = (value) => process.stdout.write(\`\${JSON.stringify(value)}\\n\`) +const state = () => emit({ type: 'state', state: { runs: [{ ...run }] } }) +const respond = (request) => { + if (request.command === 'initialize') { + emit({ type: 'ack', requestId: request.requestId, command: request.command }) + state() + } else if (request.command === 'cancel_run') { + run.status = 'cancelled' + emit({ type: 'ack', requestId: request.requestId, command: request.command }) + state() + } else if (request.command === 'shutdown') { + emit({ type: 'ack', requestId: request.requestId, command: request.command }) + } +} +process.stdin.setEncoding('utf8') +process.stdin.on('data', (chunk) => { + buffer += chunk + for (;;) { + const newline = buffer.indexOf('\\n') + if (newline < 0) break + const line = buffer.slice(0, newline) + buffer = buffer.slice(newline + 1) + if (line.length > 0) respond(JSON.parse(line)) + } +}) +process.stdin.on('end', () => { + const descendant = spawn(process.execPath, ['-e', 'setInterval(() => {}, 1000)'], { + stdio: 'inherit', + env: Object.fromEntries(Object.entries(process.env).filter(([name]) => name !== 'BRAID_PROCESS_TREE_TOKEN')), + }) + descendant.unref() + writeFileSync(process.env.PID_PATH, String(descendant.pid)) + process.exit(0) +}) +` + await writeFile(binary, source, { mode: 0o700 }) + + let session + try { + session = await RpcSession.create(binary, root, { PID_PATH: pidPath }, 4_000) + session.send({ requestId: 'request-initialize', command: 'initialize' }) + await session.waitFor( + 'running terminal state', + (candidate) => + candidate.type === 'state' && candidate.state?.runs?.[0]?.status === 'streaming', + ) + + session.send({ + requestId: 'request-cancel', + operationId: 'op-live-required-cancel-stop-proof', + command: 'cancel_run', + params: { runId: 'run-stop-proof' }, + }) + const stopped = await session.waitFor( + 'cancelled terminal state', + (candidate) => + candidate.type === 'state' && candidate.state?.runs?.[0]?.status === 'cancelled', + ) + assert.equal(stopped.state.runs[0].id, 'run-stop-proof') + const closed = await session.close() + assert.equal(closed.natural.cleanupStatus, 'still-running', JSON.stringify(closed)) + assert.equal(closed.termination.initialTree.processGroup, true, JSON.stringify(closed)) + assert.equal(closed.termination.termSignal?.method, 'process-group', JSON.stringify(closed)) + assert.equal(closed.termination.exited, true, JSON.stringify(closed)) + assert.equal(closed.termination.descendantsVerified, true, JSON.stringify(closed)) + assert.equal(closed.termination.tree.gone, true, JSON.stringify(closed)) + assert.equal(closed.exit.timeout, undefined, JSON.stringify(closed)) + assert.equal(closed.exit.code, 0, JSON.stringify(closed)) + } finally { + try { + const pid = Number(await readFile(pidPath, 'utf8')) + if (Number.isInteger(pid) && pid > 0) process.kill(pid, 'SIGKILL') + } catch {} + await session?.forceStop().catch(() => undefined) + await rm(root, { recursive: true, force: true }) + } +}) From cabecfd257a435c9fadc632cc4591b4eb7a120ee Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:58:20 -0600 Subject: [PATCH 113/136] fix(live): preserve provider read failures --- .../tangle-sandbox-braid-interactive.mjs | 37 +++++++++++----- .../tangle-sandbox-braid-stress.mjs | 20 +++++++-- test/tangle-live07-wiring.test.mjs | 43 ++++++++++++++++++- 3 files changed, 83 insertions(+), 17 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 43db477a..5a3ec0f4 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -46,6 +46,7 @@ import { providerWorkspaceReadbackEvidence, publicAccountIdentityEvidence, readRetainedWorkspaceFile, + retainedBox, singleRunSpendDisclosure, telemetryDisclosure, usage, @@ -264,12 +265,19 @@ export function assertInteractiveOwnedResourceCleanup(cleanup, expectedEnvironme } async function waitForProviderReadback(client, controlRef, path, expectedValue, timeoutMs, label) { + const box = await waitForProviderObservation( + `${label} retained Sandbox`, + () => retainedBox(client, controlRef, label), + timeoutMs, + ) const observation = await waitForProviderObservation( `${label} provider readback`, () => - readRetainedWorkspaceFile(client, controlRef, path, { label, allowMissing: true }).then( - (value) => (value?.value === expectedValue ? value : undefined), - ), + readRetainedWorkspaceFile(client, controlRef, path, { + label, + allowMissing: true, + box, + }).then((value) => (value?.value === expectedValue ? value : undefined)), timeoutMs, ) return assertProviderBoundEvidence( @@ -280,6 +288,11 @@ async function waitForProviderReadback(client, controlRef, path, expectedValue, async function waitForExecutionAttempt(client, controlRef, path, expectedAttempt, timeoutMs) { const expectedValue = `${expectedAttempt}\n` + const box = await waitForProviderObservation( + 'Execution-attempt retained Sandbox', + () => retainedBox(client, controlRef, 'Execution-attempt ledger'), + timeoutMs, + ) let previousValue let stableReads = 0 const observation = await waitForProviderObservation( @@ -288,6 +301,7 @@ async function waitForExecutionAttempt(client, controlRef, path, expectedAttempt const value = await readRetainedWorkspaceFile(client, controlRef, path, { label: 'Execution-attempt ledger', allowMissing: true, + box, }) if (value?.value === undefined) return undefined assertSingleExecutionAttemptLedger(value.value, expectedAttempt) @@ -418,9 +432,10 @@ async function listAllSandboxResources(client) { } } -async function observeInteractiveResource(client, controlRef, runId) { +async function observeInteractiveResource(client, controlRef, runId, { box: providedBox } = {}) { const expectedName = interactiveResourceName(runId) - const box = await client.get(controlRef.environmentId) + const box = + providedBox ?? (await retainedBox(client, controlRef, 'Interactive Sandbox observation')) if (box === null) { throw new Error(`Interactive Sandbox ${controlRef.environmentId} was not visible`) } @@ -839,17 +854,17 @@ async function observeSandbox( expectedRunning, expectedGeometry, ) { - const resource = await waitForProviderObservation( + const box = await waitForProviderObservation( 'interactive Sandbox identity', - () => observeInteractiveResource(client, controlRef, runId), + () => retainedBox(client, controlRef, 'Interactive Sandbox observation'), timeoutMs, ) - const box = await waitForProviderObservation( - 'interactive Sandbox client', - () => client.get(controlRef.environmentId), + const resource = await waitForProviderObservation( + 'interactive Sandbox ownership', + () => observeInteractiveResource(client, controlRef, runId, { box }), timeoutMs, ) - assert.equal(box?.id, resource.id, 'Sandbox observation changed environment identity') + assert.equal(box.id, resource.id, 'Sandbox observation changed environment identity') assert.ok(box.terminals && typeof box.terminals.get === 'function') let terminal await waitForProviderObservation( diff --git a/scripts/live-required/tangle-sandbox-braid-stress.mjs b/scripts/live-required/tangle-sandbox-braid-stress.mjs index 22f447c7..23c7fe41 100644 --- a/scripts/live-required/tangle-sandbox-braid-stress.mjs +++ b/scripts/live-required/tangle-sandbox-braid-stress.mjs @@ -207,7 +207,7 @@ function proofPrompts(coordinates, holdMs) { } } -async function retainedBox(client, controlRef, label) { +export async function retainedBox(client, controlRef, label) { if (!client) { throw new MissingIntegrationError(`${label} requires the Sandbox verification client`, { required: 'BRAID_TANGLE_SANDBOX_API_KEY or TANGLE_API_KEY', @@ -226,20 +226,32 @@ export async function readRetainedWorkspaceFile( client, controlRef, path, - { label = 'Workspace file read', allowMissing = false } = {}, + { label = 'Workspace file read', allowMissing = false, box: providedBox } = {}, ) { - const box = await retainedBox(client, controlRef, label) + const box = providedBox ?? (await retainedBox(client, controlRef, label)) + if (!box || !retainedResourceIdentity(box, controlRef)) { + throw new MissingIntegrationError(`${label} did not resolve the exact retained Sandbox`, { + environmentId: controlRef?.environmentId, + }) + } const relativePath = sandboxWorkspaceRelativePath(path) let value try { value = await box.read(relativePath) } catch (error) { - if (allowMissing) return undefined + if (allowMissing && isMissingWorkspaceFileError(error)) return undefined throw error } return { environmentId: box.id, path: relativePath, value } } +function isMissingWorkspaceFileError(error) { + const status = error?.status ?? error?.statusCode + if (status === 404 || status === '404') return true + if (error?.code === 'NOT_FOUND' || error?.name === 'NotFoundError') return true + return /\b(?:enoent|no such file|file not found)\b/iu.test(error?.message ?? '') +} + export function providerWorkspaceReadbackEvidence( observation, expectedValue, diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 25c8cc39..f1428bba 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -1,7 +1,7 @@ import assert from 'node:assert/strict' import { resolve } from 'node:path' import test from 'node:test' -import { AuthError, QuotaError } from '@tangle-network/sandbox' +import { AuthError, NotFoundError, QuotaError } from '@tangle-network/sandbox' import { toEvent } from '../dist/adapters/tui/ui-projection.js' import { PROOF_OPERATIONS, proofReceipt } from '../scripts/live-required/contracts.mjs' import { prepareProductionWorkspace } from '../scripts/live-required/headless.mjs' @@ -30,7 +30,10 @@ import { waitForInteractiveIdentityFrame, } from '../scripts/live-required/tangle-sandbox-braid-interactive.mjs' import { sandboxConfiguration as multirunSandboxConfiguration } from '../scripts/live-required/tangle-sandbox-braid-multirun.mjs' -import { assertSingleExecutionAttemptLedger } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' +import { + assertSingleExecutionAttemptLedger, + readRetainedWorkspaceFile, +} from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' import { backendConfiguration as workerBackendConfiguration } from '../scripts/live-required/tangle-sandbox-worker.mjs' import { sandboxConfiguration as workspaceSandboxConfiguration } from '../scripts/live-required/tangle-workspace-proof.mjs' import { @@ -576,6 +579,42 @@ test('LIVE-08 provider observation fails immediately for non-transient errors', assert.equal(pauses, 0) }) +test('LIVE-08 missing-file polling never hides a provider failure', async () => { + const controlRef = { + environmentId: 'sandbox-live-08-readback', + sessionId: 'session-live-08-readback', + } + const error = new AuthError('invalid test credential') + const box = { + id: controlRef.environmentId, + name: `braid-${controlRef.sessionId}`, + metadata: { + owner: 'braid', + lifecycle: 'retained', + providerSessionId: controlRef.sessionId, + }, + async read() { + throw error + }, + } + await assert.rejects( + readRetainedWorkspaceFile({}, controlRef, 'proof.txt', { + allowMissing: true, + box, + }), + (candidate) => candidate === error, + ) + + box.read = async () => Promise.reject(new NotFoundError('file', 'proof.txt')) + assert.equal( + await readRetainedWorkspaceFile({}, controlRef, 'proof.txt', { + allowMissing: true, + box, + }), + undefined, + ) +}) + test('LIVE-08 cancels a streaming run before exact cleanup after an early flow failure', async () => { const controlRef = { provider: 'tangle-sandbox', From 0fad4151af56cca23a65ddfa63df71dfe0944155 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 03:59:16 -0600 Subject: [PATCH 114/136] fix(live): wait for semantic Pi terminal readiness --- .../tangle-sandbox-braid-interactive.mjs | 33 +++- scripts/live-required/terminal-quiescence.mjs | 149 ++++++++++++++++++ test/tangle-live07-wiring.test.mjs | 91 +++++++++++ 3 files changed, 270 insertions(+), 3 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 5a3ec0f4..4c6b70a2 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -52,7 +52,11 @@ import { usage, } from './tangle-sandbox-braid-stress.mjs' import { resourceDelta } from './tangle-sandbox-braid-stress-support.mjs' -import { createTerminalOutputTracker, waitForTerminalQuiescence } from './terminal-quiescence.mjs' +import { + createTerminalOutputTracker, + waitForPiTerminalReady, + waitForTerminalQuiescence, +} from './terminal-quiescence.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') @@ -593,6 +597,16 @@ function createPty(binary, config, statePath, exitTimeoutMs) { waitForTerminalQuiescence(timeoutMs, afterRevision) { return waitForTerminalQuiescence(outputTracker, { timeoutMs, afterRevision, pause: sleep }) }, + waitForPiTerminalReady(timeoutMs, afterRevision, beforeScreen) { + return waitForPiTerminalReady({ + tracker: outputTracker, + readScreen: () => terminalText(terminal), + timeoutMs, + afterRevision, + beforeScreen, + pause: sleep, + }) + }, write(value) { child.write(value) }, @@ -1301,6 +1315,8 @@ async function runProof({ const [interactiveCommand, inputCommand, detach, , attach, reconnectCommand] = interactiveProofCommandSequence(markers) const promptCount = occurrences(runtime.output, markers.output) + const interactiveBeforeScreen = runtime.screen + const interactiveActionRevision = runtime.terminalOutputRevision runtime.write(`${interactiveCommand}\r`) await waitFor( 'native interactive output', @@ -1314,7 +1330,11 @@ async function runProof({ }, timeoutMs, ) - await runtime.waitForTerminalQuiescence(timeoutMs) + await runtime.waitForPiTerminalReady( + timeoutMs, + interactiveActionRevision, + interactiveBeforeScreen, + ) const { frame: initialFrame, identity: initialIdentity } = await waitForInteractiveIdentityFrame({ captureFrame: () => captureStateFrame(runtime, recordPath, timeoutMs), @@ -1329,6 +1349,8 @@ async function runProof({ true, { cols: 120, rows: 36 }, ) + const inputBeforeScreen = runtime.screen + const inputActionRevision = runtime.terminalOutputRevision runtime.write(`${inputCommand}\r`) const inputEvidence = await waitForProviderReadback( client, @@ -1338,12 +1360,14 @@ async function runProof({ timeoutMs, 'interactive input', ) + await runtime.waitForPiTerminalReady(timeoutMs, inputActionRevision, inputBeforeScreen) runtime.write(detach) await proveTuiReturned(runtime, timeoutMs, 'native interactive detach') const attachOutputRevision = runtime.terminalOutputRevision + const attachBeforeScreen = runtime.screen runtime.write(`${attach}\r`) - await runtime.waitForTerminalQuiescence(timeoutMs, attachOutputRevision) + await runtime.waitForPiTerminalReady(timeoutMs, attachOutputRevision, attachBeforeScreen) const resizeOutputRevision = runtime.terminalOutputRevision runtime.resize(100, 30) await runtime.waitForTerminalQuiescence(timeoutMs, resizeOutputRevision) @@ -1368,6 +1392,8 @@ async function runProof({ reconnectedIdentity.controlRef, 'native reconnect provider control reference', ) + const reconnectBeforeScreen = runtime.screen + const reconnectActionRevision = runtime.terminalOutputRevision runtime.write(`${reconnectCommand}\r`) const reconnectEvidence = await waitForProviderReadback( client, @@ -1377,6 +1403,7 @@ async function runProof({ timeoutMs, 'interactive reconnect input', ) + await runtime.waitForPiTerminalReady(timeoutMs, reconnectActionRevision, reconnectBeforeScreen) const executionAttempt = await waitForExecutionAttempt( client, initialIdentity.controlRef, diff --git a/scripts/live-required/terminal-quiescence.mjs b/scripts/live-required/terminal-quiescence.mjs index 1b1e3d35..119eed50 100644 --- a/scripts/live-required/terminal-quiescence.mjs +++ b/scripts/live-required/terminal-quiescence.mjs @@ -10,6 +10,155 @@ export const PI_LOADER_INTERVAL_MS = 80 export const TERMINAL_QUIET_INTERVAL_MS = PI_LOADER_INTERVAL_MS * 3 export const TERMINAL_QUIET_POLL_INTERVAL_MS = 25 +const PI_EDITOR_RULE_PATTERN = /^─{8,}$/u +const PI_FOOTER_PATH_PATTERN = /^(?:~|\/)[^\n]*$/u +const PI_WORKING_STATUS_PATTERN = + /\b(?:Working(?:\.\.\.|…)|Retrying\b|Compacting\b|Summarizing branch\b)/iu +const PI_SPINNER_PATTERN = /^[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\s/u +const TERMINAL_ESCAPE = String.fromCharCode(27) +const TERMINAL_BELL = String.fromCharCode(7) +const OSC_TERMINAL_SEQUENCE = new RegExp( + `${TERMINAL_ESCAPE}\\][^${TERMINAL_BELL}]*(?:${TERMINAL_BELL}|${TERMINAL_ESCAPE}\\\\)`, + 'gu', +) +const CSI_TERMINAL_SEQUENCE = new RegExp(`${TERMINAL_ESCAPE}\\[[0-?]*[ -/]*[@-~]`, 'gu') +const CHARSET_TERMINAL_SEQUENCE = new RegExp(`${TERMINAL_ESCAPE}\\([0-2A-Za-z]`, 'gu') + +function stripTerminalSequences(value) { + return value + .replace(OSC_TERMINAL_SEQUENCE, '') + .replace(CSI_TERMINAL_SEQUENCE, '') + .replace(CHARSET_TERMINAL_SEQUENCE, '') +} + +function screenRows(screen) { + if (typeof screen !== 'string') throw new TypeError('Pi terminal screen must be a string') + return stripTerminalSequences(screen) + .split(/\r?\n/u) + .map((line) => line.replace(/[ \t]+$/u, '')) +} + +function piEditorRule(line) { + return PI_EDITOR_RULE_PATTERN.test(line.trim()) +} + +function piComposerBounds(rows) { + const rules = [] + for (let index = 0; index < rows.length; index += 1) { + if (piEditorRule(rows[index] ?? '')) rules.push(index) + } + for (let index = rules.length - 2; index >= 0; index -= 1) { + const top = rules[index] + const bottom = rules[index + 1] + if (top === undefined || bottom === undefined || bottom <= top + 1) continue + const trailingRows = rows.slice(bottom + 1).filter((line) => line.trim().length > 0) + if (trailingRows.length > 3) continue + const footerPath = trailingRows.findIndex((line) => PI_FOOTER_PATH_PATTERN.test(line.trim())) + if (footerPath >= 0) return { top, bottom, footer: bottom + 1 + footerPath } + } + return undefined +} + +function piStatusRows(rows, top) { + const start = Math.max(0, top - 8) + return rows + .slice(start, top) + .map((line) => line.trim()) + .filter((line) => line.length > 0) +} + +function normalizedScreen(screen) { + return screenRows(screen).join('\n').trim() +} + +/** + * Classify the visible state of Pi's interactive terminal. + * + * Pi 0.84.4 renders a `Working...` status indicator above its editor. + * Its ready composer has two horizontal editor rules and a cwd footer row. + * These are public rendered behaviors, so this check does not inspect Pi's + * private session state or guess from elapsed time. + */ +export function piTerminalScreenState(screen) { + const rows = screenRows(screen) + const composer = piComposerBounds(rows) + if (composer === undefined) return { state: 'unknown', reason: 'composer-not-visible' } + const status = piStatusRows(rows, composer.top) + const working = status.find( + (line) => PI_WORKING_STATUS_PATTERN.test(line) || PI_SPINNER_PATTERN.test(line), + ) + if (working !== undefined) { + return { state: 'working', composer, status: working } + } + return { state: 'ready', composer } +} + +/** + * Wait until Pi has rendered a ready composer after an action. + * + * A quiet renderer is necessary but insufficient: a static `Working...` line + * can remain after its spinner stops, and a stale ready screen can precede a + * delayed remote render. The optional baseline requires a visible transition + * before readiness is accepted. + */ +export async function waitForPiTerminalReady({ + tracker, + readScreen, + timeoutMs, + afterRevision, + beforeScreen, + now = () => performance.now(), + pause = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)), +} = {}) { + if ( + !tracker || + typeof tracker.isQuiescent !== 'function' || + typeof tracker.snapshot !== 'function' + ) { + throw new TypeError('terminal output tracker is required') + } + if (typeof readScreen !== 'function') throw new TypeError('Pi terminal screen reader is required') + if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) { + throw new RangeError('Pi terminal readiness timeout must be positive') + } + if (afterRevision !== undefined && (!Number.isSafeInteger(afterRevision) || afterRevision < 0)) { + throw new RangeError('terminal output revision must be a non-negative safe integer') + } + + const baseline = beforeScreen === undefined ? undefined : normalizedScreen(beforeScreen) + const deadline = now() + timeoutMs + let sawWorking = false + let sawScreenChange = false + let lastState = { state: 'unknown', reason: 'not-observed' } + for (;;) { + const screen = readScreen() + const state = piTerminalScreenState(screen) + lastState = state + if (state.state === 'working') sawWorking = true + if (baseline !== undefined && normalizedScreen(screen) !== baseline) sawScreenChange = true + const snapshot = tracker.snapshot() + const observedAfterAction = afterRevision === undefined || snapshot.revision > afterRevision + const transitioned = + baseline === undefined || sawWorking || sawScreenChange || state.state === 'working' + if (observedAfterAction && tracker.isQuiescent() && state.state === 'ready' && transitioned) { + return { ...snapshot, readiness: state, transitioned } + } + if (now() >= deadline) { + throw new Error( + `Pi terminal did not become ready after ${timeoutMs}ms: ${JSON.stringify({ + ...snapshot, + state: lastState.state, + reason: lastState.reason, + observedAfterAction, + sawWorking, + sawScreenChange, + })}`, + ) + } + await pause(Math.min(TERMINAL_QUIET_POLL_INTERVAL_MS, Math.max(0, deadline - now()))) + } +} + export function createTerminalOutputTracker({ now = () => performance.now(), quietIntervalMs = TERMINAL_QUIET_INTERVAL_MS, diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index f1428bba..b690621f 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -39,7 +39,9 @@ import { sandboxConfiguration as workspaceSandboxConfiguration } from '../script import { createTerminalOutputTracker, PI_LOADER_INTERVAL_MS, + piTerminalScreenState, TERMINAL_QUIET_INTERVAL_MS, + waitForPiTerminalReady, waitForTerminalQuiescence, } from '../scripts/live-required/terminal-quiescence.mjs' @@ -794,6 +796,95 @@ test('LIVE-08 waits for renderer quiescence instead of guessing a sleep', async assert.equal(waited.quietIntervalMs, TERMINAL_QUIET_INTERVAL_MS) }) +function piScreen(status = '') { + const rule = '─'.repeat(40) + return [ + 'assistant response', + ...(status.length === 0 ? [] : [status]), + 'marker', + rule, + ' '.repeat(40), + ' '.repeat(40), + rule, + '/home/agent', + '[tmux status]', + ].join('\n') +} + +function advanceUntilTimeout(clock, tracker, screen, beforeScreen) { + return waitForPiTerminalReady({ + tracker, + readScreen: () => screen, + timeoutMs: TERMINAL_QUIET_INTERVAL_MS, + afterRevision: 0, + beforeScreen, + now: () => clock.value, + pause: async (milliseconds) => { + clock.value += milliseconds + }, + }) +} + +test('LIVE-08 rejects a quiet Pi screen while the model status still says Working', async () => { + const clock = { value: 0 } + const screen = piScreen('⠋ Working...') + const tracker = createTerminalOutputTracker({ now: () => clock.value }) + tracker.observe('completed renderer write', (settle) => settle()) + assert.equal(piTerminalScreenState(screen).state, 'working') + await assert.rejects( + advanceUntilTimeout(clock, tracker, screen, screen), + /did not become ready/iu, + ) + assert.equal(tracker.isQuiescent(), true, 'the failure must be semantic, not renderer output') +}) + +test('LIVE-08 rejects a stale ready Pi screen with no rendered transition', async () => { + const clock = { value: 0 } + const screen = piScreen() + const tracker = createTerminalOutputTracker({ now: () => clock.value }) + tracker.observe('action output with unchanged screen', (settle) => settle()) + assert.equal(piTerminalScreenState(screen).state, 'ready') + await assert.rejects( + advanceUntilTimeout(clock, tracker, screen, screen), + /did not become ready/iu, + ) +}) + +test('LIVE-08 accepts the ready Pi composer after a working-to-complete transition', async () => { + const clock = { value: 0 } + let screen = piScreen('⠋ Working...') + const tracker = createTerminalOutputTracker({ now: () => clock.value }) + tracker.observe('working render', (settle) => settle()) + let completed = false + const result = await waitForPiTerminalReady({ + tracker, + readScreen: () => screen, + timeoutMs: 2_000, + afterRevision: 0, + beforeScreen: screen, + now: () => clock.value, + pause: async (milliseconds) => { + clock.value += milliseconds + if (!completed) { + completed = true + screen = piScreen() + tracker.observe('completed render', (settle) => settle()) + } + }, + }) + assert.equal(result.readiness.state, 'ready') + assert.equal(result.transitioned, true) + assert.equal(result.pendingWrites, 0) +}) + +test('LIVE-08 times out closed when Pi never renders its ready composer', async () => { + const clock = { value: 0 } + const screen = 'Pi output without the composer or cwd footer' + const tracker = createTerminalOutputTracker({ now: () => clock.value }) + tracker.observe('action output', (settle) => settle()) + await assert.rejects(advanceUntilTimeout(clock, tracker, screen, ''), /did not become ready/iu) +}) + test('LIVE-08 waits past streamed output until retained admission is durable', async () => { const controlRef = { provider: 'tangle-sandbox', From d31c04620d0c180a05ebe9d1cb9c250e07338bca Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 04:12:32 -0600 Subject: [PATCH 115/136] fix(live): verify stop process cleanup --- .../live-required/tangle-sandbox-braid-interactive.mjs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 4c6b70a2..3d9cb890 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -28,7 +28,6 @@ import { scalarMeasurement, } from './contracts.mjs' import { - closeSession, configEvidence, initializedSession, prepareProductionWorkspace, @@ -41,7 +40,7 @@ import { accountIdentity, assertSingleExecutionAttemptLedger, assertStableAccountIdentity, - assertVerifiedProcessCleanup, + closeBraidWithProof, executionAttemptLedgerPath, providerWorkspaceReadbackEvidence, publicAccountIdentityEvidence, @@ -1228,9 +1227,8 @@ async function stopThroughBraid(binary, config, runId, timeoutMs) { result = { operationId, acknowledgement, run: stoppedRun, controlRef } } } finally { - const closed = await closeSession(initialized.session) - const processCleanup = assertVerifiedProcessCleanup( - closed?.termination, + const processCleanup = await closeBraidWithProof( + initialized.session, 'Braid interactive stop RPC process', ) if (result !== undefined) result = { ...result, processCleanup } From 2ffe5aa7c4c75dc703ed5ca4e8d3d1c0b5ad404d Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 04:12:52 -0600 Subject: [PATCH 116/136] fix(live): constrain Pi active status detection --- scripts/live-required/terminal-quiescence.mjs | 12 +++++------ test/tangle-live07-wiring.test.mjs | 20 ++++++++++++++++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/scripts/live-required/terminal-quiescence.mjs b/scripts/live-required/terminal-quiescence.mjs index 119eed50..8ec3cd8b 100644 --- a/scripts/live-required/terminal-quiescence.mjs +++ b/scripts/live-required/terminal-quiescence.mjs @@ -12,9 +12,9 @@ export const TERMINAL_QUIET_POLL_INTERVAL_MS = 25 const PI_EDITOR_RULE_PATTERN = /^─{8,}$/u const PI_FOOTER_PATH_PATTERN = /^(?:~|\/)[^\n]*$/u -const PI_WORKING_STATUS_PATTERN = - /\b(?:Working(?:\.\.\.|…)|Retrying\b|Compacting\b|Summarizing branch\b)/iu -const PI_SPINNER_PATTERN = /^[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\s/u +const PI_WIDGET_REGION_ROWS = 10 +const PI_ACTIVE_STATUS_ROW_PATTERN = + /^[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\s+(?:Working(?:\.\.\.|…)|Retrying\b|Compacting\b|Auto-compacting\b|Context overflow detected,\s+Auto-compacting\b|Summarizing branch\b)/iu const TERMINAL_ESCAPE = String.fromCharCode(27) const TERMINAL_BELL = String.fromCharCode(7) const OSC_TERMINAL_SEQUENCE = new RegExp( @@ -60,7 +60,7 @@ function piComposerBounds(rows) { } function piStatusRows(rows, top) { - const start = Math.max(0, top - 8) + const start = Math.max(0, top - PI_WIDGET_REGION_ROWS) return rows .slice(start, top) .map((line) => line.trim()) @@ -84,9 +84,7 @@ export function piTerminalScreenState(screen) { const composer = piComposerBounds(rows) if (composer === undefined) return { state: 'unknown', reason: 'composer-not-visible' } const status = piStatusRows(rows, composer.top) - const working = status.find( - (line) => PI_WORKING_STATUS_PATTERN.test(line) || PI_SPINNER_PATTERN.test(line), - ) + const working = status.find((line) => PI_ACTIVE_STATUS_ROW_PATTERN.test(line)) if (working !== undefined) { return { state: 'working', composer, status: working } } diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index b690621f..3596bb43 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -796,11 +796,12 @@ test('LIVE-08 waits for renderer quiescence instead of guessing a sleep', async assert.equal(waited.quietIntervalMs, TERMINAL_QUIET_INTERVAL_MS) }) -function piScreen(status = '') { +function piScreen(status = '', { statusSpacing = 0 } = {}) { const rule = '─'.repeat(40) return [ 'assistant response', ...(status.length === 0 ? [] : [status]), + ...Array.from({ length: statusSpacing }, () => ''), 'marker', rule, ' '.repeat(40), @@ -838,6 +839,23 @@ test('LIVE-08 rejects a quiet Pi screen while the model status still says Workin assert.equal(tracker.isQuiescent(), true, 'the failure must be semantic, not renderer output') }) +test('LIVE-08 ignores transcript text that mentions Working without the status prefix', () => { + const screen = piScreen('The transcript says Working... before the last tool call') + assert.equal(piTerminalScreenState(screen).state, 'ready') +}) + +test('LIVE-08 ignores unknown spinner-prefixed transcript text', () => { + const screen = piScreen('⠋ Working on the release notes') + assert.equal(piTerminalScreenState(screen).state, 'ready') +}) + +test('LIVE-08 finds the active status across Pi’s ten-line widget region', () => { + const screen = piScreen('⠋ Working...', { statusSpacing: 8 }) + const state = piTerminalScreenState(screen) + assert.equal(state.state, 'working') + assert.equal(state.status, '⠋ Working...') +}) + test('LIVE-08 rejects a stale ready Pi screen with no rendered transition', async () => { const clock = { value: 0 } const screen = piScreen() From 2492e24e7a76d77a1de12d1b662a4d8522250cc8 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 04:14:59 -0600 Subject: [PATCH 117/136] fix(process): guard reused process groups --- scripts/live-bridge/process-tree.mjs | 38 +++++++++++++++++++++----- scripts/live-bridge/process.test.mjs | 40 ++++++++++++++++++++++++++-- 2 files changed, 69 insertions(+), 9 deletions(-) diff --git a/scripts/live-bridge/process-tree.mjs b/scripts/live-bridge/process-tree.mjs index bad23a26..3acd1fba 100644 --- a/scripts/live-bridge/process-tree.mjs +++ b/scripts/live-bridge/process-tree.mjs @@ -214,6 +214,7 @@ class PosixProcessTreeTracker { this.rootPid = numericPid(child.pid) this.rootObserved = false this.rootStartTime = undefined + this.ownerGroupId = undefined this.ownershipDeadline = Date.now() + ownershipObservationTimeoutMs this.released = false this.failure = undefined @@ -242,6 +243,11 @@ class PosixProcessTreeTracker { return } this.rootStartTime = root.startTime + this.ownerGroupId = numericPid(root.processGroup) + if (this.ownerGroupId === undefined) { + this.failure = `The POSIX process ${this.rootPid} has no valid process group` + return + } this.entries.set(root.pid, { ...root, depth: 0 }) if (marker === true) this.rootObserved = true } @@ -336,7 +342,7 @@ class PosixProcessTreeTracker { if (current.inaccessible) return unsupported(`The POSIX process ${entry.pid} could not be inspected`) if (current.reused || current.gone) this.entries.delete(entry.pid) - else if (current.identity !== undefined) active.push(entry) + else if (current.identity !== undefined) active.push({ ...entry, ...current.identity }) } const root = currentIdentity(this.rootPid, this.rootStartTime) if (root.inaccessible) @@ -344,9 +350,17 @@ class PosixProcessTreeTracker { const rootActive = root.identity !== undefined if (root.reused) this.failure = 'The POSIX owner PID was reused before cleanup completed' if (this.failure !== undefined) return unsupported(this.failure) - const processGroup = processGroupPresent(this.rootPid) + const processGroup = processGroupPresent(this.ownerGroupId) if (processGroup === undefined) - return unsupported(`The POSIX process group for ${this.rootPid} could not be inspected`) + return unsupported(`The POSIX process group for ${this.ownerGroupId} could not be inspected`) + const processGroupMember = active.some( + ({ processGroup: groupId }) => groupId === this.ownerGroupId, + ) + if (processGroup && !processGroupMember) + return unsupported( + `The POSIX process group ${this.ownerGroupId} is present without an observed tracked member`, + ) + const processGroupOwned = processGroup && processGroupMember // The detached owner group catches descendants that exit before lineage polling observes them. return { supported: true, @@ -356,10 +370,12 @@ class PosixProcessTreeTracker { roots: rootActive ? [this.rootPid] : [], version: rootActive || active.length > 0 || processGroup ? 0 : 1, mechanism: 'posix-descendant-tracker', - ownership: 'pid-start-time-and-descendant-lineage', + ownership: 'pid-start-time-descendant-lineage-and-process-group-member', observed: this.rootObserved, escaped: !rootActive && active.some(({ ppid }) => ppid !== this.rootPid), processGroup, + processGroupId: this.ownerGroupId, + processGroupOwned, } } @@ -369,10 +385,10 @@ class PosixProcessTreeTracker { if (status.gone) return { method: 'already-exited', sent: false } let sent = false let groupSent = false - const root = this.entries.get(this.rootPid) - if (root === undefined || root.processGroup === this.rootPid) { + const group = status.processGroupOwned === true ? this.ownerGroupId : undefined + if (group !== undefined) { try { - process.kill(-this.rootPid, signal) + process.kill(-group, signal) groupSent = true sent = true } catch (error) { @@ -404,6 +420,7 @@ class PosixProcessTreeTracker { class PosixProcessGroupTracker { constructor(child) { + this.child = child this.rootPid = numericPid(child.pid) } @@ -419,6 +436,13 @@ class PosixProcessGroupTracker { ...unsupported('The POSIX process group could not be inspected'), mechanism: 'posix-process-group', } + if (childHasExited(this.child) && present) + return { + ...unsupported( + `The POSIX process group for ${this.rootPid} remained after its owner process exited`, + ), + mechanism: 'posix-process-group', + } return { supported: true, gone: !present, diff --git a/scripts/live-bridge/process.test.mjs b/scripts/live-bridge/process.test.mjs index 06f505e6..9854da0b 100644 --- a/scripts/live-bridge/process.test.mjs +++ b/scripts/live-bridge/process.test.mjs @@ -2,7 +2,7 @@ import assert from 'node:assert/strict' import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' -import test from 'node:test' +import test, { mock } from 'node:test' import * as pty from 'node-pty' import { runCommand } from './command.mjs' import { managedSpawn, RpcSession, terminateProcess } from './process.mjs' @@ -226,7 +226,7 @@ process.stdin.on('end', () => { }) descendant.unref() writeFileSync(process.env.PID_PATH, String(descendant.pid)) - process.exit(0) + setTimeout(() => process.exit(0), 200) }) ` await writeFile(binary, source, { mode: 0o700 }) @@ -271,3 +271,39 @@ process.stdin.on('end', () => { await rm(root, { recursive: true, force: true }) } }) + +test('refuses to signal a reused process group without an observed owner', { + skip: process.platform !== 'linux', +}, async () => { + const child = await managedSpawn(process.execPath, ['-e', 'process.exit(0)'], { + stdio: 'ignore', + }) + await waitForClose(child) + + const groupSignals = [] + const originalKill = process.kill + const killMock = mock.method(process, 'kill', (pid, signal) => { + if (pid === -child.pid) { + if (signal !== 0) groupSignals.push({ pid, signal }) + if (signal === 0) return true + const error = new Error('group signal must not be attempted') + error.code = 'EPERM' + throw error + } + return originalKill.call(process, pid, signal) + }) + try { + const result = await terminateTrackedProcessTree(child, { + termTimeoutMs: 100, + killTimeoutMs: 100, + }) + + assert.equal(result.termSent, false, JSON.stringify(result)) + assert.equal(result.killSent, false, JSON.stringify(result)) + assert.equal(result.tree.supported, false, JSON.stringify(result)) + assert.match(result.tree.reason, /without an observed tracked member/u) + assert.deepEqual(groupSignals, []) + } finally { + killMock.mock.restore() + } +}) From fc22e0e4ca230725f5d4c9bf2b27941faafeb998 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 04:18:18 -0600 Subject: [PATCH 118/136] fix(live): bound nested provider phases --- .../live-required/provider-observation.mjs | 141 +++++++++++++++--- .../tangle-sandbox-braid-interactive.mjs | 140 ++++++++++++++--- test/tangle-live07-wiring.test.mjs | 81 ++++++++++ 3 files changed, 319 insertions(+), 43 deletions(-) diff --git a/scripts/live-required/provider-observation.mjs b/scripts/live-required/provider-observation.mjs index ee26b58b..da4cf9d2 100644 --- a/scripts/live-required/provider-observation.mjs +++ b/scripts/live-required/provider-observation.mjs @@ -3,54 +3,139 @@ import { NetworkError, QuotaError, ServerError, TimeoutError } from '@tangle-net import { sleep } from '../live-bridge/process.mjs' export const PROVIDER_OBSERVATION_INTERVAL_MS = 500 +const defaultNow = () => performance.now() function transientDelay(error, intervalMs) { if (error instanceof QuotaError) { - return Math.max(intervalMs, error.retryAfterMs ?? 0) + const retryAfterMs = + Number.isFinite(error.retryAfterMs) && error.retryAfterMs >= 0 ? error.retryAfterMs : 0 + return Math.max(intervalMs, retryAfterMs) } if (error instanceof NetworkError || error instanceof TimeoutError) return intervalMs if (error instanceof ServerError && [502, 503, 504].includes(error.status)) return intervalMs return undefined } +function validateLabel(label) { + if (typeof label !== 'string' || label.length === 0) { + throw new TypeError('provider observation label is required') + } +} + +function validateTimeout(timeoutMs) { + if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) { + throw new RangeError('provider observation timeout must be positive') + } +} + +function validateNow(now) { + if (typeof now !== 'function') throw new TypeError('provider observation clock is required') +} + +export function createProviderObservationDeadline(label, timeoutMs, { now = defaultNow } = {}) { + validateLabel(label) + validateTimeout(timeoutMs) + validateNow(now) + const startedAt = now() + if (!Number.isFinite(startedAt)) { + throw new RangeError('provider observation clock must return a finite number') + } + return Object.freeze({ + label, + timeoutMs, + deadline: startedAt + timeoutMs, + now, + }) +} + +function validateDeadline(deadline) { + if ( + deadline === null || + typeof deadline !== 'object' || + !Number.isFinite(deadline.deadline) || + !Number.isFinite(deadline.timeoutMs) || + deadline.timeoutMs <= 0 || + typeof deadline.now !== 'function' + ) { + throw new TypeError('provider observation deadline is invalid') + } +} + +function timeoutError(deadline, label, attempts, transientFailures, lastTransientError, stage) { + const suffix = + stage === undefined + ? '' + : `; ${stage === 'operation' ? 'provider operation' : stage} exceeded deadline` + const error = new Error( + `${label} timed out after ${deadline.timeoutMs}ms (${attempts} attempts, ${transientFailures} transient failures)${suffix}`, + lastTransientError === undefined ? undefined : { cause: lastTransientError }, + ) + error.code = 'PROVIDER_OBSERVATION_TIMEOUT' + error.deadline = deadline.deadline + error.attempts = attempts + error.transientFailures = transientFailures + return error +} + +function assertBeforeDeadline( + deadline, + label, + attempts, + transientFailures, + lastTransientError, + stage, +) { + const now = deadline.now() + if (!Number.isFinite(now)) { + throw new RangeError('provider observation clock must return a finite number') + } + if (now >= deadline.deadline) { + throw timeoutError(deadline, label, attempts, transientFailures, lastTransientError, stage) + } + return now +} + +export function assertProviderObservationDeadline(deadline, label, stage = 'operation') { + validateLabel(label) + validateDeadline(deadline) + return assertBeforeDeadline(deadline, label, 0, 0, undefined, stage) +} + export async function waitForProviderObservation( label, observe, timeoutMs, { intervalMs = PROVIDER_OBSERVATION_INTERVAL_MS, - now = () => performance.now(), + now = defaultNow, pause = sleep, + deadline: providedDeadline, } = {}, ) { - if (typeof label !== 'string' || label.length === 0) { - throw new TypeError('provider observation label is required') - } + validateLabel(label) if (typeof observe !== 'function') throw new TypeError('provider observer is required') - if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) { - throw new RangeError('provider observation timeout must be positive') - } + if (providedDeadline === undefined) validateTimeout(timeoutMs) + else validateDeadline(providedDeadline) if (!Number.isFinite(intervalMs) || intervalMs <= 0) { throw new RangeError('provider observation interval must be positive') } + if (typeof pause !== 'function') throw new TypeError('provider observation pause is required') - const deadline = now() + timeoutMs + const deadline = providedDeadline ?? createProviderObservationDeadline(label, timeoutMs, { now }) let attempts = 0 let transientFailures = 0 let lastTransientError for (;;) { - if (attempts > 0 && now() >= deadline) { - throw new Error( - `${label} timed out after ${timeoutMs}ms (${attempts} attempts, ${transientFailures} transient failures)`, - { cause: lastTransientError }, - ) - } + assertBeforeDeadline(deadline, label, attempts, transientFailures, lastTransientError) attempts += 1 let delayMs = intervalMs + let value try { - const value = await observe() - if (value) return value + value = await observe() } catch (error) { + if (deadline.now() >= deadline.deadline) { + throw timeoutError(deadline, label, attempts, transientFailures, error, 'operation') + } const retryDelayMs = transientDelay(error, intervalMs) if (retryDelayMs === undefined) throw error transientFailures += 1 @@ -58,8 +143,24 @@ export async function waitForProviderObservation( delayMs = retryDelayMs } - const observedAt = now() - if (observedAt >= deadline) continue - await pause(Math.min(delayMs, Math.max(0, deadline - observedAt))) + const observedAt = assertBeforeDeadline( + deadline, + label, + attempts, + transientFailures, + lastTransientError, + 'operation', + ) + if (value !== undefined) return value + + await pause(Math.min(delayMs, deadline.deadline - observedAt)) + assertBeforeDeadline( + deadline, + label, + attempts, + transientFailures, + lastTransientError, + 'retry delay', + ) } } diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 3d9cb890..b45f218d 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -35,7 +35,11 @@ import { rpcState, } from './headless.mjs' import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' -import { waitForProviderObservation } from './provider-observation.mjs' +import { + assertProviderObservationDeadline, + createProviderObservationDeadline, + waitForProviderObservation, +} from './provider-observation.mjs' import { accountIdentity, assertSingleExecutionAttemptLedger, @@ -268,10 +272,12 @@ export function assertInteractiveOwnedResourceCleanup(cleanup, expectedEnvironme } async function waitForProviderReadback(client, controlRef, path, expectedValue, timeoutMs, label) { + const deadline = createProviderObservationDeadline(label, timeoutMs) const box = await waitForProviderObservation( `${label} retained Sandbox`, () => retainedBox(client, controlRef, label), timeoutMs, + { deadline }, ) const observation = await waitForProviderObservation( `${label} provider readback`, @@ -282,6 +288,7 @@ async function waitForProviderReadback(client, controlRef, path, expectedValue, box, }).then((value) => (value?.value === expectedValue ? value : undefined)), timeoutMs, + { deadline }, ) return assertProviderBoundEvidence( providerWorkspaceReadbackEvidence(observation, expectedValue, `provider-bound ${label}`), @@ -291,10 +298,12 @@ async function waitForProviderReadback(client, controlRef, path, expectedValue, async function waitForExecutionAttempt(client, controlRef, path, expectedAttempt, timeoutMs) { const expectedValue = `${expectedAttempt}\n` + const deadline = createProviderObservationDeadline('execution attempt', timeoutMs) const box = await waitForProviderObservation( 'Execution-attempt retained Sandbox', () => retainedBox(client, controlRef, 'Execution-attempt ledger'), timeoutMs, + { deadline }, ) let previousValue let stableReads = 0 @@ -316,6 +325,7 @@ async function waitForExecutionAttempt(client, controlRef, path, expectedAttempt return stableReads >= 3 ? value : undefined }, timeoutMs, + { deadline }, ) const ledger = assertSingleExecutionAttemptLedger(observation.value, expectedAttempt) return { @@ -416,12 +426,25 @@ function sameNameInteractiveResources(resources, expectedName, predicate) { return matches } -async function listAllSandboxResources(client) { +async function listAllSandboxResources( + client, + { + deadline: providedDeadline, + timeoutMs = DEFAULT_TIMEOUT_MS, + label = 'Sandbox resource list', + } = {}, +) { + const deadline = providedDeadline ?? createProviderObservationDeadline(label, timeoutMs) const resources = [] const seenIds = new Set() let offset = 0 for (;;) { - const page = await client.list({ limit: SANDBOX_LIST_PAGE_SIZE, offset }) + const page = await waitForProviderObservation( + `${label} page ${offset}`, + () => client.list({ limit: SANDBOX_LIST_PAGE_SIZE, offset }), + timeoutMs, + { deadline }, + ) if (!Array.isArray(page)) throw new Error('Sandbox list returned an invalid page') for (const resource of page) { if (typeof resource?.id === 'string') { @@ -435,10 +458,24 @@ async function listAllSandboxResources(client) { } } -async function observeInteractiveResource(client, controlRef, runId, { box: providedBox } = {}) { +async function observeInteractiveResource( + client, + controlRef, + runId, + { box: providedBox, deadline: providedDeadline, timeoutMs = DEFAULT_TIMEOUT_MS } = {}, +) { + const deadline = + providedDeadline ?? + createProviderObservationDeadline('Interactive Sandbox observation', timeoutMs) const expectedName = interactiveResourceName(runId) const box = - providedBox ?? (await retainedBox(client, controlRef, 'Interactive Sandbox observation')) + providedBox ?? + (await waitForProviderObservation( + 'Interactive Sandbox identity', + () => retainedBox(client, controlRef, 'Interactive Sandbox observation'), + timeoutMs, + { deadline }, + )) if (box === null) { throw new Error(`Interactive Sandbox ${controlRef.environmentId} was not visible`) } @@ -448,7 +485,11 @@ async function observeInteractiveResource(client, controlRef, runId, { box: prov ) } const matches = sameNameInteractiveResources( - await listAllSandboxResources(client), + await listAllSandboxResources(client, { + deadline, + timeoutMs, + label: 'Interactive Sandbox resource census', + }), expectedName, (resource) => isOwnedInteractiveResource(resource, expectedName), ) @@ -467,19 +508,34 @@ async function observeInteractiveResource(client, controlRef, runId, { box: prov } } -async function cleanupInteractiveByRunId(client, materialization) { +async function cleanupInteractiveByRunId( + client, + materialization, + { deadline: providedDeadline, timeoutMs = DEFAULT_TIMEOUT_MS } = {}, +) { + const deadline = + providedDeadline ?? createProviderObservationDeadline('Interactive Sandbox cleanup', timeoutMs) const runId = materialization?.runId const expectedName = interactiveResourceName(runId) const predicate = (resource) => isOwnedInteractiveResource(resource, expectedName) const listed = sameNameInteractiveResources( - await listAllSandboxResources(client), + await listAllSandboxResources(client, { + deadline, + timeoutMs, + label: 'Interactive Sandbox cleanup resource census', + }), expectedName, predicate, ) const deletions = [] const removedIds = [] for (const resource of listed) { - const exact = await client.get(resource.id) + const exact = await waitForProviderObservation( + `Interactive Sandbox cleanup identity ${resource.id}`, + () => client.get(resource.id), + timeoutMs, + { deadline }, + ) if (exact === null) { deletions.push({ id: resource.id, @@ -495,8 +551,24 @@ async function cleanupInteractiveByRunId(client, materialization) { `Interactive run-derived resource ${resource.id} failed exact ownership validation`, ) } + assertProviderObservationDeadline( + deadline, + `Interactive Sandbox deletion ${resource.id}`, + 'delete', + ) await exact.delete() - if ((await client.get(resource.id)) !== null) { + assertProviderObservationDeadline( + deadline, + `Interactive Sandbox deletion ${resource.id}`, + 'delete', + ) + const remaining = await waitForProviderObservation( + `Interactive Sandbox deletion verification ${resource.id}`, + () => client.get(resource.id), + timeoutMs, + { deadline }, + ) + if (remaining !== null) { throw new Error(`Interactive run-derived resource ${resource.id} remained after delete`) } removedIds.push(resource.id) @@ -509,7 +581,11 @@ async function cleanupInteractiveByRunId(client, materialization) { }) } const remaining = sameNameInteractiveResources( - await listAllSandboxResources(client), + await listAllSandboxResources(client, { + deadline, + timeoutMs, + label: 'Interactive Sandbox cleanup final census', + }), expectedName, predicate, ) @@ -867,15 +943,18 @@ async function observeSandbox( expectedRunning, expectedGeometry, ) { + const deadline = createProviderObservationDeadline('interactive Sandbox observation', timeoutMs) const box = await waitForProviderObservation( 'interactive Sandbox identity', () => retainedBox(client, controlRef, 'Interactive Sandbox observation'), timeoutMs, + { deadline }, ) const resource = await waitForProviderObservation( 'interactive Sandbox ownership', - () => observeInteractiveResource(client, controlRef, runId, { box }), + () => observeInteractiveResource(client, controlRef, runId, { box, deadline, timeoutMs }), timeoutMs, + { deadline }, ) assert.equal(box.id, resource.id, 'Sandbox observation changed environment identity') assert.ok(box.terminals && typeof box.terminals.get === 'function') @@ -886,15 +965,16 @@ async function observeSandbox( terminal = await box.terminals.get(controlRef.sessionId) if (terminal !== null) assert.equal(terminal.sessionId, controlRef.sessionId) if (expectedRunning) { - return ( + const ready = terminal?.isRunning === true && (expectedGeometry === undefined || (terminal.cols === expectedGeometry.cols && terminal.rows === expectedGeometry.rows)) - ) + return ready ? terminal : undefined } - return terminal === null || terminal?.isRunning === false + return terminal === null || terminal?.isRunning === false ? terminal : undefined }, timeoutMs, + { deadline }, ) const stopped = expectedRunning ? undefined : assertStoppedTerminal(terminal) if (expectedGeometry !== undefined) { @@ -911,7 +991,13 @@ async function observeSandbox( if (typeof box.resourceUsage !== 'function') { resourceSample = undefined } else { - resourceSample = await box.resourceUsage() + const sample = await waitForProviderObservation( + 'interactive Sandbox resource usage', + async () => ({ value: await box.resourceUsage() }), + timeoutMs, + { deadline }, + ) + resourceSample = sample.value } } catch (error) { resourceSampleError = safeMessage(error) @@ -933,12 +1019,20 @@ async function observeSandbox( } } -async function cleanupExactSandbox(client, identity) { - const observed = await observeInteractiveResource(client, identity.controlRef, identity.run.id) - const cleanup = await cleanupInteractiveByRunId(client, { - runId: identity.run.id, - phase: 'interactive_started', +async function cleanupExactSandbox(client, identity, timeoutMs = DEFAULT_TIMEOUT_MS) { + const deadline = createProviderObservationDeadline('Interactive Sandbox cleanup', timeoutMs) + const observed = await observeInteractiveResource(client, identity.controlRef, identity.run.id, { + deadline, + timeoutMs, }) + const cleanup = await cleanupInteractiveByRunId( + client, + { + runId: identity.run.id, + phase: 'interactive_started', + }, + { deadline, timeoutMs }, + ) return assertInteractiveOwnedResourceCleanup(cleanup, observed.id) } @@ -1059,7 +1153,7 @@ export async function finalizeInteractiveProof({ ) } else { const observed = await attemptCleanup(errors, 'run-derived Sandbox cleanup', () => - cleanupInteractiveByRunId(client, materialization), + cleanupInteractiveByRunId(client, materialization, { timeoutMs }), ) if (observed.ok) providerMaterialization = observed.value } @@ -1117,7 +1211,7 @@ export async function finalizeInteractiveProof({ if (observed.ok) { afterStop = observed.value const deleted = await attemptCleanup(errors, 'exact Sandbox deletion', () => - cleanupSandbox(client, resolvedIdentity), + cleanupSandbox(client, resolvedIdentity, timeoutMs), ) if (deleted.ok) { cleanup = deleted.value diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index 3596bb43..d9d906b7 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -11,6 +11,7 @@ import { } from '../scripts/live-required/model-defaults.mjs' import { MULTIRUN_REQUIRED_PHASES } from '../scripts/live-required/multirun-contract.mjs' import { + createProviderObservationDeadline, PROVIDER_OBSERVATION_INTERVAL_MS, waitForProviderObservation, } from '../scripts/live-required/provider-observation.mjs' @@ -567,6 +568,86 @@ test('LIVE-08 provider observation honors typed rate limits within one deadline' assert.deepEqual(pauses, [750, PROVIDER_OBSERVATION_INTERVAL_MS]) }) +test('LIVE-08 provider observation treats only undefined as pending', async () => { + for (const expected of [false, 0, '', null]) { + let attempts = 0 + const observed = await waitForProviderObservation( + `provider value ${String(expected)}`, + async () => { + attempts += 1 + return expected + }, + 100, + { now: () => 0 }, + ) + assert.strictEqual(observed, expected) + assert.equal(attempts, 1) + } +}) + +test('LIVE-08 provider observation shares one absolute deadline across nested phases', async () => { + let clock = 0 + const deadline = createProviderObservationDeadline('shared provider phase', 100, { + now: () => clock, + }) + assert.equal( + await waitForProviderObservation('first nested read', async () => 'ready', 100, { deadline }), + 'ready', + ) + + clock = 100 + let secondReadCalls = 0 + await assert.rejects( + waitForProviderObservation( + 'second nested read', + async () => { + secondReadCalls += 1 + return 'late' + }, + 100, + { deadline }, + ), + (error) => error?.code === 'PROVIDER_OBSERVATION_TIMEOUT', + ) + assert.equal(secondReadCalls, 0) +}) + +test('LIVE-08 provider observation rejects before and after a deadline-overrun operation', async () => { + let clock = 0 + const beforeDeadline = createProviderObservationDeadline('before operation', 100, { + now: () => clock, + }) + clock = 100 + let beforeCalls = 0 + await assert.rejects( + waitForProviderObservation( + 'before operation', + async () => { + beforeCalls += 1 + return true + }, + 100, + { deadline: beforeDeadline }, + ), + (error) => error?.code === 'PROVIDER_OBSERVATION_TIMEOUT', + ) + assert.equal(beforeCalls, 0) + + clock = 0 + await assert.rejects( + waitForProviderObservation( + 'after operation', + async () => { + clock = 100 + return true + }, + 100, + { now: () => clock }, + ), + (error) => error?.code === 'PROVIDER_OBSERVATION_TIMEOUT', + ) +}) + test('LIVE-08 provider observation fails immediately for non-transient errors', async () => { let pauses = 0 const error = new AuthError('invalid test credential') From 4ebf60713a7c26202faf3b67e86e3e7a69fbc430 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 11:28:58 -0600 Subject: [PATCH 119/136] fix(rpc): track the active composer surface --- scripts/packed-rpc/first-run-tui.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/packed-rpc/first-run-tui.mjs b/scripts/packed-rpc/first-run-tui.mjs index 7d596825..db56ce50 100644 --- a/scripts/packed-rpc/first-run-tui.mjs +++ b/scripts/packed-rpc/first-run-tui.mjs @@ -90,7 +90,7 @@ export async function runPackedFirstRun(binary, repository) { let completed = false try { await waitFor( - () => (expectSetup ? output.includes('braid setup') : output.includes('Ctrl+P commands')), + () => (expectSetup ? output.includes('braid setup') : output.includes('new message')), 'packed TUI startup surface', 15_000, () => output, @@ -133,7 +133,7 @@ export async function runPackedFirstRun(binary, repository) { const replyOffset = output.indexOf(expectedResponse, responseOffset) if (replyOffset < 0) return false const completedOutput = output.slice(replyOffset + expectedResponse.length) - return completedOutput.includes('Ctrl+E') || completedOutput.includes('Ctrl+P') + return completedOutput.includes('new message') }, 'packed real response', 120_000, From a7dc7bce107eae45ff73782c6181aab120ab3b7a Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 11:32:40 -0600 Subject: [PATCH 120/136] fix(release): forward shared Tangle credentials --- docs/08-verification.md | 4 ++++ scripts/release/child-environment.mjs | 5 +++++ scripts/release/release-collector.test.mjs | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/docs/08-verification.md b/docs/08-verification.md index 18e6eb6c..8c421068 100644 --- a/docs/08-verification.md +++ b/docs/08-verification.md @@ -388,6 +388,10 @@ The current Pi route advertises interaction-only responses, so Braid disables se The protected command calls Runtime `provisionSupervisor` when no complete external supervisor binding is configured. +The shared protected `TANGLE_API_KEY` may authenticate both the Tangle Sandbox and Runtime supervisor paths. + +The release collector passes that key only to `live-tangle` and `live-supervisor`; analysis and unrelated checks remain isolated. + Runtime creates the root, worker, acknowledger, and provider-owned process binding through its public APIs. The command discovers exact identifiers from the returned Runtime receipt instead of requiring pre-existing `BRAID_SUPERVISOR_*` identifiers. diff --git a/scripts/release/child-environment.mjs b/scripts/release/child-environment.mjs index 290ff4bc..ab5fedf7 100644 --- a/scripts/release/child-environment.mjs +++ b/scripts/release/child-environment.mjs @@ -8,6 +8,11 @@ const PROVIDER_GROUPS = Object.freeze([ name: /^BRAID_(?:CLI_BRIDGE|LIVE_BRIDGE)(?:_|$)/u, }), Object.freeze({ commands: new Set(['pnpm test:eval']), name: /^BRAID_EVAL_/u }), + Object.freeze({ + commands: new Set(['pnpm test:live:tangle', 'pnpm test:live:supervisor']), + name: /^TANGLE_API_KEY$/u, + }), + // LIVE-11 accepts the shared Sandbox credential through this fallback. Object.freeze({ commands: new Set(['pnpm test:live:tangle']), name: /^(?:BRAID_(?:LIVE_)?TANGLE|TANGLE)(?:_|$)/u, diff --git a/scripts/release/release-collector.test.mjs b/scripts/release/release-collector.test.mjs index 4b1a0d39..0cd333ea 100644 --- a/scripts/release/release-collector.test.mjs +++ b/scripts/release/release-collector.test.mjs @@ -342,6 +342,7 @@ test('release children receive only credentials for their exact provider command BRAID_CLI_BRIDGE_URL: 'http://127.0.0.1:4010', BRAID_EVAL_API_KEY: 'eval-secret', BRAID_EVAL_BASE_URL: 'https://router.example/v1', + TANGLE_API_KEY: 'shared-tangle-secret', BRAID_TANGLE_API_KEY: 'tangle-secret', BRAID_TANGLE_ENDPOINT: 'https://router.tangle.example', BRAID_TANGLE_SANDBOX_API_KEY: 'sandbox-secret', @@ -365,17 +366,21 @@ test('release children receive only credentials for their exact provider command assert.equal(evaluation.BRAID_EVAL_BASE_URL, 'https://router.example/v1') assert.equal(evaluation.BRAID_CLI_BRIDGE_BEARER, undefined) assert.equal(evaluation.BRAID_TANGLE_API_KEY, undefined) + assert.equal(evaluation.TANGLE_API_KEY, undefined) const tangle = releaseChildEnvironment(environment, 'pnpm test:live:tangle') + assert.equal(tangle.TANGLE_API_KEY, 'shared-tangle-secret') assert.equal(tangle.BRAID_TANGLE_API_KEY, 'tangle-secret') assert.equal(tangle.BRAID_TANGLE_ENDPOINT, 'https://router.tangle.example') assert.equal(tangle.BRAID_TANGLE_SANDBOX_API_KEY, 'sandbox-secret') assert.equal(tangle.BRAID_ANALYSIS_API_KEY, undefined) assert.equal(tangle.BRAID_SUPERVISOR_ROOT, undefined) const analysis = releaseChildEnvironment(environment, 'pnpm test:live:analysis') + assert.equal(analysis.TANGLE_API_KEY, undefined) assert.equal(analysis.BRAID_ANALYSIS_API_KEY, 'analysis-secret') assert.equal(analysis.BRAID_ANALYSIS_ENDPOINT, 'https://analysis.tangle.example') assert.equal(analysis.BRAID_TANGLE_API_KEY, undefined) const supervisor = releaseChildEnvironment(environment, 'pnpm test:live:supervisor') + assert.equal(supervisor.TANGLE_API_KEY, 'shared-tangle-secret') assert.equal(supervisor.BRAID_SUPERVISOR_ROOT, '/runtime-root') assert.equal(supervisor.BRAID_SUPERVISOR_ID, 'supervisor-1') assert.equal(supervisor.BRAID_ANALYSIS_API_KEY, undefined) From ea69f562cdd868784d0ad424b0a81ff54b598ca8 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 11:57:36 -0600 Subject: [PATCH 121/136] fix(live): retain nested provider failure causes --- scripts/live-required.test.mjs | 19 ++++++++++++++++ scripts/live-required/contracts.mjs | 34 ++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/scripts/live-required.test.mjs b/scripts/live-required.test.mjs index 3f87aa6d..81938319 100644 --- a/scripts/live-required.test.mjs +++ b/scripts/live-required.test.mjs @@ -521,6 +521,25 @@ test('live wrappers preserve provider unavailability', () => { assert.equal(normalized.message, 'provider credential is unavailable') }) +test('live wrappers retain redacted nested external failure causes', () => { + const secret = 'live-nested-failure-secret' + const failure = new AggregateError( + [ + new Error(`provider request failed with ${secret}`), + new AggregateError([new Error('exact cloud cleanup failed')], 'cleanup incomplete'), + ], + 'interactive proof failed', + ) + const normalized = normalizeExternalFailure(failure, 'live-tangle', { + TANGLE_API_KEY: secret, + }) + assert.match(normalized.message, /interactive proof failed/u) + assert.match(normalized.message, /provider request failed with \[REDACTED\]/u) + assert.match(normalized.message, /cleanup incomplete/u) + assert.match(normalized.message, /exact cloud cleanup failed/u) + assert.doesNotMatch(normalized.message, new RegExp(secret, 'u')) +}) + test('LIVE-11 composes a complete canonical profile by default', () => { assert.deepEqual(supervisorProfile({}), { name: 'Braid live supervisor', diff --git a/scripts/live-required/contracts.mjs b/scripts/live-required/contracts.mjs index 082edde6..222777a6 100644 --- a/scripts/live-required/contracts.mjs +++ b/scripts/live-required/contracts.mjs @@ -931,6 +931,35 @@ export function safeMessage(error, environment = process.env) { return safeText(value, environment, credentialFieldSecrets(error)).slice(0, 1_024) } +const MAX_EXTERNAL_FAILURE_MESSAGES = 8 +const MAX_EXTERNAL_FAILURE_MESSAGE_LENGTH = 4_096 + +function externalFailureMessages(error, environment, messages = [], seen = new Set()) { + if ( + error === null || + (typeof error !== 'object' && typeof error !== 'function') || + seen.has(error) || + messages.length >= MAX_EXTERNAL_FAILURE_MESSAGES + ) + return messages + seen.add(error) + const message = safeMessage(error, environment) + if (message.length > 0 && !messages.includes(message)) messages.push(message) + if (error instanceof AggregateError) { + for (const nested of error.errors) { + externalFailureMessages(nested, environment, messages, seen) + if (messages.length >= MAX_EXTERNAL_FAILURE_MESSAGES) break + } + } + externalFailureMessages(error.cause, environment, messages, seen) + return messages +} + +function externalFailureMessage(error, environment) { + const messages = externalFailureMessages(error, environment) + return messages.join('; ').slice(0, MAX_EXTERNAL_FAILURE_MESSAGE_LENGTH) +} + export function safeJson(value, environment = process.env) { const secrets = redactionSecretsFor(value, environment) const sanitized = sanitizePublicValue(value, environment, secrets) @@ -970,7 +999,10 @@ export function requiredEnvironment(environment, entries, label) { } export function normalizeExternalFailure(error, label, environment = process.env) { - const message = safeMessage(error, environment) + const message = + error instanceof LiveRequiredError + ? safeMessage(error, environment) + : externalFailureMessage(error, environment) if (error instanceof LiveRequiredError) { if (error.message === message) return error return new LiveRequiredError(error.code, message, { unavailable: error.unavailable }) From f5a3acdfd66c171f6de32c4358045519ea80f72d Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 11:58:32 -0600 Subject: [PATCH 122/136] fix(process): latch detached POSIX group absence --- scripts/live-bridge/process-tree.mjs | 75 +++++++++++++++++++++------- scripts/live-bridge/process.test.mjs | 56 +++++++++++++++++++++ 2 files changed, 113 insertions(+), 18 deletions(-) diff --git a/scripts/live-bridge/process-tree.mjs b/scripts/live-bridge/process-tree.mjs index 3acd1fba..13584f9f 100644 --- a/scripts/live-bridge/process-tree.mjs +++ b/scripts/live-bridge/process-tree.mjs @@ -422,6 +422,33 @@ class PosixProcessGroupTracker { constructor(child) { this.child = child this.rootPid = numericPid(child.pid) + // A detached group remains owned after its leader exits until the kernel removes the group. + this.groupState = 'unobserved' + this.groupObserved = false + if (this.rootPid !== undefined && !childHasExited(this.child)) { + const present = processGroupPresent(this.rootPid) + if (present === true) { + this.groupState = 'present' + this.groupObserved = true + } + } + } + + statusForGroupState() { + const present = this.groupState === 'present' + const ownerActive = !childHasExited(this.child) + return { + supported: true, + gone: !present, + present, + pids: [], + roots: present && ownerActive ? [this.rootPid] : [], + version: present ? 0 : 1, + mechanism: 'posix-process-group', + ownership: 'kernel-process-group', + observed: this.groupObserved, + escaped: false, + } } status() { @@ -430,31 +457,40 @@ class PosixProcessGroupTracker { ...unsupported('The POSIX process has no valid owner PID'), mechanism: 'posix-process-group', } + if (this.groupState === 'gone') return this.statusForGroupState() const present = processGroupPresent(this.rootPid) if (present === undefined) return { ...unsupported('The POSIX process group could not be inspected'), mechanism: 'posix-process-group', } - if (childHasExited(this.child) && present) - return { - ...unsupported( - `The POSIX process group for ${this.rootPid} remained after its owner process exited`, - ), - mechanism: 'posix-process-group', + if (this.groupState === 'unobserved') { + if (present) { + if (childHasExited(this.child)) + return { + ...unsupported( + `The POSIX process group for ${this.rootPid} remained before its owner was observed`, + ), + mechanism: 'posix-process-group', + } + this.groupState = 'present' + this.groupObserved = true + } else if (childHasExited(this.child)) { + this.groupState = 'gone' + return this.statusForGroupState() + } else { + return { + ...unsupported('The POSIX process group was not observed while its owner was active'), + pending: true, + mechanism: 'posix-process-group', + ownership: 'kernel-process-group', + observed: false, + } } - return { - supported: true, - gone: !present, - present, - pids: [], - roots: present ? [this.rootPid] : [], - version: present ? 0 : 1, - mechanism: 'posix-process-group', - ownership: 'kernel-process-group', - observed: true, - escaped: false, + } else if (!present) { + this.groupState = 'gone' } + return this.statusForGroupState() } signal(signal) { @@ -465,7 +501,10 @@ class PosixProcessGroupTracker { process.kill(-this.rootPid, signal) return { method: 'process-group', sent: true } } catch (error) { - if (error?.code === 'ESRCH') return { method: 'already-exited', sent: false } + if (error?.code === 'ESRCH') { + this.groupState = 'gone' + return { method: 'already-exited', sent: false } + } return { method: 'failed', sent: false, error: errorMessage(error) } } } diff --git a/scripts/live-bridge/process.test.mjs b/scripts/live-bridge/process.test.mjs index 9854da0b..88ee81a8 100644 --- a/scripts/live-bridge/process.test.mjs +++ b/scripts/live-bridge/process.test.mjs @@ -9,6 +9,7 @@ import { managedSpawn, RpcSession, terminateProcess } from './process.mjs' import { processTreeEnvironment, processTreeStatus, + releaseProcessTree, sendTreeSignal, terminateTrackedProcessTree, trackProcessTree, @@ -307,3 +308,58 @@ test('refuses to signal a reused process group without an observed owner', { killMock.mock.restore() } }) + +test('retains detached POSIX group ownership after leader exit and latches absence', async () => { + const originalPlatform = process.platform + const originalKill = process.kill + const child = { pid: 42_424, exitCode: null, signalCode: null } + let groupPresent = true + const groupCalls = [] + + Object.defineProperty(process, 'platform', { value: 'darwin' }) + const killMock = mock.method(process, 'kill', (pid, signal) => { + if (pid !== -child.pid) return originalKill.call(process, pid, signal) + groupCalls.push({ pid, signal }) + if (groupPresent) return true + const error = new Error('process group is absent') + error.code = 'ESRCH' + throw error + }) + try { + trackProcessTree(child) + assert.deepEqual(groupCalls, [{ pid: -child.pid, signal: 0 }]) + + child.exitCode = 0 + const leaderExited = processTreeStatus(child) + assert.equal(leaderExited.supported, true, JSON.stringify(leaderExited)) + assert.equal(leaderExited.gone, false, JSON.stringify(leaderExited)) + assert.deepEqual(leaderExited.roots, []) + + const signal = await sendTreeSignal(child, 'SIGKILL') + assert.deepEqual(signal, { method: 'process-group', sent: true }) + + groupPresent = false + const gone = processTreeStatus(child) + assert.equal(gone.supported, true, JSON.stringify(gone)) + assert.equal(gone.gone, true, JSON.stringify(gone)) + const callsAtAbsence = groupCalls.length + + groupPresent = true + const reused = processTreeStatus(child) + assert.equal(reused.supported, true, JSON.stringify(reused)) + assert.equal(reused.gone, true, JSON.stringify(reused)) + assert.deepEqual(await sendTreeSignal(child, 'SIGKILL'), { + method: 'already-exited', + sent: false, + }) + assert.equal(groupCalls.length, callsAtAbsence) + assert.deepEqual( + groupCalls.filter(({ signal: value }) => value !== 0), + [{ pid: -child.pid, signal: 'SIGKILL' }], + ) + } finally { + releaseProcessTree(child) + killMock.mock.restore() + Object.defineProperty(process, 'platform', { value: originalPlatform }) + } +}) From 18f8afb5f1c2c62ebc7ca09285ff4b45872963ee Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 19:57:43 -0600 Subject: [PATCH 123/136] feat(workspace): preserve provider-neutral workspace requests --- .../verification/workspace-request/120x40.png | Bin 0 -> 7851 bytes .../verification/workspace-request/120x40.txt | 24 + .../verification/workspace-request/200x60.png | Bin 0 -> 9347 bytes .../verification/workspace-request/200x60.txt | 34 ++ .../verification/workspace-request/40x12.png | Bin 0 -> 15206 bytes .../verification/workspace-request/40x12.txt | 9 + .../80x24-workspace-request-keyboard.gif | Bin 0 -> 85230 bytes .../verification/workspace-request/80x24.png | Bin 0 -> 7547 bytes .../verification/workspace-request/80x24.txt | 16 + .../workspace-request/capture-manifest.json | 106 +++++ docs/components/README.md | 1 + docs/components/profiles-and-connections.md | 29 +- docs/components/workspace-branching.md | 18 + package.json | 1 + scripts/capture-workspace-request.mjs | 445 ++++++++++++++++++ .../runtime/agent-runtime-execution.ts | 2 + .../production-tangle-sandbox-backend.ts | 85 ++-- .../runtime/retained-execution-state.ts | 1 + .../runtime/retained-native-continuation.ts | 9 +- .../tangle-retained-interactive-contract.ts | 6 + .../tangle-retained-interactive-execution.ts | 13 +- src/adapters/runtime/tangle-retained-run.ts | 6 + src/app/application-options.ts | 4 +- src/app/application.ts | 6 + src/app/composition.ts | 5 +- src/app/configuration-session.ts | 71 ++- src/app/production-composition.ts | 21 +- src/app/run-admission-dispatch.ts | 6 +- src/app/run-admission-receipt.ts | 6 + src/app/run-admission-request.ts | 6 + src/app/run-execution-snapshot.ts | 6 + src/app/run-execution.ts | 7 +- src/app/run-recovery-context.ts | 9 +- src/app/workspace-request.ts | 7 + src/bin/interface-runner.ts | 3 + src/bin/production-application.ts | 3 + src/bin/production-setup-discovery.ts | 3 + src/bin/production-setup-persistence.ts | 4 + src/bin/production-setup-types.ts | 5 + src/bin/production-setup-validation.ts | 21 +- src/bin/production-startup.ts | 28 ++ src/domain/invariants-base.ts | 114 +++++ src/domain/receipts.ts | 8 + src/domain/run-contracts.ts | 4 + src/domain/workspace-request.ts | 98 ++++ src/ports/execution.ts | 5 + src/startup/durable-runtime.ts | 3 + .../tui/configuration-wizard-presentation.ts | 83 +++- src/views/tui/configuration-wizard.ts | 144 +++--- src/views/tui/setup-stage-rendering.ts | 109 +++++ src/views/tui/workspace-request-form.ts | 225 +++++++++ src/views/tui/workspace-request-workflow.ts | 44 ++ test/configuration-credential-flow.test.ts | 3 + test/configuration-product-flow.test.ts | 2 +- test/configuration-session.test.ts | 36 ++ test/configuration-wizard.test.ts | 72 ++- test/connections.test.ts | 1 + test/interactive-execution-adapters.test.ts | 21 +- test/production-composition.test.ts | 64 +++ test/run-interactions.test.ts | 2 + test/workspace-request.test.ts | 208 ++++++++ 61 files changed, 2129 insertions(+), 143 deletions(-) create mode 100644 artifacts/verification/workspace-request/120x40.png create mode 100644 artifacts/verification/workspace-request/120x40.txt create mode 100644 artifacts/verification/workspace-request/200x60.png create mode 100644 artifacts/verification/workspace-request/200x60.txt create mode 100644 artifacts/verification/workspace-request/40x12.png create mode 100644 artifacts/verification/workspace-request/40x12.txt create mode 100644 artifacts/verification/workspace-request/80x24-workspace-request-keyboard.gif create mode 100644 artifacts/verification/workspace-request/80x24.png create mode 100644 artifacts/verification/workspace-request/80x24.txt create mode 100644 artifacts/verification/workspace-request/capture-manifest.json create mode 100644 scripts/capture-workspace-request.mjs create mode 100644 src/app/workspace-request.ts create mode 100644 src/domain/workspace-request.ts create mode 100644 src/views/tui/setup-stage-rendering.ts create mode 100644 src/views/tui/workspace-request-form.ts create mode 100644 src/views/tui/workspace-request-workflow.ts create mode 100644 test/workspace-request.test.ts diff --git a/artifacts/verification/workspace-request/120x40.png b/artifacts/verification/workspace-request/120x40.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd2bb83ff47239f5016b43f0004a74a0a97b180 GIT binary patch literal 7851 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 https://github.com/tangle-network/braid + git ref + > main + start in + > /workspace/src + tab/enter continues · shift-tab · esc diff --git a/artifacts/verification/workspace-request/200x60.png b/artifacts/verification/workspace-request/200x60.png new file mode 100644 index 0000000000000000000000000000000000000000..c1be12388cf7d139a9fb5062ca1ba84e6a7cf83d GIT binary patch literal 9347 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 https://github.com/tangle-network/braid + git ref + > main + start in + > /workspace/src + tab/enter continues · shift-tab · esc diff --git a/artifacts/verification/workspace-request/40x12.png b/artifacts/verification/workspace-request/40x12.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa545ebabe50a0121dee9665de1446a1d47235c GIT binary patch literal 15206 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 JnTWpc{{xBWD?R`K literal 0 HcmV?d00001 diff --git a/artifacts/verification/workspace-request/40x12.txt b/artifacts/verification/workspace-request/40x12.txt new file mode 100644 index 00000000..aff9cb47 --- /dev/null +++ b/artifacts/verification/workspace-request/40x12.txt @@ -0,0 +1,9 @@ + workspace · cloud sandbox + blank = provider default + repo url +> github.com/tangle-network/braid + git ref +> main + start in +> /workspace/src + tab/enter continues · shift-tab · esc diff --git a/artifacts/verification/workspace-request/80x24-workspace-request-keyboard.gif b/artifacts/verification/workspace-request/80x24-workspace-request-keyboard.gif new file mode 100644 index 0000000000000000000000000000000000000000..0254b6cc9d1e2664eb8473d575243950936ce575 GIT binary patch literal 85230 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

    atb43?83r_CkbBGpMuOs*f=-)4j^nfCV;6l^V zVj}_!u7r>hExuC<2F4f5h?e}bR0Izwc3}n=nz~zOvXqiy~Qp5)4i9=Fek zgJX9%f$G4*bZN+b&B8$$@H_!7LPWfymvD>1rAfp%>9D^1Xw zP;L-kI*SO!WdLjQ>5mDKf;w-@H0cxKar?R4w{L&J$r?AlwND`i?<$$w(uA zR%605sQ{Qb0pd$W>JXs5EWp=z#3eG)i_AVg069$ou9Bh8Lz=G$R5=}z0f^GZA$Ima z6|k9ujLaTuQY>pOUv54W60v2Cuyx?u5*U>QW@I;I`?LzU6dp-{$rBpY@z^P*5;z#r z80S-af4_m`1b$s=<*BYIaD?=>G*|ere*4slfV7>$wHYVWy)SFZS#H`EY>RB}(DrG{ zT<)0I2b)@2+7ha^oZ6ATZA=zmdby1*SU1no7_QYAW#0ai1xVZn|Aw@Ez5tgY!T}H^ zL4!IAR2@l#%?P$9>~}(|+t1We=~$qOQY=S-e(r|Aso0Y_MT1#TaT_XP7FHw+2H+6H zEY8#AoN9RBF$*xZ-(6x3=-@eT;{j=(=j+WFdnHhe(ZVhYgX7WZ=0Fvr#;LVYR}RF> zb&tx@Fv@MFt=-Z;y9M*w;Cg7d5)}KU>x@wM33EWBwd)8|@b%H^n)?Gie$HT|TyL~< z@2(b2D;qQ$s<%vh%}wgq%kIB7)E}zN>1xrlquCEA^+K!rErxoDa(zOiE@)mKG;g3> z8x;KsR<`!q4?)Cfkespxf-_kC2NWIZ)9z~c4DV|lK*f8r!u??eLIW^m1e^%PLSSNe zFpBuf#sX0N37!va4gy9T|PFfhF(x2AQa0+;E-XM=1M6l54&*@Ka*g=d(3SEUb1ck$tY_aDp< zRz)6+_JqouD}%jx-MUl_SB5VV-ra32-@^kg<{+z9p)P|p>P@`$q5w4bpbTkRt~6wL%?0&pPjpMH9EaA zPfx53P^l~6JsmJqrzo2Zh&#;T*(M*|n9OW@X~#Cz_V-hR#d|F0^sLN?ybjoPfAUG& zwCT4=f$TSi$HqSBi~&sIu!b`zPZ?D`Hv%J}q8T-TmqAYg4CYd}d~7s2X=H-+rH2Ku zWAVj7XvW~!uu;WS?eG*v`OAswF@y`NHUVm^1b(_)+b5*_O|4Stzn{+an)!6{P-_Sm31;=8R^K)H7M zmCI!uPd~TD4?dOyPZN=b7NBwBENm9$=KSS?9B5bm1>*vJ!3JC(nz=p&vrhhg|L|+e zdjJ}eY%%eN?NvbQfYH<0jMgbQX_#|m4xuoKJ)9$yL9da4iKO=exz!igd!txKeOEu9 zIyQg#U{-)B{Pm_45WULjoIK!WHg`vEekEj{r+S_uzX%VQ6VhA6lHf`<@LNjo+tk^A z{1#!IizX3^t&YfJz8&ycqyg@SU*$V1xu#n-uciDUr^(Qs!@P%4I3+XUYXg5Ca^Y+6 zk3+>FqXZ40BZF*awS;S$2V2^GW(I^>d6imq$h7_|VC6_F$V!htXf+_S$ks2n9V~Yq zOn>t|TrAjWC1?*38pY@Vz*S-2TD_5Z#ldNW^6cpSAA9V}bGj?>_g5E3mfP8Xz7qZv zm(2K)ys9(E_<6u!ucm!Su0otyUHZaUQCQpbTiZE!`t9WDuah6DuCCAsCz5OC(ZQlY!wxi4jqJV=%_bcZ&zZhfc#iXJvnBYwFKDyc42#W)m{~!|dt@ zVJoaLanr?o>r%>Aec8~O&E%DYG=2vyvM&F%zNO~kct z_B3zbSNs5R+Om7LCHr|d*cuF7+b$5x)o^pq3wWzefqJa$nwx#OO5BMb-7$KwX=*(IT-DxN5-w!=|CJLs{b^Jv zfQp%9{4}m`)h{=*Ds5Br#4dRcV#4-SOwqt)X782~UD- z856N?)g}pUD77a_MSz4wjIajCpL$Ew^tq*)u%#xIaz5IKud*=f;_{`+%e9v#?vSGp zl?1l@=_!Wjr7H82^-+Rq-zSnS4x?=!vb<4-2B&T#ksI+$STF*VI!;DG1c1l^Q?K;0 z&#e+C%q@K`&VCul)p?Mv6+`2#zV@GM1fj;4?04~-qg<%3zTVmYW3MdMC*+hND5`-?eT6<6#?2YdTeu(^m8APe zktY0rbsQ%!wnG8$qj83~Q@Tnfb=}Eu+dl5|&egA1+mF+#VvOb9;CMoZ#v55=R7+y? z3u`&f{AC>&!?PpA$7llE$0;3R2=Bu%(&4M@P$Y8)ZB7wGD{%p~Lf!go7=&0P(e7O% z&HOu0>FqA|@84GSBMnzJtw^z~oPdhuw5<^@BKVEY4r|uAQ8-((a__Nf3$6=$3b7~8 z=>D~M`2lwGGFi_ARU!3(U*{)xw{dMjy<>8ucX?e0+U9r^hg>WSDndBX8IBsC=#EvS z3}1SAYtp0uMX@>ou*i;^9M7Fmr|OXuZOIwErR-DTMBG=pUc9M@ro_1j-U^pUQ8G;r zqH0m_@k;2{#VvWY=pZAUkRyd3Wm^|eJ$?J_<&3KjAW!WmcN8+AF{ z?_QcnCH?wq>GAYFQXopSoaVy9PkEF!z|G|3?pt{J;L6>(G;3qe`lQS~^=qVZ$GEiEF(4>EZ7WW=D3e& z`b}PoMjW56sJY2%yrLD_i6mf*b_G<6vq$qZkb>7D>Uuh_J%W(+uHPXcX?~fAr%gYy zO^*xuL~5T|{v71S>v%KyMz0g@CHgeKOBCj^RN!q7wdv~MB)$p9m4-75{Hk0Vj=1%- zuU#O}eUCe^1VZQh^y03!c%%jpr z9h@5_ky~YSgI9M`6HOSnQ#^fa5F6w!gvKVa^NuZE>M6H`KMC%M)7SJo6S+Bx10uiZ z2Z51dbR0S%0R|!alX-cbqxfq(XU6dW_XTUInYegv#4CJc&?pWjM~6Ugy;FLr@#r`@ zC}E;E>#P*9YTn0lhF>25I06088PjwVB6ks0?EHnN?f}7vM5uO%nWmg*QZuuK(jnKE z1bTkNKmmJ-zMc}a9Bre+-)9(FqRj$8h$=!PPLC+x@Oo<>>6eL=XKH6xTyQ=h8ev-Pn=?N zwe*Doxk}RRI*4!!JYr1D1gD36rEU#8I){_VELPzVOBUsMlYxCxf>#eFpRe(bh5JjW zKGzubzVh%&hblLu5pyVq?&P34DH>~17UcB0+~3!{b=k(xo37Smh~;`~CSZtvlT?c& zP8D8AaWt#@3S4R)FYt`Wqiph*4*EDxEqdx8ikvfBHkIWIgnW{0+|RFKbKbjf7GufHgFo zfemcK=&jx8$Tp3n+tqkREk!}dv#5smJs+iCp{6P1WAVk6Roy-p*lf*>7S%<~rkT%o z%NtxHD4j?%+bZR&!5^+m6hfoPB!L|oQv01^agVZ0Tc(AhMks_OwC`y^5CJ-ib-)=0 zsyymgPSX%AMAUD_+Vo7@YKwG3kE|5qZ$Tz5&aI8`DEDNQwVZ8Icm!P6t);P7fI^}4 zYe5%>jn0@4DN*z1W%i@HyCKjSn|so?cE zPjm44FRxKG3hg|KSEFHvOulb7JM=C^VY5t5;^E3CmhNnfgCtwTjs?5_5_KD}8Ok^{%7 z?HY7fuI*k_p+obuXiuC!6mUB)28alXW#stv+?8PGBNXCwe~exn*{__-y23&Hz0)WA z=7teDWA=j|>_{Sx-H+BaGdQ3&e@s|RB=&?Tt2kN3!uNKm^M33XeI`sWk;X42)eU=o zS7A82;@_5aJe!MtcE9K;DYOMP@f=c+^_FN;%E4yYTBc|pj@`=XDt1UPMuT7U!B_)n z^FiJ;z`@?4A@Nbq+OND~olmmIIJI=&$u@Vm>2z>5h~$$L z(jqv5Q~(naEf#i~9)VSgH4DfQ2+E36LUQ}_3!zyZwPL5T1xGMqede(OL>+8a8=$S1 z*x$Ba+mYtkF~g!ebX<2zROjtU{CBr@Re#+-=4V!9F(c>Eqi(PK(UqTGrd!_UUt48S3bZSut zA=-^ZVa91-kKGB&gAULU!jZ1Lia>n@^q@*@}!elk>!91*yj)1md)R{Qk@_$i71i?_S}YC3-S|NmMrMl-q@ z9nuW~Zez3}2qN7b(kZdQfJq66NOzZXh(U>{poFv_9SRCciNR;@>$=W2e))WU`JV4T zz=5-!vGaUAp0|5I)(Hqu&0v14CwWUj+w2dGekIlr3wLH4k|SurpT4Y!A2$D_ZJ_{X z_GjD6&{9<;YF)>&SPbhv9a2B;l2j*NbIC~-jprd9>!Kjhq67IzKw-WqBrqe~zn4Xp zz}Hj%lMjzreX5GVYAZ;{T!*6tvCQQ<(ZPe2`K7u(2>Zt2n*+m23d9>9b#6kn1?aV1 zqqHx1B8CK?;XIgf@YLl#`@rFgBV!_NH>|ZO7QV;jyugW8<4+ z?~lhmK*uMT#wP{GrxeDgvEv`j#%El{XM@M*2;=kF;|rDJiyh-j!{eVm-bk>>%IA>0 z9Bcq`M=2pwS<4FVH?Z$Fu|(+}KnvI4*CzmGGXjemZFRi=I{bd_I%wpaI5hhHJM_b0 z$M~&ZO!~jlL-kn*hejyOL%TY-1n&M97b&R-X0=Ir)4VJW6husvK*9Lo5;_4a^Gu-! ze%0Xpibi8Dkq9KHiV{!tvy51uQFDm4fyc^(5EKBsVjKgMbNiMv&~rB;PynoN_p;Z@qtH zef;4hm13d6(M_I5Q({$9@eVRzd1EAVDIYWZz{}(dmdIhzMCq+l&EK*$Sa~Uads=ba zgm?TFBh4+Q&i0B;xS$5yg|S(ftWm*rTJvQ3kZV%;29eQK6+haW(PB!#^=V|8s9~o6 z{F>H#WVWR+uyhrEBsz&sn>Kx$@CAMCWJy!gQ^6f#DzvA;6;*1$-LIQAr5`eLr)nJ6 zF=BYYNPz3-;@;?r4c(l4mE3_@k+`j%H%urTi7K3lT{P88m~nNTbz_F#l3{XxH0xPq zo0(^znl4q^ewCe|W8VgBtO{3Un-k`Qi@;A*j0 zIG=ojn36XCAbKn<NhPT;MD z7P?v#ZCS==EC^YEE%hw$77IDi3)1uPu_24GTNZrbixteovZjRsGF;*ELh(s*Wr$@i zGrWmrvA$@bK?B~)6JmhvR6>TQXNaPltOIM-FHl*7d;A?y4bOD%sF znocZbfW_zBi@h4e7YPg1(N?w0@VXGIr`pzy%uCO2ER01HW5aFq0Gz=pq2@21hTbOP z{Em@DoRsMD^bK2}HvaV%p=YGXFOr4Y?9~VzVm=>}affrdgRGTbX^n zGW}@zedlt`tK~N{%M-pUE0VxZU)%8+dqOQCRy&bq9_I+3zkefvp#^qB6lY3rbK3#t zeLhF9wSa{>#NDv7u!xruO#;`hd^oWOSRCS27Pg{R(<#m&{Td;8{neE=Oiz(qHEc943Mf$q1wI zu?KcQX#&^+Hjn_rqgK@pol#OaHHXCME$D?U7@xbLW=^Enggruq0$o&Hx;55Yz6yoPP>|@0f3}SKc_Yk zjWyx7XPwP7SFW#YItja48M$b?xv1H}^{SZ_SlrBcTyIEisw6slh~lm*5h+-pcw7Rw z7B(Qcu*tl+A-RLeu^~O9_T6?P;M_oHXFr&GfQ~y}#@#4%EzRFO0cjZ}F3zT|4(+xTsl=pt~OXzB|4#Zt~yeBmT|# z@$3ft+ev%j<}+*WphWZ(-hQ<0kuSAre}1Ru20S;>J&R>c*~nGh&eg1IFKC6bSjq+` zE&#<3VYdadpv&siS6HKjdKU^3Qkejz3Q8HPIJ7p%(B^Ny!0sPgcK&5vqsbZwW5ji zQYG#{fd`%IV7-Lrr)%ZkDEr)e^}T zA`X1+mAtw?!s0tN;&j=oKj7v&Y`)(o>+^Kh#&Xw&c6<3{ zv*%|R?jZV8pbUJs+O{ObD!pj_^@+<~^XE3DFHNi8)=9r(`q~fS@4G_Frs1E2`mOe3 ztPWy`(&0Weipz`D#ADd!GamaX#qTF9F26&q{=fi08raZS`7Y&r^kU&O@jE!|+nDVF zuSJ{}JSkUlslW4ZI}vJWO!inKfkB2y{rQmg!51^*gb6agBOX7X)&}x@(R9L}R+$TN zd3duq0N9P|tg@`oux3yWV5)(;`3Fd|B~qV$PcjbRzO-)d44~pYVkjXn-VETfKl-u& zVNE)M$J#XhJ-Xa}aVW3*Q{m1}MfaadVLz3VeyTkFsao?>t^4QI*FV+geroLe)I9rn zjrx3QaCLQZNKGv@}Ht0S!e0@yMjJvUOY{ZI#A08XC zo|uT7+)_R<)jcu0b8_4L#60ZePST0R;}gr86RYkM>(?hXb0@YtCw8w-u9KfSu%0@K zoH{9=I_sXg+&Oi1KXnT`bx%6=czo(vbL!Q7>izoEXD;-PBJS?lso&>Qf4^}*kuV7T zSPV>-KSBGGvqh)W4QUEICgPGq`>T6>WheuZBNR{w2i}PRaHw zN%YsluwPwYaDFlgM&Zyjk%-9HUxn^h$Sux8b`z4ii8*t>%08sa?n2_e!^=c2s&tjB z+%IaRg=&&6>gIUrYAzaH(>A=mXiB1K+PQf0g!&2j?^ZvmR*~QBy1zT_{O)xB-Ia7K z&4vRZA>9wCdLI8)WR34(wR_@0=y`C@^$@OuO1KFpc+#&t)#=Mj2-iYL+{T2 z(M!KK7E60MzVpYIIl9N;@5}E*chTq|dg978_=xo1=^Ek`FCdbekk<1jY2vRQ^S=?1 zn2l>O+jsso;{H~j{{{I+6Z{iF9^{1Gm=PDk$meKK@87SvF)MSwpZS9icZfcve}m`= zQZf*E(SPSRiO1w{5dg*@;o;wpvjo~yIZH>8!$gLkG$_F%{*hD;<-q;jBZ1Kj&h`LK zeK<3uBvXv%y`5t^igF-UqHF91&Vsd5Q=lTOpMw`y)R zy=~pXJ*MX@yXY7#E{(Hi>I}qOpPW+s@FV(ykeoSCq@gUHRo97}?IUx3|A}b4##-Q%3DsFW1SMyeUlm1}>XwCAsF{90rEpeakrm&3(YB+~LJL2SC- z*mmD);Dp*r0p01dJj)~6U0OOahzAojIHl~H++Z!%@+Y%^Ed-$?9%HKH+v+l2E;KrG zWgb7$PDc>n;xijb(3?Qe*s5I^V8jg|a3VE{0(5dBjqUh@Fke4E4kAb$Q&B8Q-s zLjO-K7RU!0a#eguu!wU709<=E8`xharmjV>{~I71I2<-|^1(KBa%@?a+}L;V_O7CJtlvXD&{3-kxu`cZ zwynjQeFgS^QA%J2SNcR6jYh5LyGQun@ii+Sa3I_HQmC_#F1bEGE;T1zKkj1qo3G*q zfy(RD*tq$P>-umFDj;#Zm=f_0a@1K*dN(@xI$qTqmbqtfAWL61Af#Y?<#0TXUip)Z zO23G}z2}YXC|&P~iD`Z_X&t2^$O&-8Rs%I_9Y%v2S5ZFo`9M}=ow4ZCM-yhCAAptC zWqjzF^%*iwZK5RA-r)Zk@V7J`r22V>++V=%c3Pt+lE4C#YsJ@c9dn@TvT3qN2I&1z*?E?>w_p57uEk zoZIw|_~XU0Om3BDi}Niviq;L)ngs}1%TY*2|DwOqjDILwxp)I}e>^&4BK;?)9;;XI z4RKl|FYi?wc0(pc!%)z}iu-~C`TD)kZvl9pA=lx%?nYN5-s?akwpGi2y$c&}%NbPn zz_*p%SSw1(^5KUQIHrlxW=*oPln!q>+G|rjYO9o$?oz5K~FVjM)d zAD{~EQeT>U@ghE>SU*+Y?{HtDiDvMpL-{6`XnpK1nlnZSr=!NOcncpy8#=KOZS;2=#UTs0XKYhV=cYwAQ`!RO%q?*zsdlUbb35w@Ad<;je<<+& zbahV9?5k!g{BF_gi_=>Wgrp}zb?NVq?w4GA@%%py$@F7BzJzHWdKNn{I`E&r1o8N% zQhr*cFzp#s*yBsHb6=wgI_I~X@=v0=j9a5i>KPVpK4hgwQ?r?1>_lQ@lMqwM3IpdQ z;%==e-i;gFKYLzl{*%p!m)PWE>>bt7l*@Y9xG5yx`^G3nF1tcvOU$(Qt@#VNoc6{o z$)MhMcK_sZha|RTANG#9Y0BqMH*PD^vD3rC=|Ym(yfYD*l_myL`pycG;FD?pYg5h3bpM5Ayg5D!HNy1D4UH|!pA z<9$#mdDgd(?gC`a;feBf$7Bn7m(Tm5-OpQ_eDAViIYM`bMPIDx#h(={kRg=N4F14> zZ+1~5G`=2&&Pa$z22O^}I0MG?8!jD=XMo@O@vtTe$+6S(8f}-sMOX#gRlpSP>4A@K zYHvU-aX@g)&-B7FV_NOk9T-K7}?q zt^WRO=UVLT+3uB-)H~1jl~^OnBzGQjvoWrDJlK2;($p7kpm zT%~j(g(3B_jAc`5w3nhBqN^T9wGlq7c0C#qZf$*(8uknwy!!QH(8|x!*qN7fM>JCY zYuxV_qIRzFM&2uUarA(9^s3inB7^@LZ4eCjX8ZE@3ka~G^x%J{zJo|=(NOe%M!kBm zV0nvPK*66tmnj!5ue$)CxRzaSh~t`ve< z1yMSnZ9ccLLz`qjoBgrH5=cA{{y96KMvawaL$Lrjk$DgrH@KB&-OM~Jz;(HT@KT3oi}0{3&xt~F@mMf*8~d7QYx{m^FsIv58CqM4|{PbvC~nVp31uIuPI>6)zz z4VH@vuk&NDV#QA4iRHrl{OFd|#v^WOodjyyVeWbS)*JTkh+$4PRCgX&CVYur+!?_@ z5ZGTt&7&0q35;OWI=VuEh4AIC723xc9lnA3Q=ot%s4-kZuOsh9zk6xL|b3f$L5>^Xr$| zl_*TU8XSjqE5w%D>gB}A#^3=_5E$OC2mp*7i|WtpQT3ZMj!?-!s9xwQ)_hZ&18Vqh z+EDW|mKG|D8K&ZKHWhT12*${+0>ElK2#Xoatf0XRD3i8-HUfal3Tktq-~`S1W24iv zO4XbXolynK-C}8TwayZWpA5vKowi+RtA+mY zx*2R2vtvD2hCOcC-U9dEdRi*0R%If%p+o?qQwMIlZQ0Hu0pkkA98M(;g1|G#4MK%2 z7_e&=Qu7iB)){{3SQX?Zg1zn@vR)yC9S*t>Mgx`JcIz@LYp6mLqYd<32!QQz$2wFS z>p-J(bohJR7zlzc7!EBjlvoD68_O1|$7Spl?g|$goIR*0gH~7-b~Jhw!+?#gw~b8P zjAn2(=Z~)c=rnjghyx2BUBFohg_Q?_he8i;l`3wH7 zC#`!r%DMXGh~5x%7R?1~`t)<}4<>We(Zt1rjt60>cmZ4$t)3lP1tm!s1gnFt5HK%% z3Bg}PL-^evlv~%Pd(~|hWIU~}&8n~C*s1@qt0BR6q(5|o_i7sP;)Dr%f2k%q;h;a&KeXVxOQ5LFU?1+~t?iziuf4_S5@FXa&4I2J`)BXHpReq7a(s27h29sh z*Av`;0fSN><3#91!ft&*MOpXk39+&bccTaFx}16UF(O=X3KC4%Rmff)60uuXsh?cJd! z`O)B@@0;Lbp?vJKM!Q_u}mm59-tVgU`)1nhXPuFGPmr-f`D@JxK7~Fp}CTUVy1%*cvZE zR~qB}&6{^(q;}u42+xDa8smo(q`p))e`%Kb+SUB^h1C8?^Zt9OgW2YT6{&CA&ELLB zeLrpf{!i)<_T-RO`iSMpQDSOA@79sFcF}WoQw1#E@ z6XJ}Oive}$b9P!53{Dnw;|qH5LQqq#LDyl?;Kd)6haIvt&m?W0`%3h1VP2OcYNJ!Toa5 z66QityYSC?a?g!ds}cGeJkZb{;I_l|;@+pHEXW!B(abAbE;_Q(m;!Ts{tyi^wgiF5Z zOQF>VrBIG&g4`NA&-w|^7aFWQTR*oCARIjS4}<641z3-VnAagp00d$&s3aip10(SCm(Y2I|>^IlJFBmp#{|kMcJfwb5L+BPO=A6%z(WvUc?7; z=B|&=rX{TBJOP5go~+4=QTi9Oc|wD6XLXI(V?iPDA9vn4iNrXeSNScTbV@(n6YpBT zveGHz2DOc?w0%vocK8K2hV#KF>z8Ft5BPPY{n7BtA;FxJwd4-P0#5nCg`>2M0HY1% zx3$zS6@X!9<(yC*+>kO?9LVCQoRYKYwGEHy8`2BXAKVZIE*zO>MHLOz=E9Z&DNxyK0S z@%%ywMtByxc{RJ~DJSs!uJge_A3;!A?ZRlw#9NIDo3(ESbcOyt@h^ngj- z;J?ptbkMMZldx`%%rMc%F=)7l?BiS72~M_8z1(oL9xHFVYp?FdDecDV?7Asy*F*Xf z+@8Mo^+1nxCuQ{#(`)0r!)hR?=I>AUi#<{yIC}G*l-YA*Yk}L0b-IlJ#Up@;o-4Ut zwB!3OBh|^jS*0KBz^yBafXvAc@a2${0!{%1dXRY6`Aio&Y$J?Q14QpW!U(IUhP((< zwxYsWT?=)AfR=QY&E;Pe^Z%}Atj;UnYp~}ZU=%NWD^^5#p3nMfFh%Ui*Y!Ha;bH6U z7Ujk~PN*9r!Obs9FR%-(@TEe>t1!N=%Bj9Ou)c=nQ^VqyIyD-uESep+df=t{Qfx=GU(r)cNdf&|tcBqia9=sG>+XL&- z1IrCUU%X!%lC55P4{?4$QD6ED%$_Y@MLv8Gr6W?$0ta-j_9MgnH>v*Z8%Vse@+oPr zwR$T`eNSREJ#LhNdvdDrGb5G-i0={_5pUxNcjsuatG~W?ot4tYh3+jZtEO9L(`N)=imBDo&pOwvTBAX+QtBCYN3L`rcX|M zjD?$wE^)3#WS{d7Htn4*nthip#8AN#{tgoa8h~E&J^K|3GHbRTOL zMTUHxYjvM{QFJft`{#iq)@#L45kIaxv*K~?XR?cht$trm5R<6(Wul&V&DQuK<{UQm zFkN`sX%yKHL2G?)Gv<;-rgj0Uf)!_NfJ31%wFjip>YJnQwVMi0At-2Fet-PHb%`sl zQehHJsJG^Vmy_ybl7_Hc+ZUc+5frlJ^!%pbAH}I4Bee!t_L^jbw9rc@IsT__gBafI zSGHC>G*N>9&t<#zhH1@_7npo4wS_7=Zu-Txcha(6&PWX2H&k|Lm9;2_iN|0KM;I&S@=-~{+F_^vMuPn631+TUg1gIwP`xs z<;A;Qy)^3apbuX;CiaM|cE(^nYB?1&*pUsliz|uw;e#qbCePq4y@mDw@_H2{p}O#b z*#e}lC3+v9o4b0ymNd(*=Y`_Aa19IJ?T2h4oIGp=E8H&*JZ(inPrD%d5< z;KC^Z;g;m(dYIPD6bW_xk#=SSO;uN7Kfe4i!$_^G5h2)r6CpJc;lfR)noO2VgWUwX z7e$=1kN;QiK*3wb(lwR8Z~{k(kP~7vq*2-Al>B5G(AV zfy89l9K#a<0h|XNhTjpFiN=x#FX_pkD#f3nUE-h$$VO;sdg?hJqqAi^)CPxmtzGKy zZHh02v?3v_u8ZCZn1b2?nY3^uh0!LDeirHE>c>P9Dzymc=vUidHxaPGj?%>w(}ck& z3I>$b4{h0OqUwDX=&C~fs>uUR$1HXbPKUq+N_A4V`*msalNjUUK$GU*Y(MQCC*vN2K=Lg&m*)4?-f%-amU^e>uf<;^)%GCL??3<1N(+Z-C4UEgK{$nYA zXTiW2jLLTWV)fwP22qO%BJkJ?sWY1?4yX?Rg-&Hu@;}J>-WUt?5a3q=a^q8}v-a7wE1tzkZ8Mzw)^eF`^fB1D^i0n@kxWe;&VJxOULs}1s zfKv=W6~MZLM)~XC8U+9%8IFd?52LL$Hxss+OrbnVK7sBkQ{2B9&EKZL&(9pyzny(% zK`o%L?)sPXLyedqq-(oLApWwd<7Z6K#-j*~4Cu1|AqOgt>%NN-2!KhR?_nQ*;QZu`m zb^-hO&-cUl^OaH`W`Vm_I!{S}!AK z`)#-$!mc`?_cvU-7b8fK;rzrQCHGF+r3@3_LDY_^k@9@XvpI3T1U=2=8N0JVR)J-e zx9YIg%y&Onfq!KEQB7pM|3U>AH{;*3s_Z)oBfI`BAq>-_n+A@MJae&yj*(=NoB zSQy*g)XB4cj_EqOz?8SFTp*%M2)IWLhJu17oWHEI36#yl%vA@M8H(uvF`KpUuS$m2 za@70=c258%YJ@oT2eH^yT^$>Gycc_w*qLi4uFAx z12VcQB)~6{90mH!#RezxaC z+SL>A3&7{E8LPk)4xG|nFyl1BA<*ctwA3|#mPmQ^OyZ-ZPT}%bdveYs#}|*F$pbiP zh&+3;eDbWr%af|XOv{e7>R zba{v2akk9xXFIlj#2x|0P@UqJ^v#Epid+EoYWGV}3?um;Je7Sv3ciZA%3tEzVUJM3 zY8nM(LXc7HpTleM0%^Zf`B~&mPhdc6id8tKr;S$Vdc|*HyJs~Ia(0KL)B@n1sT=}l zIPfhbKYtY0ov${Ry2QBwsZ%c#PJVA7L9EmPr{{U6;nRqoAT1h?bVdqD3i_q#pO|*- z6jk}t{hnWHLQosyDHurCDb$b2_+9wHj1b%{41<5zl`AiKg$JqBVoh?H2=A(OpYI&0 z{d#Nv!jFAm{;AVMb9DMY^XzW*?HxAl)MFPb0o&)-vwmbwC<~GEWT1rq$;i|yT>hGT zu)Syc`S${(WOr}y`L|4-!o`xRD}G|J=aYWy!2#}n_oP4AUHo8OEhqaI14{jURFZq@ z?SA=-?xvfPfZ<0lpc=pb=R2@be%Yc0LbQOm4?%n~U?G37SPNM45G*SLQS^tXwm>uv zA!r$>wmtv)1Ruhh3fes)qo83D}U-Y zE!5)~ln-TSX8dUuT4u5CHEW!W}qEn3aVNoD!(o!BiW zA@g{yf>&HkWY!&9_WLFmNJ>Yh#COA)Rfm{x^}BW>t-|LBCu5Azdn6B)5g)r8hXM*r z@|J_?Y_<_aD*=43*Lmf^oMj})vb;^gkOeU)Fd!xnwG;9T;UDV$r-NSzpCl+H5~M`l zECUvPqZ=klE^Y%N7MDWHOW6gSgm2dfKXzX;*byxte^$9eQTsYF^7TD4IqB4d@Jc!1 z$8};Q4E&K(WHEB0RpnP+wy|GbrOU2`63UWXHI6P8I<4Gx+&a0NnkFbm=F%GNATmD5E&(%LapkKxIG&8zaCr zK6!rYoMZg`d2Q++2HA=@8AE6h$IciMEEf+4bmRrZf66sDDV2diM*Q-f@B^QqBm;T5 zlPsyP41!5Vo6ROFChto2JxeY;Wynfplm{!QzZ6K+9ILcf$XzKNxi5~5JN#x)OiUP* zpazDg%LJ3lB@9%ry;Uu1PyOgf^J0~1b6U%WmUQv(>PxYTDN|8s|JC01YfogMf~z9+ z9-==Rt}0^GK&Y$k2-PHc$aguG2h%K1^g2)V1;+<5M{i|KsoFSF#8WZ6m+s*A=ad3U zRPEQ9SU{y681D{=j}jiOO&slP>EBwbU$vMYw_7psVLnblQP>4Nu>XMkC+a7W9a?@& z0;fOFS7b10rUE&^!)#-m5g#P7LB#5FCm82sQH?MC5uZb zKccBV9p8BE1feZe1tD)xNDkAl8(vOdvW>z*QXRhNIe}2%<8JlAhR9d zsq{#|_{6kn&|IFM(X2y+iTa5@vw$1300*;)tg#8Rq%=E4wSMMNw=DD`V&J`()ecE z9kT6}Zo52n<>hVBh$)fZim`S$s#zp?F49=}qxHZHX)LzukFmVpX_3MR5a}$~d_>i5 z@{)F7U6W@X(pFV7&b=S3l$CzB-FC68Fs-@CXHD7=oCv|BSh0ka9f+0}Is*5jeR%o`LTl^*)7vQ+o=waz3V8Sx~9_cKg&w5&zmlv@l&5kCEuA)--RyU~q|m_J3gKh2pxLOFmrEP%Z`fcq?fPdQL1EKsaF@IO+8a*$$JkZO03##s(tl5X61W={_LDy>=y4ccSt?37{QjI| zOm}!Dt7M{bM4qxl)Sa*b<;c$U@T%^}rnAUa<$IlB_j0IF6zRM{|xtsNk8y z@$5Z#?sGh!%754tv7Wg9a4IVCisA7jrd{Ja{*t7vXonN@dk8nq2_`BDx5E=GdlGEV z6C70%UBeSSdlG%m69ZI|Lc(DstdWSg$k_0Rm*q+L@W^Nj0m3}^p+$HJYuJOH`yZU{ zmy{>9gOkN7h(nMRtsBW{tSO{d{mFWG(>$>#E~NpS+6qp)p_SHfPW&2|@_at6=y96t zVCn~p^!Qwv-E-B6@CP-+=`-MrOtuF@^GRgv6142%e=NjV*cCYPGI{eP7})vwRmFuP zvY7KSt}Ogj%BuwOh%|XbvApDXi)@fXs%}JvNuEG$SOmH^`!(Amd)0?cY}sXDIX6i+ z!XvW17qTlX9&7!|30Qc{$DXCno|C|qdl?<^=;e8CO?cjeh{s8)xuy&E?^|Z!Em9w| zJ${#)`=qyk)SRm!T^rBK4r9-0Qq6n0pgdw(t5kiOo2FXddr{xFn7U!{s4xFf zooa(UM|A;5ZBb->LVnZL$i^9qy8CL?m+c&d2^SRw9QEV*wU0TP^e<|DMygb*v^1$c z=v8|%6VXW1*UZjY`Fyc;FSq7Itt4f>jG43S`$d@uXC3d=YFYN$l*JPC)kf*QrW*cM z>7{zZf@bb}t(I5Y&z`n-FI2pITHXYHIQ_IeGq3KQRp$XmL(-kjgx^noKP}+B+Ra%| zq`%an__R@@ul`c4SF*3;sJEghukm?gOMG8j#noQk{C3yKC%y%3JCTz4;eEPGHP)Pc zH~acJfA`FBG=y0-gRILz95tPmO|Pvh%kI@qFZ8Wh=Z07}ZgIZ++V^6u_rYJQF0!c3 zFs(jDu9uw8ngyQaf97m%;CyCp-H>;$_tO1p|58C8zVDf0)DSmU!O>!`@~7_Ddkw6= z2gTH182-sjDyT;nHk(+#fc$!@{bx8p{be*)dR^}b-S1-NPdyJgMnQiD9{(PR{#|{- zG4g?<>vQDu6tzB$XRqy_Wp=8+QNGtdx7d^vKB}+&ZkeO|o%LHwuCcztq0FU@=g&rO ze|j6sKGI#-bU*4%UBMXLv(dG}w*yy6T(r`@`uo_zN}+pIihV61Ttl)P@ARX(`#x2& zK7YG&bqd{A!d&!Hps=v__tVQyxt15@pCew%7frqCtI^<|EQ|W675%!vW_r*1y=VS2 zp}+3~Y-bt&zF7D@8>FFv{8VCl(Rh2gXeqMG+cLTo@jK(SWqV5WLPWu9>*(p1OLOG5 z^)-KAEaxrs7M4FKnrrI&sQYwQ`uV5nzN%Lm3$LD~%|w$B=$CIaKJ8e($-K98V7n~z zcY%g`zQA%`H@b9>%Y^*-LwS|gJ2|V;=T!$RYgfWkA>jYppS=OZ0D)lH|A#;O-}3CG zUpNV$6}}=*!e>c6aatF(53h zp`@;(al^H)sqMFKXsEhY)HNLyO+Au|%k@y!d~wH~)C=|{cAK~+t*mXEd8X=FhWVxRDWc6usxK*0_s-hc zUkyWYY`q9=Rkckr3aWF9t0d8tB>6_;lUmw)>>S-m@xW&Ptf zDJAvmXkZp>$p2lxPCttpE$0(1v-Rfx)vp`do7ylSXlTQh_5ZJaUGVzE!<*N1eE+9k z=k=<$&3!Hb{IU&t7*aalO7SlLfa6rcvc=CbdD-B8W!|JARX+p?bb-+GZF-A$dED>LvaklpaVd%*%|PIFO?_OAnZ*M8a_s7m?H*Z!v$ z%-QC(MCShT-+{63&SLi(!}sz3^y|!G>0CLP4u7m)`+HZXU@Fq1V`3=fKm9sE*B%0d z&hL5AQ~!gVnaBSL21l2s*1Xnj%4s_BZJB{I(cJzK(%(b%agFx|MY?# zO?zzrs~1dUh~!BWT_*~vkvZKLt*%}FKlFmJES{U0dR=U*<{}(3l|F`^u<}q|12XGG zeM;52hm&}B(}y-)%vFz_V7k=??ru!N{+4cgx1BuYI^C{2jELaCn6}<3smKI5hKi z%MqI5UU|h7mnvd)Pk6)&vR7$#c^^^hsNF8=bL$bWdX%H)+WZvu?n_urxmQ{JTWxFW zR{yLB+v0BUoNdQQWW<5nze!j_4+2s1x#neL!?!Rx?JADW7W1V28qXs5ldfZ#^XiRY#1*3#a){9ktlHiad==k+@^__wh5E%^)ux_Y(O; zQL4LW_RGr48L5WG*IxqF#f$0NBjmzt%%i-U3fc-~YR|;E6heRI__U8Q!=AQIGICl^ zMzmJfDU`@QENE|0nZ6qQl-l~wae;}nZ~OCqm}A)&d;-46`LizDuBKn#d~D~lLjQIy z|8R0w>b81$8Qt-wEb@lpYFF=g^H?lhq2wZ>L1Qh)mCoDi?YPcC$3Vl2#=V7zcQ@Kg zX@5tC^b~){tKDiAx4PJNxlAf7N!RMG>?t)(Z+}Z>m>O7<*QTkwO)!7I*ZTDftJ;$~ z=L65c(G4}#u~*Wkk)K-cNcUCGl6t`>OJUzNB0k1S|2yA&?Dy{%>CF4z#eVnqf4>i3 zOJDvup7Xo>d%pAJ^535&;wT^l|7-}gkm|^G1mIjaE{C%Wd1?U8Kw%NdagM@QIsj3% ztf#xfwJCZNavo|0-WU~LuwAYGCDkg-(P=Q0T?S9-QmVxTA9$X5-GRKUj7+w6pu(pi zfw6;g?NTLByvWisK^@Jn1BDN7m(t_(J)N{s^jc!H*d(RO(ZZJS0cxi$Yb)v!=IKP< zvee83gH2>m3lP^#a3cL1#c@%C;&?Z~WNr~dz$rk*f;2{oQ3G5pfHsiJN0#LPVn+^S zQ6)Rk-&cr71tTeq^)L*HyAZU^Y9a=QB#ZSQKyAap`UE^n9v@HZ$e{ksxLetdW$WNc zErYA1&8Z`914D0-sGr4`8QstCPMbHX-A2gD8Lkut8OMP#2IwA$4$FZ`OiCmjo0N)z-9b1D zm0%#BO;5^k-Vg|8O0+pAIGq0)8f;X+OWG18Y^RLbFiel1QUlUtm_%qGs0fuiZpg@% zh|m34CgxkMCxif(b1>IkW!eK=7N?>An1B*CfK_EJ3B*)RwtxNWdfRBV9s85ixPrRx ztI1luPg`zxk#5ZF=^MA@iDGoUi*}hr@-(PRsq@+Tg~1coG3Q4#=EPwE*edLP@(eYC zd-T%9kq8mLvwa_uz(fMkl9z)~5n_P@OZm)69##4+P=1^|5) zofI7JQQ#$IfjrEC3^m=2Sjs6H+-l7%@^KAf*9E9M$!z@H;5Zx#{!gc)4cX*L4z^yH z%4r+p>K9N!P(a@@^(}7QRWj|fx^|c8X_mIMC9N!=MvJQ)8=5=dubnHS2yY5#nqK>6 zFvkb8@T1Ey!ViV_Y#D#B;q@tuSNz2G@CWJ5HZ#CJlH8vS?r%wKY4oQ0aSa-WY)_1; zWmhrDpekkoMs9$BRUDkfg%$5Y50Cu-@MDk}RM&WLf{Rw-8?->LC%4=};S#-GwgplY z<`t5(xB}`g<9m2=cL6mP$IeQ4t!dQ61nkOjK^eBWSLS;XTI38^vs~MH zkQM%fB?6HeGw!*kG6`REJh93b?)!z_%EWjYKK2A|2iFo4Jf|g7)p$=j(i&!=n&~h}Eds z)qOj0+G&eU*>CeDs-6U=hzRargQ=+j}xaVTnJVn_R*iZG+nH^WsXW zg$@NI0GxgB;_Svf7exTlZ*PqKO;_j-5}a7Lb%7}-Su?%t!G{#$&1~I#DEt-U`=H>r zV1|689a^9*(?2Q_Jqf;J^Ef$PG$zdR1NoSD@lSwWWA8@E zNrDeIAc=bM<7M;W2d&nli)H*Jl*d-IC$}@Y$yX72<}#L9W_~hIaCb1;N|EX+5J^EWx&kwk5TZwJ z8-H=R2_a)uRy6Y)u%|Gy_1iQ>%-|t7qa1feTsmsTwdS4`4&6iY1f7J2pgReCs)`AUkA&6c8F|fv z)SDO+GRuq;0H7U*3KG^WHP#iHNCY1R#31xQ4p9$qV99>+oMT80^wt9?*mah^kQ5@q zku@W&*lQs%tNI0(NXn}+29EyvVyiI37LqTQEp?Ze;laX(f-&8;y$etB?SUlG-g+n%r!f$e8`Z%=)!p)na{I;81?weW% z^Vbe@>A&t`i<*dCmp)BhwQ&vw)0vL68K8DP~6sAUE$A_Jb6LD`!@y^ulsD}$ar zlR-68ZwSP*%1%m+aV#K2k$@^Hmb)z0915aZrKcge)*0z+0a;>Vh%h9SfmFuJK(O~_ z-Z^@3a_P?Sb|WoS_>LUmA@!_KPNFc@l!-+Z%Yp>B_A)P>bTm2;|LM-vWw8!qF|L8G ztRnOyNG&|T<2aOW;emaHKi_#w!Zh}~p3eWG?k)nNjQ@R)Ka&hSbi>dMLr9}Dba$7e z0t(Usg3QpVLpRdWQqt%UBA_%#i4vlqqKJqs_qqRb7H4%9cX#)$aG|`P-|O==i@$M^ zK@=y>sPCuXJjKBCGuyq3%`XaVXXwk>QHb7wLFWOd#ysRg{^jD^9)?WQ+G-B+zBhgr z=%(>MsV<62V_+=?Z{+~!N+2LRZ=DFyuY__DC^UiqDI$QJ2ejHDeA@ujve0`0!bn0` ziAiqYVS?@ufp&;5!G#K46pe*2ks+{PXmuI|4Z&_%2*Qd3$4~*<&nf zA=ZYhvh9FiJ0u_oA$9(xlonk!)@TQDFJEgcm!<@^ewOb8A_kzWto9>OdVDFhsifdXLnQ$xEC!-I52eDu-3(a+a0pm10JT6!;&Tpy zp-^{-8VSZr$e|4e1j%sC5|r+7Efig6?Nk?$RPR4sze#yNgcBMz9YM`sPfKEypDtEP zuK~{6?@=$@qXR@CP4=!o)uC^BIVRjGo75Qw)GLgv|14xtP$<%I%ERQFt~ORN71%>o zoBV8pM1ECDCuqdfRl2NcZA3w-gAq_H3YKeeu!vKrI&Y#)&5ft#I zY&JtRLnj#ZLbfg^@VFRB9s!uZaa{}`ieq&owLm?x-}j)eP_g+{LfskQn^WLd=|Ht@ z$fKrKD7jU=knuWRIge)Ba#z_3&og@1_m`om;dgzGa+wLt_jZje)>6T>JdEIkBIW z^%xS+lub{nVI)V;Y-amm0K7$(*k%Vnsx8W)aKo`aUWbr9;KJf)84NJa0my7aSliKj zBvcR-_%O|=M9r$uULG|M7yklL&UnDHjTN!(p$_hmF7ELf=|ON6Rd#l1N&=TQ8;}4i z&2QFF!$vobj%bQIWoP!cS1Prqyfq3{QkpNl)z%26aB$n}FCKI^ zl2p8{?Z9o!z>V&6_kgDnx<)**Z7X4rW5n&!8YC92EeUXuVT{N3ltVic^uW`O;=1#2 zi{@S#IS9U;k&%>7Jp%u_S{ zX6-Z{?D^eGrQSy^*BAutDE-~YKo$HOUiFh}=*bItlNWJ$OWJ6`J8jVF>Ot`|6z5pdyZA5eVus7 z*>8gqr;d0`LlcD3Q;)sgU&K``E7`TXfgUm{g`QisNt>_=0K<@ZcrSIIRL7ty8lc#Q z=x20%eZ#oo)Zpbmw)LwO%Fq_a1*l`8UKsd{v$PHkaP+Hfa|-rpTEx_4@=p^K_T>Q- z|IDtX7xrZm#y=HztEZb9@WQs-7@6$EL$t`9>{QjaO~|>86B&XXNm89Q94d@A*fRd{DgKFTx03#N84-a7iU~2OaGwjqIPM|;v z%|p(M$e;Dkt~DO0HuE35y#qKj)oC3=t}Vcsf+mwY+MX2GU)!jc{t4y9LF~7obT~-F z`grN|eV*ZRjP#;Vz+%*`2KTDDKj$Cka$^v4#*4a@&y%9(v}i;-{aSx)HhuhpeJ^G1 z$X<;1CBmO|&E z`V6fq%D=}!eJVI$kjKey4mJB$~1nB8_*Z||^I z>~KEX;eNHl`)>!syUSDz{<~KIwaoRB+LZ`o(e3UFI27g^+LaHy8+nyc?&6+`8PglT z3di3S+u{|_k=1rup9$5HDZkE!#=+^Kz0s*LZ@I=NJk_cf_hX=SRz`K~Ktrh0eSBN3 z$;LboROdKQ=Q_=1cze|N_I>-d`<~C6tjzX<++;TWxgdk+Z||FpB>}ChR_IQv)}JT4 zMz^j$YWJ%^K4skde4f)C{OCZM;bD(QuRF0f>Qy(%^r3sl*m=gF(Z73^w+^7dQ>JHI znRM@dNE8+A4j&p1O=JuKKcdInEuVrIA-~OcfY26FIQBppNuPD7u z3n9?9CB?4s&o{z?;qB6!JCbX?)|>vWRd4Bzxi6ui7jbm2z6hA3`5xr*Upf)HeDbmU zwb<(une!7Y->bOJ5Z)e^rY6s&enEn(Rg4izHOut!NM$?kvdrcE_U9YX&)Q1tbN(&ya?r5Xuieb8E9WoObCa4b ze`gM+2*5y?dE(wbpUS?JbxSl7eSLWzHcQy&iR)17Y1)qM`aRG6{c!j6{B)+;>^Eih zHzeuzgtfA<+4YqbQ-==vKX?4T_1}TIZLg+P z{^U}hW!&6lhDm=B`U^1NFhD%w|L)JWSCRor4n}WwhFx45z$=sIV7W7rN-G=KtupWa zBtuxY}cz83g6{_F~7bYy?%P{^7-w5fB&9SU~v!% zp>`aMUI&Xuuz9!RDfkkxT9l%-?ON2b<5+E4obzPav&rpE5zUtHKdh>OXvRl-eT_yMS-DfTy&tog^X> zsA3pen_P9L*IUyvpe_lUGP z4ACPnsJCW^@%nYE)(NDSa^r9dfzO2CNtb{dsPm>nQ^kJoTXbm#wC z)|bm3O#FIGM>9Ea?Lopak&+^Uz|TbWNKgHUCG-cGAaELl59ohaKNvXpc|!fh@b|Za zHy)oOHI7SD_A`Jn`b#cBPuM8ZkB8AIWx-RTkEenkVD!sEW|S{CbyQ)^%R(2#d&}x^ zZ`&!u#`Le2e_6z8b;0o=N@d<23O}@Sqipj-qSX>FR z2SLl!R^E(4{>5;TC1kSv=I5_Sw`{7;?;donoLX8%>MmpP4xK`U8D#U`opipcRA^Jxx3C|a(*#}Yl3 z2EptTp8@o!G!+AocYwe<5UGV9&11|>yqMPy^t5&-Z>lbMq6fuj+-&&a<&jCUB%EG+ z5d#TSp3H*w24?jV*)G=&P(feP4WAQ{v2cKoUq4+zD>#eeqqh{tH#PW+9MOb4ADI*# zWB4z4;Q(CZP9R0zW#m$kB^BXJSSo!D zzps46XjYbGjibqi&;$T+YJFITak^?b3Y`auIv zgE-WJR9Y}`baw%?=`@#qPqC$)Bsx8%Jcvv7GF!D_RysGCWHuq7#n%8peG;Jb#?A$l zLs{-EzPo6<*S`zLl=B|F#JN^4t+97wC|w&&KOWB`s`TzFvQU|YhAi~CC*f#DaCUhE zC5@fQH3GtohLqKbP?b>;HuBYd(%4dyT7HeX_y_kGBXs2}?*`oq{-%&zyN;ajdXA$x z$7b!-DwlX#&URg9svt;)icL9kfuIdO+yV0P_|FSb*MJx9Fh*Z8GEq3yorUYgo(^!& z&|#D@UczzOiM0!8xR30?tnqr=!4Q_(kZyos%x%1j18DW-mtUWDi{SSsK`0BzD1n!H zg1s{V7E#wW;>C#Y2y`NHyd9ZvN``Y{pD+*LNDrZvt#EvxZ-No2S7K6zd%xK%v#Yov z(5A_2__@um(V}fd{rV~5tS!m9bmnwb<&j(}rvw86>%GmKkY%J+D6p8WVu!IfkN{rb z;@Qzv)Yk5>6%_PEO!P!oj{%e+_1KEidTo^b-xB8mdXBfK8fZn}nB9y?YqLrt0LxU0 zw#KfxY2PT@EEZ43#p@BOsGA7qqjqIAUJQ?ypNi7S1K{ymCKm##*)(IQ}DV}yimH^kO<2oF~847PA6qoMv|(lJ3hzGLNkGbYpy}*qyP9zZb+WVslN%e1@$M*l@LJf~ z^qIKwOfbYwj>*!?X^Hg^Z*Sh^?P#pCto7(&9(5%$zNHFi!b~z3Sdh4w!2|La#hh83 zNam74GbpDn{hv*%Pi>xThRljx60Y&C=oD%_r9JJPYJDB__|2T{`e7TzQSO#h6$7F_ zsTxu3-r~NpkRAYEIX57ure5E9g*fa^p|+q%q;U~KQjl3a$t0SgwTG=eUoHg<9w#%E z@uTShh679j7s2B(^viV~A^D&LoXZ*(0Z`_Ux5g^MHoPj7B2_C$*Z9OXBex;J zHp45mFWp?c0XwLBXCoEe5jymF^mTp4t(T_Xsdgl)665o8v_qWJ;1w97 zNp)b2jEbjO#f0Gy-Ek#f<$M2PG?nM)p7ES2eLg)b@h}^_`-r=)aPy^c@5~1ezVdpb zSSg#Qu|xZ@=eM+OPQ3c@PwnwN`G^LU0*t5oSe?%+=AN5tN3(&Ej5dP7>CPGxQ8ywc zzHi+uzw{gP>}D@6!h#Clj{hQ-@(AzUhHe{;`Rm#CldgU^$@f+-5K$TNivjuzT5i8t zcY|Aly1_NHX;o0H-dMIQRraly+Pb=COY`u9q5&kc;{7f%+(tGVtEfZ$sGXY9JTe~H z1xZeo&d-1_q3GyBhqI4cxEfNKY-sgx7l;-Y;t5g{j8aFi!K|+r69^;6Ua4Z03Gkdu z*3*YrZB(0p5~X^Nx3f~bZ_m|DT)B47C+k!$#Rq*>X)HA4b%my7F0!hZrp%wT;F^Jp zUO4dN?)fD_HB@az_+C$?Lz;_Vd)|9oZUaos0v5=RqS#axClfBHAdLG6Jo8XZ^c z%DC)>%wft?+U52xW#h5$(~W_0v<)AWCR4Q^^})f@^CJRKz@U4kL^X8{qUR8ABnC{J zi~$XO&XG^pu?Si$5uA1c&pQDcdO4{;>>K^K?$qUt_^Nn0pbrtsoDkF15pL6R9&sIC zAT}BM@u}q|QLRq~e+m}-O z&eNk&B|m0;8gKEIB|W9uiG4BLGWoYDgr<% zqk<(TpaNxC12ncFDIKYjegvs?#`lU$62X*-q#T3;B^*mYqT^|Q02El|ElD*jeDt@_ zboKMOU5)(jC3=nH)ZoVH%5U?3%+1i4-g`9jT}5-PiF!&xbUWm^zloXTc_ITll*gAS zqe^Av^Mx@~a{4j=nmbIF7*JOj#%3*9vvB}8`Jpue7c80!(jW&ZwrOf> z^OQG)I9Z%?S^d494yl{twVmzPng3&D1o5$03bjyHX#SNh_Pbl{6+Bak2ub>3krV_# zNOPZ=38rZec%l~0%hN3z402>KsS-apUS3~BXySsNYldx()_-IVY|*^%d;)tq`m%Xx z(_}z37Iz8J{S+gnp5F|M#o?1?)c37b|7M^`0Lqu};Un8?9TfEsK-G^i18?c9YRzG2 zy%xj3kxz(k0OabHNjS4+^*L1Hih;D6Q>*RHbB@MzTemD5r~MV@C$^Vqjr2{IwOxlr zj+7koDc|VOAQCM+W|Vxg2GX6ZDtrM66$Xi*B~u*o!N7iypVqnUS;UOdhn77HN9`OI=_zG!c^@@JV{nzwbyAM;JJ zaNn|zDqlW#WT9c3gfOTu-_S$}s&K{o5<+wr2>4ZN7PH$P=62z>>G=+7wvJ1;Y|~wF z`8Y1m@>Q1$99H5p~n`XEgdtp5SLAV)f>k(j7Nj84Nz;or8kx^@FT zYcd*|HA(ANT3|sKn{O?#&xqhOqLw)R_&TSchd-N6dwpiuP4~X@`Xi4nbT_${7tcf3!A^oTU+& z=X3@HS~P@e-lhi6`4tYZ`9ejH2}(a4EFW&0gZ=(vfDeJeXZaV`JTf{or&8_tp{M!RgYiIM@6?rQs zYnMd=92WmPZ{6mhNq(_RxXWZF-JRkGVc&jH+Zl zP`v!vb{E}qIc{|I_{d)6qy6wht`2DnDp${)`6X^WvcHSbBTaKQyHc-^ zj$TtcGsL*=4GwHwctpwUK%~S1NCTJHQL#STy)Ygdd2U77JI?<`x6}(tEtQP?Z0WS^ zX0`HdRKnJONH~et4PV`VbO-NpIL^z*ce&rl3 zRJ&!w}2#J4_|KKO#aK!8Qg=>F+ zpItKDPwBBbI)^(i{L&s>Zb2Fe&bohk_*U~uuNdq8%b6>}v`*`P-%CV%=)Q9ep}F^| z{Bl*&R>EwT=>B__E0^o-u5HCyh1+et*mqo+x$3{OXU1zWIN_6dhv=*F8L_1I^eJ7;Rf>lx$cXj zS7%4Bk)O6%KkbNo+Ex0rr}ycN-KTQEzBCmEIj~ySn_lfnbLbD4G_#|mN&k>#nyQ)# zesE;=%X*7sJiJZ&HITGzgF30FM6Kn~^-z8j33zY!8EF3$H{l$gWq)t`QzFTfvm@7F zgz~2u>a54({lDitFK#gD9jhnMLocCV_NjK7o?nuV`RZ>#;v9?JJXHUs{hLVR?IndRry8m9#W~FUp?h1YT93^*-5ahB$H6MH>HJnJU!itvkM3b$EI+}mr-yX_X_*A_0q5bf3;;ZG; z-H*qGXr2YeI!-z?fnJ4xHh?ibL4^z_5K(z}@x06@E}Rc71=pz9j?&#J2p*RfG}d!3 zE?|=!AeIXdzIK9OGK7*np49^2-(KcuT|oCOEL%j}No5JXbavrJs2nZ9U6ff{Je7K8 zp7v<|?ftAx{?)P^JmlEVOrTBv1g36aeFXIM5z`4ldv(&$-thn*j#! zgteQuQd0fz5wFcfMArr2cxGw@2CS5=#CZcm&OXiuez=s1ofXX+b?A5Qy#~Za2gi2AA42yGOA7jEQwTv#RRrD6|d!SVZ2jd(i>V8yw zdsIC6=aC~PgcL=5$=iDgRhj*3?2%)Y;7{_zO^xth5B}{n(`|l49`z%`dr&@Q^>lHR zfH`6%YaUzy2{U6N&<$6i5`V9Rnm%P{?~X zSZt5QBe^b`_*w{zr_o)wq7i8+sF%UdmBZ{9yfcx*)X*^RG8KLlo>CG} z$!8Cjuq_c}(sCfTw~~8J?{O|?ur%5Mv<>G5Xxu*aRIa4>Z64LW7p3ey2GzXy$=3F}nyK*4x8?;J0dNzV^i?Y#&* zzX+@@tzJb%;u}134zgoUu@3Q>&&Pg9O<&CC8W} zP^>s6h<4mvyXZotqwiXPvc*jp@jf5LUj9wD2%fj>gjDX6@1sdmJ8${J#x#|=Q`x`0 z;M8Y0(yKMpkx=#yZ;MUZ%9nB!%9GAn6;Fv3tucqmwsoDc#qsk0EfA-;I_OCyqstmjg z2txPy2HuFL(F;U+62z~(K;K(`IE^lbl^fQSTp#$kf6IYWM*=)!XVDOE{`OZ+dsUB3 zi>)zlvqd}anI2D}p#bw@=rn6%UBh?B49Q*|0}Gfovk8zu$D=}g`v4jfghK_e3zO)0 zG3YI7UW=e4YB~$jm|NhCJ*oFXqRr>wpP#5LZ#&8ijv^Hf&{`DNpxXqvc6TKK&BwlM zcNqo!BVC)LX0XoUzwbPL9s`HDV;{#`0%LTtG4sj6y+oEWE!rXOug~kOlHdC@%QFW> z=%lCz_P<*k00U^q2d80Rdy_PaeP$A>MWasBG5)Y4%zK7Mf+jcLW|yWelyou5#nI~3 z^RxAUgz~dI(_N|WJui3D@n|NDZUMEa$_}1Oq53VJLVz9ok9b2CX(=BvM27KlHOxbh ze_3no@iD(OU*K}>Z%4g_3TyQ0@Sr?!A_nf*1(*aoi2}xd{kc7m7yjz|YbfGN;Vr>? z(TOOo$`L-7YUevYaXdopL=^KpYu(0-#7B+O#ow9RpB?&@N$EmSuWp&_B|PffPUQM0 zxtp%g*1K9o-Az2l)xijwz@j-b;eE^C#g_25dcBZNWS~to@5b>J+pNxJhohYKgPi5UO%F@}MBqOwmx-6#6R1lP`q_eYS zRW!zR(w=hh4?j8~a+H&*Bh^`6fbsDuj@uKPW)>sBTqE|x$5bv|r$vCZtKo@sNJoa- z9|86;u?e}Hj?60>f}BeY6Bjx=vI1iSx%b4LsxEfii5L>({o3$U^Q7bM?LUGTnD``~ zv6GanAtb=mIH@b&nSCclNJvn8%FwDar(j4(M4@rYG^8`P;*XG+w)nJVPG?@dhOmTn znU zVpql4km$v)jdQUlUHAU|5yjc3jSM^q%CVQ)gD5>-lb?lb3W;U5D4}I|* z{u7B2l+Ntmc61+4E+{73)Hr6A8ny}dNJ$5$C|=)&S#B%}%cs@J@raqR=q+){T)nQ~ z>TBAFSQ2q-zb+DRpl!=3jc5z2B@T#NzAji2*?3;Ryv}cz@qU?K&96aiOFXQ)MySdx zyv0&e;+(sAUrFNqlVK@g*>IpU8K(UU*W@35)V39 zYn&!0z6Zq4JU~qiZf&5%$%nQzp_`mah-v#2)o!W#?jM#ZN@<&V9!l6MqZS?(zi6f$ zE;ZR#q4q3%^qt&tiKYl(18Bt1h9SDU$69fVxkn@0k2UI*D zEc$UR3^YWb$^o4bD2zZ@1Y(?77jF;;f#wJVJ0R^*7Lj^r?F`~0(A^|z8D{I5frLj! zK@-$Qpz)b^y#gv83kPo{b=_~*!ay1W5}OtahnJrIpcT3xBxxwEpeHG>DJlc%n9GXl z9oEhukTH=~tTVL%p$+I_eq9e&6_NfE5V7KR_1G^YN8cRuKA>_UX50fYQ6wQ(OiD2z zB6-{E`l8zv(93{W##>1fR5OFNZtEU?pvU3h5du9CNS~q-@`c3ZKvHy5Q>V|?^|j}< za1HIp_LtT1CZLc~($EEwl#R0=H@_I@l5`~Gtg*^%mX2{aeGxtp5J}`KvV`)RG^t6X5It26NsKdqBB8N z1VSN0a~B?Nfx3n^f0awmoxN=wT;CpkdgBwoCnyPOEG>1>2W;|C-a_TQNYM_c}B=Prxc&78@11F?z{EJ{ieF(_g)6Di&Q{< zN(%~DN(*41=M__Z=b5FjWGBLYv-4eDluyJznw))y{2J*BGlvto!&OCX(bzII(W6{5 zyRj?7gT0?$lM|@<%!c~D>`mrMg0}-eOf+9(e9vrn;M<3_u4}JnhX=oZ-u^F4H1zZ9 z!4ew}6qE6*+7IxBqR%y>&psW|A5~x0{P$1A5V9R?>GB3H0Bp-KaPgr|`2f_S4iw0! zga9I}Gr=VOuMFKOx>_c+l}7w(iq+cR_#<}-_c|ar9-z{46CWI&oJN3auI-pGQNg{^ z5GxR`tH~|3J2)ISd{0XYimk!vQ{~m-jZ032GG_KE$Z;jU{T8uY-y*Fj0UeIqOlTA& zkwc-1l2CHpvv^B@&u$rWOFM0f5q%qFBdW(BaC+5<$g6mu6*k@fG7px0h^~NM5Zg%y zuIDV=Q8jwnfV(51#u3L6o{p|%B^GB_P^3jO+_C4i5z}pQJ3oDI)DdlDUj}R&Sr8E` zC5?rQW^b<5AfDtKn2o(1m&D(Bzi|~mupyC~0hJz{?p>h-TPD(_mp z&T4%B_;n6PA$>Zp!xnJ5U?AFhx+rF?=8?q4+AXtWbAQ>}Wrqqb1K{X%u*UZG<=v%0 z{s9cd))}omhH(Q!XPc_oxWfsA2i5m2Zu>W9CTx4>nxU_OkFm#Evz%|Pb>DvK^5GFB z#YKx3Z>YjP6{Y>wxIS^`=>evSPv2x=HUG0zZ?PN-lPwne0pC$@Ja)-yB>fZR03gkt0 z;&fNNE}wGe>S(13WtuQQ`k|L{VknxW(tYu_j=8zPAL<$N^Eu(XxZA%@v|s&;uh;w( zynBmz;WZGhH2mIGhe++h30CE9N~>dE)*<%=`G%3I;PwRkZwx9l`d zxT7gs03a?EhL8wm5XS7#BN+r7s()|`3RtGG;zyVam7hqsSz=h(3Dgp!@ep=Qre|g` z2O?)&*iI))pIV239fP8y0btNz0UF9tKvXT82HLTU1BDQAsFLaic7)LZ4G`HEv-4@H z#ni<~P#O#!PY?m7f+ZPW3CV@Yk?C$?lOZnTTpD&14{|=9DAtLo*Qt|m^fNT^&q2Ve zAW*Swf=FVez=+AdM8;1e@6l|iSUUu!M1sX9dO&GZw5Vb*Bu!}LU0B*%EG2ZZdI5s8 z#w0-Uf(+tG*_Z&SR3U`?c|3#wo*1ko&}ePLk_E) zDv=Ls>C|w^SniR6zGY!q>JW1PXH(6L@WN3zSxC|((lDz)IAYK!eOxHOP=3H>pKe(= z$^gEd#-Z9R5{Z2{3VCUOsR0FqR(Iv8==$j*7R{=qM^Lavye5T}74c0jCg;x>g4+T? zoFpUT4um*NurQ)fSXES*7?y&7NGM~;1RSn8Uvp0&j(;ftwsA6u&S!2Lq1lJE&8`a) z=wYfi(2(b;;vbAigGvRhLEHcjJSPDngvV3{k#Wpe0#@-`Dm1FekmVMsiEaiW%AU&I zBSC6Ahi*5+va6W9B+$&3oF*uzO>7OMvNm;7uO%U2rBp)5 zZUiA9m}^SX$rG-Il?HICV+XAERl%eW!F>Mu3D`(r;US(0sResaWmlWL-xOhg>uJ2p z+6a&eo-_ks_&>P<^-^DOW;FUt=vovP5~n~J4-*0ilnt8ifK)@zzirvR?fKxV&F41l zj~D^Q+&=Z8Krg<4il~Z@Vu5=B@1Ua0fB0^vyec59$i$J7^`#!}zt7pu- z-8hk0k_hwYgXQuO;JJE|LWar=az{~jGRE4p`PXd8e#_Ni2`3_{=b7yq-t*EkpTtzo z6rF_Y8hd1zE?***+FDC4r4=P5u#GSxz^J8m;<=8a`xpz_D`}wte%6~CB3r)tm#7?A z4*<%7N<4#!>n6io@#aEB#KWin0#_fIQFd*F(aDt*_>Ai%&<Tj}!YRn^%ZPK4$*_I*MH=oAI8)!~ ztqz)1KD%FA^x>+{eg3_6e8JcbkhGsFW1Yv6UuH*7sA9u;Lx=wDPzhl1{DHXO6fwMVT>0Wfq1rGc@XQGm}?*FYttSW=7QUL>p*~h6ilFT!W{{` zB&dZ^sD*wqd(6&GgxK}*Z-2NLIn;ang>-l5ji~w0$-7p0`JdPKAC^az1w2|Tf3W_p zm;2YT;x@nq87`1DCn+A_nc!I4!;a8j34Z`6wPh?`&m4^*_@C|f4;w|wqQ%h|C|Q~A z9i=CdUxR>R!H}T@1HyYgTpNAEqch55hUfG`0H?~ubIR_@ByDDUT8efU?*=BxOfT+t zhxwx*2XizUT?utd1<?(?xV0KDUqBHEE22T7NIaCwNKIaSbU?#T_Jdbn{!G}c4u zyY|j%vQ}dJO>~NZO3H9Yj73P?&-14g(GD*5cF3y$R8uVVdStvm08hgp+>RkGmBJwn zsgnyabMGkN^S7f=aa55m_)5geD#N{1i-gE{NF|c@7#)Eiz(UC1YZe+mVc<$H0ZK@>t8v1u^N3zO0JHtXE>9+w6DVINW&~dFP<$ z&g-gMPH*FC3vWRu**>x-sHxn2`t6P}EIR*;xSDd8Vk9-x1=!&)xhFL`Y1-{X>s zNcJLmM2F%lQw0RyVw=g7+BAz=@w`Zml7OEIe)GtyIB7aV;ztOCX_o@0CHmVwR-aMl zpE8;y2nq9u%Yl}#1Q)~C3?qw6N)L<6`^zpmmes5mNBfa_CX1Wa%QOYE>48#8@lpU+ z3IK?q^AHq{gkTJ&EI!EpD~4t{2Jk{<&kY$SrlO}Bi`Syczxx)>9ilb+3TC6qmJM@% zIOIu<75W|nvFM^_Q7*42D|W@vm&ph%X2{{sBCX|$k@cc4stgl9@18Y+f4(f9@-8$g zjo0ZebxFYsN)kL;UcWfcxW9zP26oe=Mh@V#5A^CY4?QE^?9d@iyD&+ zjG~333q;cW2)?Ee3*^^)8s(ZZ6OQJow>HwU2n9#MJ>$IT;|--|W(#RjcaTsh~g zjs8{Ke6#kK#);RkUdk-&B{-IRB+#+@t9}RnuHm zlY3;rdzI#Hr{K)9^9i#Yc z)(mdBk`C@>#cy(|Jh!+pT%C_ccwG%U$N1ZT_6{+1ZuZSiELWGjdY7Vem(uyIE|t|P}gop|c$%1|9%=y|X26<@u z0X?q9eEAyMC4)h0kkRNC+C-hnDnn*R>!FiEJIexx3{)`C3a#bb0+nm!Aoju;TJLG| zBX?TZ;=3iPdf6>oo=fz}X7?dI`X2E2$}$QD4T9f0&@<_1-A+_2Ug=s0`b9LlEJH<} zsD%8|FXAzPU>K+%4!q`PsJ_LNCeQRu4eg}P&~=UBK`Fz-Ta1H)=(wC#zj!9{ZxN=2 zK_iC2urGrf(=k|l8*4Vo?*m6{bze9Ww}d3~DmB-vI>$OSuw2SG)@aoo22ttH;9lTj zdiR@i=QqnUt4AD=2V=XBj36qBAJ88L7?ZjfJ{d9nR%bspR&ih8|CYh{z2pHbSmw~U z{bW%^bVP-0)#h4>Nk+?Ld&$J_kdw8TdvA>Z+u2AdRaiEe)`TH}apcvrUd0gfd6R^w zF?v%CT?7M{soGCU7~Fg>ydYaJ?QbvocEE`0&7Zw+QIUO`C*LoC>9!14mtC9rn=7;*#yQ+>P+*l|K`Wr7C)(Ur10Y_wl z9FKNI9b39-_lDJ@OtB?IY=osUz2DT({&m|}H(%e1snQ}7)8BtjURd8n~ zz3qdwv#+$Iu#u_tRsS1VoyTBW2Fs4YMQJs&u=RRNJIBjmk+;EhoA9`7Fo(%Wi~3}( zCHiUb3CpR+Br>SoR-XUr8^`4DimT&fJjF_^hq~gQ=N5OZ= zSF9B^@J6KEA_LF7mDMfc6}9_K4`NCe%xpcuc;^&c=$W>7z2M!I8wAT6jWY`?rT1#v zQuQlq8s?YQz}+1CfE=*vfq`soa~mA%5ti04^N2UsmdP)w(6EZWp4#htdjt%5iS@6w z^-NN)YX$^GxO!X#vt34@=FXc#aD+%x+YIb?lh5Ywc7FvIg2HS6Ci!c6q|60{Mwwl! z0XK;h^{zNX4S+*Jk%iCl!|^z6!&qW6INL2LE^_eUc$oYIOn%d)ruH{`;*&D8jcolB zJ1VN`FPZyxKJ34sW%obo6^izbgvGZ0XbM`;=)dcgg8$3Oj+&=;G1}?ehMi!&5|(CB zVF~fjPJC}yU1r!-57w*D_b;cq?wj9}aEuQ-Ja#v!60&5O|Jv2Kbl;-JsNCqGgr0Fd zX;H)9O5D2HeJq{FxTj_PzQpD1-+Avq+lnX}wsOL4C)>Zj7`wagw@sf+lL1}BzGady zcj4FS8jqmC#Ainy{+j^>Y=rV;aJ@{kW$8s#kvb9;}e_X=_3W zuCMvjK;YnTwVXD`^Phmha$6(R>s6U&!#DRqX!rGFy-ROsmN^wQhQ8cWhezp>t}H<2 z*RLWHmE9oXk@t6!xg!p$3?*1lWJ$!EVBTb;W*5E0cR595ERiydLVFGccZoydtpSN> z93IU~Q!F5)eNS=iC2mev#UmV%YEUiArzgIjXJb_S;yNNI*fSB{Xycp=TcIEX)}X>n zgXqPXHa+^~u9jxk;Kg{t?V-5R0^7HZ?uynrnZ+aQ=;i#9vk%B$q zMt~lg{wfs7UGzpybSjSKFR}$cz1%Y$9U;F;hyU$fAgfI_)%UnglTH0;1SR_Xs#DSz z6?6*{kAJ4(Qg*^O7--Zvaxs}-=?4Ch5i8P%6ss^RS|G+mjh{1#;j^wGDVXsNEI9i5 z28jQsUb)y=T>MYH`T!66uX@GmktDcep)dVy*~UKL+ls^0)^9IdZXSJGbx)B#Tk|dq zI9vC<-+H!jz4z#BGswIgf@1tJZ&*x$39@@-^X0tUf`-##pPB`Q+BU`$n3xlQ%$hg7 z`Wea#saE^1T@SF4%B0TczmrO?++WsFrvjSqLrVp7o8&XTRRW@ z6uHlf1qNI%B)Z*lY<%af_I|AJTReca3HxpM~#>HPyX*7&dHPs!CXZOX$!=EVv*-YB(50< zPh<#z%I-J_dRU3C*GHpxu>zRP*MH98Id}-2Q1XYGonuxE0Ya6S0-YkzqvwgHHf91+ zVO21`r{fUT;Di^FP83E#Bp9|5ExSfgSjLiGX?nouD@PCEyLu|q3o=5Hdr0y^25~YT zo`xMow(P)Cg{sjQFSmo)qKOMsZ|)Mgz4<9}$aFL#D7^!%VvM+fmf4#~gq$Gf%B0?t zDD>UvH+v`!0P4tIh0b-U0;JLmO<%~}2|cY5pogl*;~0RlJZ~K((o@=x9d~uSg~Sgh z3Cg=xX|Tg;*{h-#AuU9Ta1xnC&}s_oU(7DoJ>~TeC$Wq(lyYJ0HC ztzeKAOvP7b1I^Fk=k$=sZA@BFe0L;<_?q9FwonYUKX0!c0VS6o(;VQajSL~EF$^OM z3QzkBZ4r2*{3zzWIQ8OOoRv2Ux;-w40Pdu_5{|%&!)LzD%p}NUWzu{Hm+KKRI8*|d#reWe%?_JNt4KAXq!Nx&ks;Q zaV;Jal0YVbz>eFFhxaFz4QEWo16n`;jxy5$Oj(+sot@aS#uF3U~Ka~2d_4eXy`>!R5I0CI8#p5`5W+9%2$=K^tnyUBQM(CCP(l(S zsts37y|J3b3Ov64`Ie}@>j%%?At(|cK5JfHq)LQL!f`wirD)*BjYlWC65eTp3Toc; zQ39+6*RMA3cHCC74-e9kG9<01k5^J_s}MN7vy)%v7f$f7;*P1HZ!*TeH`vyFCVEKi zF*yBTyzuV5AuWD;bm_I+N<{yiv0N1UYaFhqz2}6_%lbGJN&t zm8aZc(4wH1o~LK;M7O9*7~|MEbG?u7I9pAKcO~I!xaLa!Fh8dy7xNw zGCIgN#pYz4nZPjsvt@;mG z7(VrC=JVMJN!~8EW8VZ!jK|UCnfyYg&t#Jhn=17Clq08?E-!U16XN&06gQUfnJ=DM zVgJ0JmGo@+@5RsPPgQf<|MuuST^q@Eho8lm`vZ1eTLo_pmyDRdM>D&2s_g!L^I#rK zzcG0SrN^@C1Il`Bbf#6O9r*L^ae$?if}8mMOF8W3G!>ysv77!Q*?R-~$yR?Ljm(5Y zAK(li_?#FI!@&0NaLLX8@qghC@z99)-)wyB*!Z2j*k6`J*{rzl1A|u7DiYgD@np3IWQ){p*rqDS)v1k>c|I#flz*Lq~koB-zeFEh;U?L zU}`uX7%voVMf4?-;VZx;Dm)H@u)x8>1p$?L0Ea;s+M}_BWJqJ8l0I021s5#Yl|d+r zWdbh)E(Ri0N1;m?u#5=5jfEKjY_P19zg2Jx5b93jiYrWARs^*G7_AiQSc(pBOg&6a z<1bC?#DW?7)GU24%syrRC6NUYo*szRosKWJN`2^#UfoZHk`VAh#HI)vORuJigL)A& zfQ<|qHU+S!CKpou8hOL?!M#!_tSn=0I*lokzJLY4Sl#AC0e1qy7=5t9J+(@NSMW@V z@SQ9~Qx_M21 zLB2nl{73|H5nK3S>P~I-ZCGRe_4b0;nWB)H)TO=nU(^h30CvF|RyoQwt$)`qC|}@F zp66;Ff|S;JgcprYR>ecO41i4Lkvlm`_nw{s+k%pjo0MBtVE14_+zbWGx{vC&5;ii!h2Sj%O7Dr8QemaQoEryFn6C=5&%K1eKtz3Y{=b3zu#}85MCejuKF|nD zAB^?IAj|@b9#!AFq+h6q1ESGD9)_~;2gcuy4IA3w;JtfSL zrlbt293(-RKIME_v~7@b@qIO{6ej!XArM{-Ba~QHXZUAtTn6wz-mQ%-YY7?Kq5SqYi8JU52*~9s3fwGB5!C_o>?`_GE9R8JlQ=*H_dpW|U0q=l39bw<1bBjr zYTGL7{MkfKKC;3+pv|)h;m08LM4MPllQ1IGmRiSlhZjbT*CZlxn5hkj zvSwq8rn|vS_s)U}ck1EY^?W`x66`G{%AlzcX#NNMWeCELf`&#-pV)y@M?v#b%?h)R zdB&R6FFkO)Np?O3%B6y=rL{c@lENXT;1e!t&DopHY!0mwrc`O~IG5+tKZUnVH@N3T z$sMbiFe{kJ**sVytS_k1si^Hu3``mi-t^{NFo1X#ayi;_6vRMbbjatkAQrecX9fXCKuQ*x(`>uDV9t&)~$Q7*z@CmC&I~hh`)NAQ$Y0qY!*G=oUVnxbC(lWl*lwU%_ zT*1r+R5P)oZO0J22BH=Q+YvrU-T98Yv+eMRGMLeGFul>Rt#SQT`wzXR#z(=X*}H6O zJz}RiIM?VS166VF%bQ=r%uAsbI8b@0InyKOXBzMD-Fp(8?Y2pm9e*uhgC= zX&Hv$0}!xQcaH2M$~DKv=6|E-jehN&S1;$Ldiw5EsM)Z)T2~p-2Qin5^@@vc)o_^7 z|LZwhJ9w&pXf}b3l$I_2IO)|(mChHFMquO6(8hcTrO6O9*TW^3h8TbPY_cAnIF0E zDwTySCE+WhQsB0)pu*m;JUYzJ8)n`(P;xl9&EAmGUbtmFg!F-_hC_V;^tEut9Tkwo zjxM(@5*vuMVt@7MQ6Y=w#5hbpu(=CivRAcRcc^n#nU-=)-pJ942LXHX3WA{kD& zG=cE?`u6rqGczTBb82tBn_(8ug;=v&*uU4FFKRkA`!u$4RJ9{MmHeMO#IY2ri*K8* z{!n_1=Bzrhdv~H|t<&=u`0H=Z;Lzm2xs+F`;Ah*9Tr7MH*Cli}196(j#tooNfUh5_ zIq!c2o3e+0WJ4r#}Qgg@0Dg;K>9_N(UP z)IJHTHC3E@?`BZv*qh|Um+^rx{JvmOfw1W4yErS2EF#XFH2Espz3A|Hv1XGS2157d zXPy6j^_E=nHCgiWTDlmw6nK9rxN9lo<5JkarEtmR$T$NdY(>Yn3bCg6Yuss{75QAL z<0I$3>WOwM8UUsee6GwmFfpAshFeI*dqrv?QI|If?NE>WII)L8T=Rx`-UPP+Shf*Z zL@#W!y6w!#dsB@sGj7Et>s$6e-gxd6wN-v2D@YOkrDRils|nb^{k=->F1j{4G}H-Tvog8q5*`F3&|cP(#+3E!JA z!LK6&vD|!3+`zjLegpRhw#xr?ccpHPeE;snzaF;6;9ix9SbJQ!HekX(%sut*Bk$O4 zzCT{zMEwX3a8r5yAJ167u?t)X`%^SxeJO6kxoq>>ZGMgt{^e(b(;~TfF)3|9oJcBM z)gI0e%XsIW!C>w;%4KFWS$*jGLF+(e{U?&%yOO$sdOGwWyZuGJG7hFE3Rp6;_iP`{ zwrwX$j3Fc^NUwfN~vTEbf)fFs^O;$&DE^xf%tV{XdI4c zt2}*h?$@iknU2(`o9U4>Kj)e-GJoK+W84V!4i{ce~D~?_2hXpWfjq`{Pk^82n~MSvB4W zOKoGWBJ)6~AO^`z>!>~hsTnLH-uW9ppP7_Wm^xUPYk0ru&ZGR4J4LJMq{Gb8pef$@ zp2QGNpiBt>$dFFX!f?|8UQzZTXABBMWEpE8H~MVfW&?y^R5)IyQivdm6M2i7P^Ht4 zV3o}`${$%_0r3zlD$gQ0HG}WdIeXItE;(cP0)4u>KdtEwpPONBT1~(UQFWIbUZX0EqvI)rU+ovj_6Meiyzw(JTooFmHPqJdh5uOpy9g) z5|)QYq5>TrhrWc_NjgLz`j;Vo_0O}Kf4}Bc(r>GM^2YRCT?>_-VEu6NXRVc1EhnY1 zG%sD_!UNJu^U-n?QXfJ*21V1wk9Ub-L@SUYgQo22Ha03`xYf zo`8UDV@xmwT0v$fD)~{BiD+bLccKu>Z<7Ei$5Q)c>SUpO(k7xP9`4I>V~kq+sBe#3 zP_LkfD{`ITZ1-LH%-H2OzB$xDqT1ftN+MIQjC9{G>b7VelEGS%nLBdTc0lLaDE+z2 z&}&)My;PI~ARuqX0ydYH^)-1H^8<<=IoYo|IOPXkwa2AfS-r)``?9Mq-7(eGK%j9eIVsM0xhq0`AUMcgZZyv@?nrqMeKapZ#N0M8OIm+=BW22ty462lT z1X@^*;`89ZBaap(w~tjOao<|pQr0w_^i8uMjIduD zAU!WeWIjom<@J!YMG}7~=~7C)p&CEgqX?{^X2vgs3DM6;q?TvrBhbb9%CS^3XOWkLUU2bO}ZXr<%h?dlNVkjMq7T%%=vp_;IE{$7yz znE;^t^yD~g-Lx1}uzvqLN}#z-(2smgz8djHJ##>ug>?~E?~@I_Ri7@KeS}y9X*1aD z^RSDp?}TMqg*{jfHY~3~lMnq~vo+qh{E_)foH(WTvn?{!ysLKq(T{V*rLP`wPtxbn zq9)NpT%JL=B5I3=*`ion40{hyNJy3fDUi4rIhr^6jU$esvQ(Pod^ zN<;kx06fIBiU=P=V%$NRJu{ZJ%9i=}?gL;I z*c0@KmY9+H$_$b*w&wi17zi-_+FqRa=_;?P52Fy-i^E4JE z)L*hmCr|)BHk)Zrp^L4*UNF~h3U;__NjoS4okwqApkizx=AhOzM&{JX3$LPd!Lg?y zRw_082o|VMZwQCDGKYC9e|1lh>@?EfXo6>#~DK3dH~c1?LaKC{5a0+8!o=h1bEH5>HU z&PR4`$o_0Ql=(EKAdGl@Or0W=UNGEM{p3a;M~byk!Oa=r7xE+OZKgJA424#0-!`H_ z|B);jH3h?Qfhpzx-xt2Zl~N`A3AcM6ElT zf8j~gm_c2B6h}}@DYOFWEtz@y+ubiJ_skJT)LEsXyB{9^^a-%)^=i?%uk;|m885mt4lql^C$=^QDR9D;P#e=Yle3lyYI{x-ei~>(pbO)M~G529oa;Y z8YabUn;(%_Jz0R_J1kuai?V?j(MSS~L`whJ=T%C~oAYd+a*h{D!{Z8}-&g^gQs8H8 zADhm3G!M}pL;4Yx-0|wn&q%AW=WaoEg7Z3;Cxvp2G)zi5MlXH7+W4m8r=^`?^WHaR zRQ0J3Gttrs+-E_k)*k*-r- zbXGHQ_Wbo;UP8xvR=E1?P3Kb7e}6yZ)J1pg$!(`8QU_PB72IbUuN>=3EAKsapO5dM zM@?0l;q3(d`7EQmIbCJ42K`M5y{UL4gF~{A&hDv@@s`fLL%;Kf4$2uoMLBr22}3?G zf&Bu0Kf(|RE)ZVXKAkJXz_W*RqlzISZQbqF-4dPM;yc|^ASWdu99Nvr5?$O-AGc}!i+5LKS zAJhMC!Gy`Z5_04hN6ANMjfR}2x{GEeJH5vR7z8q^GS7RD(C!)BaeyT~}b!?1(**$ebJ$n`mD_c@vOIXm~c`1QF)^|?{{+;jWRRQ8>1 z>GNRpd5-s;TkP{e{ora(kE0qw=o-odrQO+-~`Z2I{vMxslDIBJhnh975v5jJ>M}RP2 z2pbWiG)g)--F~kFRI$oe!DQ>Rs2cN_r)j8Y%FC^zX=ogbskD)R^L?2H$CtoziI-#8X!)5_2*e!1qg%IDXPN$QxE2;V^+wipmE0CjH3moxu|L$)WbT zOJ&)4sKEve)mtIfA#1!>v-ks>u?6ENF8|Jcew~jTo_{_4C}g(3bmvtA{AAzt)Jct# zks;Rbvx+(5M41IK^2Xh)T+pwW1{oa#i}Tp4ecX z8ke3amuZV)Z!hLJYWRRklp~ASv?>X79ljnKw>dBHnuK``psd5hsl8F`4{xQm^VyQq zUq4#x&o;z9dM?pPkr|pBdf#GuR{Ugu(kXl2oOd$iOaOx@xb#YlfB4g(?MvtWynWp4 z^ONP`xhyrxO74i8fUZFftw(z#Th2y$6oKs)bNQl;Ue&KOA94Mz=U$=r{np59#=vUS zn?3Qqwb~c8-6Ov>@o4EpnZS1U=l>1=xx{C|q^K#yZG< zHB*XxYhgozioj+Wj>=aZj)s~#V}WDX4D|^|rrPdFO&zCByc6!6gNBQ#?hA(MkGG|j zPWpAD;$OSZw~frL0J>cmxND|xEvUy9v+lF9?+ z;|OO$Y?16w1Z6&e_bu*&2hgjvbd+gq-FYcW`%63mtboHeqHv-i~$lba5dQ zk*D@4#v(BMsEb$IxQ$>TR}A86o3qyjeCYbb@r(%%+X<@&6V^{BHL6`sA^_GnzEj5J zX^BKTE*A%Rlq15$>4&THunXYr5;pNJyz+U+eo|xx1=xT)p(c!D5=hgIYQThDOu`w& zw1S{JKud_!LD<$!*=N8bRi_+OCz$O6Q?U}$@m$lS(C#F}gcW8w9YIV*xWvh$vO*oR zZKv)3CQ+@<*q?K^8iOUiNa$FYR@imVQ3bNEPC>ELQ2pt9KV}j_XB1-3kgI2)G1HMc zZUBBtLC2+7{!F@#dq&1oRIwYdlC0p8q!*Lmv`+#C5}>7t?rjM;Ea1N}1r=e#w!y0I zO*{>qRYJH2&Xe>4lcC{kt;KKXHlD!^KA)SH2764@jNIp z@MBi->)cSRN2`nHtBG^Wc2(f{Q;*IGkGi@K|Ea#ya+w4!ythHAH;1nKuR1Rn=@XUqY0ckzL1KRE*uu)Wm(mqU zP|PPPb=KV-&DNFF^1_KI`03uU&(N^<_Bsgi%7Ro^nur2bkIVPGD)ExNFB$LqFLbUW z#TW9+TdvC&!1yu&>=!L0;E#28j&XhH@}50O;FSG)0k9BvKTUh&^OYroU;Jyx2S4Y2Kg7cYUe~Ww01@bpZ~_p({vs6hwWDm_O=McK^$Snj z0$BgmdFhL7*hSa;g!9}>?J@peLf_Gkef7WZZ<(}cb*;Zvbw)w{qV>kvM!{LV6;Iow zrGOKk9dI6J0g3|)yfHdQ6I|BA1lYb{Jsq|)eM?Fis2+=exvxvEx&*tnaCNeac3Vx$bC)?V<&V92F4Mr`HVv#OSK zGj@X-PG7P=cL`Vt2B^XI_rB@3ev2Ib*70vOeU5m3Ai<>#NsxDTwj~9)kDp#zG^roI zERt;32={mQBU`QYg@wc;i2bCS0qoG;nw;99tN;>k)IgCp@962Ti;;+pK4o3)65@Sox0dz(_i zTl|Ux{_qIlWCyY2SBsVWvUg_sN?mD~e zx&-XHM(?^M@46T4o~hbB`)t?aCYE+p?% z3q*&qMTMqq4SpIq%aPwK!pAP*5 zKYb$R8E>0#OnAvo%FEx+g>OlDKyTszUwi@*AHzYq`SibtEcM^*Qn$JrNH&2;e*GkM z{56&&we98p#s7AW-Z>m&;!Uksvn%ir9%BE?y=%v>2`T=a-fPmDM(|txoji+XPVR-1 znKuUu{x&xpdeUzVyTyK3{{7iFI-dFWYjSSS@k2@bTjtBR>i2Fewj z|Mo<`9FJRD-oow0{;0Zn>O!m<^Va&aoee$ap55?HGV^zXS#M7K!AquQS+C8 zrfn#7QM4r^S=G#Y z06jby&iv!5WgIdIc_(MbmDq`A<)CK=HWTkd_FBP#8CYCY&0=6@@>h(AJZg0!5T&NGpIjXdWQF zJVPd@t@+ed*uwIts=`hnEfmGILW_iTUjPh|qTweLhPC{)YE4~AmO6uN@-d?I0Hu4j|PfL?O*-&5Gvulda(}8I1&OU zeStwG=7K+0KhRYC3>qvp4&oCfi?Dgpm6)N)e8!AdX26fl*yjR6-(SI8Cv(v9XE&@yef~njiI6}M z!hqbxI0p+J_2LDtyVjg6a;k{9+0Z?Nzfl#_MuHM-e}5rkN)eXW*+|j~=9J?=r-(F> zbWAv%VG@Y{8q@isPrq8Yfsg>VhjcjP$o#NSB3-mR&Z_2-&AX6o{5dOHH&UJARF+^D zvH=KMtE+BLA_irAZ@pk=pkY@+01|vs=b3LH7YpLT-am>ShB&%?+_o8Md$1?Jbuc97pTe(2jp) z-=W?ii)e!D6Y@E)vrpJ$V_qFM;O!--dh9ow#VQVu*5#u7(g1Z-uGQGz*jRgLKYLUQ zK|)!TxC?kU#O@0wB@oYZSTjeNA9*U&M-QMc=y)PLme%`*?sV+XKNE9VY>cp|Mf10@ zgWu>V+CNa>ObCCYWxOv5u(L{x`e39)P*$t^xX=*q1!3%aBBTut;6%L91y6WIIlG&( z4_{h!1W~`4Mu2fg7SD5{MdZU4xI)~m#ajPl5#N+S*sHA~ zw)@Kjzc{Wl@A3N5U8kr-jC@QFzNblf#3t~TnDVC`F9wlB)o_u=$^wQo>Ixcjo8ys` z$g)BgtM>zAb4ZvwAq`wa@Bvq~F>`!aJzx>YfJ)0XVFvUd+T9pGxdGO2HS!b`$dQ5g zm?}pb%xQn&EnrqyDy;bvg(=*?W+6j29Uv-A*yr;M3V%Ov1Eu~wz(Wa1QQT2UvO<;Y zzeP}IMZVYsHY+J2r~3p+<(jJBRx!7l-{Tuwk9wlLIiNEXIDJg^B&swc`^E*rkR|QF z`Xsa>=C0B4ioxU`{J<3ue~8M48MDJ78)a2^ZV^2)u2dNIs2A3Iq}z&*Qv6lG%1kP_ zj_2A@%ABZl7{Fj#%+3?1D*e4anX=@Bak3aVr{3<6VO1|(1Am0qerW(3 z-?*|_?XN~-C;H-qY>=b=W>y8I!sCq(|2<#jxuSgg#!l`XI4?XXdaC2oqgKO?(Q}T8 zd?qLe-c%s+NK%(FO*Lc#bDH?(9en<@=|~hNs+63}viw{U=wahVpr!wA**WcAi62sy z0uba$w6p-gp0`-_@FmwJ3pdQWW3J~RbPo!u;u)}lu~b}kcr7giOaldN3?HfhTI1Z= z(SC6#CgUQ#7qt>@;m?*0zp*nf{cM9PT%cR(4L7Bb9W8>~B9*?CfmbhOOf!_3{e|ix zrEDkkdoj~3@XN-&5HWg^cB?e+@BVADb^{~Vo?r1$`}L?qg!cctn9zk2+{W|-g-Sx3 zUhOQQhz^{_+SaFDApT;NACXZcHuMJJ?ALEPjYrDRf+qpkP?GM`!HJG2c`6hk!vh&2 zv4L%rr>%2e)wd@w$GNv?X~p^wN<~Cw?OWw+vhN7TpWEH16Zv8=kFEmUT^@-$kDOk7bN$b7@=5(} z-IW*Ly_km6y=uRja$c-mJZ|*V3;GJW);;fehh?pc-r)b zaPGH{bD=3OiRlBhq2FbW2QDQ7j?#9#=6pbjXq?SJdU}BPKzAUiXJXz+v zx~-|t=LKR8p8BpgFymd@oh%&)w6M6YR7N&`c&3sIkb`#eGLZCPg@@(b`MzhnWeDjr zioQuI^>@UZxYS4THiIPj-cJ8eg0B|dmJ}tbw)E+W08#t5)8KDbqoe^&9-hX;%?-94 zolk@Nqebo?b-3>eH!t9c75H?f><(-bN=|p{eE4z9O0iGP)8T_G$jo5 zpTqn8!-71f)7de}vkxF(mbC=KmEGJ8S_vJ= z!nAvLL+FZJ=2(eSih}0n*v+x57%!&!AiR)~NXhg- z!#xvuLeu$x9q1I6`H(|_aq8cgNyJ0%CP9MD!%P)EzkYc+)i3z*kCt-M6{^yNIY%`J zpuT(FA)g!2&q*_X=g3FV@yT(zUt;@6Y5)ySvA$rW#vi^!30KY`zyp|f9;~h;_39{| zMpb!?@OO{pS=@OC7iC1>$Wwp#>Nu|?kX~h?CAEkwyFUm__~ z-)(w`Z&TpoW7u(<`*FejCuqB8ut4Aik8oK5pL~4hWcbMk&iB7iB^3d=suUs0eMv?t zpK^#GBMn&-W;jU@2+nw44gHKIJf6C3c!uEqEi=FBAC7+2zvgD5`Sss9`rgJd`; za4bu%;Pe2f4?}t5g^jxlE(V=Q|8{*W=jw!CEw^}A-s)*xY)JhhJf}NJLL~8(lF)tk zR6#VL;+`-gmDVnjJ~(|psTyA@TgqNT_J81Z`g>ZRNOFo)o9p+eo@(unJ)6}W#3NSi zsmx0mA6FVizLubmWRc`D5021gYD=YaartKw$1jzV7Ei3)DIm>c{p8=$Apzs0hDc?g z^iI*341lM18Dv*R;ZvE(G5O%gI_H1)2 z;u-XAW1^@=dQmx?&L=S2B=6zO7f`#KC>d58cI|u0`;s>@v)SUogq_Dt8b8`KYa-8z z)*O*&vQQnZ_xf_Rzc4kEtee&varYUQdDp?rwAb9!^U|)(yVGYqXKuh56CRJ09|Oci z%}SD*bnbtUV)}$@QOaA*z_o@*#@tEI=%=CTF(*DDi$TYl?kuMsi@ui@HDA5L-ZwFe zUw0P|`P47R{hZ>uciUTaCBJ_4zS_5k_225%zPHwY?^0XquU{Kc`!QMn)Hra1bYNNH%O}k}O5mH|xz#>_Bih06BY;cmnU~2TiNRVuhbp!;b5gXxTb!BCFJ4kMW**i=b8cm>i~Z^ zA-s_-p%E3p*k?CKYc(DO-(%gXiumWPRY^1Va6&p6YknClHk0C{AV4PT5E9B?Z3=S0 z6|_xdsirz0z^eEnx7YEHdkx?a{@k8JH8?+r=d1AG(dy=j-vos>dE+-(OOxdGCUSohcgtJ}1Qbw|4M{RSS3^cI0tTaN0R&DMpj6T%H?=9j0S7&C1pJ2L zvq+hn=8Ex}0A&j+)qM0nK{dK5*h0d_^vk(5OW%!9t7`b0tuBRG7dooJZ=@jrqpKxo zLa1BjR=2sNDBS!Mh}2~Re7AaSV{4@0H?iWq79g93)nsXxWnULi=SYaiXgH$K6izoL6w zNADBTqqx^-83!5N!tX#7RCRJ%23KUVRY1B!AH0S_~ZG3g)(exfMPS(g< zqv-|#`D_k1#dct%S`&8&vY@W4w@e?i|^K2(=bB8+1z@?RLD}ZPw|y7h-ZYs zT=#d))(vF$1@#uccRG;jU*MOgUOeg-`8O|eT(-Wc8D5ydxeXHKl>Q}H z>t5?sf)yD7H#6Jbw9M26_9Kp1kvEF8fDLWdp#gyJK3-sE_GR7F7{;yLs$Bgf>B|1* zXS#Yq8x@AXEOwPD%ZxHaF*s|X0Fk`mstz<>BRMJ9o!44>rJpgopA_A8JH8E1-OmhY zm*uC^VE8Pl>)Be-Ihj2<9{Z*Yy{kqsu{;`?idRp+X+3e_I;{Yb%}>nMG606I9NoWc zkZvk=XmD>&->mxgttZ!QkLnj3-Oc95iwQ99EnmO1zF*F>Un#~QUDin9C#F=yBy4Xb zSei#M8*Uvn*XLpEzHfjPG^r@+r11mCqa#x;nfbkDA%JXW12(szhPjnj+w3^| zJYXX#AZOheM#|(+KmH8LC3Q9BO@00L^9I@VnwxEn{2h3a4i3feW_6>-9F!-u&+r(X zDl^U=l}Fx zzENe?j`!OT{?Cx+#NhveALOSG!tk$z4?BC?hpt=?i2u!b{6-}Q#?)o}^aZ10Ru0Q=KK3LwC+!&Hl<`9+AqVpuYUi2=RBImXyy0`fDS11<=XGKUs~afu=R+@f@hhY>IxfC4IN=hkN;s?OayxWeGLd-s*3#)-B`~N{p`ER zItOJvXD>37yup9micVYKY$&_yJLtj0KmXs3BZYIbb~}5OI{3p*+&+-_R%J1fSri<789{H-l6$f zXG83j;X1D>2TkB)JVoB2+=2sv;M1mpL~Icb9qz2ZrlmzIzYv`B+%%lF9Y@yMG_G-;Z{_fpL~qk^z=9nqUh6CDNWK-KXC^LuA= z=);6(Mm@$Aa&Wu~?_D+FjL?T#c}C>=6xt{9j0%X?Y4-+Skjcj;@;CEx3vO8p^2pzK zcw)iPvw2W4RxGF80mnLzb{A1{IHfk>OqE_1Agev+p1APlSjA8j-z!11Y6_2o>sdy* zD|_hpn5A@v^IL1By79NCH1ht3VjOO9Xp8eLH?y-=ofvm=uyvVmIithtTx1@a_ryUY zNR|%qA9k5Kcm2o2)Op(n6O+Ou)ye4#S+=e-{&zwrX9CJHT;B&hs+)X&scG1CHnjc6 zY3;Cx$Tk;k|uZ(sMC`5Lz?I&1D179n5q(Dv;exe~$P6TBZ8Pc;L;#MaQFdRFGyFxVyyFo+K7tT-R?cJRqeU?(=owQYdI~oGA$nerd@m}* zUANmeEn{T{P~Cc}DEzu$)F|g-QA$-Q?3+fnU>uIh3IU|m20o`OceTka$Db#zz2f@s z7PDEassS)my+WxdhVTsB`QJH**#LoCS3?+%B9a9cNnb!(0|JGCu%GdUNr@0RO^NJ$ z0D(>3oxq{&hmfG*MNJwZ&u#1zp>6Z1Q!%EA-guZCjjkz*FOa5T#81=k(tevX9z&39 zw6?&L&<24&UXYgG7X_4KEQFqeNt%pOQ(dYlpn^fl4UkaHmcp7vycz6eW$c#+%%q?W z(q<~3d2E1S&=J^f^@ z%eC(RRyjXhh}h?}&$J07aNL=P7_UU6Ayo+C(N8>q>{7i%(xN4Y|jh zo(4_|#wPdQW!^gD&6ea1myPlfxDNLO9$y>DD)WQ+?34oYN_IC4Z$lDex{<|Y$PVoh z7-vimQWBq7JMkcb4a-8=odwU(FuW(Gi8{A1=13x5=mgf>ig{%8db3}J#9!>mf-y+q zfGNNl^&hl)JIb>Bm1l~{vT-ysA$-PBu=y3lIm$`rifq3K)m^OBcm227_nloNza$SI zywtq*@f64XA(5XU4z$n^yJAFy`7n17;IVS)@o^Xt!`a`?f^wxuhCo_R4B#f#LZ>pW?HRyoGg zjKt3RaAZ$6=R4Kj)K(mKADo(&34gjQSGpmDP46i6izxBGbDSfawM)VSxmc)#`rJAc5T8cS73Az? z66agm->6zeReg7wXTCB6Bk|y;zM1FiT>;b9@!0IkAPPw zlO2kLsVvmG*bfMEdK>nZb%W*FA~M`(5_5^}jN!IKQ|-qc1c5JJNij{HqV|b40+mO| z)w3B8@B%PY7_J+4FLk%?bF#6kG=kMG{?^1*2Nin4!2CdRdUyRxY?Yr=37w%n24w?u zF2J7r&{=;pGIP>4{9mt1kw=mTMBC@tJ{P?DT5`_u$piAFAhzM@`jD=%* z+MNYP5xh}s>e6Io6G$gCW)9(2Bvv1jzAP+31A!g80_#_q`E9krOPW~Y6hGYvb z2*OZvG^Sc(zE0g;BX7X`##;n>{ejlsd7rK~zQ>Phy=MPKZr(h49@8Ietk9IP*4+zW zFJ8+YV<##v%ATi`9&O@kOluDm=>znW&|z(%i7~TR=Y{s9Z5uy_2vY{(msE^;pFN}N zeBqU-czIh@_)@}O)DGS@m-pGK!=b02T$(NBOBAywaTcF7Vaq4DrEMnk%Fpya zI+d+u0*9PK{Wja-7#DR6=a|oGVv&uJ1UHS{p6@qk?H*SSvY+_&~eL^>6{L( z05FkJ$d|W$D^_lXPFF*(6!R>6Wlw3Byq*M!*#E+DZtnmQdQ+Y2N}-(k7r)j%X|BY> z*Y7u({kpE_I4?Zsmf=r0g>14A+xtJ%-Bn!E@#FXX?>1tL8r`q~l4EoT3Ipkq?p9Jj zkQ5a+O1h;4qy-VAK@=RNgtVlHqeB`b6y@6Q_rLD@aUER;_t|~G@y2*;kMaF}-p?0R zO8Oq!zBW3}MT(J0l(sPGc?)9Xf7k{sS$ zi3K3XNYY%L;Xh8nqso7xgQqVhhgsb-jFkTFjs_i!?l1WMt$U3qTMC7~ZRsZO18X&M zZyhkI5jax_r|2X`7r>TmWHE6WO9SiG@i}0i8n$>-Y;pzhC(N zi&b7yz3z8;Z_m7pNL}HpEtrY}wXXi5E;mDR%4Kp}7e;L-no2B3{OE??L8nOyDJh=R z(+HVEE8bv)^gckQ8vW_L2dz(b2V==eVo5GO`}wNACDY-c+L{MD{VOYGBY?8(kpC9Y zG>u7Fi3BPS&5$f7IJYxM4&W%mHQ2b&2vpw@iOaZAMSBGYvhW;abO2Ra1Htbf49vBO zyoA*r2)zY~l5>>k(Dxy0G1Z5<%ZJ)=+{#->0e?8*qz1BnVwOV!>@+lw-}Zw=IBDfE%heYBK=L?=WEU;0*)Jejnvmd33PeIFe=0& ztBDr%!+bbVc6EX$gCG*mz`OfT7R38wRfQufuQ^Hycn%MXylr0C>83aI=}*s>m?$Xp zXVFrfV8zG4)OZpr;a5_4wxrb4S_z5`f3#-}nIZr}BV%@W(E)(O=(Ar~N=OTWn!gB= zhv~F&iJeA}y9^h`kMVOdNL@4SEE(!#jNq`?J0;1Gpl(F(ONsYYQeZIPd@Rie540VF zoNER@+*A^`F3A@l^(2V|EiGLh&4MK5`Z{Wy$nYRDz&@tZAur%MQ#Uldi!K!4NL{+J zP*<#)RIF!E>@c+}3~=b4RHDEI#1`{$l;1EQ+;Bfq`krC?N!nrg_~url^6s(np|r}c z0F{eImA}U-AQ=p4Acmp|Lw$lFo}gwT-fJe_^gU5U%BWonR1Iin$!(W)Qx2{%mX#ZzpmSzXgJGgx&~@`Hfj2tX!^@&1qEt7Y|?si zqJ@*ujtj<)|#xn0UAB*9c8Hi00&Nd${68k5Ztbq#m_wLWK8OeG?2M2tm_3jm6&c`z{(dYS97Tu^3|Z?vXRQ`f5SZ5_D)W6FNL8G;A$DjGmuH z`?eyKcU>S!WGovYI$|O2z9AdD;@{lc*r@?-Y9N&s$lO17x*g^1Gp$fFvt1JMlb0?E zN3QAo`12VuH4PeKu%0a6>|*eUDdOQVI9!jHv$8qDY_ueXC3-dFk^dR8b2>;*!~4E& z@Kvi{sqdPf?|Nvhahb2Ad))(;SGa;8+|OlF_hY0y(4epdGU6Q}eK25QTm5z?x&APp)tECG4p&63i(BOK=M#+A z4wEIVz1Z;SAmBNVOX}ZqGl1CHGB0Iy`l?-mr0nM4q33=$YP_C!!Nr#@E}ET#`^1Hm z;;ynn=S)NM0M|oS9{U#dw~}s@U<9cNGQm18E!RlR!tEL%fGa(B$T**&0nwOsx1P;) zV>z$UIywLk2`!?Sz+~}+7N)fnmJ%<`u;oNQ%)S{NtJ4@$mP7i)2`#Q5zx6===A?W< zP`YWE^dkma_v;t`8cMGJmd;=k&nqH<ys#W5;;zy z!byzS;Cly%xFnJ9Bo=8{iHg6V7*W{7B^D7|E<}72mr&>*mdJ?^Br=^u=#vUkxse2r;7(-azAljWF*z})!$GHV1M97j@q!E)+ zB#N2xH#Az_eT<1uRo5}(;YW>soqwKNNTe+llvE8(i0kC$*#!cz-_rB>%kvL^o^28_jnX89S2eD*aRjZ<=P1G}q*rkl3IuZShu3Xl0ctWhfjEqkc!A+tXNfa%k zW0Q#VB(d~D^g4r|4-hfRyH8#b6;5J6#@@-z`hI3=MlP`=L-a{+8n`}4?IL=V=GG3x zB8}0VXorxOM9vap`_TisGmEQ6@Sm$v$qQRh5GLr)`oJV?=60L*SJCK5hidGr}6)xKdT*v z+nayR)ZG~>G$5YF{MHumb8-0pOSq=makR7J&)LDs(97E&JOBPUKmPe+^y9~?D}ao6 zn~Q{*ILUwtR1zYnH2b8s~JZBr9Uk^*PdIs zRjp;&1#hioJH-gE=iJTmT+j8Ws9MkSZrNIY;rB^+BR_E3bE6>izx3zn*2YULnaE~Q z6tmZ6ajd}W&5}g9?ak6uO_8m#Obf5A@*KCY>~Ac}4eHcHeRAH=Zq5`*zOP4*9-c zD-?axKr*WLHth5tWnK3f`ioz~pLt3NRnnn*2VI-yH~dxU<#+r)(wHvzH?ec>~EQSDDiQr?j5y?vXj?yG?**J7V&WQ}a+mfUX8n7s;0E>-^H_d5#@_O(O4hi=rI zEj~WG+CBS$B}bnV5}t^CosvcRrY=k0OjMXhNIKB1Cg>TSe;Ku@%~%(d9J#)Mw%)rK znn({H-zcKp6B~c_qHtpK*7xsw&9%23-VbCe*Pkkn%?o5^fZ4%ZzjBbrzVtVSKzGqAusQRaPfWP9y z@%MwoHU_?5tP_2-Ep!ROy~RMQ79RRbZQx_G3gSE)5`12d*^$7COQmsaKZ)WxFCYjEJY{NeW;4jTrVY zxSx}f749IuPhqA$@ru?J-3zGG0jHWJjiC}z0-TcA>tmsS5Nl5&`SQ2}BH}aTVGj^i zPjc%L#0aV1qT%g|A4vv)dZ;?`E*6$G&kj75@RXo(hH`VV0HtdX@+^e6JdwbACQ*f@ z%iRTezyJ1QUCKU<^q%$P{Im;me=w+yg!P#-#SMunyBb6--M=rc_zu22l0|<(#fR)%=nh4N71ob#~*%9(BMh$C}^m9 z$NQO36_Ej$K6X3cPDYF>g4YtV%bbwKZ6!RDzCFQy*K`oRP=VA7i5#@WGSUBM7M zY_|82g*hseMWtE-cxr@F*$m+$2ZYF;=+)h~t0c}7A9AzW7@S7|m}rPoGzc3_^9oz) z`q01f;dx&WcqvHsAhM)22J8V9;p(~Lk=9@7&ZCV=-9?39J-)fo6qs*_QL zcNzxja$szyK*lLS8o(5^>lR&!rTmfQ)PaX}E0A^7sgg!(je9^RS?_~V6Yt?c2Wkl| zn|`nBNZRV|>q%JN$0xJC(s~Rec55dBb&130iBF*@T>t$8p_J%K|IayzqcO>d88C_o zI-m{9@KAd_qo-{4tX9zI#xu*jSyNiNc+t&A+*>*y)Z-0H)1+CgHdMojiTB}W#Ny1| z2m$!5bEzU%XcMz7+qs$06~gK9saf6_cz~D*WDdF@ziZ?ch-q=MsJPjm?)v8x-5qR_ zI+gC^79{Z8$yES;JMJDuOeicM!z0*Q`NB+fj);Dy0IAQzvizR}+a=3B2U2ksc+gx7 zSa;Tg@xnYk>NYCSfSI_{xE|0YuOqf@etcjGE7oO3s`k&R&umJwE_ zo`vfH5Oa*nwW4#jqHWV#@f2pFmb{Pqm;`hf=mw0P4~uN+ilror8DY%KubEhX(~mS2 z^D36`+mr}|l?dgPh_siWwi)S)K>sEIVy=d;ZA0HoiI2R7Py8pG7d{as+J#1n+dj-=f~1L5;1ukrsrtG<@{SG z=qjF0F1|E8+A3lj?q^d;0(wOSf`IFQK-~&5|5p#$BLyyspFVsk@9w$ap_GwV;rGia z9ah0^M4@g3P!|EaQWd$kK#x+v#9gOc9kl-eKw1Z=_<=Z_0PtbuY6Cf|5k-Mq&I*yh zlc10$@@0MyNHOpt55zSFqLYBX!&md*fnYK~%7`3=fpeq+-BP7seC?(hxY!5~hJ#eu z(Kk~8ZaY_bTNg;=TBM0hcm@M%c z6bb>!E&{2Fpb`imO(T#V0L6^8fDc;ym0FW5+Mc~=JA(m9f7;S0Nz5rx*!RG}a#M>) zv#uzdg%ZW4N2xwp&m8b-S;j?7RI76}pt3g!Xl`H#maAi|5+;!)eePMpTKO`o=)uhU zC}9Iq{wAdtMZJ8DPAAS;^K7Sil=yTA7z2iMHC0_P0!>BrZ$tq%1Y8mUNB}?zdy7I? zKqk;24J(}uY+(RUgY3XOJ9(Ql6_*5@1_3x>(9erH!G|S($!nAprCz+0f8Uj?lP)isGaeNer>NTD{FZ_W;K4v3 zpw4|M3XY;SX+^w60tk{;-|toGj{uMeBO!Ssz^?^HLhgV;&%?lNrI33tKnwx=UhwBQ%f~P?96Bj8GidK2|F56p4Ba6)M)dEdB;MX#rjSLd|Zc5B#NF z6onGIL?^vgmRu-r6YRKg&)IdVT%36RYAEbEYZGQ6Oo^)R#uvp({Qx<2^_7$N_ugpA zUk+I{$)V(LriFE=a}0us7E@|pp%+@59U=uMzR&;-FnCA5Q!Wf7hXwVsM~I*FfYU%M zMHq||?7@eswn_$#WRYrP-Xwr+C|k9U7~|4yr?A%Ez#dK~I}$mBAt znMG4VVPtw$r-!3b;_AB+imQ>bQLlwR=Y1=OnO(mX3U0#*DAs}Z!DaMM>cQjPaxgGs zDp=9zMK#06BfXDdtDgwq&p-2r2VFix(mwytMgOCM)B@y;68#79C@u`-*}^++0x3MR zX7({m zoxo-XaNrq2T#n zML&F9xNN2^0(nve6hBcvr9>qlfRXqvJ8E&NgO6Z3;-uj-_W@KTl{f|L2an@v7v9Mc z@SbHg16NO8bD`ioDEPOInVlQ(rroYt6ui!U7)XUh+t<~LNr@gn3=#)l#lCM}nSJfi zJEX3`u45?UGj|=8Rx})TLa`uXnFcK*n6NJ>e$c-Cm|&+d({9}4l|ZJBfzx6^DHzGP zF^~oVf;a&Eyg6R`{@Xq!*lj!ev<&6`qUE06I~uGwnNw@%9|%VsxPc3VBxJTFECJ6Nkx`ZyWe8p7B=~ zhM&qZANIcR-l?cNEI~*>n&u&lx4<4~Ab}a+bb|2|fjod&A#Onb`!awf<1qr|o-QBo z)}Sz3)P9gF#hKw{K$!TZ!_@wy$8!PVafpxpUluWbbp;&2P2x!(KaeotYd8IxoNZl? z!`p)Dy8haoKyS1F6}sTxR&n?;y&lOl?3?f^oNukY;BtGw@zJ5BALva@=>d+_sJ zGUYoWq$*k4;*W0$OjvpNzLjP2wEgetbIR67_s1g*i$YS){@jy7Qla?lM!>+vAPo5T zXc{0a$XA~O5`%y4sheN@$iI0}ao8^qFhEEj@VV^nE|~(HJ`=#x;x*mADq~<^z&Nt{ zv;NYX+ZP)?V=()X4Jz~&3cg1rez=oecK^5ih-4toM6cszIc`DVs&pnka;lkUr%fEy ze*b#JO?cGsxvZh$j7mdQ&EJx)zkMc)KR#ac`YeF!7rfEGvnCh8pdWxLC9(Pk<|Khi z7$E_AumZvi>Q7v>(}Rrca*S6rleun&ldzerYNuZ_C{)iiS<}rDv+s;zGhNrull58b zjg!W7Mbba=(9SH4#xY5fxxujn)o6ucMs_^rR!jsBhk!}1q69ga2B!yz4v|`#nw%v+2z--Lq>C+Fk5>VY%}vQ#CWLzKy?v_P%#KCFgOt3_V&KeyR1+;cwXK?)Q(+ zcpU#d{{3tB$LE(%6+r*~{{2ZVfdP^8*C}4n@E2i7S?<=Uk{_!bd?Xhvt5c&CUlr>9 z_iqr^v!Qq*p-%Uc4?#i0y9!5gLN{GXnQW;j;*jbhs^APmA<~u)4rP>a)W=}s3PEV< z3LiHJZ!Ey3G!Y3IeyQ{cwU?Z6`bEm)?JvlOwNOicY{|VJ6D3p>Eka#7(ZBzg7CZl?Y|*@V z$r=SyWqh4hqV?RUnNh4W6+_SD06}9lD_Nr`oD^80@y2BSYEc|y4OqbNaa(zsWe(QA z_}(ySa1k>*+Zs%;4bBJz%>`xG_Rf{q5!6tgQa*OeZovh+Bc@ClI%N$xitZQ zC{HP!6c`kNNIHv9BolOuk3zU?*0sp=3gl77ASTsrh2-2H4*7x0^8LM437TzNNx4Oa zT}VV624^z#K9TkPUDy_l)sGrbEw#~;$&0gesKX|b(7kS)2Vl>Hk`RbGe7f{tkrRUT z@d0U!M$mGd+ zDw#37cD>q+d8`0(6%I&xXAE1(z^}vcK=uTe+IqQ&Hbp9sN^pEeg^96m(j<9nr3Y9r zR>iEL7&@VNipo?vbbNB0s!1$;XoxT~vMlL7BcH}#Wdl%$Lff%&tBLqUS2Nwd`K)LXe*M}V|S5W6DhcM#;)Rf(%PzR+c-LgtBnxLUk($fb?A3h%(;yIMOy zp+|_ZVSvlx%2c_L70kx$nU{D_!*H3V4ura9iCve}vx;+}6k3ktr|P9Iz(jCIJg+eZ zA^dD|s5JKC=!l}6SgHgcyN;{0lu&Q{K7H;Ur>qV?os%q!KbTi3giZ{OzsEYz3m4*r zfb;Q%B%x{mA~nWv*${aaxXM5tK`K(0tdf~-zY6$`0Vl^V4}PxF&n-icAEIIZWL)*h z9~c1#jC?A;%ovz>p@PPU641GZ0FY|j;`g<5z&lDaCXfsaRpk>BTfYT@8^7_5Do4u- zP`#YH9St!0Oh;9Rxm?5fD1J5~P~n-gtPJDed-;qyJxq1oBySzmX>Ad=;4MayzFuV% zSNc{%_qd0K5qEtNjnGZ$JGn~HUnGmY4|gaS!_xE-{v{yzC$Vo}K=>q+w*cFxbxU!= zP|6vZVX(zI_aH*FA8GZn2gIp5^d2zF63bb;Te(b+L?hJGFDVeV%gsh%lJZr|#end0 ze3U*30_NbeYwI+mr|Iz=h$N^9!e7G|V#YLK!ah<%FX$G3GXwZxZ7R`f`0A&rj~frw z=pB$CL#ThVsg&{4?kdX%|AM3+YiKJnEkhidG{_pyBXnp#z^%3M)P5A0XW#J#FKBve zE~ZdbQW3-rcnfoBf%E?2=@@Y1R})i*kh+u?bM>G_nJ4kyx3?0UPANSuY4}Q=fzf4% z5T4a8`|DMl|7*KAqfqH@)`uP&9&2H|e!SWT8tl5M6qE{}6f-XEl#IF6Xe#0AQlUtz z1bxS6B2jMy_<dYU%9n}J~NP|Qni<<+v@9CYo^t>Z@*b`E<1Ek|k zsW3e^az5Jxs#PS}Ls4aj$OaP3*D{(?5)j6q*|%)MJ?wr0n~gCmg1=eH@LrFubv171 zkR+U>EIx6rZZ6%dA9lStjqiK0xLGK|)%(GRRfPe4-l!>PRizt$ceJtH^%VcKU|_v} z_qy178GIWli5Z^K5u0g<(gt+$fKDL#ot(sg&;COHyeY;9X+-B1wNAxbJ9YAkmTNJP|~rCuaZQt6I=p03Pa zW36`)6DcC+xf{&K_$5HL0{s zuqvW$v}5m~8gvF(LQX+)zyQ^Qel0f)a@e-^QfJrZL+l?VK|B04&dz*3a-Y^KDaS~^ zS)!(^^_zI=ejgqZ=#bqHLTV$SBsqd=R{LSIw+^k&ZJ2H4$gXgrkBcdq*VkCh*CJtl zWIDb3MnDsugkpiWSwrC*H(!-H_fgrt{uDKpBM~bNn0+eugY20fFqb8aP@AO!4B@Ib zI1|;t%5YWMWNYs?JWmUg--Pdij6g`@*BRr3#)irFi`Jd%k2+hdI%kGn5U(qs{UStJ zqcua34h)!4FFbi7o`MQ{DXI)$afk!KSMd>X9v{yVK4$Q}my7&>iv+mM%-N|R!JN)S?e1$kQ2AKdeUI*TtlF;} zHDs^aJ7l+lWE|g@1Q-E)t?0cJp^+SPOOla9>Pz>P?A=>ivuc?K-5+vDPedbS;ML^0 zJ>88xa;rVcsATz*9t@HG)ThPp|CjzOqq$}Ff2Th+(mb#vW0bn*I7K+13;hrMsmj)u zLDOic)Pkf&viRRzRC?g>(N&x_cVsUV+D}P_K5Y{zHa|(!y zu)U(b&(4sak15u?l0*E5001$_hY@ z07bKEJKpF|AsN`)1lWyYW3)A&d27a+X~!`Fef>~{*(Tg9kj@#KOf~SLS7)h+Inj?a zo(R5#0&iIRY~uO~-Y}5@SW*e)q&iT%wr07^U}ffDRoUR{rormo!8czAYgPwq|3iNc z)iDm$^A9!13^l3`g>CnwnZ@4p=*NZjN5}T35-5@m0P#)ei!TEmt3ylL+R@rktt8ks zvsk8cP3=yR0*xBkdLJ1qscem5r+j>l5uXhn|2zJ$gX3&D~Dzx2xt zPwr6CBR-+DNkK%?0;=!dI}{DY(O7*_T8-`f65Fki*bDE!nou7mFpj(jh%)BLiu%Yt z0pKf&W)_Mtvcjzr?=a*i>&;@pKm^r+!uIOO-pR;5$>;&&=pp~;k<93^`sj(-==$uy zFCzUZLs1$vdQmo-oI3iu_x9z7(aY7*vxU(V{Fi@>V@sE}Q=r8EgN-IpVHXF&QPstN%A_Lc#{$~XMotMj zv)EueO$mufdUKO#%xC7H$y?>Ui0Y3`8p!tBFk-^_i>f;7~c^?9_2))PRz` zxeh77TiF+#Y2LPAX8ZT6U66(HVXcb% zU$dZ*AkMM?nOJjj*4WuZ%@1$P{d}hVn=Li$#vV=0n17jh@@vL$XXYuBl|I!hPIguY zH5+MerKLX`9W?tadN%g?>{VR(Y<%-sI|<{E?MazcsM zqiwg_Y&vqj8RTQh4zR@E?O~XvKVvn`Un7ows8^GwHwm^g>5~#C6a8>3gTXkHtXYxR zx7Rl%(syTH+7I40Z9^N+54g^MnOeX>%MiHva{YOe0Bs zh*A!lw@yHq*3VLaiuyw{HP(0M=w*#%%uVG;n@hNC4`r>DtQ~(BRH_{>HXD53T8o9% z5;Rtp}4 zg$eMacFJZfSPOFI*KoS#nxHmCs3nbKI&GnjNusE57X0)>=pCWb^;>&6;k4riZLrg} zET^E{JXOW=)rt9>NW~8Ulm=eA!i48AT#c32c10QE=6m@jgZ0lLj*0NyO51M0Q< z1FXD^@v$=`1#TCtGzK{j$T}u&x{U2E8eBN!<*Z&jzYEV;mI(hYTI)ckxx%SbFo*eGO}7iKS{zO+DTiL#!1yJ z>4Dp#!Pc51838J{q9CwdE4$93>1NounybBb&(KycX2oL9Dl2J8hs-0kf4!Ayg|%=A zXXtU|SKCW!h2!4E`suFQ;^G05N3OsoeehhS>-z6&+tI$x%+sr9e`m{Tx6DaEByCtWD-b&+ z0IMASM*MUzw+wzhm1bdE-D2Q*<3|+M(j$ME!QRuUaI0cu5$oVJTfT)wZ?@5Iw~=`{ zFG@hk?9VlRWRR|IzOS_$2jZcPpguXCf1mf5*>*^Lw9bsi&!@`qycO zDt1`ut-PHOIcwb-3<+no;Hor&3<&Dx!-*roHFEy~(#U0=Q$ z{iLzie0x!o_Df+(Zo!ToYR_mr-ILij+|y8?UE!RxO-6r~jjZ&NTP3?wWJd?6v&6>nTV0UAyu7)QR$=Lv!;_(vJ-nG1b4& z_siUND6S6ZUmfi1tpX}yq*u#yf?mJOS2}8co+^89)vAj$o1jR&#ez3MZx4Jw-Mh!U z^Q_Q;@w7!Id3o5?`D5qz4`_S3WS46%@9=Rv;HS0cZMCP}BS`HXLIjUu3XcTO*01!U zOs{htiOW&uf{$+buFIz!xCjJDWUbugUT0(R$QEdlD?FB$cNMj;ManxWWG{dH>+Zd{ zf2Y=-__pK~KM`kHlgK{q4nDduqpsolRbhk0H~GXqYirEG|M6bHsr}KP@<4S*Z^9x{ z`ThgbkdtLqkMF0x#wx!IlJ9GTB)zBzdRpkO`s!Ho?a9xIUZTZpYH;ipd`Dg0`=us@ zMeBo`Do3Sc$5OOv?vAHFVm9wj6RcAmf0x9{ZDV8PcQC#kJh#~D=1dwkkQhgZYlKk%+Hjkp|WQ_nsgy%Gw#ePo9@h^ zSuEQxJ3TKPg7sedChY%wws@c6=`ubmgo@=nE9AcHkAPzNhZL2qrY>>v8y3ZG|&_dC))2;S5o}`MYH~UF64I< z?6JD}_vHMaxw@UlV<9}LF&!6Fw}yllOI5~cBhw!-F#E~(QnSU+j;NO7Sf9S(j=ebh zL`nh$K#WkU)Z$yupkRoEH-za)v?s{L}^e`7S`no<*|;?dSnzWj#k_xAe5;R?N!TAx31 zdkgI$$1O>}kq{F7ls85g5Lq6ZFR8bc8FGXQ7B>tnY6?vw=VQtOz`R`iWO5Q&-V>?{ z3T`{|?;sa?5_&N(CW!*y8f^##n}onxm=y_xT1w~u0_Nd@FNUsl#5j0T%fcsJ$m6vN zAIdYOP8tH0t@a^80|Zs9p4qbQ{o7Aimt*CT+Rmo5ioYXyfKgaMtzbs#R(Y&*8F{KXsWaDM57<28)C)ZhL&C#+`;6;{^ z+I3ft%mKHx`%di_0{Q-f7nvTipO^tLHZcAUnraOJP{e_bB5!Ga83W(qB!pxDZW6>) zx&*4%$u-7-1Y3fGsT*;6lTkp($nng02`(d|mI20sOiEKU!yIr;k|$2CcDaY}vUH1R zzvBoy+wb-lh*LbY${*IY~`(1?}#(zy$>!W+B7_>8AsUfJ~_E^eMB z3E6$RZjupIkE0bV&w_}iyiMfOEitL?ioilIb+u2(MOZ#1r zIt()_G_|khL4>&S#XL*7pspK3w47;$O6JCu?k?T6E88jvzWt|qpYrcJ?c{04Nu$Of z1&1S{SK?oMe5GOnSl8Lz-}c(qD$_9zuS#rY4hkR0GwIvq%zwqh{^U;J1Tbim!T@l8D4sHha$qmmrK#csE<%!q%obUZFE~Vrt5DAWZ26pl zFQGu?xx#+y&ORtqFGSPNpbrLbF zf`v7IofM-m*MJrq+sbnc9fp<+y}waHLsji2J(PuI>5COEY8sZ;xcKlary==qSZr(H zN}E-BmCV%Le(^~Dx?saGgX5k2WwqGb4_k%;oZ1CR6SQuVdHMS5ELaLMydH~=BO_tW z0gUO#alHKi36H{Bi`)SgR)m9UOyEJ7NeDGRFS(cm9_CW?{*Iv}KvRJ6)U=t%s9@y% zkXUwu$sc!VM)VY<04&K#BsJ@15bD|&y*c%2sE_}X`J)_O1q>yE=*|gfROx&ab{+4KQB_DS*G5=#D$V?Ce|$w6h+|ewx_T};x(MRZl_{)T1dRTEJ3MBKeq*p!HtBs2-X+u()h6VXgE-is0d+%><$Y61q3N6 z_Lf#WySfj>-PS@TtR6Tu_S?mQr=i9GcdQ>sZb9Gn=DC>9R6LgQixa6kjsZITZLvO- zCE*)&0?T5yMacp4`;4u9D+T!cc-CoPrFo708WEP5I8|bd6@T>IR(yrm@|`Qp*@eSn z6t|oa5Zko6u6xzCG~hPkurE@)wmvYc<=fJSUc5`Goccq=`Ls{2Q!+W=%?j6XPO>Dnfzk=GhKKX7WxKq0D_|3-6<9DOs|D=l`Vnn;3eJn;<=D&Xh z>Gtt$#$q+=df@;oGdhSesw)=OWr&f_i(}Kg<64!`EB-zwk|}q zJjc(m;op-_YMVDTJC>B9Dbkxi{VKwB-0PXJ8tZNe%AW~b#<73xHA#L@#c@wZUqnf& z+WE9OoBHRKp7NvNX9dBBCl8%8r04%Pc-LU*l*7oN$IUtocG-6*nL#Z-uRh2TuVt#wAF z;N?sM*#EuZ|a2e-9i~q_%jU1-{uhK1^jXZDp!HRXvhk9Umcl7q>qfPPy^ZP2e|4&E8pW zgc1!$UQ zdhX>BMbv#Ej*aLSoBnpMta+TDFY=FnKkefhCw17zeIFY@P*vm)8at72+g;KjcCSs) zhAn)${(@}jijY%TL~fI}?fe29Uv#uKM8Q3AF!!Qtt*CE&5(H!1X5xXUJ z2qVA7yuc||Hp zL~40OTS`Pbc~PHAP$Rrz(prtC{si8-;yi4rOdCc zS*C8tuVGQ9;lQuyR;KC8uN7RT70$1n?y_@%D7m?uZ0wT$*Gao%neG7xHG8g3RuP|@ z%h33$ZUnEcoWogHnE}0R_S#*8#WK;?Ib__9ja94FY{+JRyTLBKu3@CvG_s?>h@rd4 z+>6t+kh246rVn#PFlXv{5jc2VDMYS8CWpt{<;oV;L!Dou0J~ zyT%ydYOGke0bIMrJ3-04Fn)pLRDOBY#Yyf}$P?iR1#>&?agU@eIc>X&9$h2b-Jrrc{jb&YY*DljRyHWM+AJp4zsd9{>TdM z_-xz(eKj2936XO2^F`b(v~|#YHS>L)#j7HyMbIZ=ot&BA5$4_jAlxS0A5S}x{BsL= z{W461JB*k)>vrF#uJ9d+!+RIsFMI{Vz1k}-w{3B!;w@nKv_`_M@4a4}3l)k8TQ=`5 zq!n;xASSdyo4kMB*va%A1tR$I1B5^Al zjPBj-o^w{%tLy<~FxI_0heTE_l}NJvjxYI4v2E$?ig2phu|=z*!rq zv_0MSMJLdmQ0zr|FBaXo?kLw~ zJhkw&BE2elwmhrhSzVqt@VqItgW8qoA^MU6q)>8%9LtM2UM!@apr6X#5_>DzH>jV1 z%Pd{y;3`j71-LHKbqQ|DbYsG;MYk0Qsub8TsL`MfcMZC0!o5THE#~Lk3&wxKe^%e0~tiI>`y-;z&ajJfnzZ=H-+U6fpy+PIh literal 0 HcmV?d00001 diff --git a/artifacts/verification/workspace-request/80x24.png b/artifacts/verification/workspace-request/80x24.png new file mode 100644 index 0000000000000000000000000000000000000000..f06bb003db6b1cea42dc7c3260794555bc77886e GIT binary patch literal 7547 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 literal 0 HcmV?d00001 diff --git a/artifacts/verification/workspace-request/80x24.txt b/artifacts/verification/workspace-request/80x24.txt new file mode 100644 index 00000000..b06ca172 --- /dev/null +++ b/artifacts/verification/workspace-request/80x24.txt @@ -0,0 +1,16 @@ + + + + + + + + workspace · cloud sandbox + blank = provider default + repo url + > https://github.com/tangle-network/braid + git ref + > main + start in + > /workspace/src + tab/enter continues · shift-tab · esc diff --git a/artifacts/verification/workspace-request/capture-manifest.json b/artifacts/verification/workspace-request/capture-manifest.json new file mode 100644 index 00000000..e92ec6ec --- /dev/null +++ b/artifacts/verification/workspace-request/capture-manifest.json @@ -0,0 +1,106 @@ +{ + "schemaVersion": 1, + "generatedAt": "2026-08-31T01:54:23.433Z", + "command": "pnpm capture:workspace", + "binary": "clean npm install from generated tarball", + "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "fc8f2ff2dca42436c226afa643c0a70a347d0427da1d2fc02b15451d96bca947", + "terminal": "node-pty/xterm-256color", + "provenance": { + "renderer": { + "package": "@earendil-works/pi-tui@0.84.4", + "pty": "node-pty@1.1.0", + "emulator": "@xterm/headless@6.0.0", + "node": "v24.18.0", + "terminal": "xterm-256color" + }, + "raster": { + "agg": "agg 1.9.0", + "imagemagick": "Version: ImageMagick 6.9.12-98 Q16 x86_64 18038 https://legacy.imagemagick.org", + "fontFamily": "DejaVu Sans Mono", + "font": "DejaVu Sans Mono | Book | /usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", + "colorMode": "sRGB 8-bit" + } + }, + "flow": [ + "open cloud workspace step", + "submit git ref without repository", + "shift-tab to repository and enter URL", + "submit and review effective values", + "back to workspace with edits intact", + "shift-tab to connection and return with edits intact" + ], + "artifacts": [ + { + "path": "40x12.txt", + "sha256": "6afe2c78a729cc35958372d31b94a746f3e0c7894e45e31bad80efb8be7f3df0", + "kind": "terminal-frame", + "columns": 40, + "rows": 12 + }, + { + "path": "40x12.png", + "sha256": "e57f1354ef9012b66fe9ad55802d063aeb60e85dc07f1c0329db2099afdd651f", + "kind": "png", + "columns": 40, + "rows": 12 + }, + { + "path": "80x24.txt", + "sha256": "adf851a1d104dc9ad09cf0042fcd85e44759d070e739221bcb5dffa4fafeccf0", + "kind": "terminal-frame", + "columns": 80, + "rows": 24 + }, + { + "path": "80x24.png", + "sha256": "642609a750b020afb669dffffe25c22cd353eac927bc3d414cd9e1532ce5ac76", + "kind": "png", + "columns": 80, + "rows": 24 + }, + { + "path": "120x40.txt", + "sha256": "4fe2f084af450526506e1ac12397825bfec997733dd40b382e7c3230f868a13a", + "kind": "terminal-frame", + "columns": 120, + "rows": 40 + }, + { + "path": "120x40.png", + "sha256": "ac77458d39b17fcb5d8f2d239e69c1e82597928a81c5946f1691279a1d34de15", + "kind": "png", + "columns": 120, + "rows": 40 + }, + { + "path": "200x60.txt", + "sha256": "cfc88ea6498373c6441bcb98c0fb1258d8568a0c59a74c8f54d9c036a416de2c", + "kind": "terminal-frame", + "columns": 200, + "rows": 60 + }, + { + "path": "200x60.png", + "sha256": "6fb83480e7deabf67a0208c9e436d61251be73cb423a2d925142649470b561f9", + "kind": "png", + "columns": 200, + "rows": 60 + }, + { + "path": "raw/workspace-request-keyboard.cast", + "sha256": "45231fca16e468bc85703610816bb5896440025d15bd819e07d6397194526e67", + "kind": "keyboard-asciicast", + "columns": 80, + "rows": 24 + }, + { + "path": "80x24-workspace-request-keyboard.gif", + "sha256": "693098882e81a70a72ff250c145d0e4d5a8a8c699fae408b2ec6692550a520e3", + "kind": "keyboard-flow", + "columns": 80, + "rows": 24 + } + ] +} diff --git a/docs/components/README.md b/docs/components/README.md index 7b7b7ada..d65ff2cf 100644 --- a/docs/components/README.md +++ b/docs/components/README.md @@ -133,6 +133,7 @@ Helpers remain in the same document as the component whose behavior they serve. | `UnavailablePanel` | `src/views/tui/terminal-shell.ts` | [help-and-capability-states.md](help-and-capability-states.md) | | `TerminalSurfaceOverlays` | `src/views/tui/terminal-surface-overlays.ts` | [modal-coordination.md](modal-coordination.md) | | `TranscriptView` | `src/views/tui/transcript.ts` | [transcript-composer.md](transcript-composer.md) | +| `WorkspaceRequestForm` | `src/views/tui/workspace-request-form.ts` | [profiles-and-connections.md](profiles-and-connections.md) | ## Change rule diff --git a/docs/components/profiles-and-connections.md b/docs/components/profiles-and-connections.md index bd190d60..b96ef084 100644 --- a/docs/components/profiles-and-connections.md +++ b/docs/components/profiles-and-connections.md @@ -20,10 +20,11 @@ Use one staged configuration workflow with explicit review and commit. | Component | Responsibility | | --- | --- | -| `ConfigurationWizard` | Select profile, connection, and model through one staged workflow. | +| `ConfigurationWizard` | Select profile, connection, and cloud workspace request through one staged workflow. | | `ConfigurationCredential` | Collect a required credential through a bounded secret path. | | `PreparedCredential` | Hold the commit or rollback capability for a staged secret write. | | `ConfigurationReview` | Show the effective selection before durable activation. | +| `WorkspaceRequestForm` | Edit the bounded provider-neutral cloud workspace request. | | `ResponsiveText` | Present configuration detail without breaking narrow layouts. | | `ProfileEditorViewPanel` | Create or edit canonical profile fields. | | `ProfileCompatibilityPanel` | Explain supported, ignored, or blocking fields from real capability data. | @@ -39,21 +40,35 @@ A connection contains secret-free transport and account metadata plus a credenti Credential bytes live only in the operating-system credential facility or their bounded setup path. +`WorkspaceRequest` is an immutable provider-neutral startup selection, not connection metadata. + +The local `workspaceRoot` remains separate from the remote provider workspace request. + +Only a cloud-workspace provider exposes repository URL, git ref, and remote cwd in setup review. + +Repository URLs require HTTPS, contain no credentials, query, or fragment data, and reject literal private hosts. + +DNS names are not resolved during validation, so URL policy does not claim protection from DNS rebinding. + +Provider-native workspace options never enter startup persistence, receipts, snapshots, or logs. + The active selection records stable profile and connection identifiers. -Each run receipt freezes the exact effective profile and connection identity used for admission. +Each run receipt freezes the exact effective profile, connection, workspace request, and local root used for admission. + +The request digest includes both workspace values, so changing either value creates a new admission identity. ## Workflow Discovery loads available profiles, connections, models, and provider capabilities. -Selection validates the exact profile against the selected connection. +Selection validates the exact profile and workspace request against the selected connection capabilities. Credential preparation writes through a recoverable staged operation. -Review shows effective runner, model, endpoint label, limits, and compatibility findings without secret values. +Review shows effective runner, model, workspace fields, endpoint label, limits, and compatibility findings without secret values. -Commit saves metadata and activates the selection only after validation succeeds. +Commit saves the workspace request with startup metadata and activates the selection only after validation succeeds. Rollback removes an uncommitted credential if later persistence fails. @@ -69,6 +84,10 @@ Endpoints are normalized for transport and redacted for display. Credential removal is serialized, journaled, and recoverable after process interruption. +Recovery replays the workspace request stored in `receipt.requested`. + +Legacy receipts without that field replay without a remote workspace request and never inherit current setup values. + Removing a shared credential remains unavailable until no saved connection references it. ## Responsive behavior diff --git a/docs/components/workspace-branching.md b/docs/components/workspace-branching.md index ac4dde27..534b57a0 100644 --- a/docs/components/workspace-branching.md +++ b/docs/components/workspace-branching.md @@ -6,6 +6,24 @@ Workspace branching creates an isolated provider environment from an exact sourc It supports checkpoint, lookup, fork, restart replay, destination mutation, source preservation, and resource cleanup. +## Workspace request boundary + +The startup `WorkspaceRequest` selects a provider-neutral remote workspace for a run. + +The local Braid `workspaceRoot` remains separate and never becomes the provider workspace cwd. + +Admission freezes the request inside `receipt.requested` and includes it in the exact request digest. + +Retained and ephemeral Tangle starts receive that frozen request through the runtime environment boundary. + +Recovery reads the request from the receipt and does not infer it from current setup configuration. + +Legacy receipts without a request replay with provider defaults. + +Branching records source environment identity separately from startup workspace selection. + +Provider-native options remain outside Braid persistence and branch records. + ## Component map | Component | Responsibility | diff --git a/package.json b/package.json index 9ed09c7a..92724105 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "capture:w0": "pnpm run build && node scripts/capture-w0.mjs", "capture:visual": "pnpm run build && node scripts/capture-visual.mjs", "capture:connections": "pnpm run build && node scripts/capture-connections.mjs", + "capture:workspace": "pnpm run build && node scripts/capture-workspace-request.mjs", "capture:demo:live": "pnpm run build && node scripts/live-demo.mjs", "check": "pnpm run format:check && pnpm run lint && pnpm run typecheck && pnpm run boundaries && pnpm run dependencies:check && pnpm run attribution && pnpm run licenses:check && pnpm run test && pnpm run test:live:required:self && pnpm run test:live:bridge:matrix && pnpm run check:release", "clean": "node scripts/clean.mjs", diff --git a/scripts/capture-workspace-request.mjs b/scripts/capture-workspace-request.mjs new file mode 100644 index 00000000..2a853b2b --- /dev/null +++ b/scripts/capture-workspace-request.mjs @@ -0,0 +1,445 @@ +import { execFile } from 'node:child_process' +import { createHash } from 'node:crypto' +import { mkdir, mkdtemp, readFile, rm, symlink, writeFile } from 'node:fs/promises' +import { createServer } from 'node:http' +import { tmpdir } from 'node:os' +import { dirname, join, relative } from 'node:path' +import { promisify } from 'node:util' +import { visibleWidth } from '@earendil-works/pi-tui' +import xterm from '@xterm/headless' +import * as pty from 'node-pty' +import { + captureProvenance, + createArtifactFor, + writeCastGif, + writeRaster, +} from './capture-visual-support.mjs' +import { nativeInstallEnvironment } from './native-install-environment.mjs' +import { installPackedBraid } from './packed-binary.mjs' +import { npmInvocation } from './release/platform.mjs' + +const run = promisify(execFile) +const repository = new URL('../', import.meta.url).pathname +const outputRoot = join(repository, 'artifacts', 'verification', 'workspace-request') +const rawRoot = join(outputRoot, 'raw') +const sizes = [ + [40, 12], + [80, 24], + [120, 40], + [200, 60], +] +const XtermTerminal = xterm.Terminal + +function sleep(milliseconds) { + return new Promise((resolve) => setTimeout(resolve, milliseconds)) +} + +async function waitFor(predicate, label, diagnostic, timeoutMs = 10_000) { + const deadline = Date.now() + timeoutMs + while (!predicate()) { + if (Date.now() >= deadline) { + throw new Error(`Timed out waiting for ${label}${diagnostic ? `\n${diagnostic()}` : ''}`) + } + await sleep(20) + } +} + +function normalized(value) { + return value.replace(/\s+/gu, ' ').trim() +} + +function screenFrom(emulator, rows) { + const buffer = emulator.buffer.active + return Array.from( + { length: rows }, + (_, index) => buffer.getLine(buffer.viewportY + index)?.translateToString(true) ?? '', + ).join('\n') +} + +function castFor(terminal, events, title) { + const lastEventAt = events.at(-1)?.[0] ?? 0 + const settled = [...events, [Number((lastEventAt + 0.01).toFixed(6)), 'o', '\u001b[0m']] + const header = { + version: 2, + width: terminal.columns, + height: terminal.rows, + timestamp: Math.floor(Date.now() / 1_000), + duration: settled.at(-1)[0], + idle_time_limit: 1, + command: 'packed braid workspace request setup', + title, + env: { TERM: 'xterm-256color' }, + stdin: true, + } + return [JSON.stringify(header), ...settled.map((event) => JSON.stringify(event)), ''].join('\n') +} + +async function sha256(path) { + return createHash('sha256') + .update(await readFile(path)) + .digest('hex') +} + +async function startBridge() { + const server = createServer((request, response) => { + const path = new URL(request.url ?? '/', 'http://127.0.0.1').pathname + const body = + path === '/health' + ? { status: 'ok', backends: [{ name: 'pi', state: 'ready' }] } + : path === '/v1/models' + ? { data: [{ id: 'pi/openai/gpt-5', backend: 'pi' }] } + : { error: 'not found' } + response.statusCode = path === '/health' || path === '/v1/models' ? 200 : 404 + response.setHeader('content-type', 'application/json') + response.end(JSON.stringify(body)) + }) + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) + const address = server.address() + if (address === null || typeof address === 'string') { + await new Promise((resolve) => server.close(resolve)) + throw new Error('Workspace capture bridge did not receive a TCP address') + } + return { server, endpoint: `http://127.0.0.1:${address.port}` } +} + +async function createFixture(root) { + const workspace = join(root, 'workspace') + const profileDirectory = join(workspace, '.braid') + await mkdir(profileDirectory, { recursive: true, mode: 0o700 }) + await writeFile( + join(profileDirectory, 'profile.json'), + `${JSON.stringify({ + name: 'Workspace request capture', + description: 'Packed setup flow proof', + harness: 'pi', + model: { default: 'openai/gpt-5' }, + })}\n`, + { mode: 0o600 }, + ) + return workspace +} + +async function spawnTerminal(binary, columns, rows, root, endpoint) { + const workspace = await createFixture(root) + const emulator = new XtermTerminal({ + cols: columns, + rows, + disableStdin: true, + allowProposedApi: true, + }) + const environment = { + ...process.env, + TERM: 'xterm-256color', + COLORTERM: 'truecolor', + NODE_NO_WARNINGS: '1', + BRAID_CLI_BRIDGE_ENDPOINT: endpoint, + BRAID_DISCOVERY_TIMEOUT_MS: '1000', + XDG_DATA_HOME: join(root, 'data'), + XDG_CONFIG_HOME: join(root, 'config'), + } + delete environment.NO_COLOR + delete environment.FORCE_COLOR + const session = pty.spawn(process.execPath, [binary, '--workspace', workspace], { + name: 'xterm-256color', + cols: columns, + rows, + cwd: workspace, + env: environment, + }) + const startedAt = performance.now() + const events = [] + let output = '' + let screen = '' + let pendingWrites = 0 + let lastOutputAt = performance.now() + let exited = false + const exit = new Promise((resolve) => + session.onExit((result) => { + exited = true + resolve(result) + }), + ) + session.onData((data) => { + output += data + events.push([Number(((performance.now() - startedAt) / 1_000).toFixed(6)), 'o', data]) + lastOutputAt = performance.now() + pendingWrites += 1 + emulator.write(data, () => { + screen = screenFrom(emulator, rows) + pendingWrites -= 1 + }) + }) + const input = (data) => { + events.push([Number(((performance.now() - startedAt) / 1_000).toFixed(6)), 'i', data]) + session.write(data) + } + const stable = (label) => + waitFor( + () => pendingWrites === 0 && performance.now() - lastOutputAt >= 75, + `${columns}x${rows} ${label}`, + () => screen, + ) + const waitForScreen = (predicate, label) => + waitFor( + () => predicate(normalized(screen)), + label, + () => screen, + ) + const close = async () => { + if (exited) return + for (let index = 0; index < 6; index += 1) { + const visible = normalized(screen) + if ( + !visible.includes('braid setup') && + !visible.includes('workspace · cloud sandbox') && + !visible.includes('credential ·') + ) + break + input('\u001b') + await sleep(150) + await stable(`close layer ${index + 1}`) + } + input('\u0003') + await waitFor( + () => normalized(screen).toLowerCase().includes('ctrl+c again to quit'), + 'safe exit prompt', + () => screen, + ) + input('\u0003') + const result = await Promise.race([ + exit, + sleep(5_000).then(() => { + throw new Error('Workspace request capture did not exit') + }), + ]) + if (result.exitCode !== 0) + throw new Error(`Workspace request capture exited ${result.exitCode}`) + } + const dispose = async () => { + if (!exited) session.kill() + emulator.dispose() + } + return { + columns, + rows, + events, + input, + output: () => output, + screen: () => screen, + stable, + waitForScreen, + close, + dispose, + } +} + +async function reachWorkspace(terminal) { + try { + await terminal.waitForScreen( + (screen) => screen.includes('choose an AgentProfile'), + 'profile selection', + ) + } catch (error) { + throw new Error( + `${error instanceof Error ? error.message : String(error)}\n${terminal.output()}`, + ) + } + terminal.input('\r') + await terminal.waitForScreen( + (screen) => screen.includes('choose a connection'), + 'connection selection', + ) + terminal.input('\u001b[B') + terminal.input('\u001b[B') + terminal.input('\r') + await terminal.waitForScreen( + (screen) => screen.includes('workspace · cloud sandbox'), + 'workspace form', + ) +} + +async function fillWorkspace(terminal) { + terminal.input('https://github.com/tangle-network/braid') + terminal.input('\t') + terminal.input('main') + terminal.input('\t') + terminal.input('/workspace/src') + await terminal.stable('filled workspace form') +} + +function cleanFrame(screen) { + return `${screen.replace(/[ \t]+$/gmu, '').replace(/\n+$/u, '')}\n` +} + +async function captureFrame(binary, columns, rows, endpoint) { + const root = await mkdtemp(join(tmpdir(), `braid-workspace-request-${columns}x${rows}-`)) + const terminal = await spawnTerminal(binary, columns, rows, root, endpoint) + try { + await reachWorkspace(terminal) + await fillWorkspace(terminal) + const screen = cleanFrame(terminal.screen()) + const events = [...terminal.events] + await terminal.close() + return { + terminal, + screen, + events, + cast: castFor(terminal, events, `Braid workspace request ${columns}x${rows}`), + } + } finally { + await terminal.dispose() + await rm(root, { force: true, recursive: true }) + } +} + +async function captureKeyboardFlow(binary, endpoint) { + const root = await mkdtemp(join(tmpdir(), 'braid-workspace-request-keyboard-')) + const terminal = await spawnTerminal(binary, 80, 24, root, endpoint) + try { + await reachWorkspace(terminal) + terminal.input('\t') + terminal.input('main') + terminal.input('\t') + terminal.input('\r') + await terminal.waitForScreen( + (screen) => screen.includes('gitRef requires repoUrl'), + 'bounded invalid git ref message', + ) + const invalidFrame = terminal.screen().split('\n') + if (invalidFrame.some((line) => visibleWidth(line) > 80)) + throw new Error('Workspace validation error exceeded the terminal width') + terminal.input('\u001b[9;2u') + await sleep(100) + terminal.input('https://github.com/tangle-network/braid') + terminal.input('\t') + terminal.input('\t') + terminal.input('\r') + await terminal.waitForScreen( + (screen) => + screen.includes('review and start') && screen.includes('github.com/tangle-network/braid'), + 'workspace review', + ) + terminal.input('\u001b[B') + terminal.input('\r') + await terminal.waitForScreen( + (screen) => screen.includes('github.com/tangle-network/braid') && screen.includes('main'), + 'workspace edits after review back', + ) + terminal.input('\u001b[9;2u') + await terminal.waitForScreen( + (screen) => screen.includes('choose a connection'), + 'connection back', + ) + terminal.input('\r') + await terminal.waitForScreen( + (screen) => + screen.includes('workspace · cloud sandbox') && + screen.includes('github.com/tangle-network/braid'), + 'workspace edits after connection back', + ) + await terminal.stable('keyboard walkthrough') + const events = [...terminal.events] + await terminal.close() + return { + events, + steps: [ + 'open cloud workspace step', + 'submit git ref without repository', + 'shift-tab to repository and enter URL', + 'submit and review effective values', + 'back to workspace with edits intact', + 'shift-tab to connection and return with edits intact', + ], + cast: castFor(terminal, events, 'Braid workspace request keyboard flow'), + } + } finally { + await terminal.dispose() + await rm(root, { force: true, recursive: true }) + } +} + +const packed = await installPackedBraid(repository) +const sdkTarball = process.env.BRAID_AGENT_INTERFACE_TARBALL +if (sdkTarball !== undefined) { + const npm = npmInvocation([ + 'install', + '--no-audit', + '--no-fund', + '--package-lock=false', + '--legacy-peer-deps', + sdkTarball, + ]) + await run(npm.file, npm.args, { + cwd: packed.installRoot, + env: nativeInstallEnvironment(), + }) + const nestedSdk = join( + packed.installRoot, + 'node_modules', + '@tangle-network', + 'braid', + 'node_modules', + '@tangle-network', + 'agent-interface', + ) + await rm(nestedSdk, { force: true, recursive: true }) + await mkdir(dirname(nestedSdk), { recursive: true }) + await symlink( + join(packed.installRoot, 'node_modules', '@tangle-network', 'agent-interface'), + nestedSdk, + ) +} +const bridge = await startBridge() +const artifactFor = createArtifactFor(outputRoot, sha256) +try { + await rm(outputRoot, { force: true, recursive: true }) + await mkdir(rawRoot, { recursive: true }) + const artifacts = [] + for (const [columns, rows] of sizes) { + const frame = await captureFrame(packed.binary, columns, rows, bridge.endpoint) + const name = `${columns}x${rows}` + const textPath = join(outputRoot, `${name}.txt`) + const castPath = join(rawRoot, `${name}.cast`) + const pngPath = join(outputRoot, `${name}.png`) + const temporaryGif = join(rawRoot, `${name}.gif`) + await writeFile(textPath, frame.screen) + await writeFile(castPath, frame.cast) + await writeRaster(castPath, pngPath, temporaryGif) + artifacts.push(await artifactFor(textPath, 'terminal-frame', columns, rows)) + artifacts.push(await artifactFor(pngPath, 'png', columns, rows)) + } + const keyboard = await captureKeyboardFlow(packed.binary, bridge.endpoint) + const keyboardCast = join(rawRoot, 'workspace-request-keyboard.cast') + const keyboardGif = join(outputRoot, '80x24-workspace-request-keyboard.gif') + await writeFile(keyboardCast, keyboard.cast) + await writeCastGif(keyboardCast, keyboardGif) + artifacts.push(await artifactFor(keyboardCast, 'keyboard-asciicast', 80, 24)) + artifacts.push(await artifactFor(keyboardGif, 'keyboard-flow', 80, 24)) + const manifestPath = join(outputRoot, 'capture-manifest.json') + await writeFile( + manifestPath, + `${JSON.stringify( + { + schemaVersion: 1, + generatedAt: new Date().toISOString(), + command: 'pnpm capture:workspace', + binary: 'clean npm install from generated tarball', + binarySha256: await sha256(packed.binary), + tarball: packed.tarballName, + tarballSha256: packed.tarballSha256, + terminal: 'node-pty/xterm-256color', + provenance: await captureProvenance(), + flow: keyboard.steps, + artifacts, + }, + null, + 2, + )}\n`, + ) + process.stdout.write( + `Wrote ${artifacts.length} packed workspace request UI artifacts to ${relative(repository, outputRoot)}\n`, + ) +} finally { + await new Promise((resolve) => bridge.server.close(resolve)) + await packed.cleanup() +} diff --git a/src/adapters/runtime/agent-runtime-execution.ts b/src/adapters/runtime/agent-runtime-execution.ts index 157c8073..fb2fe61c 100644 --- a/src/adapters/runtime/agent-runtime-execution.ts +++ b/src/adapters/runtime/agent-runtime-execution.ts @@ -421,6 +421,8 @@ function admissionKey(input: ExecuteTurnInput, profileDigest: string): string { profileDigest, connectionId: input.connectionId ?? null, mode: input.mode ?? null, + workspaceRequest: input.workspaceRequest ?? null, + workspaceRoot: input.workspaceRoot ?? null, sessionId: input.sessionId ?? null, contextBoundary: input.contextBoundary ?? null, contextTransfer: input.contextTransfer ?? null, diff --git a/src/adapters/runtime/production-tangle-sandbox-backend.ts b/src/adapters/runtime/production-tangle-sandbox-backend.ts index c2e1aae7..ec1620c7 100644 --- a/src/adapters/runtime/production-tangle-sandbox-backend.ts +++ b/src/adapters/runtime/production-tangle-sandbox-backend.ts @@ -3,10 +3,10 @@ import type { AgentEnvironmentCapabilities, AgentEnvironmentProvider, } from '@tangle-network/agent-interface/environment-provider' -import type { SandboxClientLike } from '@tangle-network/agent-provider-tangle' -import type { ExecutorFactory, SandboxClient } from '@tangle-network/agent-runtime/kernel' -import type { BackendType, CreateSandboxOptions, SandboxInstance } from '@tangle-network/sandbox' +import type { ExecutorFactory } from '@tangle-network/agent-runtime/kernel' +import type { BackendType } from '@tangle-network/sandbox' import { ConnectionError } from '../../app/connection-errors.js' +import { snapshotWorkspaceRequest, workspaceRequestDigest } from '../../app/workspace-request.js' import { canonicalDigest } from '../../domain/canonical.js' import type { ConnectionId } from '../../domain/ids.js' import type { ExecuteTurnInput } from '../../ports/execution.js' @@ -62,17 +62,23 @@ export async function resolveTangleSandboxBackend( } const { profile, model, runner } = await tangleExecutionIdentity(input, selection, connectionId) - const [{ createTangleSandboxClient }, { createTangleProvider }, { createExecutor }] = - await Promise.all([ - import('../connections/production-connection-providers.js'), - import('@tangle-network/agent-provider-tangle'), - import('@tangle-network/agent-runtime/kernel'), - ]) + const [ + { createTangleSandboxClient }, + { createTangleProvider }, + { createExecutor, providerAsSandboxClient }, + ] = await Promise.all([ + import('../connections/production-connection-providers.js'), + import('@tangle-network/agent-provider-tangle'), + import('@tangle-network/agent-runtime/kernel'), + ]) const lifecycle = sandboxLifecycle() const idempotencyKey = stableProviderId('env-braid-', input.runId) + const workspaceRequest = snapshotWorkspaceRequest(input.workspaceRequest) + const workspaceRequestDigestValue = workspaceRequestDigest(workspaceRequest) const environmentRequestDigest = canonicalDigest({ kind: 'tangle-sandbox-environment-request', idempotencyKey, + workspaceRequest: workspaceRequest ?? null, }) const rawClient = await createTangleSandboxClient(record, options, input.signal) const observedClient = observeSandboxClient(rawClient, lifecycle) @@ -85,6 +91,7 @@ export async function resolveTangleSandboxBackend( ? {} : { confidentialAttestationVerifier: confidential.tangle }), }) + const runtimeProvider = providerWithoutSandboxOptions(sdkProvider) const capabilities = capabilitiesForLifecycle(await sdkProvider.capabilities(), lifecycle) const providerSessionId = providerSessionFor(input, capabilities) const backend = Object.freeze({ @@ -92,12 +99,17 @@ export async function resolveTangleSandboxBackend( factory: ((spec, context) => createExecutor({ backend: 'sandbox', - sandboxClient: runtimeSandboxClient( - observedClient.client, - record.name, - idempotencyKey, - context.signal, - ), + sandboxClient: providerAsSandboxClient(runtimeProvider, { + defaults: { + profile, + backend: runner, + ...(workspaceRequest === undefined ? {} : { workspace: workspaceRequest }), + name: record.name, + idempotencyKey, + signal: context.signal, + }, + requireTerminalEvent: true, + }), maxIterations: 1, })(spec, context)) satisfies ExecutorFactory, profile, @@ -114,6 +126,9 @@ export async function resolveTangleSandboxBackend( backend: 'executor', connectionId, environmentRequestDigest, + ...(workspaceRequestDigestValue === undefined + ? {} + : { workspaceRequestDigest: workspaceRequestDigestValue }), lifecycle: lifecycle.mode, cleanup: lifecycle.cleanup, continuity: lifecycle.continuity, @@ -133,6 +148,7 @@ export interface PreparedTangleRetainedConnection { readonly capabilities: AgentEnvironmentCapabilities readonly observation: ExecutionObservationSource readonly providerSessionId: string + readonly workspaceRequest?: Readonly readonly environmentIdempotencyKey: string readonly environmentName: string readonly environmentMetadata: Readonly> @@ -162,6 +178,7 @@ export async function resolveTangleSandboxRetainedConnection( ) } const { profile, model, runner } = await tangleExecutionIdentity(input, selection, connectionId) + const workspaceRequest = snapshotWorkspaceRequest(input.workspaceRequest) const providerSessionId = input.sessionId ?? stableProviderId('session-braid-', input.runId) if (!providerSessionId.startsWith('session-braid-')) { throw new ConnectionError( @@ -231,7 +248,9 @@ export async function resolveTangleSandboxRetainedConnection( name: identity.name, metadata: identity.metadata, idleTtlSeconds, + workspaceRequest: workspaceRequest ?? null, }) + const workspaceRequestDigestValue = workspaceRequestDigest(workspaceRequest) return freezeExecution({ profile, model, @@ -240,6 +259,7 @@ export async function resolveTangleSandboxRetainedConnection( capabilities, observation: observedClient.observation, providerSessionId, + ...(workspaceRequest === undefined ? {} : { workspaceRequest }), environmentIdempotencyKey: identity.environmentIdempotencyKey, environmentName: identity.name, environmentMetadata: identity.metadata, @@ -258,6 +278,9 @@ export async function resolveTangleSandboxRetainedConnection( backend: 'environment-provider', connectionId, environmentRequestDigest, + ...(workspaceRequestDigestValue === undefined + ? {} + : { workspaceRequestDigest: workspaceRequestDigestValue }), lifecycle: lifecycle.mode, cleanup: lifecycle.cleanup, continuity: lifecycle.continuity, @@ -269,26 +292,6 @@ export async function resolveTangleSandboxRetainedConnection( }) } -function runtimeSandboxClient( - client: SandboxClientLike, - name: string, - idempotencyKey: string, - signal: AbortSignal, -): SandboxClient { - return Object.freeze({ - async create(createOptions?: CreateSandboxOptions) { - return (await client.create( - { - ...createOptions, - name, - idempotencyKey, - }, - { signal }, - )) as unknown as SandboxInstance - }, - }) -} - function sandboxLifecycle(): SandboxLifecyclePolicy { return { mode: 'ephemeral', @@ -298,6 +301,18 @@ function sandboxLifecycle(): SandboxLifecyclePolicy { } } +function providerWithoutSandboxOptions( + provider: AgentEnvironmentProvider, +): AgentEnvironmentProvider { + return { + ...provider, + async create(input) { + const { providerOptions: _providerOptions, ...neutralInput } = input + return provider.create(neutralInput) + }, + } +} + function capabilitiesForLifecycle( capabilities: AgentEnvironmentCapabilities, lifecycle: SandboxLifecyclePolicy, diff --git a/src/adapters/runtime/retained-execution-state.ts b/src/adapters/runtime/retained-execution-state.ts index a5b5470c..b583e395 100644 --- a/src/adapters/runtime/retained-execution-state.ts +++ b/src/adapters/runtime/retained-execution-state.ts @@ -26,6 +26,7 @@ export function retainedExecutionKey( interactions: input.interactions ?? (capabilities === undefined ? {} : requestedInteractionsForRun(input.mode, capabilities)), + workspaceRequest: input.workspaceRequest ?? null, workspaceRoot: input.workspaceRoot ?? null, sessionId: input.sessionId ?? null, contextBoundary: input.contextBoundary ?? null, diff --git a/src/adapters/runtime/retained-native-continuation.ts b/src/adapters/runtime/retained-native-continuation.ts index 474b16d3..fe1e4327 100644 --- a/src/adapters/runtime/retained-native-continuation.ts +++ b/src/adapters/runtime/retained-native-continuation.ts @@ -128,7 +128,14 @@ export function nativeContinuationInputFromRecovery( ...(receipt.requested.connectionId === undefined ? {} : { connectionId: receipt.requested.connectionId }), - ...(recovery.workspaceRoot === undefined ? {} : { workspaceRoot: recovery.workspaceRoot }), + ...(receipt.requested.workspaceRequest === undefined + ? {} + : { workspaceRequest: receipt.requested.workspaceRequest }), + ...(receipt.requested.workspaceRoot === undefined + ? recovery.workspaceRoot === undefined + ? {} + : { workspaceRoot: recovery.workspaceRoot } + : { workspaceRoot: receipt.requested.workspaceRoot }), sessionId: proof.sessionId, signal, nativeContextBoundaryProof: proof, diff --git a/src/adapters/runtime/tangle-retained-interactive-contract.ts b/src/adapters/runtime/tangle-retained-interactive-contract.ts index 6003bed2..08d43cd4 100644 --- a/src/adapters/runtime/tangle-retained-interactive-contract.ts +++ b/src/adapters/runtime/tangle-retained-interactive-contract.ts @@ -4,6 +4,7 @@ import type { RetainedInteractiveAdmissionHook, RetainedInteractiveStartedAdmission, } from '@tangle-network/agent-runtime/kernel' +import { workspaceRequestDigest } from '../../app/workspace-request.js' import { canonicalDigest } from '../../domain/canonical.js' import { publicMaterializationReceipt } from '../../domain/materialization-receipt.js' import type { RunAdmissionReceipt } from '../../domain/receipts.js' @@ -56,6 +57,7 @@ export function interactiveRunCapabilities( export function interactiveMaterializationReceipt( prepared: PreparedTangleRetainedConnection, ): Readonly> { + const workspaceRequestDigestValue = workspaceRequestDigest(prepared.workspaceRequest) return publicMaterializationReceipt({ provider: prepared.provider.name, backend: 'environment-provider', @@ -67,6 +69,9 @@ export function interactiveMaterializationReceipt( idleTtlSeconds: prepared.idleTtlSeconds, model: prepared.model, runner: prepared.runner, + ...(workspaceRequestDigestValue === undefined + ? {} + : { workspaceRequestDigest: workspaceRequestDigestValue }), }) } @@ -85,6 +90,7 @@ export function interactiveEnvironment( lifecycle: 'retained', surface: 'interactive-agent', }, + ...(prepared.workspaceRequest === undefined ? {} : { workspace: prepared.workspaceRequest }), idempotencyKey, } } diff --git a/src/adapters/runtime/tangle-retained-interactive-execution.ts b/src/adapters/runtime/tangle-retained-interactive-execution.ts index 239f8d1e..632edc5a 100644 --- a/src/adapters/runtime/tangle-retained-interactive-execution.ts +++ b/src/adapters/runtime/tangle-retained-interactive-execution.ts @@ -554,7 +554,18 @@ export class TangleRetainedInteractiveExecutionPort implements ExecutionPort { ...(receipt?.requested.connectionId === undefined ? {} : { connectionId: receipt.requested.connectionId }), - ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), + ...(receipt === undefined + ? input.workspaceRequest === undefined + ? {} + : { workspaceRequest: input.workspaceRequest } + : receipt.requested.workspaceRequest === undefined + ? {} + : { workspaceRequest: receipt.requested.workspaceRequest }), + ...(receipt?.requested.workspaceRoot === undefined + ? input.workspaceRoot === undefined + ? {} + : { workspaceRoot: input.workspaceRoot } + : { workspaceRoot: receipt.requested.workspaceRoot }), signal: input.signal ?? new AbortController().signal, } return (this.#recover ?? this.#resolve)(recoveredInput) diff --git a/src/adapters/runtime/tangle-retained-run.ts b/src/adapters/runtime/tangle-retained-run.ts index 2056c32e..fd440648 100644 --- a/src/adapters/runtime/tangle-retained-run.ts +++ b/src/adapters/runtime/tangle-retained-run.ts @@ -147,6 +147,9 @@ export async function startTangleRetainedRun( environment: { profile: plan.prepared.profile, backend: plan.prepared.runner, + ...(plan.prepared.workspaceRequest === undefined + ? {} + : { workspace: plan.prepared.workspaceRequest }), name: plan.prepared.environmentName, metadata: plan.prepared.environmentMetadata, idempotencyKey: plan.environmentIdempotencyKey, @@ -182,6 +185,9 @@ async function recoverTangleRetainedRun( environment: { profile: plan.prepared.profile, backend: plan.prepared.runner, + ...(plan.prepared.workspaceRequest === undefined + ? {} + : { workspace: plan.prepared.workspaceRequest }), name: plan.prepared.environmentName, metadata: plan.prepared.environmentMetadata, idempotencyKey: admission.idempotencyKey, diff --git a/src/app/application-options.ts b/src/app/application-options.ts index 60936ee9..dfadb6a0 100644 --- a/src/app/application-options.ts +++ b/src/app/application-options.ts @@ -1,4 +1,4 @@ -import type { AgentProfile } from '@tangle-network/agent-interface' +import type { AgentProfile, WorkspaceRequest } from '@tangle-network/agent-interface' import type { EffectStoragePort, JournalPort } from '../ports/effect-storage.js' import type { ExecutionPort } from '../ports/execution.js' import type { IdSource } from '../ports/ids.js' @@ -18,6 +18,8 @@ export type CancelReceipt = Omit & { readonly replayed export interface BraidApplicationOptions { readonly profile: Readonly + /** Provider-neutral remote workspace selected at startup. */ + readonly workspaceRequest?: Readonly readonly execution: ExecutionPort readonly clock: import('../ports/clock.js').Clock readonly ids: IdSource diff --git a/src/app/application.ts b/src/app/application.ts index c0119b88..ffa89d6f 100644 --- a/src/app/application.ts +++ b/src/app/application.ts @@ -67,6 +67,7 @@ import { createRunLedger } from './run-ledger.js' import { reconcileRun, reconnectRun } from './run-replay.js' import { isTerminal, waitForIdle } from './run-status.js' import { shutdownApplication } from './shutdown-controller.js' +import { snapshotWorkspaceRequest } from './workspace-request.js' export type { SendInput, SendReceipt } from './application-types.js' export { AppError } from './errors.js' @@ -121,6 +122,9 @@ export class BraidApplication { readonly runtimeSelection: RuntimeSelection readonly #execution: ExecutionPort readonly #executionProfile: Readonly + readonly #workspaceRequest: + | Readonly + | undefined readonly #ids: IdSource readonly #clock: Clock readonly #journal: ApplicationJournal @@ -146,6 +150,7 @@ export class BraidApplication { constructor(options: BraidApplicationOptions) { this.#execution = options.execution this.#executionProfile = structuredClone(options.profile) + this.#workspaceRequest = snapshotWorkspaceRequest(options.workspaceRequest) this.runtimeSelection = new RuntimeSelection(this.#executionProfile) this.#ids = options.ids this.#clock = options.clock @@ -424,6 +429,7 @@ export class BraidApplication { configuration.profile, configuration.connectionId, configuration.mode, + this.#workspaceRequest, ) validateNativeProof(this.#portViews.admission, snapshot) if (this.#asynchronousJournal || admissionIsAsync(this.#execution)) { diff --git a/src/app/composition.ts b/src/app/composition.ts index aaa6406d..55e1794d 100644 --- a/src/app/composition.ts +++ b/src/app/composition.ts @@ -25,8 +25,8 @@ export { type DurableCompositionOptions, type DurableStartupStage, } from '../startup/durable-runtime.js' -export { DETERMINISTIC_PROFILE, STARTER_PROFILE } from './default-profiles.js' export type { CompositionOptions } from './composition-options.js' +export { DETERMINISTIC_PROFILE, STARTER_PROFILE } from './default-profiles.js' export type ProductionBraidApplicationOptions = Omit @@ -111,6 +111,9 @@ export function createBraidApplication(options: CompositionOptions = {}): BraidA options.profile ?? production?.profile ?? (isFixture ? DETERMINISTIC_PROFILE : STARTER_PROFILE), + ...(options.production?.workspaceRequest === undefined + ? {} + : { workspaceRequest: options.production.workspaceRequest }), execution, clock, ids: options.ids ?? (isFixture ? new SequenceIds() : new RandomIds()), diff --git a/src/app/configuration-session.ts b/src/app/configuration-session.ts index 88a6fb45..40e53dfe 100644 --- a/src/app/configuration-session.ts +++ b/src/app/configuration-session.ts @@ -3,16 +3,28 @@ import type { ConnectionHealth, ConnectionKind, ConnectionRecord } from '../doma import type { Digest } from '../domain/ids.js' import { ConnectionRegistry } from './connections.js' import type { ProfileRecord } from './profile-types.js' - -export type ConfigurationStep = 'profile' | 'connection' | 'confirm' | 'complete' | 'cancelled' - -export type ConfigurationBackTarget = 'profile' | 'connection' +import { + snapshotWorkspaceRequest, + type WorkspaceRequest, + workspaceRequestErrorMessage, +} from './workspace-request.js' + +export type ConfigurationStep = + | 'profile' + | 'connection' + | 'workspace' + | 'confirm' + | 'complete' + | 'cancelled' + +export type ConfigurationBackTarget = 'profile' | 'connection' | 'workspace' export type ConfigurationErrorCode = | 'PROFILE_NOT_FOUND' | 'CONNECTION_NOT_FOUND' | 'PROFILE_REQUIRED' | 'CONNECTION_REQUIRED' + | 'WORKSPACE_INVALID' | 'NO_PROFILES' | 'NO_CONNECTIONS' | 'ALREADY_FINISHED' @@ -50,6 +62,7 @@ export interface ConfigurationSelection { readonly connection: ConnectionRecord readonly profileDigest: Digest readonly connectionDigest: Digest + readonly workspaceRequest?: Readonly } export interface ConfigurationEffectiveValues { @@ -57,6 +70,7 @@ export interface ConfigurationEffectiveValues { readonly model: string readonly effort: string readonly workdir: string + readonly workspaceRequest?: Readonly readonly verification: string readonly unsupported: readonly string[] } @@ -76,6 +90,8 @@ export interface ConfigurationSessionOptions { readonly connections: readonly ConnectionRecord[] readonly initialProfileId?: ProfileRecord['id'] readonly initialConnectionId?: ConnectionRecord['id'] + /** Optional provider-neutral request selected for cloud-workspace connections. */ + readonly workspaceRequest?: WorkspaceRequest } function kindLabel(kind: ConnectionKind): string { @@ -171,6 +187,7 @@ export class ConfigurationSession { readonly #profiles: readonly ProfileChoice[] readonly #connections: readonly ConnectionChoice[] readonly #connectionRegistry: ConnectionRegistry + #workspaceRequest: Readonly | undefined #state: ConfigurationSessionState constructor(options: ConfigurationSessionOptions) { @@ -181,6 +198,7 @@ export class ConfigurationSession { this.#connectionRegistry = new ConnectionRegistry( connections.map((choice) => choice.connection), ) + this.#workspaceRequest = snapshotWorkspaceRequest(options.workspaceRequest) this.#state = freezeState({ step: 'profile', profiles: this.#profiles, @@ -227,7 +245,7 @@ export class ConfigurationSession { this.#state = clearError( clearSelection({ ...this.#state, - step: 'confirm', + step: connection.connection.kind === 'tangle-sandbox' ? 'workspace' : 'confirm', selectedConnectionId: connection.id, }), ) @@ -236,7 +254,11 @@ export class ConfigurationSession { back(): ConfigurationSessionState { const target = - this.#state.step === 'confirm' || this.#state.step === 'complete' ? 'connection' : 'profile' + this.#state.step === 'workspace' + ? 'connection' + : this.#state.step === 'confirm' || this.#state.step === 'complete' + ? this.#workspaceTarget() + : 'profile' return this.backTo(target) } @@ -245,10 +267,33 @@ export class ConfigurationSession { if (target === 'connection' && this.#state.selectedProfileId === undefined) { return this.#fail('PROFILE_REQUIRED', 'Choose an AgentProfile before continuing') } + if (target === 'workspace') { + const selectedConnection = this.#selectedConnection() + if (selectedConnection === undefined) { + return this.#fail('CONNECTION_REQUIRED', 'Choose a connection before continuing') + } + if (selectedConnection.connection.kind !== 'tangle-sandbox') { + return this.#fail('CONNECTION_REQUIRED', 'The selected connection has no cloud workspace') + } + } this.#state = clearError(clearSelection({ ...this.#state, step: target })) return this.#state } + submitWorkspace(request: WorkspaceRequest | undefined): ConfigurationSessionState { + this.#assertSelectable() + if (this.#state.step !== 'workspace') { + return this.#fail('CONNECTION_REQUIRED', 'Choose a cloud workspace connection first') + } + try { + this.#workspaceRequest = snapshotWorkspaceRequest(request) + } catch (error) { + return this.#fail('WORKSPACE_INVALID', workspaceRequestErrorMessage(error)) + } + this.#state = clearError({ ...this.#state, step: 'confirm' }) + return this.#state + } + confirm(): ConfigurationSelection { if (this.#state.step === 'complete' && this.#state.selection !== undefined) { return this.#state.selection @@ -290,6 +335,9 @@ export class ConfigurationSession { connection: connection.connection, profileDigest: profile.digest, connectionDigest: this.#connectionRegistry.select({ connectionId }).digest, + ...(this.#workspaceRequest === undefined || connection.connection.kind !== 'tangle-sandbox' + ? {} + : { workspaceRequest: this.#workspaceRequest }), }) return selected } @@ -311,6 +359,17 @@ export class ConfigurationSession { return this.#state } + #selectedConnection(): ConnectionChoice | undefined { + const id = this.#state.selectedConnectionId + return id === undefined ? undefined : this.#connections.find((choice) => choice.id === id) + } + + #workspaceTarget(): ConfigurationBackTarget { + return this.#selectedConnection()?.connection.kind === 'tangle-sandbox' + ? 'workspace' + : 'connection' + } + #assertOpen(): void { if (this.#state.step === 'cancelled') { throw new ConfigurationSessionError( diff --git a/src/app/production-composition.ts b/src/app/production-composition.ts index 07bf7702..11df2d76 100644 --- a/src/app/production-composition.ts +++ b/src/app/production-composition.ts @@ -1,4 +1,4 @@ -import { harnessTypeSchema, type AgentProfile } from '@tangle-network/agent-interface' +import { type AgentProfile, harnessTypeSchema } from '@tangle-network/agent-interface' import { materializeBridgeModelRoute } from '../adapters/connections/cli-bridge-model-route.js' import { nitroVerifiersForConnection } from '../adapters/connections/nitro-confidential-attestation.js' import type { ProductionConnectionOptions } from '../adapters/connections/production-connections.js' @@ -36,6 +36,7 @@ import type { NativeInteractiveExecutionControl } from '../ports/native-interact import { ConnectionError } from './connection-errors.js' import { ConnectionRegistry } from './connections.js' import { assertValidProfile } from './profile-validation.js' +import { snapshotWorkspaceRequest, type WorkspaceRequest } from './workspace-request.js' export type ProductionCompositionErrorCode = | 'PRODUCTION_CONFIGURATION_REQUIRED' @@ -65,6 +66,8 @@ export interface ProductionCompositionConfig { readonly connectionId: string /** Canonical workspace root used by provider environment creation. */ readonly workspaceRoot?: string + /** Provider-neutral remote workspace request. Separate from workspaceRoot. */ + readonly workspaceRequest?: Readonly /** Protected headless SQLite key-file path, absolute or relative to the config directory. */ readonly databaseKeyFile?: string /** Published provider construction options, including credential resolution. */ @@ -186,6 +189,13 @@ export function createProductionComposition( ) } + if (config.workspaceRequest !== undefined && connection.kind !== 'tangle-sandbox') { + throw new ProductionCompositionError( + 'PRODUCTION_CONNECTION_UNSUPPORTED', + 'A provider-neutral workspace request requires a tangle-sandbox connection', + ) + } + const resolverOptionsBase: ProductionBackendResolverOptions = { ...(config.connectionOptions ?? {}), connections, @@ -198,6 +208,7 @@ export function createProductionComposition( }, }), } + snapshotWorkspaceRequest(config.workspaceRequest) const confidential = nitroVerifiersForConnection(connection, resolverOptionsBase) const resolverOptions: ProductionBackendResolverOptions = { ...resolverOptionsBase, @@ -229,7 +240,12 @@ export function createProductionComposition( const requested = recovery.receipt?.requested const admissionSessionId = retainedAdmissionSessionId(recovery.retainedAdmission) const sessionId = providerSessionId ?? admissionSessionId - const workspaceRoot = recovery.workspaceRoot ?? config.workspaceRoot + const workspaceRoot = + recovery.receipt?.requested.workspaceRoot ?? recovery.workspaceRoot ?? config.workspaceRoot + const workspaceRequest = + recovery.receipt === undefined + ? recovery.workspaceRequest + : recovery.receipt.requested.workspaceRequest return { operationId: recovery.receipt?.operationId ?? `recover-${runId}`, runId, @@ -240,6 +256,7 @@ export function createProductionComposition( connectionId: requested?.connectionId ?? connection.id, ...(sessionId === undefined ? {} : { sessionId }), ...(workspaceRoot === undefined ? {} : { workspaceRoot }), + ...(workspaceRequest === undefined ? {} : { workspaceRequest }), signal: signal ?? new AbortController().signal, } } diff --git a/src/app/run-admission-dispatch.ts b/src/app/run-admission-dispatch.ts index 14f51b15..9287c047 100644 --- a/src/app/run-admission-dispatch.ts +++ b/src/app/run-admission-dispatch.ts @@ -1,12 +1,12 @@ +import type { ContextTransferReceipt } from '../domain/receipts.js' +import { activeRunForBranch } from '../domain/state.js' import type { AdmissionPort, AsyncAdmissionPort } from './application-ports.js' import type { SendReceipt } from './application-types.js' -import type { ContextTransferReceipt } from '../domain/receipts.js' import { AppError } from './errors.js' import { admitRun, admitRunAsync } from './run-admission-receipt.js' import { RUN_EFFECT_KIND, runEffectRequest } from './run-admission-request.js' import { validateContextPlan, validateNativeProof } from './run-admission-validation.js' import type { RunExecutionSnapshot } from './run-execution-snapshot.js' -import { activeRunForBranch } from '../domain/state.js' export function sendRun(context: AdmissionPort, input: RunExecutionSnapshot): SendReceipt { const state = context.currentState() @@ -49,6 +49,7 @@ export function sendRun(context: AdmissionPort, input: RunExecutionSnapshot): Se ...(input.mode === undefined ? {} : { mode: input.mode }), ...(input.connectionId === undefined ? {} : { connectionId: input.connectionId }), ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), + ...(input.workspaceRequest === undefined ? {} : { workspaceRequest: input.workspaceRequest }), signal: new AbortController().signal, ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }), ...(input.contextPlan === undefined @@ -144,6 +145,7 @@ export async function sendRunAsync( ...(input.mode === undefined ? {} : { mode: input.mode }), ...(input.connectionId === undefined ? {} : { connectionId: input.connectionId }), ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), + ...(input.workspaceRequest === undefined ? {} : { workspaceRequest: input.workspaceRequest }), signal, ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }), ...(input.contextPlan === undefined diff --git a/src/app/run-admission-receipt.ts b/src/app/run-admission-receipt.ts index eb2443b7..6978c237 100644 --- a/src/app/run-admission-receipt.ts +++ b/src/app/run-admission-receipt.ts @@ -49,6 +49,8 @@ export function admitRun( profile: input.profile, ...(input.connectionId === undefined ? {} : { connectionId: input.connectionId }), ...(input.mode === undefined ? {} : { mode: input.mode }), + ...(input.workspaceRequest === undefined ? {} : { workspaceRequest: input.workspaceRequest }), + ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), interactions, text: input.text, ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }), @@ -101,6 +103,8 @@ export async function admitRunAsync( profile: input.profile, ...(input.connectionId === undefined ? {} : { connectionId: input.connectionId }), ...(input.mode === undefined ? {} : { mode: input.mode }), + ...(input.workspaceRequest === undefined ? {} : { workspaceRequest: input.workspaceRequest }), + ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), interactions, text: input.text, ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }), @@ -143,6 +147,8 @@ export function pendingAdmissionReceipt( profile: input.profile, ...(input.connectionId === undefined ? {} : { connectionId: input.connectionId }), ...(input.mode === undefined ? {} : { mode: input.mode }), + ...(input.workspaceRequest === undefined ? {} : { workspaceRequest: input.workspaceRequest }), + ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), interactions: {}, text: input.text, capabilities: UNKNOWN_RUN_CAPABILITIES, diff --git a/src/app/run-admission-request.ts b/src/app/run-admission-request.ts index cf074a24..66a89224 100644 --- a/src/app/run-admission-request.ts +++ b/src/app/run-admission-request.ts @@ -3,10 +3,12 @@ import { canonicalDigest } from '../domain/canonical.js' import type { PortableContextPlan } from '../domain/receipts.js' import type { ExecuteTurnInput } from '../ports/execution.js' import type { RunExecutionSnapshot } from './run-execution-snapshot.js' +import { snapshotWorkspaceRequest } from './workspace-request.js' export const RUN_EFFECT_KIND = 'run.execute' export function runEffectRequest(input: RunExecutionSnapshot): Readonly> { + const workspaceRequest = snapshotWorkspaceRequest(input.workspaceRequest) return { conversationId: input.conversationId, branchId: input.branchId, @@ -14,6 +16,7 @@ export function runEffectRequest(input: RunExecutionSnapshot): Readonly readonly mode?: string readonly connectionId?: string + /** Provider-neutral remote workspace request. Separate from local workspaceRoot. */ + readonly workspaceRequest?: Readonly readonly workspaceRoot?: string readonly sessionId?: string /** Distinguishes the private linear continuation from caller-supplied reuse. */ @@ -46,7 +49,9 @@ export function snapshotRunExecution( profile: Readonly, connectionId: string | undefined, mode?: string, + workspaceRequest?: WorkspaceRequest, ): RunExecutionSnapshot { + const workspaceSnapshot = snapshotWorkspaceRequest(workspaceRequest) const snapshot = { operationId: input.operationId, text: input.text, @@ -55,6 +60,7 @@ export function snapshotRunExecution( profile: snapshotAgentProfile(profile), ...(mode === undefined ? {} : { mode }), ...(connectionId === undefined ? {} : { connectionId }), + ...(workspaceSnapshot === undefined ? {} : { workspaceRequest: workspaceSnapshot }), ...(state.workspace === null ? {} : { workspaceRoot: state.workspace }), ...(input.sessionId === undefined ? (() => { diff --git a/src/app/run-execution.ts b/src/app/run-execution.ts index bfa71aa0..49e30b03 100644 --- a/src/app/run-execution.ts +++ b/src/app/run-execution.ts @@ -26,7 +26,12 @@ export async function executeRun( ...(input.mode === undefined ? {} : { mode: input.mode }), interactions: admission.requested.interactions ?? {}, ...(input.connectionId === undefined ? {} : { connectionId: input.connectionId }), - ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), + ...(admission.requested.workspaceRequest === undefined + ? {} + : { workspaceRequest: admission.requested.workspaceRequest }), + ...(admission.requested.workspaceRoot === undefined + ? {} + : { workspaceRoot: admission.requested.workspaceRoot }), signal: abort.signal, ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }), ...(currentRun?.lastCursor === undefined ? {} : { after: currentRun.lastCursor }), diff --git a/src/app/run-recovery-context.ts b/src/app/run-recovery-context.ts index 6038f88b..c9f32517 100644 --- a/src/app/run-recovery-context.ts +++ b/src/app/run-recovery-context.ts @@ -11,6 +11,13 @@ export function retainedExecutionRecoveryContext( ? {} : { retainedAdmission: structuredClone(run.retainedAdmission) }), receipt: structuredClone(run.receipt), - ...(workspaceRoot === null ? {} : { workspaceRoot }), + ...(run.receipt.requested.workspaceRequest === undefined + ? {} + : { workspaceRequest: structuredClone(run.receipt.requested.workspaceRequest) }), + ...(run.receipt.requested.workspaceRoot === undefined + ? workspaceRoot === null + ? {} + : { workspaceRoot } + : { workspaceRoot: run.receipt.requested.workspaceRoot }), } } diff --git a/src/app/workspace-request.ts b/src/app/workspace-request.ts new file mode 100644 index 00000000..9175c616 --- /dev/null +++ b/src/app/workspace-request.ts @@ -0,0 +1,7 @@ +export type { WorkspaceRequest } from '../domain/workspace-request.js' +export { + compactWorkspaceRepositoryUrl, + snapshotWorkspaceRequest, + workspaceRequestDigest, + workspaceRequestErrorMessage, +} from '../domain/workspace-request.js' diff --git a/src/bin/interface-runner.ts b/src/bin/interface-runner.ts index d7f7f914..18df2567 100644 --- a/src/bin/interface-runner.ts +++ b/src/bin/interface-runner.ts @@ -111,6 +111,9 @@ export async function runInterface(input: InterfaceRunnerInput): Promise ...(setup.initialProfileId === undefined ? {} : { initialProfileId: setup.initialProfileId }), + ...(setup.workspaceRequest === undefined + ? {} + : { workspaceRequest: setup.workspaceRequest }), diagnostics: setup.diagnostics, openOnStart: true, requiresCredential: (connection) => diff --git a/src/bin/production-application.ts b/src/bin/production-application.ts index 28afdb81..64755434 100644 --- a/src/bin/production-application.ts +++ b/src/bin/production-application.ts @@ -54,6 +54,9 @@ export function productionConfigForSelection( connections: productionConnectionsForSelection(selection, connections), connectionId: selection.connection.id, workspaceRoot: resolve(options.workspace), + ...(selection.workspaceRequest === undefined + ? {} + : { workspaceRequest: selection.workspaceRequest }), ...(options.databaseKeyFile === undefined ? {} : { databaseKeyFile: options.databaseKeyFile }), ...(Object.keys(connectionOptions).length === 0 ? {} : { connectionOptions }), } diff --git a/src/bin/production-setup-discovery.ts b/src/bin/production-setup-discovery.ts index ec9d5597..d6a47cd7 100644 --- a/src/bin/production-setup-discovery.ts +++ b/src/bin/production-setup-discovery.ts @@ -7,6 +7,7 @@ import { DEFAULT_TANGLE_SANDBOX_ENDPOINT } from '../adapters/connections/product import type { ProductionCompositionConfig } from '../app/production-composition.js' import type { ProfileRecord } from '../app/profile-types.js' import { discoverProfiles } from '../app/profiles.js' +import { snapshotWorkspaceRequest } from '../app/workspace-request.js' import type { ConnectionRecord } from '../domain/entities.js' import { createConnectionId } from '../domain/ids.js' import { productionActiveProfile } from './production-active-profile.js' @@ -130,6 +131,7 @@ export async function loadProductionSetup( ]) const profiles = projectSetupProfiles(options, endpoint, bridge.models, discovered) const now = new Date().toISOString() + const workspaceRequest = snapshotWorkspaceRequest(options.workspaceRequest) return { configPath, profiles: profiles.profiles, @@ -142,6 +144,7 @@ export async function loadProductionSetup( ...(profiles.initialProfileId === undefined ? {} : { initialProfileId: profiles.initialProfileId }), + ...(workspaceRequest === undefined ? {} : { workspaceRequest }), verification: { status: 'unverified', detail: diff --git a/src/bin/production-setup-persistence.ts b/src/bin/production-setup-persistence.ts index 6aa9b001..855a7d28 100644 --- a/src/bin/production-setup-persistence.ts +++ b/src/bin/production-setup-persistence.ts @@ -15,6 +15,7 @@ import { } from '../adapters/persistence/safe-file.js' import type { ConfigurationSelection } from '../app/configuration-session.js' import { ConnectionRegistry } from '../app/connections.js' +import { snapshotWorkspaceRequest } from '../app/workspace-request.js' import type { ConnectionRecord } from '../domain/entities.js' import { assertProductionConfigMutationLock, @@ -213,6 +214,9 @@ function serializedSelection( profile: persistableProductionProfile(selection.profile.profile), connectionId: selection.connection.id, connections: productionConnectionsForSelection(selection, connections), + ...(selection.workspaceRequest === undefined + ? {} + : { workspaceRequest: snapshotWorkspaceRequest(selection.workspaceRequest) }), ...(databaseKeyFile === undefined ? {} : { databaseKeyFile }), })}\n` } diff --git a/src/bin/production-setup-types.ts b/src/bin/production-setup-types.ts index 32af8a99..ef5d363c 100644 --- a/src/bin/production-setup-types.ts +++ b/src/bin/production-setup-types.ts @@ -1,3 +1,4 @@ +import type { WorkspaceRequest } from '@tangle-network/agent-interface' import type { ProductionConnectionOptions } from '../adapters/connections/production-connections.js' import type { ProfileRecord } from '../app/profile-types.js' import type { ConnectionRecord } from '../domain/entities.js' @@ -6,6 +7,8 @@ import type { ProductionCredentialContext } from './production-credential-contex export interface ProductionStartupLoadOptions { readonly workspace: string + /** Provider-neutral cloud workspace request. It is never copied into a connection record. */ + readonly workspaceRequest?: WorkspaceRequest readonly configPath?: string readonly profileReference?: string readonly connectionId?: string @@ -44,5 +47,7 @@ export interface ProductionStartupSetup { readonly connections: readonly ConnectionRecord[] readonly diagnostics: readonly string[] readonly initialProfileId?: ProfileRecord['id'] + /** Request shown in setup review when the selected provider supports cloud workspaces. */ + readonly workspaceRequest?: Readonly readonly verification: ProductionSetupVerification } diff --git a/src/bin/production-setup-validation.ts b/src/bin/production-setup-validation.ts index 69181d22..6351a0b1 100644 --- a/src/bin/production-setup-validation.ts +++ b/src/bin/production-setup-validation.ts @@ -8,6 +8,7 @@ import type { ConfigurationEffectiveValues, ConfigurationSelection, } from '../app/configuration-session.js' +import { compactWorkspaceRepositoryUrl } from '../app/workspace-request.js' import { DEFAULT_MODEL_VALIDATION_TIMEOUT_MS, displayBridgeEndpoint, @@ -196,7 +197,10 @@ export function describeProductionSelection( runner, model, effort, - workdir: 'provider-selected sandbox workdir', + workdir: selection.workspaceRequest?.cwd ?? 'provider-selected sandbox workdir', + ...(selection.workspaceRequest === undefined + ? {} + : { workspaceRequest: workspaceSummary(selection.workspaceRequest) }), verification: `${verification.status}: ${verification.detail}`, unsupported, } @@ -211,3 +215,18 @@ export function describeProductionSelection( unsupported, } } + +function workspaceSummary( + request: ConfigurationSelection['workspaceRequest'], +): NonNullable { + if (request === undefined) return {} + const repoUrl = + request.repoUrl === undefined ? undefined : compactWorkspaceRepositoryUrl(request.repoUrl) + return { + ...(request.environment === undefined ? {} : { environment: request.environment }), + ...(request.image === undefined ? {} : { image: request.image }), + ...(repoUrl === undefined ? {} : { repoUrl }), + ...(request.gitRef === undefined ? {} : { gitRef: request.gitRef }), + ...(request.cwd === undefined ? {} : { cwd: request.cwd }), + } +} diff --git a/src/bin/production-startup.ts b/src/bin/production-startup.ts index 8a80c025..38101dc2 100644 --- a/src/bin/production-startup.ts +++ b/src/bin/production-startup.ts @@ -15,6 +15,7 @@ import { readProfileFile, validateProfileShape, } from '../app/profiles.js' +import { snapshotWorkspaceRequest, type WorkspaceRequest } from '../app/workspace-request.js' import type { ConnectionRecord } from '../domain/entities.js' import { redactProviderError } from '../domain/redaction.js' import { recoverPendingConnectionCredentialRemoval } from './production-connection-credential-cleanup.js' @@ -115,6 +116,7 @@ export interface ProductionStartupDocument { readonly connectionId?: string readonly databaseKeyFile?: string readonly connections?: readonly unknown[] + readonly workspaceRequest?: Readonly } function isRecord(value: unknown): value is Record { @@ -184,6 +186,18 @@ function parseConfig(bytes: Buffer, path: string): ProductionStartupDocument { 'Production configuration connections must be an array', ) } + let workspaceRequest: Readonly | undefined + if (parsed.workspaceRequest !== undefined) { + try { + workspaceRequest = snapshotWorkspaceRequest(parsed.workspaceRequest as WorkspaceRequest) + } catch (error) { + throw new ProductionStartupError( + 'PRODUCTION_CONFIGURATION_INVALID', + 'Production configuration workspaceRequest is invalid or contains unsafe URL data', + error, + ) + } + } return { schemaVersion, ...(parsed.profile === undefined ? {} : { profile: parsed.profile }), @@ -197,6 +211,7 @@ function parseConfig(bytes: Buffer, path: string): ProductionStartupDocument { ? {} : { databaseKeyFile: requiredStringValue(parsed.databaseKeyFile, 'databaseKeyFile') }), ...(connections === undefined ? {} : { connections }), + ...(workspaceRequest === undefined ? {} : { workspaceRequest }), } } @@ -419,10 +434,23 @@ export async function loadProductionStartup( ? {} : { bridgeModelCredential: options.bridgeModelCredential }), } + let workspaceRequest: Readonly | undefined + try { + workspaceRequest = snapshotWorkspaceRequest( + options.workspaceRequest ?? document.workspaceRequest, + ) + } catch (error) { + throw new ProductionStartupError( + 'PRODUCTION_CONFIGURATION_INVALID', + 'Production startup workspaceRequest is invalid or contains unsafe URL data', + error, + ) + } return { profile, connections, connectionId: selectedConnectionId, + ...(workspaceRequest === undefined ? {} : { workspaceRequest }), ...(databaseKeyFile === undefined ? {} : { databaseKeyFile }), ...(Object.keys(connectionOptions).length === 0 ? {} : { connectionOptions }), } diff --git a/src/domain/invariants-base.ts b/src/domain/invariants-base.ts index 857bedf7..022800be 100644 --- a/src/domain/invariants-base.ts +++ b/src/domain/invariants-base.ts @@ -1,3 +1,4 @@ +import { isIP } from 'node:net' import type { JsonValue } from './entities.js' import type { IdKind } from './ids.js' import { isDigestValue, isId, isReplayCursor } from './ids.js' @@ -66,6 +67,119 @@ export function assertPublicReference(value: string, name: string): void { } } +/** Validate a public URL without resolving DNS names. */ +export function assertPublicUrl( + value: string, + name: string, + options: Readonly<{ + readonly protocols?: readonly string[] + readonly rejectQuery?: boolean + readonly rejectFragment?: boolean + readonly rejectPrivateHost?: boolean + }> = {}, +): void { + assertPublicReference(value, name) + let url: URL + try { + url = new URL(value) + } catch { + fail(`${name} must be a valid URL`) + } + const protocols = options.protocols ?? ['https:'] + if (!protocols.includes(url.protocol)) { + fail(`${name} must use an allowed URL protocol`) + } + if (options.rejectQuery === true && url.search !== '') { + fail(`${name} must not contain query data`) + } + if (options.rejectFragment === true && url.hash !== '') { + fail(`${name} must not contain fragment data`) + } + if (options.rejectPrivateHost !== false && isPrivateHost(url.hostname)) { + fail(`${name} must use a public hostname`) + } +} + +function isPrivateHost(hostname: string): boolean { + const normalized = hostname + .toLowerCase() + .replace(/^\[/u, '') + .replace(/\]$/u, '') + .replace(/\.$/u, '') + if ( + normalized === 'localhost' || + normalized.endsWith('.localhost') || + normalized.endsWith('.local') + ) { + return true + } + const version = isIP(normalized) + if (version === 4) return isPrivateIpv4(normalized) + if (version === 6) return isPrivateIpv6(normalized) + return false +} + +function isPrivateIpv4(value: string): boolean { + const octets = value.split('.').map(Number) + if ( + octets.length !== 4 || + octets.some((octet) => !Number.isInteger(octet) || octet < 0 || octet > 255) + ) { + return false + } + const first = octets[0] ?? -1 + const second = octets[1] ?? -1 + const third = octets[2] ?? -1 + return ( + first === 0 || + first === 10 || + first === 127 || + (first === 100 && second >= 64 && second <= 127) || + (first === 169 && second === 254) || + (first === 172 && second >= 16 && second <= 31) || + (first === 192 && second === 0 && third === 0) || + (first === 192 && second === 0 && third === 2) || + (first === 192 && second === 31 && third === 196) || + (first === 192 && second === 52 && third === 193) || + (first === 192 && second === 88 && third === 99) || + (first === 192 && second === 168) || + (first === 192 && second === 175 && third === 48) || + (first === 198 && second >= 18 && second <= 19) || + (first === 198 && second === 51 && third === 100) || + (first === 203 && second === 0 && third === 113) || + first >= 224 + ) +} + +function isPrivateIpv6(value: string): boolean { + const first = Number.parseInt(value.split(':')[0] || '0', 16) + if (!Number.isFinite(first)) return true + if (value === '::' || value === '::1') return true + if (first >= 0xfc00 && first <= 0xfdff) return true + if (first >= 0xfe80 && first <= 0xfebf) return true + if (first >= 0xff00) return true + if (value.startsWith('2001:db8:') || value === '2001:db8') return true + const mapped = mappedIpv4(value) + if (mapped !== undefined) return isPrivateIpv4(mapped) + return false +} + +function mappedIpv4(value: string): string | undefined { + const marker = value.indexOf('::') + const left = (marker < 0 ? value : value.slice(0, marker)).split(':').filter(Boolean) + const right = (marker < 0 ? '' : value.slice(marker + 2)).split(':').filter(Boolean) + const expanded = [ + ...left, + ...(marker < 0 ? [] : Array(8 - left.length - right.length).fill('0')), + ...right, + ] + if (expanded.length !== 8 || expanded[5]?.toLowerCase() !== 'ffff') return undefined + const high = Number.parseInt(expanded[6] ?? '', 16) + const low = Number.parseInt(expanded[7] ?? '', 16) + if (!Number.isInteger(high) || !Number.isInteger(low) || high < 0 || low < 0) return undefined + return [high >> 8, high & 0xff, low >> 8, low & 0xff].join('.') +} + export class DomainInvariantError extends Error { readonly code = 'DOMAIN_INVARIANT' diff --git a/src/domain/receipts.ts b/src/domain/receipts.ts index 54c4633f..56c28690 100644 --- a/src/domain/receipts.ts +++ b/src/domain/receipts.ts @@ -16,6 +16,7 @@ import type { RunAdmissionReceipt, RunCapabilities, } from './run-contracts.js' +import { snapshotWorkspaceRequest, type WorkspaceRequest } from './workspace-request.js' export type { ContextTransferReceipt, @@ -123,6 +124,8 @@ export function createAdmissionReceipt(input: { readonly profile: Readonly readonly connectionId?: string readonly mode?: string + readonly workspaceRequest?: WorkspaceRequest + readonly workspaceRoot?: string readonly interactions?: RequestedInteractions readonly text: string readonly sessionId?: string @@ -153,11 +156,14 @@ export function createAdmissionReceipt(input: { : publicMaterializationReceipt(input.materializationReceipt) const warnings = boundedWarnings(input.warnings) const contextPlanDigest = input.contextPlanDigest ?? input.contextTransfer?.planDigest + const workspaceRequest = snapshotWorkspaceRequest(input.workspaceRequest) const requested = { text, profile: structuredClone(profile), ...(input.connectionId === undefined ? {} : { connectionId: input.connectionId }), ...(input.mode === undefined ? {} : { mode: input.mode }), + ...(workspaceRequest === undefined ? {} : { workspaceRequest }), + ...(input.workspaceRoot === undefined ? {} : { workspaceRoot: input.workspaceRoot }), ...(input.interactions === undefined ? {} : { interactions: input.interactions }), ...(profile.model?.default === undefined ? {} : { model: profile.model.default }), ...(profile.harness === undefined ? {} : { runner: profile.harness }), @@ -173,6 +179,8 @@ export function createAdmissionReceipt(input: { profileDigest, connectionId: input.connectionId ?? null, mode: input.mode ?? null, + workspaceRequest: workspaceRequest ?? null, + workspaceRoot: input.workspaceRoot ?? null, interactions: input.interactions ?? {}, contextPlanDigest: contextPlanDigest ?? null, }) diff --git a/src/domain/run-contracts.ts b/src/domain/run-contracts.ts index 2529b92e..69c9e4df 100644 --- a/src/domain/run-contracts.ts +++ b/src/domain/run-contracts.ts @@ -3,6 +3,7 @@ import type { AgentProfile, NativeContextBoundaryProof, RequestedInteractions, + WorkspaceRequest, } from '@tangle-network/agent-interface' import type { RetainedInteractiveAdmission, @@ -136,6 +137,9 @@ export interface RunAdmissionReceipt { readonly profile: Readonly readonly connectionId?: string readonly mode?: string + readonly workspaceRequest?: Readonly + /** Local Braid checkout root captured with the admission request. */ + readonly workspaceRoot?: string readonly interactions?: RequestedInteractions readonly model?: string readonly runner?: string diff --git a/src/domain/workspace-request.ts b/src/domain/workspace-request.ts new file mode 100644 index 00000000..3fe940c9 --- /dev/null +++ b/src/domain/workspace-request.ts @@ -0,0 +1,98 @@ +import { type WorkspaceRequest, WorkspaceRequestSchema } from '@tangle-network/agent-interface' +import { canonicalDigest } from './canonical.js' +import { assertPublicUrl } from './invariants-base.js' + +export type { WorkspaceRequest } + +/** Validate and snapshot the canonical provider-neutral workspace request. */ +export function snapshotWorkspaceRequest( + request: WorkspaceRequest | undefined, +): Readonly | undefined { + if (request === undefined) return undefined + const parsed = WorkspaceRequestSchema.parse(structuredClone(request)) + if (parsed.providerOptions !== undefined && Object.keys(parsed.providerOptions).length > 0) { + throw new Error( + 'Workspace providerOptions are not persisted; use a provider credential reference', + ) + } + if ( + parsed.environment === undefined && + parsed.image === undefined && + parsed.repoUrl === undefined && + parsed.gitRef === undefined && + parsed.cwd === undefined + ) + return undefined + if (parsed.repoUrl !== undefined) { + assertPublicUrl(parsed.repoUrl, 'Workspace repoUrl', { + rejectQuery: true, + rejectFragment: true, + }) + } + const snapshot: WorkspaceRequest = { + ...(parsed.environment === undefined ? {} : { environment: parsed.environment }), + ...(parsed.image === undefined ? {} : { image: parsed.image }), + ...(parsed.repoUrl === undefined ? {} : { repoUrl: parsed.repoUrl }), + ...(parsed.gitRef === undefined ? {} : { gitRef: parsed.gitRef }), + ...(parsed.cwd === undefined ? {} : { cwd: parsed.cwd }), + } + return freezeDeep(snapshot) +} + +/** Return the exact canonical identity of a workspace request. */ +export function workspaceRequestDigest(request: WorkspaceRequest | undefined): string | undefined { + const snapshot = snapshotWorkspaceRequest(request) + return snapshot === undefined ? undefined : canonicalDigest(snapshot) +} + +/** Return one bounded validation message without echoing untrusted input. */ +export function workspaceRequestErrorMessage(error: unknown): string { + const message = error instanceof Error ? error.message : '' + if (/gitRef requires repoUrl/iu.test(message)) return 'gitRef requires repoUrl' + if ( + /Workspace repoUrl must use HTTPS|Workspace repoUrl must use an allowed URL protocol/iu.test( + message, + ) + ) + return 'repoUrl must use HTTPS' + if ( + /Workspace repoUrl (?:must not contain credentials|cannot contain credential material|cannot contain URL credentials|cannot contain credential-bearing query parameters)/iu.test( + message, + ) + ) { + return 'repoUrl must not contain credentials' + } + if (/Workspace repoUrl must not contain query data/iu.test(message)) { + return 'repoUrl must not contain query data' + } + if (/Workspace repoUrl must not contain fragment data/iu.test(message)) { + return 'repoUrl must not contain fragment data' + } + if (/Workspace repoUrl must use a public hostname/iu.test(message)) { + return 'repoUrl must use a public hostname' + } + if (/providerOptions are not persisted/iu.test(message)) { + return 'providerOptions are not persisted' + } + if (/must be a valid URL|Invalid URL/iu.test(message)) return 'repoUrl must be a valid URL' + return 'workspace request invalid' +} + +/** Display only the non-secret origin and path of a repository URL. */ +export function compactWorkspaceRepositoryUrl(value: string | undefined): string | undefined { + if (value === undefined) return undefined + try { + const parsed = new URL(value) + return `${parsed.origin}${parsed.pathname === '/' ? '' : parsed.pathname}` + } catch { + return undefined + } +} + +function freezeDeep(value: T): T { + if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) { + for (const child of Object.values(value)) freezeDeep(child) + Object.freeze(value) + } + return value +} diff --git a/src/ports/execution.ts b/src/ports/execution.ts index ba19c1d6..09cf8593 100644 --- a/src/ports/execution.ts +++ b/src/ports/execution.ts @@ -11,6 +11,7 @@ import type { NativeContextBoundaryProof, PortableContextPlanRequest, PortableContextPlanResult, + WorkspaceRequest, } from '@tangle-network/agent-interface' import type { TurnUsage } from '../domain/entities.js' import type { RunAdmissionReceipt } from '../domain/receipts.js' @@ -35,6 +36,8 @@ export interface ExecuteTurnInput { /** Exact per-turn interaction posture derived from admitted capabilities. */ readonly interactions?: RequestedInteractions readonly connectionId?: string + /** Provider-neutral remote workspace request. Separate from local workspaceRoot. */ + readonly workspaceRequest?: Readonly readonly workspaceRoot?: string readonly signal: AbortSignal readonly sessionId?: string @@ -90,6 +93,8 @@ export interface ProviderRunSnapshot { export interface RetainedExecutionRecoveryContext { readonly retainedAdmission?: RetainedRunAdmissionRecord readonly receipt?: RunAdmissionReceipt + /** Receipt-bound remote workspace request; absent on legacy receipts. */ + readonly workspaceRequest?: Readonly readonly workspaceRoot?: string } diff --git a/src/startup/durable-runtime.ts b/src/startup/durable-runtime.ts index 4cd4eb8e..4dc46c0f 100644 --- a/src/startup/durable-runtime.ts +++ b/src/startup/durable-runtime.ts @@ -145,6 +145,9 @@ export async function createDurableBraidApplication( } const app = new BraidApplication({ profile: options.profile ?? productionConfig?.profile ?? STARTER_PROFILE, + ...(productionConfig?.workspaceRequest === undefined + ? {} + : { workspaceRequest: productionConfig.workspaceRequest }), execution: options.execution ?? production?.execution ?? diff --git a/src/views/tui/configuration-wizard-presentation.ts b/src/views/tui/configuration-wizard-presentation.ts index 02b8d977..75d46d24 100644 --- a/src/views/tui/configuration-wizard-presentation.ts +++ b/src/views/tui/configuration-wizard-presentation.ts @@ -1,4 +1,5 @@ import type { SelectItem } from '@earendil-works/pi-tui' +import type { WorkspaceRequest } from '@tangle-network/agent-interface' import type { ConfigurationEffectiveValues, ConfigurationSelection, @@ -10,6 +11,7 @@ import { shortDigest } from './configuration-presenters.js' export const BACK_TO_PROFILE = '__braid_back_profile__' export const BACK_TO_CONNECTION = '__braid_back_connection__' +export const BACK_TO_WORKSPACE = '__braid_back_workspace__' export const APPLY_SELECTION = '__braid_apply_selection__' export const CANCEL_CONFIGURATION = '__braid_cancel_configuration__' export const DOWN_ARROW = '\u001b[B' @@ -25,6 +27,8 @@ export function configurationTitle( return 'profile · choose an AgentProfile' case 'connection': return 'connection · choose a connection' + case 'workspace': + return 'workspace · choose remote files' case 'confirm': return 'review and start' case 'complete': @@ -37,11 +41,14 @@ export function configurationTitle( export function configurationExplanation(state: ConfigurationSessionState): string { if (state.step === 'profile') return 'Choose the AgentProfile for this run.' if (state.step === 'connection') return 'Choose where this profile should run.' + if (state.step === 'workspace') + return 'Set the repository and working directory for the cloud sandbox.' return 'No changes were made.' } export function configurationFooter(state: ConfigurationSessionState, busy: boolean): string { if (busy) return 'waiting for the selected connection' + if (state.step === 'workspace') return 'tab next · shift-tab back · esc cancel' if (state.step === 'confirm') return 'enter apply · arrows · ←/esc cancel' return 'filter · enter choose · ←/esc cancel' } @@ -98,6 +105,18 @@ export function configurationItems( label: busy ? 'Applying…' : 'Apply and start', description: 'use this profile and connection for Braid', }, + ...(state.step === 'confirm' && state.selectedConnectionId !== undefined + ? state.connections.find((connection) => connection.id === state.selectedConnectionId) + ?.kind === 'tangle-sandbox' + ? [ + { + value: BACK_TO_WORKSPACE, + label: '← change workspace', + description: 'edit repository and working folder', + }, + ] + : [] + : []), { value: BACK_TO_CONNECTION, label: '← change connection', @@ -134,6 +153,7 @@ export function reviewSummary( `profile digest ${shortDigest(selection.profileDigest)} · connection ${selection.connection.kind}`, `runner: ${sanitizeTerminalText(effective.runner)} · model: ${sanitizeTerminalText(effective.model)}`, `effort: ${sanitizeTerminalText(effective.effort)} · workdir: ${sanitizeTerminalText(effective.workdir)}`, + ...workspaceRequestSummary(effective.workspaceRequest), `verification: ${sanitizeTerminalText(effective.verification)}`, `unsupported: ${ effective.unsupported.length > 0 @@ -163,7 +183,8 @@ export function compactReviewSummary( `profile ${profile?.label ?? selection.profile.displayName} → ${connection?.label ?? selection.connection.name}`, `cred ${compactCredentialStatus(selection, credentialPrepared)} · conn ${selection.connection.kind} · digest ${compactDigest(selection.profileDigest)}`, `runner: ${shortValue(effective.runner, 14)} · model: ${shortValue(effective.model, 16)}`, - `effort: ${shortValue(effective.effort, 12)} · cwd: ${shortValue(effective.workdir, 18)}`, + `effort: ${shortValue(effective.effort, 12)} · start in: ${shortValue(effective.workdir, 18)}`, + ...compactWorkspaceRequestSummary(effective.workspaceRequest), `verify: ${shortValue(effective.verification, 18)} · unsupported: ${shortValue(unsupported, 12)}`, ].map(sanitizeTerminalText) } catch { @@ -176,10 +197,10 @@ export function configurationReviewSummaries( state: ConfigurationSessionState, confirmation: ((selection: ConfigurationSelection) => ConfigurationEffectiveValues) | undefined, credentialPrepared: boolean, -): { readonly summary: readonly string[]; readonly compact: readonly string[] } { +): { readonly summary: readonly string[]; readonly compactSummary: readonly string[] } { return { summary: reviewSummary(session, state, confirmation, credentialPrepared), - compact: compactReviewSummary(session, state, confirmation, credentialPrepared), + compactSummary: compactReviewSummary(session, state, confirmation, credentialPrepared), } } @@ -199,7 +220,7 @@ function effectiveValues( selection: ConfigurationSelection, confirmation?: (selection: ConfigurationSelection) => ConfigurationEffectiveValues, ): ConfigurationEffectiveValues { - if (confirmation !== undefined) return confirmation(selection) + if (confirmation !== undefined) return withWorkspaceRequest(selection, confirmation(selection)) const profile = selection.profile.profile return { runner: profile.harness ?? 'provider default', @@ -207,13 +228,65 @@ function effectiveValues( effort: profile.model?.reasoningEffort ?? 'provider default', workdir: selection.connection.kind === 'tangle-sandbox' - ? 'provider-selected sandbox workdir' + ? (selection.workspaceRequest?.cwd ?? 'provider-selected sandbox workdir') : 'workspace-selected workdir', + ...(selection.workspaceRequest === undefined + ? {} + : { + workspaceRequest: selection.workspaceRequest, + }), verification: `${selection.connection.lastHealth.status}: unverified`, unsupported: [], } } +function withWorkspaceRequest( + selection: ConfigurationSelection, + confirmed: ConfigurationEffectiveValues, +): ConfigurationEffectiveValues { + const workspaceRequest = selection.workspaceRequest + if (workspaceRequest === undefined) return confirmed + return { + ...confirmed, + workspaceRequest: { ...(confirmed.workspaceRequest ?? {}), ...workspaceRequest }, + ...(selection.connection.kind === 'tangle-sandbox' && workspaceRequest.cwd !== undefined + ? { workdir: workspaceRequest.cwd } + : {}), + } +} + +function workspaceRequestSummary( + workspace: Readonly | undefined, +): readonly string[] { + if (workspace === undefined) return [] + const values = [ + workspace.environment === undefined ? undefined : `environment ${workspace.environment}`, + workspace.image === undefined ? undefined : `image ${workspace.image}`, + workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, + workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, + workspace.cwd === undefined ? undefined : `start in ${workspace.cwd}`, + ].filter((value): value is string => value !== undefined) + return values.length === 0 + ? ['cloud workspace: provider defaults'] + : [`cloud workspace · ${values.join(' · ')}`] +} + +function compactWorkspaceRequestSummary( + workspace: Readonly | undefined, +): readonly string[] { + if (workspace === undefined) return [] + const values = [ + workspace.environment === undefined ? undefined : `env ${workspace.environment}`, + workspace.image === undefined ? undefined : `image ${workspace.image}`, + workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, + workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, + workspace.cwd === undefined ? undefined : `start in ${workspace.cwd}`, + ].filter((value): value is string => value !== undefined) + return [ + `cloud: ${values.length > 0 ? values.map((value) => shortValue(value, 18)).join(' · ') : 'defaults'}`, + ] +} + function compactDigest(value: string): string { const digest = shortDigest(value).replace(/^sha256:/u, '') return digest.length <= 10 ? digest : `${digest.slice(0, 5)}…${digest.slice(-3)}` diff --git a/src/views/tui/configuration-wizard.ts b/src/views/tui/configuration-wizard.ts index 1f3f024a..a78be9b2 100644 --- a/src/views/tui/configuration-wizard.ts +++ b/src/views/tui/configuration-wizard.ts @@ -1,4 +1,4 @@ -import { Container, type Focusable, Text } from '@earendil-works/pi-tui' +import { Container, type Focusable } from '@earendil-works/pi-tui' import { type ConfigurationEffectiveValues, type ConfigurationSelection, @@ -6,7 +6,6 @@ import { type ConfigurationSessionOptions, type ConfigurationSessionState, } from '../../app/configuration-session.js' -import { sanitizeTerminalText } from '../shared/sanitize.js' import { type ConfigurationCommit, ConfigurationCredential, @@ -14,23 +13,25 @@ import { mountConfigurationCredential, PreparedCredential, } from './configuration-credential.js' -import { ConfigurationReview } from './configuration-review.js' +import type { ConfigurationReview } from './configuration-review.js' import { APPLY_SELECTION, BACK_TO_CONNECTION, BACK_TO_PROFILE, + BACK_TO_WORKSPACE, CANCEL_CONFIGURATION, - configurationExplanation, - configurationFooter, - configurationItems, - configurationReviewSummaries, - configurationTitle, - DOWN_ARROW, } from './configuration-wizard-presentation.js' import { SearchableSelector } from './selector.js' +import { renderConfigurationStage } from './setup-stage-rendering.js' import type { BraidTheme } from './theme.js' +import type { WorkspaceRequestForm } from './workspace-request-form.js' +import { mountWorkspaceRequestForm } from './workspace-request-workflow.js' -type ConfigurationControl = SearchableSelector | ConfigurationReview | ConfigurationCredential +type ConfigurationControl = + | SearchableSelector + | ConfigurationReview + | ConfigurationCredential + | WorkspaceRequestForm export interface ConfigurationWizardOptions extends ConfigurationSessionOptions { readonly theme: BraidTheme @@ -103,73 +104,21 @@ export class ConfigurationWizard extends Container implements Focusable { } #renderStage(state: ConfigurationSessionState): void { - this.clear() - const applied = state.step === 'complete' && !this.#busy && this.#commitError === undefined - const heading = new Text(this.#theme.brand('braid setup'), 1, 0) - this.addChild(heading) - if (state.step !== 'confirm' && state.step !== 'complete') { - this.addChild(new Text(this.#theme.muted(configurationExplanation(state)), 1, 0)) - for (const diagnostic of this.#diagnostics) { - this.addChild( - new Text(this.#theme.warning(`notice · ${sanitizeTerminalText(diagnostic)}`), 1, 0), - ) - } - } - if (this.#commitError !== undefined && state.step !== 'confirm' && state.step !== 'complete') { - this.addChild(new Text(this.#theme.danger(sanitizeTerminalText(this.#commitError)), 1, 0)) - } - if (state.step === 'confirm' || state.step === 'complete') { - const summaries = configurationReviewSummaries( - this.#session, - state, - this.#confirmation, - this.#credential.prepared, - ) - this.#selector = new ConfigurationReview({ - theme: this.#theme, - summary: summaries.summary, - compactSummary: summaries.compact, - title: applied - ? 'selection applied' - : configurationTitle(state, this.#busy, this.#commitError), - ...(this.#commitError === undefined ? {} : { error: this.#commitError }), - items: applied - ? [{ value: CANCEL_CONFIGURATION, label: 'Close', description: '←/esc close' }] - : configurationItems(state, this.#busy, this.#commitError), - onSelect: (item) => this.#select(item.value), - onCancel: () => this.#cancel(), - }) - } else { - this.#selector = new SearchableSelector({ - title: configurationTitle(state, this.#busy, this.#commitError), - items: configurationItems(state, this.#busy, this.#commitError), - maxVisible: 4, - theme: this.#theme, - footer: configurationFooter(state, this.#busy), - onSelect: (item) => this.#select(item.value), - onCancel: () => this.#cancel(), - }) - } - this.#selector.focused = this.#focused - this.#restoreSelection(state) - this.addChild(this.#selector) - this.invalidate() - this.#requestRender?.() - } - - #restoreSelection(state: ConfigurationSessionState): void { - if (!(this.#selector instanceof SearchableSelector)) return - const selectedValue = - state.step === 'profile' - ? state.selectedProfileId - : state.step === 'connection' - ? state.selectedConnectionId - : undefined - if (selectedValue === undefined) return - const index = configurationItems(state, this.#busy, this.#commitError).findIndex( - (item) => item.value === selectedValue, - ) - for (let offset = 0; offset < index; offset += 1) this.#selector.handleInput(DOWN_ARROW) + this.#selector = renderConfigurationStage({ + container: this, + session: this.#session, + state, + theme: this.#theme, + ...(this.#confirmation === undefined ? {} : { confirmation: this.#confirmation }), + credentialPrepared: this.#credential.prepared, + diagnostics: this.#diagnostics, + busy: this.#busy, + ...(this.#commitError === undefined ? {} : { commitError: this.#commitError }), + focused: this.#focused, + onSelect: (value) => this.#select(value), + onCancel: () => this.#cancel(), + ...(this.#requestRender === undefined ? {} : { requestRender: this.#requestRender }), + }) } #select(value: string): void { @@ -203,7 +152,8 @@ export class ConfigurationWizard extends Container implements Focusable { } const next = this.#session.selectConnection(value) this.#commitError = next.error?.message - if ( + if (next.error === undefined && next.step === 'workspace') this.#renderWorkspace() + else if ( next.error === undefined && configurationNeedsCredential(this.#session, this.#requiresCredential) ) @@ -211,6 +161,7 @@ export class ConfigurationWizard extends Container implements Focusable { else this.#renderStage(next) return } + if (state.step === 'workspace') return if (state.step !== 'confirm' && state.step !== 'complete') return if (value === BACK_TO_CONNECTION) { this.#clearCredential() @@ -218,6 +169,13 @@ export class ConfigurationWizard extends Container implements Focusable { this.#renderStage(this.#session.backTo('connection')) return } + if (value === BACK_TO_WORKSPACE) { + this.#clearCredential() + this.#commitError = undefined + this.#session.backTo('workspace') + this.#renderWorkspace() + return + } if (value === BACK_TO_PROFILE) { this.#clearCredential() this.#commitError = undefined @@ -292,6 +250,36 @@ export class ConfigurationWizard extends Container implements Focusable { }) } + #renderWorkspace(): void { + this.clear() + this.#selector = mountWorkspaceRequestForm({ + session: this.#session, + theme: this.#theme, + focused: this.#focused, + ...(this.#requestRender === undefined ? {} : { requestRender: this.#requestRender }), + ...(this.#requiresCredential === undefined + ? {} + : { requiresCredential: this.#requiresCredential }), + onInvalid: (next) => { + this.#commitError = next.error?.message + this.#renderWorkspace() + }, + onCredential: (next) => this.#renderCredential(next), + onComplete: (next) => { + this.#commitError = undefined + this.#renderStage(next) + }, + onCancel: () => { + this.#commitError = undefined + this.#renderStage(this.#session.backTo('connection')) + }, + }) + this.#selector.focused = this.#focused + this.addChild(this.#selector) + this.invalidate() + this.#requestRender?.() + } + #clearCredential(): void { this.#credential.clear() if (this.#selector instanceof ConfigurationCredential) this.#selector.dispose() diff --git a/src/views/tui/setup-stage-rendering.ts b/src/views/tui/setup-stage-rendering.ts new file mode 100644 index 00000000..977f9472 --- /dev/null +++ b/src/views/tui/setup-stage-rendering.ts @@ -0,0 +1,109 @@ +import { type Container, Text } from '@earendil-works/pi-tui' +import type { + ConfigurationEffectiveValues, + ConfigurationSelection, + ConfigurationSession, + ConfigurationSessionState, +} from '../../app/configuration-session.js' +import { sanitizeTerminalText } from '../shared/sanitize.js' +import { ConfigurationReview } from './configuration-review.js' +import { + CANCEL_CONFIGURATION, + configurationExplanation, + configurationFooter, + configurationItems, + configurationReviewSummaries, + configurationTitle, + DOWN_ARROW, +} from './configuration-wizard-presentation.js' +import { SearchableSelector } from './selector.js' +import type { BraidTheme } from './theme.js' + +export type ConfigurationStageControl = SearchableSelector | ConfigurationReview + +export interface ConfigurationStageOptions { + readonly container: Container + readonly session: ConfigurationSession + readonly state: ConfigurationSessionState + readonly theme: BraidTheme + readonly confirmation?: (selection: ConfigurationSelection) => ConfigurationEffectiveValues + readonly credentialPrepared: boolean + readonly diagnostics: readonly string[] + readonly busy: boolean + readonly commitError?: string + readonly focused: boolean + readonly onSelect: (value: string) => void + readonly onCancel: () => void + readonly requestRender?: () => void +} + +export function renderConfigurationStage( + options: ConfigurationStageOptions, +): ConfigurationStageControl { + const { container, state, theme, busy, commitError, focused, onSelect, onCancel } = options + container.clear() + const applied = state.step === 'complete' && !busy && commitError === undefined + container.addChild(new Text(theme.brand('braid setup'), 1, 0)) + if (state.step !== 'confirm' && state.step !== 'complete') { + container.addChild(new Text(theme.muted(configurationExplanation(state)), 1, 0)) + for (const diagnostic of options.diagnostics) + container.addChild( + new Text(theme.warning(`notice · ${sanitizeTerminalText(diagnostic)}`), 1, 0), + ) + } + if (commitError !== undefined && state.step !== 'confirm' && state.step !== 'complete') + container.addChild(new Text(theme.danger(sanitizeTerminalText(commitError)), 1, 0)) + const control: ConfigurationStageControl = + state.step === 'confirm' || state.step === 'complete' + ? new ConfigurationReview({ + theme, + ...configurationReviewSummaries( + options.session, + state, + options.confirmation, + options.credentialPrepared, + ), + title: applied ? 'selection applied' : configurationTitle(state, busy, commitError), + ...(commitError === undefined ? {} : { error: commitError }), + items: applied + ? [{ value: CANCEL_CONFIGURATION, label: 'Close', description: '←/esc close' }] + : configurationItems(state, busy, commitError), + onSelect: (item) => onSelect(item.value), + onCancel, + }) + : new SearchableSelector({ + title: configurationTitle(state, busy, commitError), + items: configurationItems(state, busy, commitError), + maxVisible: 4, + theme, + footer: configurationFooter(state, busy), + onSelect: (item) => onSelect(item.value), + onCancel, + }) + control.focused = focused + restoreSelection(control, state, busy, commitError) + container.addChild(control) + container.invalidate() + options.requestRender?.() + return control +} + +function restoreSelection( + control: ConfigurationStageControl, + state: ConfigurationSessionState, + busy: boolean, + commitError: string | undefined, +): void { + if (!(control instanceof SearchableSelector)) return + const selectedValue = + state.step === 'profile' + ? state.selectedProfileId + : state.step === 'connection' + ? state.selectedConnectionId + : undefined + if (selectedValue === undefined) return + const index = configurationItems(state, busy, commitError).findIndex( + (item) => item.value === selectedValue, + ) + for (let offset = 0; offset < index; offset += 1) control.handleInput(DOWN_ARROW) +} diff --git a/src/views/tui/workspace-request-form.ts b/src/views/tui/workspace-request-form.ts new file mode 100644 index 00000000..de856fd2 --- /dev/null +++ b/src/views/tui/workspace-request-form.ts @@ -0,0 +1,225 @@ +import { + type Component, + Container, + type Focusable, + getKeybindings, + Input, + matchesKey, + Text, + truncateToWidth, + visibleWidth, +} from '@earendil-works/pi-tui' +import type { WorkspaceRequest } from '@tangle-network/agent-interface' +import { + compactWorkspaceRepositoryUrl, + snapshotWorkspaceRequest, + workspaceRequestErrorMessage, +} from '../../app/workspace-request.js' +import { sanitizeTerminalText } from '../shared/sanitize.js' +import type { BraidTheme } from './theme.js' + +type WorkspaceField = 'repoUrl' | 'gitRef' | 'cwd' + +const WORKSPACE_FIELDS: readonly WorkspaceField[] = ['repoUrl', 'gitRef', 'cwd'] +const WORKSPACE_LABELS: Readonly> = { + repoUrl: 'repo url', + gitRef: 'git ref', + cwd: 'start in', +} + +export interface WorkspaceRequestFormOptions { + readonly theme: BraidTheme + readonly initialRequest?: Readonly + readonly onSubmit: (request: Readonly | undefined) => void + readonly onCancel: () => void + readonly requestRender?: () => void +} + +/** Keyboard-first cloud workspace form with no provider-native fields. */ +export class WorkspaceRequestForm extends Container implements Focusable { + readonly #theme: BraidTheme + readonly #onSubmit: WorkspaceRequestFormOptions['onSubmit'] + readonly #onCancel: () => void + readonly #requestRender: (() => void) | undefined + readonly #fixedRequest: Readonly> + readonly #inputs = new Map() + #values: Readonly> + #fieldIndex = 0 + #focused = false + #error: string | undefined + #closed = false + + constructor(options: WorkspaceRequestFormOptions) { + super() + this.#theme = options.theme + this.#onSubmit = options.onSubmit + this.#onCancel = options.onCancel + this.#requestRender = options.requestRender + this.#fixedRequest = Object.freeze({ + ...(options.initialRequest?.environment === undefined + ? {} + : { environment: options.initialRequest.environment }), + ...(options.initialRequest?.image === undefined + ? {} + : { image: options.initialRequest.image }), + }) + this.#values = Object.freeze({ + repoUrl: options.initialRequest?.repoUrl ?? '', + gitRef: options.initialRequest?.gitRef ?? '', + cwd: options.initialRequest?.cwd ?? '', + }) + for (const field of WORKSPACE_FIELDS) { + const input = new Input() + input.setValue(this.#values[field]) + this.#inputs.set(field, input) + } + this.#render() + } + + get focused(): boolean { + return this.#focused + } + + set focused(value: boolean) { + this.#focused = value + this.#syncFocus() + } + + handleInput(data: string): void { + if (this.#closed) return + const keybindings = getKeybindings() + if (keybindings.matches(data, 'tui.select.cancel')) { + this.#cancel() + return + } + if (matchesKey(data, 'shift+tab')) { + if (this.#fieldIndex === 0) this.#cancel() + else { + this.#fieldIndex -= 1 + this.#redraw() + } + return + } + if (keybindings.matches(data, 'tui.input.tab')) { + this.#nextField() + return + } + if (keybindings.matches(data, 'tui.input.submit')) { + this.#nextField() + return + } + const field = WORKSPACE_FIELDS[this.#fieldIndex] + const input = field === undefined ? undefined : this.#inputs.get(field) + if (field === undefined || input === undefined) return + input.handleInput(data) + const value = sanitizeTerminalText(input.getValue()) + if (value !== input.getValue()) input.setValue(value) + this.#values = Object.freeze({ ...this.#values, [field]: value }) + this.#error = undefined + this.invalidate() + this.#requestRender?.() + } + + #nextField(): void { + if (this.#fieldIndex < WORKSPACE_FIELDS.length - 1) { + this.#fieldIndex += 1 + this.#redraw() + return + } + this.#submit() + } + + #submit(): void { + const request = { + ...this.#fixedRequest, + ...(this.#trimmed('repoUrl') === '' ? {} : { repoUrl: this.#trimmed('repoUrl') }), + ...(this.#trimmed('gitRef') === '' ? {} : { gitRef: this.#trimmed('gitRef') }), + ...(this.#trimmed('cwd') === '' ? {} : { cwd: this.#trimmed('cwd') }), + } + try { + this.#onSubmit(snapshotWorkspaceRequest(request)) + } catch (error) { + this.#error = workspaceRequestErrorMessage(error) + this.#fieldIndex = errorFieldIndex(this.#error) + this.#redraw() + } + } + + #trimmed(field: WorkspaceField): string { + return this.#values[field].trim() + } + + #syncFocus(): void { + for (const input of this.#inputs.values()) input.focused = false + if (!this.#focused || this.#closed) return + const field = WORKSPACE_FIELDS[this.#fieldIndex] + if (field !== undefined) { + const input = this.#inputs.get(field) + if (input !== undefined) input.focused = true + } + } + + #render(): void { + this.#syncFocus() + this.clear() + this.addChild(new Text(this.#theme.brand('workspace · cloud sandbox'), 1, 0)) + this.addChild(new Text(this.#theme.muted('blank = provider default'), 1, 0)) + for (const [index, field] of WORKSPACE_FIELDS.entries()) { + this.addChild(new Text(this.#theme.muted(WORKSPACE_LABELS[field]), 1, 0)) + const input = this.#inputs.get(field) + if (input !== undefined) { + if (index === this.#fieldIndex) this.addChild(input) + else this.addChild(new WorkspaceValue(this.#theme, field, this.#values[field])) + } + if (this.#error !== undefined && index === this.#fieldIndex) { + this.addChild(new Text(this.#theme.danger(sanitizeTerminalText(this.#error)), 1, 0)) + } + } + this.addChild(new Text(this.#theme.muted('tab/enter continues · shift-tab · esc'), 1, 0)) + this.invalidate() + } + + #redraw(): void { + this.#render() + this.#requestRender?.() + } + + #cancel(): void { + if (this.#closed) return + this.#closed = true + this.#focused = false + this.#syncFocus() + this.#onCancel() + } +} + +function errorFieldIndex(message: string): number { + if (message.startsWith('repoUrl')) return 0 + if (message.startsWith('gitRef')) return 1 + if (message.startsWith('cwd')) return 2 + return WORKSPACE_FIELDS.length - 1 +} + +class WorkspaceValue implements Component { + readonly #theme: BraidTheme + readonly #field: WorkspaceField + readonly #value: string + + constructor(theme: BraidTheme, field: WorkspaceField, value: string) { + this.#theme = theme + this.#field = field + this.#value = value + } + + invalidate(): void {} + + render(width: number): string[] { + const full = `> ${sanitizeTerminalText(this.#value)}` + if (visibleWidth(full) <= width) return [this.#theme.muted(full)] + const compact = + this.#field === 'repoUrl' + ? (compactWorkspaceRepositoryUrl(this.#value)?.replace(/^https?:\/\//u, '') ?? full) + : full + return [this.#theme.muted(truncateToWidth(`> ${compact}`, Math.max(1, width), '…'))] + } +} diff --git a/src/views/tui/workspace-request-workflow.ts b/src/views/tui/workspace-request-workflow.ts new file mode 100644 index 00000000..5f0fb245 --- /dev/null +++ b/src/views/tui/workspace-request-workflow.ts @@ -0,0 +1,44 @@ +import type { + ConfigurationSelection, + ConfigurationSession, + ConfigurationSessionState, +} from '../../app/configuration-session.js' +import { configurationNeedsCredential } from './configuration-credential.js' +import type { BraidTheme } from './theme.js' +import { WorkspaceRequestForm } from './workspace-request-form.js' + +export interface WorkspaceRequestWorkflowOptions { + readonly session: ConfigurationSession + readonly theme: BraidTheme + readonly focused: boolean + readonly requestRender?: () => void + readonly requiresCredential?: Parameters[1] + readonly onInvalid: (state: ConfigurationSessionState) => void + readonly onCredential: (state: ConfigurationSessionState) => void + readonly onComplete: (state: ConfigurationSessionState) => void + readonly onCancel: () => void +} + +export function mountWorkspaceRequestForm( + options: WorkspaceRequestWorkflowOptions, +): WorkspaceRequestForm { + let initialRequest: ConfigurationSelection['workspaceRequest'] + try { + initialRequest = options.session.previewSelection().workspaceRequest + } catch { + initialRequest = undefined + } + return new WorkspaceRequestForm({ + theme: options.theme, + ...(initialRequest === undefined ? {} : { initialRequest }), + ...(options.requestRender === undefined ? {} : { requestRender: options.requestRender }), + onSubmit: (request) => { + const next = options.session.submitWorkspace(request) + if (next.error !== undefined) options.onInvalid(next) + else if (configurationNeedsCredential(options.session, options.requiresCredential)) + options.onCredential(next) + else options.onComplete(next) + }, + onCancel: options.onCancel, + }) +} diff --git a/test/configuration-credential-flow.test.ts b/test/configuration-credential-flow.test.ts index 4c01505e..6a023ee4 100644 --- a/test/configuration-credential-flow.test.ts +++ b/test/configuration-credential-flow.test.ts @@ -109,6 +109,9 @@ test('Escape from credential input returns to connection choice without committi wizard.focused = true wizard.handleInput('\r') wizard.handleInput('\r') + wizard.handleInput('\r') + wizard.handleInput('\r') + wizard.handleInput('\r') wizard.handleInput('discarded-secret') wizard.handleInput('\u001b') assert.match(wizard.render(80).join('\n'), /choose a connection/u) diff --git a/test/configuration-product-flow.test.ts b/test/configuration-product-flow.test.ts index 8366ebbc..8eba92bb 100644 --- a/test/configuration-product-flow.test.ts +++ b/test/configuration-product-flow.test.ts @@ -274,7 +274,7 @@ test('first-run review keeps exact effective values and credential boundaries le const narrowLines = wizard.render(40) assert.ok(narrowLines.every((line) => visibleWidth(line) <= 40)) assert.match(narrowLines.join('\n'), /runner:/u) - assert.match(narrowLines.join('\n'), /cwd:/u) + assert.match(narrowLines.join('\n'), /start in:/u) assert.match(narrowLines.join('\n'), /cred hidden/u) wizard.handleInput('\r') diff --git a/test/configuration-session.test.ts b/test/configuration-session.test.ts index 8bf974a7..61598ef5 100644 --- a/test/configuration-session.test.ts +++ b/test/configuration-session.test.ts @@ -79,6 +79,12 @@ test('configuration session chooses a profile and connection without persisting session.selectProfile(reviewer.id) assert.equal(session.state.step, 'connection') session.selectConnection(sandbox.id) + assert.equal(session.state.step, 'workspace') + session.submitWorkspace({ + repoUrl: 'https://github.com/acme/repository', + gitRef: 'main', + cwd: '/workspace/src', + }) assert.equal(session.state.step, 'confirm') const selected = session.confirm() @@ -86,11 +92,41 @@ test('configuration session chooses a profile and connection without persisting assert.equal(selected.profile.id, reviewer.id) assert.equal(selected.connection.id, sandbox.id) assert.equal(selected.connection.credentialRef, 'credential-sandbox-ref') + assert.equal(selected.workspaceRequest?.repoUrl, 'https://github.com/acme/repository') + assert.equal(Object.isFrozen(selected.workspaceRequest), true) assert.equal(Object.isFrozen(selected), true) assert.equal('error' in session.state, false) assert.throws(() => session.selectProfile(coder.id), ConfigurationSessionError) }) +test('local and inference connections skip cloud workspace setup', () => { + const record = profileRecord('reviewer', 'openai/gpt-5.6') + const session = new ConfigurationSession({ + profiles: [record], + connections: [ + connection('cli-bridge', 'local-cli'), + connection('tangle-inference', 'inference'), + ], + }) + session.selectProfile(record.id) + session.selectConnection(session.state.connections[0]?.id ?? '') + assert.equal(session.state.step, 'confirm') + const failed = session.submitWorkspace({ cwd: '/workspace' }) + assert.equal(failed.error?.code, 'CONNECTION_REQUIRED') +}) + +test('workspace validation keeps the session open and reports the bounded field error', () => { + const record = profileRecord('reviewer', 'openai/gpt-5.6') + const cloud = connection('tangle-sandbox', 'remote-sandbox') + const session = new ConfigurationSession({ profiles: [record], connections: [cloud] }) + session.selectProfile(record.id) + session.selectConnection(cloud.id) + const failed = session.submitWorkspace({ gitRef: 'main' }) + assert.equal(failed.step, 'workspace') + assert.equal(failed.error?.code, 'WORKSPACE_INVALID') + assert.equal(failed.error?.message, 'gitRef requires repoUrl') +}) + test('configuration session supports back navigation and fails closed on empty catalogs', () => { const session = new ConfigurationSession({ profiles: [], connections: [] }) const profileResult = session.selectProfile('profile-missing') diff --git a/test/configuration-wizard.test.ts b/test/configuration-wizard.test.ts index 314ddeca..cd483712 100644 --- a/test/configuration-wizard.test.ts +++ b/test/configuration-wizard.test.ts @@ -1,6 +1,6 @@ import assert from 'node:assert/strict' import test from 'node:test' -import { TuiMainScreen } from '@earendil-works/pi-tui' +import { TuiMainScreen, visibleWidth } from '@earendil-works/pi-tui' import type { AgentProfile } from '@tangle-network/agent-interface' import { createApplicationUiController } from '../src/adapters/tui/application-ui-controller.js' import { createBraidApplication } from '../src/app/composition.js' @@ -320,9 +320,14 @@ test('mounted first-run setup preserves choices and fits keyboard guidance at na terminal.sendInput('\u001b[B') terminal.sendInput('\r') await terminal.waitForRender() + terminal.sendInput('\r') + terminal.sendInput('\r') + terminal.sendInput('\r') + await terminal.waitForRender() assert.match(frame('confirm'), /reviewer → remote-sandbox/u) assert.doesNotMatch(frame('confirm'), /credential-secret-ref/u) + terminal.sendInput('\u001b[B') terminal.sendInput('\u001b[B') terminal.sendInput('\u001b[B') await terminal.waitForRender() @@ -395,6 +400,71 @@ test('mounted setup exposes apply errors with retry and cancel controls', async } }) +test('cloud workspace setup accepts edits, reports invalid refs, and preserves back navigation', () => { + const record = createProfileRecord( + { + kind: 'inline', + reference: 'test:workspace-form', + label: 'workspace profile', + writable: false, + trusted: true, + }, + makeProfile(), + ) + const cloud = makeConnectionVariant('tangle-sandbox', 'workspace-form-cloud') + const wizard = new ConfigurationWizard({ + theme, + profiles: [record], + connections: [cloud], + onCommit: () => {}, + onComplete: () => {}, + onCancel: () => {}, + }) + wizard.focused = true + wizard.handleInput('\r') + wizard.handleInput('\r') + const initial = wizard.render(40) + assert.match(initial.join('\n'), /workspace · cloud sandbox/u) + assert.match(initial.join('\n'), /blank = provider default/u) + assert.match(initial.join('\n'), /start in/u) + assert.match(initial.join('\n'), /tab\/enter continues/u) + assert.doesNotMatch(initial.join('\n'), /braid setup/u) + assert.ok(initial.every((line) => visibleWidth(line) <= 40)) + + // Submit an invalid ref first. The form keeps the field values and points back to git ref. + wizard.handleInput('\r') + wizard.handleInput('main') + wizard.handleInput('\r') + wizard.handleInput('\r') + const invalidFrame = wizard.render(40) + assert.match(invalidFrame.join('\n'), /gitRef requires repoUrl/u) + assert.ok(invalidFrame.every((line) => visibleWidth(line) <= 40)) + + // Shift-tab returns to the repository field, then the valid request reaches review. + wizard.handleInput('\u001b[Z') + wizard.handleInput('https://github.com/tangle-network/braid') + wizard.handleInput('\t') + wizard.handleInput('\t') + wizard.handleInput('\r') + const review = wizard.render(80).join('\n') + assert.match(review, /cloud workspace/u) + assert.match(review, /github\.com\/tangle-network\/braid/u) + assert.match(review, /ref main/u) + + // The review action returns to the form with edits intact. + wizard.handleInput('\u001b[B') + wizard.handleInput('\r') + const restored = wizard.render(80).join('\n') + assert.match(restored, /github\.com\/tangle-network\/braid/u) + assert.match(restored, /main/u) + wizard.handleInput('\u001b[Z') + assert.match(wizard.render(80).join('\n'), /choose a connection/u) + wizard.handleInput('\r') + assert.match(wizard.render(80).join('\n'), /github\.com\/tangle-network\/braid/u) + wizard.handleInput('\u001b') + assert.match(wizard.render(80).join('\n'), /choose a connection/u) +}) + test('mounted setup redraws when a long asynchronous apply finishes', async () => { const record = createProfileRecord( { diff --git a/test/connections.test.ts b/test/connections.test.ts index 93604f8e..cfa16a72 100644 --- a/test/connections.test.ts +++ b/test/connections.test.ts @@ -427,6 +427,7 @@ test('CLI Bridge and sandbox resolvers expose only supported runtime backend sha canonicalDigest({ kind: 'tangle-sandbox-environment-request', idempotencyKey: 'env-braid-run-connection-test', + workspaceRequest: null, }), ) assert.deepEqual(sandboxBackend.backend.profile, profile()) diff --git a/test/interactive-execution-adapters.test.ts b/test/interactive-execution-adapters.test.ts index 2ac724ce..c9d98f31 100644 --- a/test/interactive-execution-adapters.test.ts +++ b/test/interactive-execution-adapters.test.ts @@ -22,7 +22,10 @@ import { stableProviderId, } from '../src/adapters/runtime/production-backend-common.js' import type { PreparedTangleRetainedConnection } from '../src/adapters/runtime/production-tangle-sandbox-backend.js' -import { assertInteractiveProvider } from '../src/adapters/runtime/tangle-retained-interactive-contract.js' +import { + assertInteractiveProvider, + interactiveEnvironment, +} from '../src/adapters/runtime/tangle-retained-interactive-contract.js' import { TangleRetainedInteractiveExecutionPort } from '../src/adapters/runtime/tangle-retained-interactive-execution.js' import type { RunAdmissionReceipt } from '../src/domain/receipts.js' import type { RuntimeEventEnvelope } from '../src/domain/runtime-events.js' @@ -520,6 +523,22 @@ test('interactive provider admission requires terminal and prompt capabilities', assert.throws(() => assertInteractiveProvider(incomplete), /exact interactive agents/u) }) +test('retained runtime receives the canonical workspace request without a provider cwd shim', () => { + const fixture = interactiveFixture() + const workspaceRequest = { + environment: 'universal', + repoUrl: 'https://github.com/acme/repository', + gitRef: 'main', + cwd: '/workspace/src', + } as const + const prepared = { ...fixture.prepared, workspaceRequest } as PreparedTangleRetainedConnection + + const environment = interactiveEnvironment(prepared, 'run/workspace-request') + + assert.deepEqual(environment.workspace, workspaceRequest) + assert.equal(Object.hasOwn(environment, 'cwd'), false) +}) + test('native interactive admission does not advertise structured responses it cannot route', async () => { const fixture = interactiveFixture() const port = new TangleRetainedInteractiveExecutionPort({ diff --git a/test/production-composition.test.ts b/test/production-composition.test.ts index a35bc1bf..95f41535 100644 --- a/test/production-composition.test.ts +++ b/test/production-composition.test.ts @@ -560,6 +560,70 @@ test('bin startup loads a canonical profile and exact connection from a bounded assert.equal(parseArgs(['--config', configPath], root).config, configPath) }) +test('startup persists the workspace request, reloads it, and preserves legacy absence', async () => { + const root = await mkdtemp(join(tmpdir(), 'braid-production-workspace-request-')) + const configPath = join(root, '.braid', 'config.json') + const profileRecord = createProfileRecord( + { + kind: 'inline', + reference: 'test:workspace-request', + label: 'workspace request profile', + writable: false, + trusted: true, + }, + profile(), + ) + const sandbox = connection('tangle-sandbox', 'workspace-request', 'https://sandbox.test') + const selection = { + profile: profileRecord, + connection: sandbox, + profileDigest: profileRecord.digest, + connectionDigest: + 'sha256:0000000000000000000000000000000000000000000000000000000000000000' as const, + workspaceRequest: { + repoUrl: 'https://github.com/acme/repository', + gitRef: 'main', + cwd: '/workspace/src', + providerOptions: {}, + }, + } + await saveProductionStartupSelection(configPath, selection) + const saved = JSON.parse(await readFile(configPath, 'utf8')) as { + [key: string]: unknown + workspaceRequest?: Record + } + assert.deepEqual(saved.workspaceRequest, { + repoUrl: 'https://github.com/acme/repository', + gitRef: 'main', + cwd: '/workspace/src', + }) + assert.ok(saved.workspaceRequest) + assert.equal('providerOptions' in saved.workspaceRequest, false) + + const restarted = await loadProductionStartup({ workspace: root }) + assert.deepEqual(restarted.workspaceRequest, saved.workspaceRequest) + assert.equal(Object.isFrozen(restarted.workspaceRequest), true) + + const legacy = { ...saved, schemaVersion: 1 } + delete legacy.workspaceRequest + await writeFile(configPath, `${JSON.stringify(legacy)}\n`, { mode: 0o600 }) + const legacyStartup = await loadProductionStartup({ workspace: root }) + assert.equal(legacyStartup.workspaceRequest, undefined) + + await writeFile( + configPath, + `${JSON.stringify({ ...legacy, schemaVersion: 2, workspaceRequest: { gitRef: 'main' } })}\n`, + { mode: 0o600 }, + ) + await assert.rejects( + () => loadProductionStartup({ workspace: root }), + (error: unknown) => + error instanceof ProductionStartupError && + error.code === 'PRODUCTION_CONFIGURATION_INVALID' && + /gitRef requires repoUrl/iu.test(String(error.cause)), + ) +}) + test('CLI routing overrides agree with the canonical profile passed to runtime', async () => { const cases = [ { diff --git a/test/run-interactions.test.ts b/test/run-interactions.test.ts index 2c34c312..212d743a 100644 --- a/test/run-interactions.test.ts +++ b/test/run-interactions.test.ts @@ -135,6 +135,8 @@ test('selected mode survives the snapshot, effect request, receipt, and retry id profileDigest: receipt.profileDigest, connectionId: null, mode: 'plan', + workspaceRequest: null, + workspaceRoot: null, interactions: { plan: true }, contextPlanDigest: null, }), diff --git a/test/workspace-request.test.ts b/test/workspace-request.test.ts new file mode 100644 index 00000000..84a6ef9f --- /dev/null +++ b/test/workspace-request.test.ts @@ -0,0 +1,208 @@ +import assert from 'node:assert/strict' +import test from 'node:test' +import { defineAgentProfile } from '@tangle-network/agent-interface' +import { exactAdmissionRequestDigest } from '../src/app/run-admission-request.js' +import { snapshotRunExecution } from '../src/app/run-execution-snapshot.js' +import { retainedExecutionRecoveryContext } from '../src/app/run-recovery-context.js' +import { + compactWorkspaceRepositoryUrl, + snapshotWorkspaceRequest, + workspaceRequestDigest, + workspaceRequestErrorMessage, +} from '../src/app/workspace-request.js' +import type { RunRecord } from '../src/domain/entities.js' +import { createAdmissionReceipt } from '../src/domain/receipts.js' +import { initialState } from '../src/domain/state.js' +import { DEFAULT_RUN_CAPABILITIES, type ExecuteTurnInput } from '../src/ports/execution.js' + +const validRequest = { + repoUrl: 'https://github.com/acme/repository', + gitRef: 'main', + cwd: '/workspace/src', +} as const + +function thrownMessage(request: unknown): string { + try { + snapshotWorkspaceRequest(request as never) + return '' + } catch (error) { + return workspaceRequestErrorMessage(error) + } +} + +test('workspace requests use the canonical schema and immutable snapshots', () => { + assert.equal(snapshotWorkspaceRequest({}), undefined) + assert.deepEqual(snapshotWorkspaceRequest({ environment: 'universal' }), { + environment: 'universal', + }) + assert.deepEqual(snapshotWorkspaceRequest({ image: 'ubuntu:24.04' }), { + image: 'ubuntu:24.04', + }) + const input = { + ...validRequest, + providerOptions: {}, + } as { repoUrl: string; gitRef: string; cwd: string; providerOptions: Record } + const snapshot = snapshotWorkspaceRequest(input) + const digestBeforeMutation = workspaceRequestDigest(input) + assert.deepEqual(snapshot, validRequest) + assert.equal(Object.isFrozen(snapshot), true) + assert.throws(() => { + ;(snapshot as { cwd: string }).cwd = '/mutated' + }, TypeError) + + input.cwd = '/changed-after-snapshot' + assert.equal(snapshot?.cwd, validRequest.cwd) + assert.equal(digestBeforeMutation, workspaceRequestDigest(snapshot)) +}) + +test('provider options are never persisted, even when the canonical schema accepts them', () => { + assert.equal( + thrownMessage({ ...validRequest, providerOptions: { imagePullSecret: 'secret-ref' } }), + 'providerOptions are not persisted', + ) +}) + +test('canonical workspace validation reports bounded actionable messages', () => { + assert.equal(thrownMessage({ gitRef: 'main' }), 'gitRef requires repoUrl') + assert.equal( + thrownMessage({ repoUrl: 'http://github.com/acme/repository' }), + 'repoUrl must use HTTPS', + ) + assert.equal( + thrownMessage({ repoUrl: 'https://user:password@github.com/acme/repository' }), + 'repoUrl must not contain credentials', + ) + assert.equal( + thrownMessage({ repoUrl: 'https://github.com/acme/repository?token=secret' }), + 'repoUrl must not contain credentials', + ) + assert.equal( + thrownMessage({ repoUrl: 'https://github.com/acme/repository?ref=main' }), + 'repoUrl must not contain query data', + ) + assert.equal( + thrownMessage({ repoUrl: 'https://github.com/acme/repository#main' }), + 'repoUrl must not contain fragment data', + ) + assert.equal( + thrownMessage({ repoUrl: 'https://127.0.0.1/acme/repository' }), + 'repoUrl must use a public hostname', + ) + assert.equal( + thrownMessage({ repoUrl: 'https://[::1]/acme/repository' }), + 'repoUrl must use a public hostname', + ) + assert.equal( + thrownMessage({ repoUrl: 'https://[::ffff:127.0.0.1]/acme/repository' }), + 'repoUrl must use a public hostname', + ) + for (const host of ['192.31.196.1', '192.52.193.1', '192.88.99.1', '192.175.48.1']) { + assert.equal( + thrownMessage({ repoUrl: `https://${host}/acme/repository` }), + 'repoUrl must use a public hostname', + ) + } + assert.equal(thrownMessage({ repoUrl: 'https://github.com/acme/repository' }), '') +}) + +test('workspace display strips URL credentials and query material', () => { + assert.equal( + compactWorkspaceRepositoryUrl( + 'https://user:password@github.com/acme/repository?token=secret#fragment', + ), + 'https://github.com/acme/repository', + ) + assert.equal(compactWorkspaceRepositoryUrl('not a URL'), undefined) +}) + +test('admission binds workspace selection and local root without receipt shadow fields', () => { + const profile = defineAgentProfile({ + name: 'workspace admission', + harness: 'pi', + model: { default: 'openai/gpt-5' }, + }) + const state = { ...initialState(profile), workspace: '/local/repository' } + const snapshot = snapshotRunExecution( + { operationId: 'operation-workspace-admission', text: 'inspect the repository' }, + state, + profile, + 'connection-tangle-sandbox', + undefined, + validRequest, + ) + const workspaceRequest = snapshot.workspaceRequest + assert.ok(workspaceRequest) + const connectionId = 'connection-tangle-sandbox' + const workspaceRoot = '/local/repository' + const input: ExecuteTurnInput = { + operationId: snapshot.operationId, + runId: 'run-workspace-admission', + text: snapshot.text, + profile: snapshot.profile, + connectionId, + workspaceRequest, + workspaceRoot, + signal: new AbortController().signal, + } + const receipt = createAdmissionReceipt({ + runId: input.runId, + turnId: 'turn-workspace-admission', + operationId: input.operationId, + conversationId: snapshot.conversationId, + branchId: snapshot.branchId, + admittedAt: '2026-08-30T00:00:00.000Z', + profile: input.profile, + connectionId, + workspaceRequest, + workspaceRoot, + text: input.text, + capabilities: DEFAULT_RUN_CAPABILITIES, + }) + + assert.deepEqual(receipt.requested.workspaceRequest, validRequest) + assert.equal(receipt.requested.workspaceRoot, workspaceRoot) + assert.equal(Object.hasOwn(receipt, 'workspaceRequest'), false) + assert.equal(Object.hasOwn(receipt, 'workspaceRoot'), false) + const recovered = retainedExecutionRecoveryContext( + { receipt } as unknown as RunRecord, + '/current/repository', + ) + assert.deepEqual(recovered.workspaceRequest, validRequest) + assert.equal(recovered.workspaceRoot, '/local/repository') + + const legacyReceipt = createAdmissionReceipt({ + runId: input.runId, + turnId: 'turn-workspace-legacy', + operationId: input.operationId, + conversationId: snapshot.conversationId, + branchId: snapshot.branchId, + admittedAt: '2026-08-30T00:00:00.000Z', + profile: input.profile, + connectionId: 'connection-tangle-sandbox', + text: input.text, + capabilities: DEFAULT_RUN_CAPABILITIES, + }) + const legacyRecovery = retainedExecutionRecoveryContext( + { receipt: legacyReceipt } as unknown as RunRecord, + '/current/repository', + ) + assert.equal(legacyRecovery.workspaceRequest, undefined) + assert.equal(legacyRecovery.workspaceRoot, '/current/repository') + const digest = exactAdmissionRequestDigest(input, snapshot.conversationId, snapshot.branchId) + assert.notEqual( + digest, + exactAdmissionRequestDigest( + { ...input, workspaceRoot: '/another/local/repository' }, + snapshot.conversationId, + snapshot.branchId, + ), + ) + assert.notEqual( + digest, + exactAdmissionRequestDigest( + { ...input, workspaceRequest: { ...validRequest, cwd: '/workspace/other' } }, + snapshot.conversationId, + snapshot.branchId, + ), + ) +}) From 9445fe86172ba92998181e9d7176ffcc0a2dbffc Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 19:51:12 -0600 Subject: [PATCH 124/136] fix(live): use portable sandbox workspace cwd --- .../tangle-sandbox-braid-interactive.mjs | 1 + .../tangle-sandbox-braid-multirun.mjs | 1 + .../live-required/tangle-workspace-proof.mjs | 1 + scripts/live-required/workspace-request.mjs | 14 ++++++++++++++ test/tangle-live07-wiring.test.mjs | 18 ++++++++++++++++++ 5 files changed, 35 insertions(+) create mode 100644 scripts/live-required/workspace-request.mjs diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index b45f218d..025961d4 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -60,6 +60,7 @@ import { waitForPiTerminalReady, waitForTerminalQuiescence, } from './terminal-quiescence.mjs' +import { workspaceRequestFor } from './workspace-request.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 754e8140..3c28ab1d 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -26,6 +26,7 @@ import { observeRetainedResource, } from './tangle-sandbox-braid-stress.mjs' import { createTerminalOutputTracker, waitForTerminalQuiescence } from './terminal-quiescence.mjs' +import { workspaceRequestFor } from './workspace-request.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index 1bd4d90a..097ec8ca 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -24,6 +24,7 @@ import { } from './contracts.mjs' import { configEvidence, prepareProductionWorkspace } from './headless.mjs' import { DEFAULT_TANGLE_ROUTER_MODEL } from './model-defaults.mjs' +import { workspaceRequestFor } from './workspace-request.mjs' const DEFAULT_REPOSITORY = resolve(dirname(fileURLToPath(import.meta.url)), '../..') const DEFAULT_ENDPOINT = 'https://sandbox.tangle.tools' diff --git a/scripts/live-required/workspace-request.mjs b/scripts/live-required/workspace-request.mjs new file mode 100644 index 00000000..cdc49f0f --- /dev/null +++ b/scripts/live-required/workspace-request.mjs @@ -0,0 +1,14 @@ +const DEFAULT_REPOSITORY = 'https://github.com/tangle-network/braid.git' +const DEFAULT_GIT_REF = 'main' + +// WorkspaceRequest.cwd is portable and resolves from the provider repository root. +// Keep validation in agent-interface so every caller shares one contract. +export const DEFAULT_WORKSPACE_CWD = '.' + +export function workspaceRequestFor(environment = {}) { + return { + repoUrl: environment.BRAID_TANGLE_SANDBOX_REPOSITORY ?? DEFAULT_REPOSITORY, + gitRef: environment.BRAID_TANGLE_SANDBOX_GIT_REF ?? DEFAULT_GIT_REF, + cwd: environment.BRAID_TANGLE_SANDBOX_CWD?.trim() || DEFAULT_WORKSPACE_CWD, + } +} diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index d9d906b7..aac6bf14 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -45,6 +45,10 @@ import { waitForPiTerminalReady, waitForTerminalQuiescence, } from '../scripts/live-required/terminal-quiescence.mjs' +import { + DEFAULT_WORKSPACE_CWD, + workspaceRequestFor, +} from '../scripts/live-required/workspace-request.mjs' const repository = resolve(new URL('../', import.meta.url).pathname) @@ -67,6 +71,20 @@ test('active Tangle Sandbox checks share the current router model default', () = assert.equal(supervisorProfile({}).model.default, expectedProfileModel) }) +test('live Tangle Sandbox proofs request the repository root with a portable cwd', () => { + assert.equal(DEFAULT_WORKSPACE_CWD, '.') + assert.deepEqual(workspaceRequestFor({}), { + repoUrl: 'https://github.com/tangle-network/braid.git', + gitRef: 'main', + cwd: '.', + }) + assert.equal( + workspaceRequestFor({ BRAID_TANGLE_SANDBOX_CWD: 'packages/braid' }).cwd, + 'packages/braid', + ) + assert.equal(workspaceRequestFor({ BRAID_TANGLE_SANDBOX_CWD: ' ' }).cwd, '.') +}) + test('Tangle Sandbox workspace profiles pin model identity separately from connection kind', async () => { const values = interactiveSandboxConfiguration({ BRAID_TANGLE_SANDBOX_CREDENTIAL_REF: 'credential-ref-live-provider-split', From 3962bdb4cac16a7d04b98fb43f4e4c60fcccd8f2 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 20:35:11 -0600 Subject: [PATCH 125/136] chore(deps): update agent-runtime to 0.184.0 --- docs/04-runtime-contracts.md | 2 +- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- pnpm-workspace.yaml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index a1ec28f0..9bd3886d 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -15,7 +15,7 @@ The following published versions were resolved in this worktree, and their insta | Package | Installed version | Braid boundary | | --- | ---: | --- | | [`@tangle-network/agent-interface`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) | `1.9.0` | Canonical profile, capabilities, environment, stream, portable context, native continuation, and interaction contracts | -| [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.182.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | +| [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.184.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | | [`@tangle-network/agent-eval`](https://github.com/tangle-network/agent-eval) | `0.170.0` | Run records, judges, trace analysts, comparisons, and feedback trajectories | | `@tangle-network/agent-provider-cli-bridge` | `0.11.1` | CLI Bridge environment adapter with capability discovery, native retained sessions, bounded terminal results, live streaming, replay, retry-safe turns, retained control, durable interaction response, and explicit cancel | | `@tangle-network/agent-provider-tangle` | `0.14.4` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations | diff --git a/package.json b/package.json index 92724105..96b6dd83 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "@tangle-network/agent-interface": "1.9.0", "@tangle-network/agent-provider-cli-bridge": "0.11.1", "@tangle-network/agent-provider-tangle": "0.14.4", - "@tangle-network/agent-runtime": "0.182.0", + "@tangle-network/agent-runtime": "0.184.0", "@tangle-network/sandbox": "0.34.4", "@tangle-network/tcloud-attestation": "0.1.1", "better-sqlite3-multiple-ciphers": "13.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf817d2d..32747750 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: 0.14.4 version: 0.14.4(@tangle-network/sandbox@0.34.4) '@tangle-network/agent-runtime': - specifier: 0.182.0 - version: 0.182.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4) + specifier: 0.184.0 + version: 0.184.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4) '@tangle-network/sandbox': specifier: 0.34.4 version: 0.34.4 @@ -546,8 +546,8 @@ packages: peerDependencies: '@tangle-network/sandbox': '>=0.34.4 <1.0.0' - '@tangle-network/agent-runtime@0.182.0': - resolution: {integrity: sha512-0uCrvS73+ZFNBJIMhJxCCg1fnmstvf56vjP15GIPFjhlg+WtxjoHWt7TPswqG8ZKH0BPJUnmVAJ2eYaNvzH8ew==} + '@tangle-network/agent-runtime@0.184.0': + resolution: {integrity: sha512-kvkzwne6w5XS8dDbS4emNdBc8x4hQUctM0D43qgcQ5XBEs9x9NolUnmV2GqzSd1VVQSzFVXFeNG0sJY+X9tSag==} engines: {node: '>=22.13.0'} hasBin: true peerDependencies: @@ -1206,7 +1206,7 @@ snapshots: '@tangle-network/agent-interface': 1.9.0 '@tangle-network/sandbox': 0.34.4 - '@tangle-network/agent-runtime@0.182.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4)': + '@tangle-network/agent-runtime@0.184.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4)': dependencies: '@tangle-network/agent-core': 0.9.5 '@tangle-network/agent-eval': 0.170.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 702b56a1..2bfb3aeb 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -11,7 +11,7 @@ allowBuilds: node-pty: true ignoreScripts: false minimumReleaseAgeExclude: - - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0 || 0.178.0 || 0.179.0 || 0.180.0 || 0.182.0' + - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0 || 0.178.0 || 0.179.0 || 0.180.0 || 0.182.0 || 0.184.0' - '@tangle-network/agent-eval@0.143.0 || 0.144.0 || 0.144.1 || 0.144.3 || 0.144.4 || 0.144.6 || 0.144.8 || 0.144.10 || 0.144.11 || 0.144.13 || 0.145.0 || 0.145.1 || 0.145.2 || 0.145.3 || 0.145.9 || 0.145.10 || 0.145.11 || 0.145.14 || 0.145.15 || 0.145.21 || 0.149.0 || 0.163.2 || 0.170.0' - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0 || 1.7.0 || 1.7.1 || 1.8.0 || 1.9.0' - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0 || 10.8.0' From b586514d76d29cc97ab6dde1fd8a700175b06846 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 20:56:37 -0600 Subject: [PATCH 126/136] fix(workspace): describe portable sandbox cwd --- scripts/capture-workspace-request.mjs | 3 +- src/bin/production-setup-validation.ts | 5 ++- src/domain/workspace-request.ts | 6 ++++ .../tui/configuration-wizard-presentation.ts | 8 +++-- src/views/tui/workspace-request-form.ts | 6 ++-- test/configuration-session.test.ts | 7 ++++- test/configuration-wizard.test.ts | 5 +-- test/interactive-execution-adapters.test.ts | 2 +- test/production-composition.test.ts | 4 +-- test/workspace-request.test.ts | 31 +++++++++++++++++-- 10 files changed, 61 insertions(+), 16 deletions(-) diff --git a/scripts/capture-workspace-request.mjs b/scripts/capture-workspace-request.mjs index 2a853b2b..93044d7d 100644 --- a/scripts/capture-workspace-request.mjs +++ b/scripts/capture-workspace-request.mjs @@ -263,7 +263,7 @@ async function fillWorkspace(terminal) { terminal.input('\t') terminal.input('main') terminal.input('\t') - terminal.input('/workspace/src') + terminal.input('src') await terminal.stable('filled workspace form') } @@ -313,6 +313,7 @@ async function captureKeyboardFlow(binary, endpoint) { terminal.input('https://github.com/tangle-network/braid') terminal.input('\t') terminal.input('\t') + terminal.input('src') terminal.input('\r') await terminal.waitForScreen( (screen) => diff --git a/src/bin/production-setup-validation.ts b/src/bin/production-setup-validation.ts index 6351a0b1..ad40f2a3 100644 --- a/src/bin/production-setup-validation.ts +++ b/src/bin/production-setup-validation.ts @@ -197,7 +197,10 @@ export function describeProductionSelection( runner, model, effort, - workdir: selection.workspaceRequest?.cwd ?? 'provider-selected sandbox workdir', + workdir: + selection.workspaceRequest?.cwd === undefined + ? 'repository root (provider default)' + : selection.workspaceRequest.cwd, ...(selection.workspaceRequest === undefined ? {} : { workspaceRequest: workspaceSummary(selection.workspaceRequest) }), diff --git a/src/domain/workspace-request.ts b/src/domain/workspace-request.ts index 3fe940c9..7ee4f055 100644 --- a/src/domain/workspace-request.ts +++ b/src/domain/workspace-request.ts @@ -48,6 +48,12 @@ export function workspaceRequestDigest(request: WorkspaceRequest | undefined): s /** Return one bounded validation message without echoing untrusted input. */ export function workspaceRequestErrorMessage(error: unknown): string { const message = error instanceof Error ? error.message : '' + if ( + /Workspace cwd (?:must be relative|must use POSIX separators|cannot leave the workspace root|cannot contain control characters)/iu.test( + message, + ) + ) + return 'start in must be a repository-relative path' if (/gitRef requires repoUrl/iu.test(message)) return 'gitRef requires repoUrl' if ( /Workspace repoUrl must use HTTPS|Workspace repoUrl must use an allowed URL protocol/iu.test( diff --git a/src/views/tui/configuration-wizard-presentation.ts b/src/views/tui/configuration-wizard-presentation.ts index 75d46d24..35a85eed 100644 --- a/src/views/tui/configuration-wizard-presentation.ts +++ b/src/views/tui/configuration-wizard-presentation.ts @@ -228,7 +228,9 @@ function effectiveValues( effort: profile.model?.reasoningEffort ?? 'provider default', workdir: selection.connection.kind === 'tangle-sandbox' - ? (selection.workspaceRequest?.cwd ?? 'provider-selected sandbox workdir') + ? selection.workspaceRequest?.cwd === undefined + ? 'repository root (provider default)' + : selection.workspaceRequest.cwd : 'workspace-selected workdir', ...(selection.workspaceRequest === undefined ? {} @@ -264,7 +266,7 @@ function workspaceRequestSummary( workspace.image === undefined ? undefined : `image ${workspace.image}`, workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, - workspace.cwd === undefined ? undefined : `start in ${workspace.cwd}`, + workspace.cwd === undefined ? undefined : `start in repo ${workspace.cwd}`, ].filter((value): value is string => value !== undefined) return values.length === 0 ? ['cloud workspace: provider defaults'] @@ -280,7 +282,7 @@ function compactWorkspaceRequestSummary( workspace.image === undefined ? undefined : `image ${workspace.image}`, workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, - workspace.cwd === undefined ? undefined : `start in ${workspace.cwd}`, + workspace.cwd === undefined ? undefined : `start in repo ${workspace.cwd}`, ].filter((value): value is string => value !== undefined) return [ `cloud: ${values.length > 0 ? values.map((value) => shortValue(value, 18)).join(' · ') : 'defaults'}`, diff --git a/src/views/tui/workspace-request-form.ts b/src/views/tui/workspace-request-form.ts index de856fd2..abf0d4c3 100644 --- a/src/views/tui/workspace-request-form.ts +++ b/src/views/tui/workspace-request-form.ts @@ -24,7 +24,7 @@ const WORKSPACE_FIELDS: readonly WorkspaceField[] = ['repoUrl', 'gitRef', 'cwd'] const WORKSPACE_LABELS: Readonly> = { repoUrl: 'repo url', gitRef: 'git ref', - cwd: 'start in', + cwd: 'start in (repo-relative)', } export interface WorkspaceRequestFormOptions { @@ -163,7 +163,7 @@ export class WorkspaceRequestForm extends Container implements Focusable { this.#syncFocus() this.clear() this.addChild(new Text(this.#theme.brand('workspace · cloud sandbox'), 1, 0)) - this.addChild(new Text(this.#theme.muted('blank = provider default'), 1, 0)) + this.addChild(new Text(this.#theme.muted('blank = repository root'), 1, 0)) for (const [index, field] of WORKSPACE_FIELDS.entries()) { this.addChild(new Text(this.#theme.muted(WORKSPACE_LABELS[field]), 1, 0)) const input = this.#inputs.get(field) @@ -196,7 +196,7 @@ export class WorkspaceRequestForm extends Container implements Focusable { function errorFieldIndex(message: string): number { if (message.startsWith('repoUrl')) return 0 if (message.startsWith('gitRef')) return 1 - if (message.startsWith('cwd')) return 2 + if (message.startsWith('cwd') || message.startsWith('start in')) return 2 return WORKSPACE_FIELDS.length - 1 } diff --git a/test/configuration-session.test.ts b/test/configuration-session.test.ts index 61598ef5..34d757bb 100644 --- a/test/configuration-session.test.ts +++ b/test/configuration-session.test.ts @@ -83,7 +83,7 @@ test('configuration session chooses a profile and connection without persisting session.submitWorkspace({ repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: '/workspace/src', + cwd: 'src', }) assert.equal(session.state.step, 'confirm') const selected = session.confirm() @@ -125,6 +125,11 @@ test('workspace validation keeps the session open and reports the bounded field assert.equal(failed.step, 'workspace') assert.equal(failed.error?.code, 'WORKSPACE_INVALID') assert.equal(failed.error?.message, 'gitRef requires repoUrl') + + const failedCwd = session.submitWorkspace({ cwd: '/workspace/src' }) + assert.equal(failedCwd.step, 'workspace') + assert.equal(failedCwd.error?.code, 'WORKSPACE_INVALID') + assert.equal(failedCwd.error?.message, 'start in must be a repository-relative path') }) test('configuration session supports back navigation and fails closed on empty catalogs', () => { diff --git a/test/configuration-wizard.test.ts b/test/configuration-wizard.test.ts index cd483712..6e715cf5 100644 --- a/test/configuration-wizard.test.ts +++ b/test/configuration-wizard.test.ts @@ -425,8 +425,8 @@ test('cloud workspace setup accepts edits, reports invalid refs, and preserves b wizard.handleInput('\r') const initial = wizard.render(40) assert.match(initial.join('\n'), /workspace · cloud sandbox/u) - assert.match(initial.join('\n'), /blank = provider default/u) - assert.match(initial.join('\n'), /start in/u) + assert.match(initial.join('\n'), /blank = repository root/u) + assert.match(initial.join('\n'), /start in \(repo-relative\)/u) assert.match(initial.join('\n'), /tab\/enter continues/u) assert.doesNotMatch(initial.join('\n'), /braid setup/u) assert.ok(initial.every((line) => visibleWidth(line) <= 40)) @@ -450,6 +450,7 @@ test('cloud workspace setup accepts edits, reports invalid refs, and preserves b assert.match(review, /cloud workspace/u) assert.match(review, /github\.com\/tangle-network\/braid/u) assert.match(review, /ref main/u) + assert.match(review, /start in repo src/u) // The review action returns to the form with edits intact. wizard.handleInput('\u001b[B') diff --git a/test/interactive-execution-adapters.test.ts b/test/interactive-execution-adapters.test.ts index c9d98f31..4a18e992 100644 --- a/test/interactive-execution-adapters.test.ts +++ b/test/interactive-execution-adapters.test.ts @@ -529,7 +529,7 @@ test('retained runtime receives the canonical workspace request without a provid environment: 'universal', repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: '/workspace/src', + cwd: 'src', } as const const prepared = { ...fixture.prepared, workspaceRequest } as PreparedTangleRetainedConnection diff --git a/test/production-composition.test.ts b/test/production-composition.test.ts index 95f41535..d774bc5d 100644 --- a/test/production-composition.test.ts +++ b/test/production-composition.test.ts @@ -583,7 +583,7 @@ test('startup persists the workspace request, reloads it, and preserves legacy a workspaceRequest: { repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: '/workspace/src', + cwd: 'src', providerOptions: {}, }, } @@ -595,7 +595,7 @@ test('startup persists the workspace request, reloads it, and preserves legacy a assert.deepEqual(saved.workspaceRequest, { repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: '/workspace/src', + cwd: 'src', }) assert.ok(saved.workspaceRequest) assert.equal('providerOptions' in saved.workspaceRequest, false) diff --git a/test/workspace-request.test.ts b/test/workspace-request.test.ts index 84a6ef9f..9a5fa433 100644 --- a/test/workspace-request.test.ts +++ b/test/workspace-request.test.ts @@ -18,7 +18,7 @@ import { DEFAULT_RUN_CAPABILITIES, type ExecuteTurnInput } from '../src/ports/ex const validRequest = { repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: '/workspace/src', + cwd: 'src', } as const function thrownMessage(request: unknown): string { @@ -38,6 +38,7 @@ test('workspace requests use the canonical schema and immutable snapshots', () = assert.deepEqual(snapshotWorkspaceRequest({ image: 'ubuntu:24.04' }), { image: 'ubuntu:24.04', }) + assert.deepEqual(snapshotWorkspaceRequest({ cwd: './src' }), { cwd: 'src' }) const input = { ...validRequest, providerOptions: {}, @@ -105,6 +106,32 @@ test('canonical workspace validation reports bounded actionable messages', () => assert.equal(thrownMessage({ repoUrl: 'https://github.com/acme/repository' }), '') }) +test('portable Sandbox cwd failures use the start-in field message', () => { + for (const message of [ + 'Workspace cwd must be relative', + 'Workspace cwd must use POSIX separators', + 'Workspace cwd cannot leave the workspace root', + 'Workspace cwd cannot contain control characters', + ]) { + assert.equal( + workspaceRequestErrorMessage(new Error(message)), + 'start in must be a repository-relative path', + ) + } +}) + +test('portable Sandbox cwd validation rejects paths that leave the repository', () => { + for (const cwd of [ + '/workspace/src', + '../outside', + 'src/../../outside', + 'src\\win', + 'src\u0000bad', + ]) { + assert.equal(thrownMessage({ cwd }), 'start in must be a repository-relative path') + } +}) + test('workspace display strips URL credentials and query material', () => { assert.equal( compactWorkspaceRepositoryUrl( @@ -200,7 +227,7 @@ test('admission binds workspace selection and local root without receipt shadow assert.notEqual( digest, exactAdmissionRequestDigest( - { ...input, workspaceRequest: { ...validRequest, cwd: '/workspace/other' } }, + { ...input, workspaceRequest: { ...validRequest, cwd: 'other' } }, snapshot.conversationId, snapshot.branchId, ), From b63db897f66ba7b2a08f1534928ce71f51193d63 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 20:58:17 -0600 Subject: [PATCH 127/136] docs(workspace): document portable sandbox cwd --- docs/components/profiles-and-connections.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/components/profiles-and-connections.md b/docs/components/profiles-and-connections.md index b96ef084..913bf880 100644 --- a/docs/components/profiles-and-connections.md +++ b/docs/components/profiles-and-connections.md @@ -16,6 +16,8 @@ Ask the provider for current capabilities and show exact incompatibilities befor Use one staged configuration workflow with explicit review and commit. +Show a blank Sandbox cwd as the repository root. + ## Component map | Component | Responsibility | @@ -42,9 +44,11 @@ Credential bytes live only in the operating-system credential facility or their `WorkspaceRequest` is an immutable provider-neutral startup selection, not connection metadata. +Sandbox `cwd` is a canonical POSIX path relative to the repository root; `.` selects that root. + The local `workspaceRoot` remains separate from the remote provider workspace request. -Only a cloud-workspace provider exposes repository URL, git ref, and remote cwd in setup review. +Only a cloud-workspace provider exposes repository URL, git ref, and repository-relative cwd in setup review. Repository URLs require HTTPS, contain no credentials, query, or fragment data, and reject literal private hosts. From 6a23f7aa936bb4cb3d755b75017a23c96d2a1859 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 21:03:13 -0600 Subject: [PATCH 128/136] fix(live): pass portable workspace requests --- scripts/live-required/headless.mjs | 4 ++++ .../live-required/tangle-sandbox-braid-execution-soak.mjs | 2 ++ scripts/live-required/tangle-sandbox-braid-interactive.mjs | 1 + scripts/live-required/tangle-sandbox-braid-multirun.mjs | 1 + scripts/live-required/tangle-sandbox-braid-stress.mjs | 2 ++ scripts/live-required/tangle-workspace-proof.mjs | 3 ++- test/tangle-live07-wiring.test.mjs | 6 ++++++ 7 files changed, 18 insertions(+), 1 deletion(-) diff --git a/scripts/live-required/headless.mjs b/scripts/live-required/headless.mjs index ef030fae..4e2e4a56 100644 --- a/scripts/live-required/headless.mjs +++ b/scripts/live-required/headless.mjs @@ -256,6 +256,7 @@ export async function prepareProductionWorkspace({ runner, modelProvider, connectionName, + workspaceRequest, providerOptions = {}, confidentialAttestationPolicy, credentialRef, @@ -308,6 +309,7 @@ export async function prepareProductionWorkspace({ profile: `profiles/${profileFile}`, connectionId: connection.id, connections: [connection], + ...(workspaceRequest === undefined ? {} : { workspaceRequest }), }, null, )}\n`, @@ -339,6 +341,7 @@ export async function prepareProductionWorkspace({ statePath: join(root, 'state.sqlite'), connection, profile, + ...(workspaceRequest === undefined ? {} : { workspaceRequest }), endpoint: endpointEvidence(endpoint), credentialConfigured: selectedCredentialId !== undefined, environment: childEnvironment(environment, root, join(root, 'state.sqlite')), @@ -583,6 +586,7 @@ export function configEvidence(config) { endpoint: config.endpoint, connectionId: config.connection.id, connectionKind: config.connection.kind, + ...(config.workspaceRequest === undefined ? {} : { workspaceRequest: config.workspaceRequest }), credentialConfigured: config.credentialConfigured, model: config.profile.model.default, ...(modelProvider === undefined ? {} : { modelProvider }), diff --git a/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs b/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs index 953205cf..612076f7 100644 --- a/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs +++ b/scripts/live-required/tangle-sandbox-braid-execution-soak.mjs @@ -19,6 +19,7 @@ import { resourceDelta, runObservations, } from './tangle-sandbox-braid-stress-support.mjs' +import { workspaceRequestFor } from './workspace-request.mjs' const repository = resolve(dirname(fileURLToPath(import.meta.url)), '../..') const DEFAULT_RUNS = 3 @@ -181,6 +182,7 @@ async function runAttempt({ index, proofId, client, binary, values, environment environment, ...values, connectionName, + workspaceRequest: workspaceRequestFor(environment), }) turn = await runHeadlessTurn({ binary, diff --git a/scripts/live-required/tangle-sandbox-braid-interactive.mjs b/scripts/live-required/tangle-sandbox-braid-interactive.mjs index 025961d4..a1b5b66b 100644 --- a/scripts/live-required/tangle-sandbox-braid-interactive.mjs +++ b/scripts/live-required/tangle-sandbox-braid-interactive.mjs @@ -1380,6 +1380,7 @@ async function runProof({ model: values.model, runner: values.runner, modelProvider: values.modelProvider, + workspaceRequest: workspaceRequestFor(environment), providerOptions: { lifecycle: 'retained', idleTtlSeconds }, credentialRef: values.credentialRef, credentialValue: values.credentialValue, diff --git a/scripts/live-required/tangle-sandbox-braid-multirun.mjs b/scripts/live-required/tangle-sandbox-braid-multirun.mjs index 3c28ab1d..f26f7661 100644 --- a/scripts/live-required/tangle-sandbox-braid-multirun.mjs +++ b/scripts/live-required/tangle-sandbox-braid-multirun.mjs @@ -671,6 +671,7 @@ export async function runProof({ model: values.model, runner: values.runner, modelProvider: values.modelProvider, + workspaceRequest: workspaceRequestFor(environment), providerOptions: { lifecycle: 'retained', idleTtlSeconds: 1_800 }, credentialRef: values.credentialRef, credentialValue: values.credentialValue, diff --git a/scripts/live-required/tangle-sandbox-braid-stress.mjs b/scripts/live-required/tangle-sandbox-braid-stress.mjs index 23c7fe41..60477fbc 100644 --- a/scripts/live-required/tangle-sandbox-braid-stress.mjs +++ b/scripts/live-required/tangle-sandbox-braid-stress.mjs @@ -38,6 +38,7 @@ import { waitForWorkspaceToolEvents, workspaceToolEvents, } from './tangle-sandbox-braid-stress-support.mjs' +import { workspaceRequestFor } from './workspace-request.mjs' const scriptPath = fileURLToPath(import.meta.url) const repository = resolve(dirname(scriptPath), '../..') @@ -1298,6 +1299,7 @@ export async function runBraidSandboxStress({ repository: suppliedRepository, environment: sanitizedEnvironment(environment), ...values, + workspaceRequest: workspaceRequestFor(environment), providerOptions: { lifecycle: RETAINED_LIFECYCLE, idleTtlSeconds }, }), ) diff --git a/scripts/live-required/tangle-workspace-proof.mjs b/scripts/live-required/tangle-workspace-proof.mjs index 097ec8ca..1577a4dc 100644 --- a/scripts/live-required/tangle-workspace-proof.mjs +++ b/scripts/live-required/tangle-workspace-proof.mjs @@ -5,9 +5,9 @@ import { fileURLToPath, pathToFileURL } from 'node:url' import { confidentialExecutionVerified, forkedEnvironmentConfidentialityVerified, - workspaceCleanupAcknowledgementMatches, workspaceCheckpointRequestDigest, workspaceCheckpointResultMatchesRequest, + workspaceCleanupAcknowledgementMatches, workspaceCleanupRequestDigest, workspaceForkRequestDigest, workspaceForkResultMatchesRequest, @@ -891,6 +891,7 @@ async function runWorkspaceProof({ model: values.model, runner: values.runner, modelProvider: values.modelProvider, + workspaceRequest: workspaceRequestFor(environment), credentialRef: values.credentialRef, credentialValue: values.credentialValue, providerOptions: { diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index aac6bf14..c7d8f6be 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -93,11 +93,17 @@ test('Tangle Sandbox workspace profiles pin model identity separately from conne repository, environment: {}, ...values, + workspaceRequest: workspaceRequestFor({}), }) try { assert.equal(config.connection.kind, 'tangle-sandbox') assert.equal(config.profile.model.provider, 'tangle-router') assert.equal(config.profile.model.default, DEFAULT_TANGLE_ROUTER_MODEL) + assert.deepEqual(config.workspaceRequest, { + repoUrl: 'https://github.com/tangle-network/braid.git', + gitRef: 'main', + cwd: '.', + }) } finally { await config.cleanup() } From a5e9bac4e65443b917c5f995894c90c52ff04601 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 21:08:54 -0600 Subject: [PATCH 129/136] fix(workspace): make blank cwd explicit root --- src/bin/production-setup-validation.ts | 2 +- .../tui/configuration-wizard-presentation.ts | 6 +-- src/views/tui/workspace-request-form.ts | 11 ++++-- test/configuration-wizard.test.ts | 39 +++++++++++++++++++ 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/bin/production-setup-validation.ts b/src/bin/production-setup-validation.ts index ad40f2a3..96b1bff4 100644 --- a/src/bin/production-setup-validation.ts +++ b/src/bin/production-setup-validation.ts @@ -199,7 +199,7 @@ export function describeProductionSelection( effort, workdir: selection.workspaceRequest?.cwd === undefined - ? 'repository root (provider default)' + ? 'repository root' : selection.workspaceRequest.cwd, ...(selection.workspaceRequest === undefined ? {} diff --git a/src/views/tui/configuration-wizard-presentation.ts b/src/views/tui/configuration-wizard-presentation.ts index 35a85eed..0d46fb88 100644 --- a/src/views/tui/configuration-wizard-presentation.ts +++ b/src/views/tui/configuration-wizard-presentation.ts @@ -42,7 +42,7 @@ export function configurationExplanation(state: ConfigurationSessionState): stri if (state.step === 'profile') return 'Choose the AgentProfile for this run.' if (state.step === 'connection') return 'Choose where this profile should run.' if (state.step === 'workspace') - return 'Set the repository and working directory for the cloud sandbox.' + return 'Set the repository and repo-relative directory for the cloud sandbox.' return 'No changes were made.' } @@ -112,7 +112,7 @@ export function configurationItems( { value: BACK_TO_WORKSPACE, label: '← change workspace', - description: 'edit repository and working folder', + description: 'edit repository and repo-relative folder', }, ] : [] @@ -229,7 +229,7 @@ function effectiveValues( workdir: selection.connection.kind === 'tangle-sandbox' ? selection.workspaceRequest?.cwd === undefined - ? 'repository root (provider default)' + ? 'repository root' : selection.workspaceRequest.cwd : 'workspace-selected workdir', ...(selection.workspaceRequest === undefined diff --git a/src/views/tui/workspace-request-form.ts b/src/views/tui/workspace-request-form.ts index abf0d4c3..ff13e600 100644 --- a/src/views/tui/workspace-request-form.ts +++ b/src/views/tui/workspace-request-form.ts @@ -130,11 +130,16 @@ export class WorkspaceRequestForm extends Container implements Focusable { } #submit(): void { + const repoUrl = this.#trimmed('repoUrl') + const gitRef = this.#trimmed('gitRef') + const cwd = this.#trimmed('cwd') + const hasWorkspaceSource = + repoUrl !== '' || gitRef !== '' || Object.keys(this.#fixedRequest).length > 0 const request = { ...this.#fixedRequest, - ...(this.#trimmed('repoUrl') === '' ? {} : { repoUrl: this.#trimmed('repoUrl') }), - ...(this.#trimmed('gitRef') === '' ? {} : { gitRef: this.#trimmed('gitRef') }), - ...(this.#trimmed('cwd') === '' ? {} : { cwd: this.#trimmed('cwd') }), + ...(repoUrl === '' ? {} : { repoUrl }), + ...(gitRef === '' ? {} : { gitRef }), + ...(cwd === '' ? (hasWorkspaceSource ? { cwd: '.' } : {}) : { cwd }), } try { this.#onSubmit(snapshotWorkspaceRequest(request)) diff --git a/test/configuration-wizard.test.ts b/test/configuration-wizard.test.ts index 6e715cf5..aa9d318a 100644 --- a/test/configuration-wizard.test.ts +++ b/test/configuration-wizard.test.ts @@ -466,6 +466,45 @@ test('cloud workspace setup accepts edits, reports invalid refs, and preserves b assert.match(wizard.render(80).join('\n'), /choose a connection/u) }) +test('blank Sandbox cwd is submitted as the repository root', () => { + const record = createProfileRecord( + { + kind: 'inline', + reference: 'test:workspace-root-form', + label: 'workspace root profile', + writable: false, + trusted: true, + }, + makeProfile(), + ) + const cloud = makeConnectionVariant('tangle-sandbox', 'workspace-root-cloud') + let submitted: unknown + const wizard = new ConfigurationWizard({ + theme, + profiles: [record], + connections: [cloud], + onCommit: (selection) => { + submitted = selection.workspaceRequest + }, + onComplete: () => {}, + onCancel: () => {}, + }) + wizard.focused = true + wizard.handleInput('\r') + wizard.handleInput('\r') + wizard.handleInput('https://github.com/tangle-network/braid') + wizard.handleInput('\t') + wizard.handleInput('main') + wizard.handleInput('\t') + wizard.handleInput('\r') + wizard.handleInput('\r') + assert.deepEqual(submitted, { + repoUrl: 'https://github.com/tangle-network/braid', + gitRef: 'main', + cwd: '.', + }) +}) + test('mounted setup redraws when a long asynchronous apply finishes', async () => { const record = createProfileRecord( { From afdcfd5cc8623cc156ac573ceb0fc9d33b168182 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 21:49:09 -0600 Subject: [PATCH 130/136] fix(workspace): refresh portable cwd proof --- .../verification/workspace-request/120x40.png | Bin 7851 -> 7612 bytes .../verification/workspace-request/120x40.txt | 6 +-- .../verification/workspace-request/200x60.png | Bin 9347 -> 9320 bytes .../verification/workspace-request/200x60.txt | 6 +-- .../verification/workspace-request/40x12.png | Bin 15206 -> 6262 bytes .../verification/workspace-request/40x12.txt | 6 +-- .../80x24-workspace-request-keyboard.gif | Bin 85230 -> 53664 bytes .../verification/workspace-request/80x24.png | Bin 7547 -> 7249 bytes .../verification/workspace-request/80x24.txt | 6 +-- .../workspace-request/capture-manifest.json | 24 +++++------ scripts/capture-workspace-request.mjs | 18 +++++--- .../tui/configuration-wizard-presentation.ts | 37 ++-------------- .../tui/workspace-request-presentation.ts | 40 ++++++++++++++++++ test/configuration-wizard.test.ts | 1 + 14 files changed, 80 insertions(+), 64 deletions(-) create mode 100644 src/views/tui/workspace-request-presentation.ts diff --git a/artifacts/verification/workspace-request/120x40.png b/artifacts/verification/workspace-request/120x40.png index 2dd2bb83ff47239f5016b43f0004a74a0a97b180..3b5e797c79158640a1d8c45faac5800be4854cf4 100644 GIT binary patch literal 7612 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 https://github.com/tangle-network/braid git ref > main - start in - > /workspace/src + start in (repo-relative) + > src tab/enter continues · shift-tab · esc diff --git a/artifacts/verification/workspace-request/200x60.png b/artifacts/verification/workspace-request/200x60.png index c1be12388cf7d139a9fb5062ca1ba84e6a7cf83d..e80bee6bd92709938966a646385adc7cf36283cf 100644 GIT binary patch literal 9320 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 https://github.com/tangle-network/braid git ref > main - start in - > /workspace/src + start in (repo-relative) + > src tab/enter continues · shift-tab · esc diff --git a/artifacts/verification/workspace-request/40x12.png b/artifacts/verification/workspace-request/40x12.png index 5fa545ebabe50a0121dee9665de1446a1d47235c..83ce89b9bb6d9c8a12cee3e1649a1cfecc890212 100644 GIT binary patch literal 6262 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 W%*g?=Sv7T61W*R6%h$-7hy4$kE~AbB literal 15206 zcmeIYWl$VZ*EKqXKnU&{LU0l+xCKaXf(3U5CwOp&1a}P(Jh;2NdvJFhWN^1(xSi*D z<$JZhs{7~uxX=_`J=3yJpR@PcYpswk@{$;+q^KYe2t!&*ObG-+hzI_tQJw)uoQlw% z1OMI_Nh!&JK<;!P(06|j=pH!qeGmBbJqQHV2Z8v1fj~sxQkxV%03RS5%1DZVp8o#+ zZq1Jaj=XS`mJ@#gMWI08##1n$83#`2lotD>;<|XW;--UVb`Lt`@sIY$mTEYe@_UFT z!x8I2v#rchE1p?Ywq$KyI<|4CUpcm!(^`5|T`D^8s#(1vg!~l!bgcaRS)h!K6v|6J zZ=dkKpGNG@slvV5DBvg#Ef=E?qaXgr2Hs?9%=1zL5m2U`l>yK46=jnM^u6SbHv(t? z_5aOo0dnB-Sy}hT;kEf%=t?WyEQ`s)TwgN_-l%bg=92SjdLvBtFh8>{r?gUwjLd!O zf)Ne;D6+^}<`K=YDj+BpzY06Q@51mQy16>1*oky$?P&OMzzPCseu7aY4f*!8mpQ-> z_;ya~dr|vj0QQ{d7l!7^$f^ z3#s;46-Px9VR-MZ`|(mMvawWZe2}p<#dD*1w7(W5lc&AK#()Ph%PP>g-wXsJ_wX`_$#kO!$NwTvB@3$6@E&ApWRT>wY4Tx~hRaMuvF>D#$ z$5R+jdP5?AEyziraH$aG>fN>{Pdb*~jGSI|22CB7d)iM9GHWb+@)6XEz~*mra4`8q zB^TAU9zV9?M-==#jYq+gZ*mcH?(OYJ+vd?piwNOPZu#|qkO$Rf5oOH6XV~_N!#gZs5C-n*GUQqu_}_=dggM+hJh40owTfeH%vt zNs<-?+`iVH*@Piy>WZlSK5F(p$O)?oME%G%K%o#Q!j>2|{k)|sz2dh8GK>Pj%x6I{n@3-8@=t~s@R{g6V~jQcfW=dAc{ z0?{n$JqII^SHeU>JNT=40UW-yK&Li}lG*PBK@Bh*O;%vQ|7>Cay=$fT#(W5d@4e~o z;kSb4^>BcT6S_Iqb@(nd2Um()eYt1$-5qC>v98Iqd4EEdKRi6D1&Bn-x%?sx#x5F= z;jecQ5D$Xx5wZ_D1VTeql2@@ZSPl>HY;L!Cfh)c@B`0jB!BxDE_o8(vui^Uen=L{Q ze(IBeX;TJgn-AHB3KO9b4(_%OH`$?3;$suA9uX-sO!E~BNuaFo!cDG^s8w|DQ@Jv3 z$8@+H7PvRh7(FMn=lNP3EDN9n43Qg9zjneiQ;P4S#vVb;5-5<|^hWQ)i;lh8YW1Tx z-tX5PQN62$_u1baJw)w7*)a4T4mA07*ZO+vn|LFn;u%y{)-Ihc7onS+Fo^;d`DT}c zuj7YKXguCFkiEh$45Lq{KQxvlJH3i;$y03~Gi=O^ z5wC+L85zPQ!m$6ROz)F+`EO?7Bb~h#j7S?w#G$uit?^zDd+X=<_u`cP_q3Z~4^M9r zhvTPGTys$<8DF@ZROGf)l~f&C4lQBG4z3K#Ipv~cF6U&J^|qSXa3H0Omj6kEk`c5& zN+MD#lfNTK`TEr=!mDGnK5wyV+o8GgtqaT3cWm~0r(Sqhe~-^AyeBqs$rlgBHXG}K zHRcWX>(r}L||2y^g+MrzWp4Kq=wV?fe9a;ZVS?aGi zSKkq?48l8H=kCdc+30W3HCoL?WTN@0iE!*L8(9W?=&%50ilzY8{PTE;ZlU)Jul&Dg zbJ%t~V-m$X^gCbf9(UZ=I>2xFXL#dD$n!5gnc<0`yv6q|Q`-!6I{YQ1h;{ub z&;Ez>--xuLI;kd6CcULKueqveZK?f3*;yisGCCSadx15t!xERIA#lKUIqZN(j4Yv? zKaw|fMRCE1Ez*_lY{eFtgyC%T^{Zh7HuPwpMnmYypmT;g!y0~Q_3clSZw<$MhNgeC z2&K%2i>sq4fkwi}xK^s2k~`yGvSw&8T71+-MGzQ;l6&qMCC%afN0cNjJ|i>5%_Q67 z75;a)jx9CTQIg}HkR36>G!#law0?vc?3er%Sk1!0N?wyZR4yz>jSl8x!D=LBLZ9se z&?$3@i}U#vt*aTg+5Mw2;{&m?I2MKoJeo6>TgbjKH7`PO0I1UG`-_Vp>4ocO3Tk(!4#Vv~hOXIka))=Y3Jv zebKY>@m`cn3B8vh1=&e+3$x#`Lv^lM{CX>$&#%)eUs0;)+6U?1k(Wl1TA(__`AlRg z5n03Y?cMiUMmQ2}dFqoUr&hmc{(OgX1N~BHs>U*e^ud=Xd8rAgb1*7(D*xAW!XHr- z9n*CLL!PHqdB=pQ_u#K-7Nr!k$VsAT@;8VxEez?~q4N@EUVt6!GvL3#k>VY9tWN<( z#~){MlQj5|B+647J)6}8OdIYQi1vm;}^HC-XaG*FXA)?Z}B{f|EvqYpW_sC2lCa?NG-R#9tUB2 z?o8S9#q7H)B9T3|_Gb^;T3}Uu3rM(^H!dr~Pk-eny}Rpr<;N`eX?Gk?PV-Uu8JKPF2*hc9J%B5G-ezy$33+E1R>YGTe^ioo19 zGVyRItqc(TTb6EkyV5a}SF1fbCJ!ySOkC2IeSvJi!+0!cwRx770h#MDQ@|Q15+e#7F?zJPs-F$iu4J@}!uK30^i^4jrf8x>rLJ z-8Ffz))e5HOvgu7mbX_v8HNgGChQA?y4vs1lpoxYd`A<==;4~)Pdm1CIbTxe8z~=$ z+9CQl%4C#)!z`_aL>i(>%rjHV*-*@6x2MPUhiKD zKQRg)eQ@s2L2X|^Q}P*X^irZZJpQ_ou~Mz;)SE)z#x&I6U%M3GCE&i89IWmPWR#F|Avz7az52h}%1Ub;zq!8C7FkUGBm7SARWc1-&=IZr54y%9HGQf2AoG0n721 zu`Z1YDap;w-rCvN-N(~6G^IR9Jf~32&!=&8uA}sS=4<9Jo8biMD%_882(_&LKtpY8Y3(7xDr{wXz=wF+F*;rk}yMRr!m*;938C=bkCJrt39Of zu1URK_k+XqP~U2|C8-DlD-Q=fBSDI#*$FNo+tTzOrNyfC7I(%Yfij~1J4`HbSVmGx;##UBo?z;U- z+k-w7GajrR=lNjoqW+?DadX@%8=;e$tf- z9d`z}J|K%r^shE}-hUFWR7;VL8vS;0Dc}J0Q7WV{T@9tRJHR?xi-3qKp`u4@&&{Or zRuNHd?@|RF^py&`8J9Pdm)GrV;H$Hmz}Pp5 zQ?xZ8#)4#&FFZ=Bsl2B;@~T~us`bUsj~H`%8=bFNE)3O+Mj_v1H^JVm3F=PU9X=3y z&FzwT2&*-3%TqIgXgH>(b_;ycF`Lh2%KkWy#4eo2#_ee{DVuACpa%;v!hjO%m;&sY z{Roc{$;_eC-9NO#Lwz3dvb_p}uk2VzOs%A}u!m)K+rII4KBE9ffb{@dy=(03CrL?q z+I=krm&5|~Ux{&pT-;pxWEc#c{j9v~{MU=Q;Na)1^h9$<0&T>wi`i>oyycOfJ;lHp z5&7{3a&3Y+XFP--g)l7Dvl(9VJoC3U!(LmQJ)!_&K9c+i-c=rr-q8VGZLN^JOpB?3 zxzX;rFLn_FV?|x1`tckvG$CR-R~53>CNRG)GP2i@wXvVUy{hrK1d#T|Q}nRl7^xnf zvQ$FUCh^v;B_7r)jli5|2=gG%f3;^jbf1z|Bb%}6XGX@M0;I@6OiQYU~d55^Y(y}!gmyqdKEbg z1?TGQ>{109_Uek)*gVDWf`~h&CWq=OH)75|M~s#C(g_unx@&08vhHWF&v5Y2lT&iK z6`5UiqbA8demvYsm?bb7i;d!%6+XYj`~tT)SwF9+QqhzLGVsKNg^jtc+IfmRNmbqA z>R$9WOhnLW1h=OF&>(gZL!pFe#H?vR-x>dzvOHLe&1mvU&OS z?Z5`@DI2Xr2te1=wzhSA596+(({|cBcKam zcmPsGIc)a+GQM5O$z0`KZTX3G-E?SGm-z5(1x7?(gWFArSZ&K^s)yAj#@`&jhQK86 zGH^sTg%l0Eo!yI)4U&UOO6z#|iQxvnZ;$XKNYT&Gy)Ds?DN3ylZ=F8)M`z-wgEOvf z?Xsadc3=t-sl+_`qr?LF{E4qc$~t)sQD3vE6j_xR%D_Uc&fQCj)ke0u?cdvBdnXjk zrAMT~uxALX!Ti^qgY>|FD|%crNt(!1bm2=vy!*X-t-{6_AGZ_+&`Q zECQa1)R!e6<~5X;(D*>0Bj|M1l|OvWE)9H16jD;4tm%BXxUXC9O35d^&E=fLEhf2U zkY4{JaCeo%Lv?>Wqgp5*m0sO5%=6`r@fugzSu%}`s) zD{g9uMq^2jgTibN(QdPHy&JmtyrtPm9j%|*a_g3Io?43xaD(xc8M}wR-rp5TtKO6m zSG70nu{%r}nN9cKB#H7G-uEw0@;lqL2n~N1$?SLlv%V%4))EB3PV3sEQ48ZU&@BeB z&oj_RHSBf}$QbD+>Mz3i7l!Q_D4L+>pJdyAx7+EnD~xd00D40n3|9D9#{-gjaZG^# zGUi%5V1*g$@P@RU#>HYJIRM#pI&W!`*NGUU|BN){puA&T%6~kB+C$;h!tienCr8Ke zsZ=fYB-p@@r`NDE%Mh^^SS|)Ws%m2b``d*~FYqwrZwaha+^a}60`Lic%!hNG z`*qVwJ6n@_)gVw`DB)J(Vyad*Ep7K0U!bUU6Lan9g&hKj4xhQrr<^-~_M7zJ^v)}? z$VEqOi;dl_XCPUIEpE6V4J{%l9Ji(ECFsq+AWoS1|IG`Ux$Q3}I7=a9))w`=`@T+c z((;sqOooac;%WJi(eL3B1X<^Fdx&KH^QW}0_!;9SkM-Ia(ly6w1e;BRP8?8bzdW+) zzADnqJIW3lFyGw%-~@ab0D5DUoqY>EBf^~jjw^Lzc4^+z_^RtJoHy9DkQ#KE>L*u7 zc17zVr{|wVf#=OH1k6l~Y%O;k@3-M+Whif;d@dxZbfQXl?EvC!a=Ryhn9a=y<%D}m zk*K?5MDJIl&j&`OkQGxT1W1kw-cFU3jXGPEoeSj_Rb5Wr;SJTUx;=5M6)9J8?4rl-}hu=JAs2L9mnti{W( zu`f@=KtWuyvo+ipGCtpJA_Jf!+vRg_H}lNwsqO3QgsRP!^$LbUS@(U|SzUtZOc$ab zH5v2(N^us<=^GgtnG%$dukbx2DWC*AMeq)!-HEh>DqNrNlcu z`yzjSgVbQ9uQZp|Ey=w8g_Y$L8O6K&t(*#~^uVDh`ZpHWS^k#0Lo#T{e@K^2ZY7CE zCC&sK8>XIb9q$w2^G|)ZoaSPZQ>5a*a<-cP*f3KdKTHfY+9}l_t%t8GGzV{={9ujY$$)}r@)Omu=Oht7c z!Cak=o5!b0dR6)YM#4LjQl4Qq(F)D z0}J_A3t`yj7g(y~sKi@GWcVcH9$V-8F9>=O>$r>)arl}7ml?c+FkO=0_#YnX0x2@a z^Wn3(U0GV|aLauBbB~LF%$++gAlvTaJz$+YFUr*IVUD8F}tUFt)vZ1{2 z$Jj=4K>`KwtA)kI5`K2lw#DSnhqlc+EJT-%CT4jR7<@Z~W4PJtHBo(OS==cNL;Y<(dOPfxSA5|9gf^BW`)Yfrk@WKS)T7+t|SVI|CUWo0pQv&+3@0bDZRDGva z1VJRYmmT}k5l6GW5-#1BeOwl~s+XCRL?GgJTRguYaIm+hqKZil4jfLn+}rEshfjsFIt6`~^L6umoaDIx@VS34mFCj0AF zN+z^!7IVFYQKr4zGs1@NlU|ictD8L>oOmkf#b(4h&U6jswU&xA9aB%fMd87S&v*Hr zeX+gSl^TTg8F{RCpS@Oc?i*R}$@m7)s;U1ZD6;V?k!PzS9=z}fc=i^by)axKj^^cs zSUEJ3rvcfYVHkw4Loy3LqWWWZZlvb|0!^VWHWcrQT@%@2&XE0TVhYc;BF0oEmT?-=Scx7pjvv;(Hl_5#JO%d9vW3;K)6AjAKrg2pjRl2Rm z7>5pKl1rIhYuJTRi-tkd%gb-}6E(CJ*pu#Ky(|4LjDPwwl^#}vvHGU@#sv=bjaF7= z&5v}KGYD&6DUy5tbAlHvVv=LV6_ziiw0BqfzU*aXnd?~@UK{C7>@*hg{Nj9^D2f5o zs@hv4#JyZnL?x|!vH{`BeaVBop)zHsu)YHKZ$rX&+U z)*Nn9O?%k5>ubtn-6rY8_>p$UzFBO}WOb#gTGs#3ZaAOMJTU==k|~vi+TIbPQ87Z` z@-D*=FCzK2my0_hseO5|59pz}cm%w}#!gbm$V#jawmxJlmpC=a_vVyOr7GbU9C=tq`YUDUJd8Z*|-W=I3JcC5dEw^ZI<=RMvKT2)lN=P@faWK zi(C(7Mdunj;d_PmN#SN81MBtTjhv1AeK5W3%#-}k_UkL(6BTXdW7T6Wi|&f z6QU?<#z$=rNvpEHh1fmEKp=tZ$p=C+T&N;Cipw0GZn!w=C$pzoz5G(?n7hUYvz=I&Npm)Q&CUF$;aMG)jr_$0c5@;ZGz&?z{cUe>NSk%uvonZn%yl~4boEL=2oNDTh0jG# z?@+`__4Fbw*qxOFO+*9+>>?iv$Ia~-<3425oODblsu-vUvON#m!a)5Zi zSnASw!`lZN`}y!+iq|NOAKK5dy&C2`|Yp(sNdq^Ch}zfa&xlc#@Qv1JmDul zG4JX`(vi7xz?wLC+-acLN0;ZDe*6N`>%tLdmwxqq7m**S<^7u{Y(Tm1^ML`teH{IN zf$yJS0H~k27+9;M@{SW@BK_ca<7#Jbm-d>Z8~$He;I!tGQvGQm3?vGiroTw(>wuxiZ&&g9Jf_AdW%Cs z^I{_}t4q3%0Q&>=2m9miS?d6odQPeetEzL-Xmqc(U}q5&yk9r=^V4Wyae&4gAE`M4Oh`ESKEFHaFxmTB!B@TRl@0scL?2FDx1cf_vc_kUrh+mFiaP0 z&M|Q0P)5Y&Y>X=bckAfkEV9f{G?fx1rIqf^%zXt0hQ^$!zdguU2lRc{T;(Q;Q}Eum z_bfrJPUYRqpXDLeHzhd?E-g1Gpi>XFqKAI(kcO<1Z?mbiMZirwfF7)!C|Vc;=*r%E zQ~vKh3=5HeMfx18wIGn}7d(Ezv;o3&^&tRGw}AT$47wGiBJ&KC&QtV*lE{oZ zKm@=#n3!S7&>gv4sB=v{z+O{9*okF@pT?_VTYz_Hz+qaA5#cR#on2enS{os1BF-i< zuxb}u+N!*hrtK12o|s6;t6-0To~{_35)dKuD?T0Az8dY)#7V!%L8`2Cs&Gl|F(lDx zy}Wol6o|`fXmq@#a8+H= zC124^!-%rz-E7N477DWT9Vsd;l>OW=J$tXgl8ENsRK=k@ANa}vO{9_A(a{k|AyO>gBUi}k>Sbf_>_uWS26W<*q0ROiPop03qwmpeE|3K@rw}5YfW^4xpVnr4? z3mfLLyE%8cI5l~nghlZ)?Ex~rr!3gi^pKFSEmXkJ=gnp8(AWGHnD^Oq-gXgkMmwza zb(JSyZAV7rS(!(Vl%;QZNjXU|nwxtXWbG(U@<5>IaG)@6{6cYW8iRXQMDkSK&`)ow zs{g%aBB8TWZFAEduYxoAzkXF!Syxe6_XjrV(s}^)XX&Oq(HYG;3qKasL~y@MgT0OP zGQSmJOpiF=I67HF1gu8zC!BwyBF@nMZ+6@JZ;{L+K(1_G1-(ZiBD7oKa#i?fpf@ow z;o#dWUJq!8t2zScJ+j2Z(~=tZwE>6WpAqI2*h;9IJbzIkRpfc*}6D;(XF`Id%czOPv(kx zYNk|3imy`X92)3cIAT>2lgP--tPGvc2UZad_<7}=)3>#Lxzzuw67bc=#tBdf>>FPR zMu0J{oM27KzAeotl)&l$_-iW``AV^p;58bYFy#L73KBM06V(4;H}@ZU!PON8=E>S4 ztob?U<9I>3Pg1hxB*~x2SfG^vgEI<%4D#``>l4jWv>4N^63V0 zLH|sYnur+;n0ZLaUaz#d;mDMi62`zpfwHr^Ko~uX0BEGHNQ%?CmFh<@*<{@u@OTud*nYrQCC@^%-UwSz`{^x0>0Fq2h30d>22&#hnJ-QSSHP)lUNYZy}ISCW( zCO`w-J`&H+$}*Qvez)fJSXC+uNz$0s)>Vy(Nq(=NwAu9vXg242&+eHJQ3J9(718LQ zuyMKx!VrNdPkn#D{wjR;g77D9(0VWEf0=Kms1GMn(smQysy}>a?Q3=hg%j)e{6}jX z^scx3^mL!LSKOwI`a$>z$Ijl7=`BlWNQj$_09RnT=mY4~*UkIPaw<=bgk;|Y0@-RE z#>20{0#RS3w)tG1oxMawUv99Qay>bDj&y|h9eG;ECm=}S>HZ*%l9DnsACb{==ZaYy z6&3ZwWUbq~)r-+!X|~jlNLe21ZO4B)BSFuPFV=lFpf^{9dQ5f;Q2N$ zkI(i>pY10Tn9DI(j&kD}(atXjS@m*KH@CJNPS>BR*g2G9KSLz+uAQTWVjtEg}~ zsQqCi<8EqfK3RG2@eA{Myqd!iv12U_@i50o8JW%9FC5h+r+C`W&w!o9Dfm2I;d1wm zkDvBaTniPrzBfB=p_SQU=cv{T)y``|4Ku0uI+1ln1`bOiVmwMbT)1eBjKmaS;G`Lt z8op5Qxp(;XRYPa_GXPUIo{p4PmS0e`JZ(r)yymxeHJvWOD7X4*X?t;T)@cfm?&-YV zCGG7#3sn$@oe?4w_v@2~kk7fB^;j{Bn>GIkKBl12r)1+yPp^J;aKi2`6hg*hGhb(Y zFp|QfkiqBi1ozrpnm=FM2~t(9x21nK<*>c8W8<|;9w3sLT+uz;O-}hUG2>~F;%OWh z<&*NZ*kK4z(ZF6;GYZ0RVqDzV`1o8cD+PtI;({EGrP`H&C1x*CpyMR^HHd}{K%Qv!;gh)7qOz`o0I zj?pkDH`n9slmdMu#l<%lMh1qDD4LpDHm)Y!$F?p;KdPFWA8yagl4#dFZpbsg+y)7I zhtiteFYSVJXlQ%;SiVTiP%Z^YSqE7nzyK>N73C$YEwKOL{y4#Z-kVQI)`r}_@D37YNA{`{jtx_&I&iqfQJ`sZ9zpv zi(hzsvNk4);^u+n`3ZJ?v?OYC226AKWxj$>tD`iRE2Y1M1%-6(B$hDj%?D5Z;ST)) zrwcUH_~zxQsjZE(Z7RE?MXue^)JB&R8(^J>Z1rP{$kO4Z5D?=RWQ$6F{`|VCW8c7l zBq?d=kG;r`-(_{P-H!{kyU|CY6?LL@Aa7t&$AqsxNH&U4#z@^iJeXABA3fD;QZ5enUxVaF!)LwC88;w%lO7)a)pDzbfca&CV|WN?2&!1SzIKf$m5hzBsdD zZD<&dy;udQy{T)jzv-vQHWl}9b?@yh6+=-hR7f8EWf_ibVQo#G^$s63Wkj#dN>kb{ z=G?64Km`rW0d`HPw6viGDi;E^XrT16(o6OqE!F4K(0bn-)w35~)-sou>)heS5Jbqy zCbDSS@2zJd6jnp*-4yL&67waE#d=uVVZPW^wJw*JmjlBiq9|7=&m|FMbR0Wv0&lsxz4K93KNSVBy1->%$cloO-pK}&v4Pjgw$AtNKTH$Up4pOWLfJ1=u5J4azO>5A`??n)wWLv zSPHB&8Am6rQENhC76LkG>oYID6NM$;LJki-5BFk*6In;n@PM3`nN)4)>zM#RPvzi4S`>B(X*dIn2U|;@p4KSQ}1`V!p~p795=V6EiDfaNG!a(S}L*Xt|Ni9*6H^G zg%Xiah5`RwViGxrwp09}$AW#M;q~DjC1YHCJOM85hvoWu-XqbRI?=9jED$R$*V*vs zY+Y@w)6~w~&ItJ1-s#418Rn)qSw)0esg~3B-UKBFA^|>rLvu4338|X8Iz4@Ui4Mu! z!h)u*vL80T`yp>o_nm7$rYQ9>kXM}#=M}Zo5}W|~(m5R5zjT+8Hk`<;+!jeef^(MG z4qF(RiI+Fy<>T)g1xKf+|4^X{(krt%XS2rxd8)}8o*sqG%y!3w9>O9b zF#I|%Pfu@$!SHa^m+fBDv(CJ?R|xCkSvwE?z*P7-t>TXz&;f=c%(k{@vBag_yY10G zy4~GzChJ*Pkc#Yi+muPsyklVKsZ&x?I-gy#wOwiA;$!-)ALrw&iLVbgC)xY^5aV6X^TB+NYtQng&35>ss_sg5;#}F|REChXxpnKe zjjl#CqDsw~nVGY*;(BYZ-NXz9fJX^Z#TrW!O#GReRR;t~_~LKni}}jvL+aPr;&rgI z&tVo1K2`Vzlv~|uQzxmf^A`)t4K-NdPe^+27w?}k+k_@APf4~~UGRtin2`NqYZnAS zymYzd&2?iVXw}qsIR6J>K=Gj_ zrjHp*mwP8&8BQ6YxiG)9$d@M6=yNIlxSA^Hq~B8fK69f6E5*7XUvhWuEbvt#hU}|s zcc0C_<{MR#Q>^OUrLjr`1E3}?e}Dl>j_e;M<3}ZUHuUnR|L7>URb@x?Ku2_NPfELd zR4||qB$M7rzf4@zqQGLXK09|pr@Khp5-ybACQS*H9IdQ%$=dsJSIae6&uWDD@cj80 zN|MmQP=NA(Qj!#M>Uevp{AFcF=31MM0Iv(sL%i0T!WMCBOyct|hYJ1|Majw-O~50u zB6tDN*(c%NdLw?*IhI+g^oS7~hhdB43vF9yhoY(``?(kGB(T@{8dkGUNB3lPIq?yX zMYY=UuOBlTW6JBiDj?maJ-<@4f#z9H&O~BS&Zpzps6_v0r!S%U9!IQ$MTJ`Q1Vnd0R?;JKg~-Mt3_jmlD$lvJoWsy zQ!IzJT7XS$K74^WDy2;C!wf4y{~v7wLyNrBFgCVoje5J{^S#b*ymZBL?TW+2pQT&g zB@R=W^=fG?yjp!q6QM*yNyp))4g{;GeS2(Cd8gapSliatx$)Q>GEJDTamne;H9dEB zV1asmOyv)QiE>Qh2E)A4|Er`_S}F(QPfu!8g*EY@UYxARDHxMf?6T_7#(j<_P;O?m zu$55jv5gHD_Zu7A2wtK4j%;< z&)bB|UT4K8Zin$bZ&ht=*ghp3PpP#91&HS@cB1elttp+F3j(IXm^bp&no1O@c>#5`Uk2F2$NF-`(JRd)8w z@?=v94HhNMU)^VJ{wDq(#06TRADAhxsLC;iS>NoWBs*JKRg>E_AvfOIsGAzn5bo*C z%zdV4O~5U_^)E3@EljY)4N{ph545@jjqSd@U^b6hWVR^0s(Jn-+sP+agOFc-mO{S! zbq<%gul)D;K*xI0%em2W*Ld7Y;${*R3<;%uTP2dK5ci}KvyiT5e$?*nO+&+|FYt%; z*#%o4flZa(S z83F=}m`4wR>!G)1sBrVFh`Qc=OPFat-(sy;*xB&RN_`E@%_niT>tf0jj&DogbDf`=$X5o5#0y&qaMtskaU)Pe1blX;|koS6ixMvWuJ8J-5mm`~Vk zGT9w<1U@m018J9Y0vFcSXYQPutt->FewX-HQNhG{Va}Oc1I~iYn1nv8o0M1`R$u|X z8!xZft$bEDIkaCagg5c{SavZw>e?ojCppA--)?Vf$xSM|H-w84h9N9*g2;a*cWuq3 zx2&jE*5ueCL#z*+t2hx?r~!b7i~n&D>33mLF7gp|+_k!D!p^Q~B?h0-QY@ZX7-@Y= zpV`p2{E!6f{R7H>y!cqQV6Zjwh)!8yZE5%S{TAqFbr&!|5eV|HEb$DuRUNE5QD+%O z@b)nw`T^vFN0R{K5Wu84@^=sOFtE~#a;20gNh~r03uD0{k(AV~u!$2*CZ*t)cw8Q~ zb=8K2z>s0k)YM9RV%%$D(*5IoNwfDF$bou7KLF5%k_i}1Wxdn@OA|Ws6ktK>E4c%F z2?yyyut`@*PPMV!LCE>RV_KDxd|aF&_VZ@dn>@GdPMF5_-&8Ki2S-t z-5&xtXXjRjrIM@lkvdJwA*!Sm7-nPILtJclVeZAn@7R^_B-R{xIajm#jPj(w79%j JnTWpc{{xBWD?R`K diff --git a/artifacts/verification/workspace-request/40x12.txt b/artifacts/verification/workspace-request/40x12.txt index aff9cb47..477fcf1d 100644 --- a/artifacts/verification/workspace-request/40x12.txt +++ b/artifacts/verification/workspace-request/40x12.txt @@ -1,9 +1,9 @@ workspace · cloud sandbox - blank = provider default + blank = repository root repo url > github.com/tangle-network/braid git ref > main - start in -> /workspace/src + start in (repo-relative) +> src tab/enter continues · shift-tab · esc diff --git a/artifacts/verification/workspace-request/80x24-workspace-request-keyboard.gif b/artifacts/verification/workspace-request/80x24-workspace-request-keyboard.gif index 0254b6cc9d1e2664eb8473d575243950936ce575..d8bec3182a056df9a9dc0e38ba98ddd03c3213d9 100644 GIT binary patch delta 49334 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 XN$2aO&UYkT;!0go&l@A*fX@E~Ik_!3 delta 81438 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

    R*O!`l_iOEkCOQt|>)@eBHx8W33D?}Gxs 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%0D)kD^=1 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

    ${nmd%fbZ|3QYco|mHOX=16olj+On39kP%g~<) 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 diff --git a/artifacts/verification/workspace-request/80x24.png b/artifacts/verification/workspace-request/80x24.png index f06bb003db6b1cea42dc7c3260794555bc77886e..9b7e9bb81ddc6267469fcea8da80028f8eb88b95 100644 GIT binary patch literal 7249 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 literal 7547 zcmdsb_di@++r31J7(x<8LPQr~^cF<#(aSJ;MvY-cucJnb-g}Ga3`UD?)M!EUIz){U z1VQw7lIOmk_xt(&3Ge>toU_k9Yp?5E*Sgj@q3Wvg#DtWDczAfkiV8BCczF0gJiMD+ z1o*fspk?Ae6SQUunksmBp3Hc7et~#+XShp#8+dpwTzGg}Z}9MhQ}FO8>@ylQUf~vc zs4HvBQc%%Z2cVN%uVKN}uU?yps#y4DPik3(`Q^;0n+M0$pN5xjNogSrozjqL!;zJH zj36P$n08~=Y%nY;6t(f3ON`6)c~84Hi3xp$F*zWY;J7O%`v33V6* z5g%N%LPf*un%MVJ*3i-q6^ip+b)#OV^>EvxH9``D;Yd|c$f>QW| zWN4W{W;RF(IZZdecopq8EbRP#VHp;1A0}2FE&*{4K2d6Vmf)B?`sW;0c76gPvXD0j z1{N-JxK~hguB}Uut8c8VlCG$f3fwhB%it|LkFbuht+0d=)Y`+u%8ge@l9NxAl}nIY zP{P>4nNL_oOh(PX%)vV(jaxv%_kD(@o|VjNu%f!5l!CU4PYfHEkfFJwD%jL3I7Q#o zUhj>a`@4h}9Q=Z!a!Q&emI$98d%rYw45Vb0UW!N>zOig*Zm+6sP}PLw7nPM()U>pH z9-o{KdLOm6v9qwW{vo$WL|j%^|4m4E?9}WxZ~tI~gWJaTPYY{AZ38APE7#E#X>IF> z>Fixu|4~?q?&=vF9-R^rmF^!Lb@TKSlTwI@PYsKTe`5~w3k==bIZRB=T3XvuQq``g zs`vB>h>A^`ng4cueO-G~;ZMTeFjbP58T~e0j>etbbyif7y}Ly~b3=e^j-5%Ju@I}P zcANi>E13Taqj=?xRc|foN>0A9xQAX)q|Q($(fBlHsBG$L{#&Cg1n*wC14N;d06_Gr zGsHu!PKcpPrH+Kkqm$)miZjDxfqT~B0$uM^&&#M1@gz;`xZFXCxWV9aVRWm(`v`+w zMK#Q&F<8v3qYEm%*PEauh|S9KS-foFhxMnU2@Ei5$1*R6BCE#nH_i4U0RSv9_Kftq z{{s?LZ7kQC1r5z>8e|=KJ8xvj$aGY}%F8#~j))NBxT~%9D8pp2)RJ##x=$*o+rIWk zQ1|MKp-$`NsfEwyfs~H96Uz+C2)jgH@cWwcW+tJyOVhDuI}IvY3xPohY+$!hNl9!h znhX22jKo2%|NAdR*V7!IYa0IAF!@aD=tz5J)xEvLNXez-p-8RF7moI#Vw0!ctHl@x zW&(2H*yp03G0^?4ogusGz{h*9xUCObNbd2k%87{~P|acU0;XHPGz3cz9Dk~$ygE%f zmz}l$-WQ>`(&Atsru#z}O!sYO4ZLEqZ89 z6I7q(<4vb}B0#Cv*Phs8?mmx?hwi@FaH5A##&(;mI;I~Cb*|9s0;qv?YMBCqR4Tl? zPkC);GuL5s6&!BLY5QnGz&VV&oCH3r8}9tw_{d!UI?)yxM;P7{Z^-T}sJtxaj2BnGduwM9$7_&0^dks(e}6G$q*e!Pj!D@_)rw7%z&+{$1T0W_i$-QG3n5w4~n7b#liAb4r zfk4)dnk?2+m|u4C?z$9kM@nV)ifCOU!1K<-=vZmFVwYGnX`L`hRGRa)=q5u831jmx z`?%H3=*#8yrMjpSvAu!E+z!(T2CH9;=baY=HU-sE=9SV5np2#o?5}lR+Ip}5UR3rP z2ZaBi+cdKa_d)#0NI@vHe?UwuM$9t;yv;C{(KKO2FU@;??!~~ge~%}|4~_Sb6lW{` zGrsBf^$`Ot8_MV4#WTAZrL$Y8#niP|f*2AcV^V**!M7nLW29Qh&0ne^L8L(ete{cH z?^Z4b`ZWFTf^=&a>s5cLL8g5yA!H36*kopqy{w}n1$j>vt48<|q~EjAc|R_HU{zBO zw3m7iwk8RAWq>Y9?$<$qKpZCg1{{g?9>ZXr_1^sNN(0Ft2)m4{WDcw5K9X+r>GOJh zZE(+Plb?4k(iU6l>n-8tYV3-|JX5@!qk5<4q00al7H*6-+&9~tNI=Mid|+#eqV!bZ zF_20i$sF#fSjK7t0oR&cre$W0 zIqc3BzefnE)4U2Rh!Q}5Smbd9s7$x1FkEUaklG;Uub(6khEgJbG5tg zJWZAqxUIC-$-)1v4mfc1WDPu-rC+5f3_=Y(1lH?28uF{otpjX8TC6X6%TqA>fq^HPBU#rR(5wLF&UX6d1vPaZY_=(k9)*o7kTZ>;eS zd4)a_*7rIU&6UXnvaek&YG*ty8KI2Ir|35+CO@Aio>WNRN#bOOEZA7E0ZV(fE*GfZ zVM<1+`fd*%Ky8XqJtowFve+A^Xj$Ul-)5`FXa58uL^f`Su;ZpKOW%a)o?OntX=t!4 zQh(F(oGKfu{PD|#X#l3*kbSk6Ll`}Wu_EYLR`I5WG(1O1?-et#<#%>Cf0A}_eGc_6 zZELJ6a^!6WcMnPpuH{0x|rEV=GR?i0F2A7StHY>q-N}7gNAK$rd7`TABN=k?Y`DEYY4-D{Ks4#j zZjv$U;bN$8h9&Xt8u3oQs`FaE|4C+4#NdH= z9l_m`;L&NsQA3cvGuy<>P{)Eayn3qX~!)-=9vgZ z?Kf-B32^$yJ4Fgq;D+9$jJN%qS6f*%6G(poTzcJc^9A$8ZjGYA*vdplUS?&hvkHW^ zJ1}>SF`e5Q4rE*~NU7n~foxpxO27!@>;6Jd&)D8%-iaUw3SSe&Q2yGO{EID;uA)$w zS;;#Uh$Epb`|&324d@LNndm?|53G2oikfmkE5_u=4*x4 zCb*jx(&9+0lxb`RRj5S4sn-Z{WGSFx1~~`EGlrDcZNkEJe_O0pD+YXw&vJ+E+qTnh z_YTHxXckzl+oojqbxBmNTe#WD&->ou{70-796KgD81egzg~X9(+jqzNAL>%fyBs!&Gkg}AqjQ?sBKU`XTvm{iO826QB*U> ziSw7x416a>9asX|>dY3!nMl$^5Psu1d_jr$_++=Aaust%Ri5^m5fJ`!8+&xSI*Qp# z+6CVEabq;Sg764Dxmyl|D!D>>Z@idYH%QcJu(`N>8F}F4_6briMW!P^JD$mo>P>V? z$o&8I(PX&WV&3`^J#}T;r0U5tXSBB)mWA60Gk@4FE)?*RNbv_i{Na(ZN(IOUT^b0- zpEP!ATz#sBQ-7kp(|ROdn15h))CjVXghKyBbeE%w$97C{h(KfOa7x$ zYSw1;10l)BES7u45%6%;kDf#T@7friIx<~(Rs(9A2m{YCAMPJwAZ5zfJl$}HE2)l& zW&1xb9Vtl2KU3M+u`Bl&$lR&8oHIAq0kax3(fA~Y*-;xQmHp|Bok8G4dtJFn{CL7t z+H3gNjC*`(cUyHqA2!2&03Otx)37xArjHSS-xr%p*Exl{>-y9_Y%_s?hZATV_lze|x|`u(%9BT*d-9VOvN1yzKZgYD#lCVlSQ{nY6td_Cst z_vF9=ChSbaCA@)uL@{AAm}^GyuLdCCfYQP8_`}Rkl+Z%S(BPmVJx#lRcEM{EFwCwg zp=Po-WIGp+UbSwny0(~zuTS!HCT`lVJ_|^2XwW0!`Gm-x(QK*2G>J+y`jffL^htcu z?kdSn_ed2n^2X1j`d3ZARdp9`Y^W^E-*hwfb)&5Rw0wQno%4@dJIa3=^Y9D^lwGHI z??3)A-i)ze1HAzP3Jb}lnuIBmX~twe%?(jZ7&3)2_4Iy+`IA}r`j_>f392BFK5kr# zVHFXQi-tZhuSCb0;d%zxl`!mCCq2OpHlaIEe{GAx4;$Q|cbsqZ|K41ZcLHQSlvfA| zN_-lCmME!;H|r|I;i3PtSP$wL!T3TLgtI)Wj{|RO&R)|C-QjYNd5W(f<4E)`8N4^> z#(74eHW!>(_1m5tDI4y&9)&@{S|(Pm7k+vl@{??dn;y5#NAK>B&pVjDkyQv=VZwkty8);ap) zAqqS2EnhpgI^?hRV%Tw3|MaH~#@8X;#z#giuR3l{rShxnt_K<* zsDa&s2YW_=x666u>vomB0(3&U|C$zoj+^KXdNW@GM5JKosG=hQ;J@*}{p3rKKEuyz z?ON2`v0#AukGsu4Z{(G@RO{&MR#4EdU)#;hDy&C86x?g*?|*8O`@r%x9Xo-h>T&<+ z%$SMz2Vf`QUE*nO7u>VFwNN2a9u@st{#-=VpvFEq@cjz}Eq7p$e; zOUujBV=di(sxkLo{Anj)xP5Lx^}GN5QlVvXfn8!By=kKb`P~YUqAx#=G*Cj36jkr2s&bbA9(vt#_^CFlFiWqI%0!6JsYe%S;&mFy$n5B>%9B? zQhfZdX)k;0%>L8GO774YjqgEUp(G?j=sfl5a<-fILHGTJ9rLMVnvAoHdc*#UxrRd{ zliHG&VK48k4#gvy5sc7?%TzdFFN_u8?sTEXjg zDCIV6`B39K<{h=j;^_e@P5v^^E=$ezDsR%4=3-{yv}XFM6BB@0IF~Ty*&6n>0{s%gRN@uB`ciLO6dv`pkD z4K)vGpKyN1*kSB7E|j9at2J|bAB*fUw{bc*ACBu2JOVtcu__)$09 ztUW5zs%ilfv%_wMIc&cTHDTv4eh52u`O>QIl`-wNFs3~)ar1IF{X~S5ao*AQWRW(Y zy$_RdzTRXf5*^(RwJH4-*b}#NGk5l`f&YK=l7>Q@8$Fp!tdlT)eCC(qGS2PY~i^M~5FSn+H ze%c@1CJ_h6-ZCtRH`1-RfvdNVcF++)oci8^-Z0eqTTB1`6YwKTil;ht3OHTcwPF3; zS6SM3o>|a!cDN3#KlE9jX>*}p64YL~)1kF}-nf#;ejVnP= zP6oKCiMJOeVSzz9WLMKKq5g=j3zJ|Jxt>}whjEp2syaSY!{JA9+y@Djcu&K_CJKtF zBD=Q7^U9CXIz>G=^Cm zZHHfme!jn#?=sV0c2rsiF6`5o_)l9Xqb`f&0i|V?R@e%rU16F0 z#prP{y~9Hbfh{!GkyS-Tw&>*%ehYOhhh?2Pv&N}+y}q-PKw}~*`mC3mU?#wkv!{Do7RNH#=&_C+%4%;L5|Sn0XFx=&?muxv-4f{%b_OkVUlF4EL#+oI%x10hCN5?`w~ z*99*HHItHpUpzp?0)M=PD?bFv5-*)=0)Djw@k2U=WlSO3#cqMZt8rk=sK(dAPR(x5 zdw|mY`uNxj+h4SbG=s5bq%e@XiYPV8wis@EcvnjHYK!t{K?#nqpQ>j*`8NAyEo5Cr zP9L3H%dH4`zupa=Ioff2%WkK>Cj*wbYXb>UAPTP~9(*!ax)xU~Zf7>|g`eDacjvux zrEy0G?A5M0qbQZA;-tJcF3eS~;K@FU^}oLHs)nwv@}+>%AfB;1cXPXFm2=0bOu0laa5^c}I75h-YTi zwrK&65eD5MMI(U=mZyMc!k=KpzUG-bHuPZne@w;y(Zlk0*LR~!NR|W1sM~N9Nt|UN j&SrLSxCO!)&&t}8!^y^4dmT0ThrOb#s!X}mn|J>M=^63p diff --git a/artifacts/verification/workspace-request/80x24.txt b/artifacts/verification/workspace-request/80x24.txt index b06ca172..40ec987b 100644 --- a/artifacts/verification/workspace-request/80x24.txt +++ b/artifacts/verification/workspace-request/80x24.txt @@ -6,11 +6,11 @@ workspace · cloud sandbox - blank = provider default + blank = repository root repo url > https://github.com/tangle-network/braid git ref > main - start in - > /workspace/src + start in (repo-relative) + > src tab/enter continues · shift-tab · esc diff --git a/artifacts/verification/workspace-request/capture-manifest.json b/artifacts/verification/workspace-request/capture-manifest.json index e92ec6ec..6ca1c52f 100644 --- a/artifacts/verification/workspace-request/capture-manifest.json +++ b/artifacts/verification/workspace-request/capture-manifest.json @@ -1,11 +1,11 @@ { "schemaVersion": 1, - "generatedAt": "2026-08-31T01:54:23.433Z", + "generatedAt": "2026-08-31T03:44:27.678Z", "command": "pnpm capture:workspace", "binary": "clean npm install from generated tarball", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "fc8f2ff2dca42436c226afa643c0a70a347d0427da1d2fc02b15451d96bca947", + "tarballSha256": "5117dfb4026d6afbe6e10a2f8c145cef8655d920e54b9a55bdc96938d3349721", "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { @@ -34,70 +34,70 @@ "artifacts": [ { "path": "40x12.txt", - "sha256": "6afe2c78a729cc35958372d31b94a746f3e0c7894e45e31bad80efb8be7f3df0", + "sha256": "b05417e77e062602fa7867406d22c762da06bfcea66f6c58eab2bf1411ca1006", "kind": "terminal-frame", "columns": 40, "rows": 12 }, { "path": "40x12.png", - "sha256": "e57f1354ef9012b66fe9ad55802d063aeb60e85dc07f1c0329db2099afdd651f", + "sha256": "91791c071964bb71b46b6c96f10ce287abb748e14a87c3e24eb4f5fa9d68a0d2", "kind": "png", "columns": 40, "rows": 12 }, { "path": "80x24.txt", - "sha256": "adf851a1d104dc9ad09cf0042fcd85e44759d070e739221bcb5dffa4fafeccf0", + "sha256": "4c726496080628ef622a7af3ae00257c681395828b389770a2161ed32c77a0cc", "kind": "terminal-frame", "columns": 80, "rows": 24 }, { "path": "80x24.png", - "sha256": "642609a750b020afb669dffffe25c22cd353eac927bc3d414cd9e1532ce5ac76", + "sha256": "dfcb89e95fe9a060b8f439e3a4773529cb01897ead06a04da80c6df13320e7ca", "kind": "png", "columns": 80, "rows": 24 }, { "path": "120x40.txt", - "sha256": "4fe2f084af450526506e1ac12397825bfec997733dd40b382e7c3230f868a13a", + "sha256": "05a9f72c1a0ffe1c551436c88bd29b6e3d8a56c54a845a15253fb31716245a7d", "kind": "terminal-frame", "columns": 120, "rows": 40 }, { "path": "120x40.png", - "sha256": "ac77458d39b17fcb5d8f2d239e69c1e82597928a81c5946f1691279a1d34de15", + "sha256": "f9771d51c800bacf5d21ae3a519c022043f42d89d621a1e9784b3c9b491131ad", "kind": "png", "columns": 120, "rows": 40 }, { "path": "200x60.txt", - "sha256": "cfc88ea6498373c6441bcb98c0fb1258d8568a0c59a74c8f54d9c036a416de2c", + "sha256": "31f078e77d8491153d8ad71a329556c2ddceb6493e5c695bcef6e2ba8299bef8", "kind": "terminal-frame", "columns": 200, "rows": 60 }, { "path": "200x60.png", - "sha256": "6fb83480e7deabf67a0208c9e436d61251be73cb423a2d925142649470b561f9", + "sha256": "953ceff671d8ef284059962ea4cfbdd95a3dd0d7d39c3a7ff8f5c81fd7269dc7", "kind": "png", "columns": 200, "rows": 60 }, { "path": "raw/workspace-request-keyboard.cast", - "sha256": "45231fca16e468bc85703610816bb5896440025d15bd819e07d6397194526e67", + "sha256": "529e17ac03492c2f7b649d3b989172b3f60ed5168a05ff63b3a23f5ced0b3884", "kind": "keyboard-asciicast", "columns": 80, "rows": 24 }, { "path": "80x24-workspace-request-keyboard.gif", - "sha256": "693098882e81a70a72ff250c145d0e4d5a8a8c699fae408b2ec6692550a520e3", + "sha256": "2f8a550ffcb0af4ef63024bac15a00bd81665b5b594e360d20e63fc1438b6c4b", "kind": "keyboard-flow", "columns": 80, "rows": 24 diff --git a/scripts/capture-workspace-request.mjs b/scripts/capture-workspace-request.mjs index 93044d7d..bdbd4ed0 100644 --- a/scripts/capture-workspace-request.mjs +++ b/scripts/capture-workspace-request.mjs @@ -139,13 +139,17 @@ async function spawnTerminal(binary, columns, rows, root, endpoint) { } delete environment.NO_COLOR delete environment.FORCE_COLOR - const session = pty.spawn(process.execPath, [binary, '--workspace', workspace], { - name: 'xterm-256color', - cols: columns, - rows, - cwd: workspace, - env: environment, - }) + const session = pty.spawn( + process.execPath, + [binary, '--workspace', workspace, '--profile', '.braid/profile.json'], + { + name: 'xterm-256color', + cols: columns, + rows, + cwd: workspace, + env: environment, + }, + ) const startedAt = performance.now() const events = [] let output = '' diff --git a/src/views/tui/configuration-wizard-presentation.ts b/src/views/tui/configuration-wizard-presentation.ts index 0d46fb88..87f7498f 100644 --- a/src/views/tui/configuration-wizard-presentation.ts +++ b/src/views/tui/configuration-wizard-presentation.ts @@ -1,5 +1,4 @@ import type { SelectItem } from '@earendil-works/pi-tui' -import type { WorkspaceRequest } from '@tangle-network/agent-interface' import type { ConfigurationEffectiveValues, ConfigurationSelection, @@ -8,6 +7,10 @@ import type { } from '../../app/configuration-session.js' import { sanitizeTerminalText } from '../shared/sanitize.js' import { shortDigest } from './configuration-presenters.js' +import { + compactWorkspaceRequestSummary, + workspaceRequestSummary, +} from './workspace-request-presentation.js' export const BACK_TO_PROFILE = '__braid_back_profile__' export const BACK_TO_CONNECTION = '__braid_back_connection__' @@ -257,38 +260,6 @@ function withWorkspaceRequest( } } -function workspaceRequestSummary( - workspace: Readonly | undefined, -): readonly string[] { - if (workspace === undefined) return [] - const values = [ - workspace.environment === undefined ? undefined : `environment ${workspace.environment}`, - workspace.image === undefined ? undefined : `image ${workspace.image}`, - workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, - workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, - workspace.cwd === undefined ? undefined : `start in repo ${workspace.cwd}`, - ].filter((value): value is string => value !== undefined) - return values.length === 0 - ? ['cloud workspace: provider defaults'] - : [`cloud workspace · ${values.join(' · ')}`] -} - -function compactWorkspaceRequestSummary( - workspace: Readonly | undefined, -): readonly string[] { - if (workspace === undefined) return [] - const values = [ - workspace.environment === undefined ? undefined : `env ${workspace.environment}`, - workspace.image === undefined ? undefined : `image ${workspace.image}`, - workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, - workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, - workspace.cwd === undefined ? undefined : `start in repo ${workspace.cwd}`, - ].filter((value): value is string => value !== undefined) - return [ - `cloud: ${values.length > 0 ? values.map((value) => shortValue(value, 18)).join(' · ') : 'defaults'}`, - ] -} - function compactDigest(value: string): string { const digest = shortDigest(value).replace(/^sha256:/u, '') return digest.length <= 10 ? digest : `${digest.slice(0, 5)}…${digest.slice(-3)}` diff --git a/src/views/tui/workspace-request-presentation.ts b/src/views/tui/workspace-request-presentation.ts new file mode 100644 index 00000000..611a02a5 --- /dev/null +++ b/src/views/tui/workspace-request-presentation.ts @@ -0,0 +1,40 @@ +import type { WorkspaceRequest } from '@tangle-network/agent-interface' +import { sanitizeTerminalText } from '../shared/sanitize.js' + +export function workspaceRequestSummary( + workspace: Readonly | undefined, +): readonly string[] { + if (workspace === undefined) return [] + const values = [ + workspace.environment === undefined ? undefined : `environment ${workspace.environment}`, + workspace.image === undefined ? undefined : `image ${workspace.image}`, + workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, + workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, + workspace.cwd === undefined ? undefined : `start in repo ${workspace.cwd}`, + ].filter((value): value is string => value !== undefined) + return values.length === 0 + ? ['cloud workspace: provider defaults'] + : [`cloud workspace · ${values.join(' · ')}`] +} + +export function compactWorkspaceRequestSummary( + workspace: Readonly | undefined, +): readonly string[] { + if (workspace === undefined) return [] + const values = [ + workspace.environment === undefined ? undefined : `env ${workspace.environment}`, + workspace.image === undefined ? undefined : `image ${workspace.image}`, + workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, + workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, + workspace.cwd === undefined ? undefined : `start in repo ${workspace.cwd}`, + ].filter((value): value is string => value !== undefined) + return [ + `cloud: ${values.length > 0 ? values.map((value) => shortValue(value, 18)).join(' · ') : 'defaults'}`, + ] +} + +function shortValue(value: string, limit: number): string { + const sanitized = sanitizeTerminalText(value) + if (sanitized.length <= limit) return sanitized + return `${sanitized.slice(0, Math.max(1, limit - 4))}…${sanitized.slice(-3)}` +} diff --git a/test/configuration-wizard.test.ts b/test/configuration-wizard.test.ts index aa9d318a..09fb31e6 100644 --- a/test/configuration-wizard.test.ts +++ b/test/configuration-wizard.test.ts @@ -445,6 +445,7 @@ test('cloud workspace setup accepts edits, reports invalid refs, and preserves b wizard.handleInput('https://github.com/tangle-network/braid') wizard.handleInput('\t') wizard.handleInput('\t') + wizard.handleInput('src') wizard.handleInput('\r') const review = wizard.render(80).join('\n') assert.match(review, /cloud workspace/u) From 6005323de3a3ed56ae0246d1ab21e14688d21282 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 22:24:18 -0600 Subject: [PATCH 131/136] fix(workspace): remove stale contract wording --- src/domain/workspace-request.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/domain/workspace-request.ts b/src/domain/workspace-request.ts index 7ee4f055..683e7a77 100644 --- a/src/domain/workspace-request.ts +++ b/src/domain/workspace-request.ts @@ -4,7 +4,7 @@ import { assertPublicUrl } from './invariants-base.js' export type { WorkspaceRequest } -/** Validate and snapshot the canonical provider-neutral workspace request. */ +/** Validate and snapshot the shared workspace request. */ export function snapshotWorkspaceRequest( request: WorkspaceRequest | undefined, ): Readonly | undefined { From e73fa82ba3c34831e43a44935f47460510216053 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 23:22:30 -0600 Subject: [PATCH 132/136] fix(workspace): release fork before checkpoint --- src/app/conversation-branch-effects.ts | 32 +++++++++++++----------- test/conversation-branch-effects.test.ts | 25 ++++++++++++++++-- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/app/conversation-branch-effects.ts b/src/app/conversation-branch-effects.ts index 9c55a52e..a5f45c61 100644 --- a/src/app/conversation-branch-effects.ts +++ b/src/app/conversation-branch-effects.ts @@ -158,21 +158,8 @@ export async function cleanupWorkspaceFork( if (!hasWorkspaceBranching(branching)) throw new AppError('CAPABILITY_UNAVAILABLE', 'Workspace cleanup is unavailable') - const checkpointOutcome = - checkpoint === undefined - ? 'not_requested' - : previous?.checkpoint === 'deleted' || previous?.checkpoint === 'already_absent' - ? previous.checkpoint - : await cleanupCheckpoint( - host, - branching, - derivedOperationId(String(operationId), 'checkpoint-cleanup'), - checkpoint, - ) - await updateOperation(host, operationId, digest, { - status: 'pending', - result: { checkpoint: checkpointOutcome, environment: 'not_requested' }, - }) + // Destroy the dependent fork before its source checkpoint. + // Providers may refuse checkpoint deletion while any fork still references it. const environmentOutcome = environment === undefined ? 'not_requested' @@ -184,6 +171,21 @@ export async function cleanupWorkspaceFork( derivedOperationId(String(operationId), 'fork-cleanup'), environment, ) + await updateOperation(host, operationId, digest, { + status: 'pending', + result: { checkpoint: 'not_requested', environment: environmentOutcome }, + }) + const checkpointOutcome = + checkpoint === undefined + ? 'not_requested' + : previous?.checkpoint === 'deleted' || previous?.checkpoint === 'already_absent' + ? previous.checkpoint + : await cleanupCheckpoint( + host, + branching, + derivedOperationId(String(operationId), 'checkpoint-cleanup'), + checkpoint, + ) const result: WorkspaceForkCleanupResult = { checkpoint: checkpointOutcome, environment: environmentOutcome, diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts index 19619dcb..16b2fd27 100644 --- a/test/conversation-branch-effects.test.ts +++ b/test/conversation-branch-effects.test.ts @@ -141,7 +141,10 @@ function contextResult(request: ContextTransferRequest): ContextTransferResult { } function workspaceProvider( - options: { readonly beforeFork?: (request: WorkspaceForkRequest) => void } = {}, + options: { + readonly beforeFork?: (request: WorkspaceForkRequest) => void + readonly requireForkBeforeCheckpoint?: boolean + } = {}, ): { readonly branching: NonNullable readonly state: WorkspaceProviderState @@ -185,6 +188,20 @@ function workspaceProvider( targetId: request.targetId, operationId: request.operationId, }) + if (options.requireForkBeforeCheckpoint && state.forks.size > 0) { + return { + operationId: request.operationId, + kind: 'checkpoint' as const, + targetId: request.targetId, + provider: request.provider, + requestDigest: request.requestDigest, + status: 'in_use' as const, + blockingTargetIds: [...state.forks.values()].map( + (fork) => fork.environment.environmentId, + ), + message: 'Checkpoint is still referenced by a fork', + } + } return { operationId: request.operationId, kind: 'checkpoint' as const, @@ -253,6 +270,9 @@ function workspaceProvider( targetId: request.targetId, operationId: request.operationId, }) + for (const [key, fork] of state.forks) { + if (fork.environment.environmentId === request.targetId) state.forks.delete(key) + } return { operationId: request.operationId, kind: 'fork' as const, @@ -760,6 +780,7 @@ test('workspace fork uses exact provider operations, isolates destination, and c | ReturnType['state']>['operations'][number] | undefined const provider = workspaceProvider({ + requireForkBeforeCheckpoint: true, beforeFork: () => { operationAtFork = app ?.state() @@ -857,8 +878,8 @@ test('workspace fork uses exact provider operations, isolates destination, and c assert.deepEqual( provider.state.cleanupRequests.map(({ kind, targetId }) => ({ kind, targetId })), [ - { kind: 'checkpoint', targetId: 'provider-checkpoint-1' }, { kind: 'fork', targetId: 'provider-destination-environment' }, + { kind: 'checkpoint', targetId: 'provider-checkpoint-1' }, ], ) assert.notEqual( From b48402e306530fb1394e38efe2b262aea6f44474 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Sun, 30 Aug 2026 23:30:46 -0600 Subject: [PATCH 133/136] fix(workspace): preserve cleanup progress across restart --- src/app/conversation-branch-effects.ts | 5 +- test/conversation-branch-effects.test.ts | 172 ++++++++++++++++++++++- 2 files changed, 175 insertions(+), 2 deletions(-) diff --git a/src/app/conversation-branch-effects.ts b/src/app/conversation-branch-effects.ts index a5f45c61..3453ef8a 100644 --- a/src/app/conversation-branch-effects.ts +++ b/src/app/conversation-branch-effects.ts @@ -173,7 +173,10 @@ export async function cleanupWorkspaceFork( ) await updateOperation(host, operationId, digest, { status: 'pending', - result: { checkpoint: 'not_requested', environment: environmentOutcome }, + result: { + checkpoint: previous?.checkpoint ?? 'not_requested', + environment: environmentOutcome, + }, }) const checkpointOutcome = checkpoint === undefined diff --git a/test/conversation-branch-effects.test.ts b/test/conversation-branch-effects.test.ts index 16b2fd27..e8499533 100644 --- a/test/conversation-branch-effects.test.ts +++ b/test/conversation-branch-effects.test.ts @@ -15,8 +15,11 @@ import { canonicalAgentProfileDigestHex } from '../src/adapters/agent-interface/ import { createBraidApplication } from '../src/app/composition.js' import { MemoryJournal } from '../src/app/journal.js' import { canonicalDigest } from '../src/domain/canonical.js' -import type { ConnectionRecord } from '../src/domain/entities.js' +import type { BraidEvent, BraidEventEnvelope } from '../src/domain/events.js' +import type { BraidState } from '../src/domain/state.js' +import type { ConnectionRecord, OperationRecord } from '../src/domain/entities.js' import { createConnectionId, createOperationId } from '../src/domain/ids.js' +import { replayEvents } from '../src/domain/reducer.js' import { FixedClock } from '../src/ports/clock.js' import { DEFAULT_RUN_CAPABILITIES, @@ -40,6 +43,40 @@ function deferred(): { return { promise, resolve } } +class CleanupBoundaryCrashJournal extends MemoryJournal { + #operationId: string | undefined + + crashAfterCleanupProgress(operationId: string): void { + this.#operationId = operationId + } + + override append(envelope: BraidEventEnvelope) { + const result = super.append(envelope) + const operation = + envelope.event.kind === 'operation.updated' ? envelope.event.operation : undefined + if ( + this.#operationId !== undefined && + operation?.id === this.#operationId && + operation.result?.environment === 'deleted' + ) { + this.#operationId = undefined + throw new Error('simulated crash between fork and checkpoint cleanup') + } + return result + } +} + +function appendSeededEvent( + journal: MemoryJournal, + state: BraidState, + event: BraidEvent, +): BraidState { + const envelope = journal.envelope(state, event) + const result = journal.append(envelope) + assert.equal(result.appended, true) + return replayEvents(state, [envelope]) +} + interface WorkspaceProviderState { readonly checkpoints: Map< string, @@ -911,6 +948,139 @@ test('workspace fork uses exact provider operations, isolates destination, and c assert.deepEqual(sourceLookups, ['provider-source-environment', 'provider-source-environment']) }) +test('workspace cleanup restarts between fork and checkpoint cleanup without repeating a terminal result', async () => { + const operationId = createOperationId('op-cleanup-workspace-restart-boundary') + const provider = workspaceProvider({ requireForkBeforeCheckpoint: true }) + const execution = executionFor({ + capabilities: branchCapabilities(true), + workspaceBranchingProvider: { + async forEnvironment(sourceEnvironmentId) { + return sourceEnvironmentId === 'provider-source-environment' ? provider.branching : null + }, + }, + }) + const journal = new CleanupBoundaryCrashJournal(new FixedClock(AT)) + const app = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + journal, + }) + await prepareSource(app) + await app.send({ operationId: 'op-source-workspace-restart', text: 'checkpoint source' }) + .completion + const plan = app.conversations.branches.plan({ + operationId: 'op-workspace-restart-fork', + kind: 'workspace', + }) + const branch = await app.conversations.branches.execute({ + operationId: 'op-workspace-restart-fork', + kind: 'workspace', + planDigest: plan.digest, + }) + const checkpoint = app.state().checkpoints[0] + assert(checkpoint) + const destination = app + .state() + .environments.find((environment) => environment.id === branch.environmentId) + assert(destination) + assert.equal(destination.providerEnvironmentId, 'provider-destination-environment') + const cleanupDigest = canonicalDigest({ + command: 'cleanup_workspace_fork', + operationId, + checkpointId: checkpoint.id, + providerCheckpointId: 'provider-checkpoint-1', + environmentId: destination.id, + providerEnvironmentId: destination.providerEnvironmentId, + }) + const cleanupOperation: OperationRecord = { + id: operationId, + kind: 'conversation-fork', + requestDigest: cleanupDigest, + status: 'pending', + createdAt: AT, + updatedAt: AT, + } + let seededState = app.state() + seededState = appendSeededEvent(journal, seededState, { + kind: 'operation.requested', + operation: cleanupOperation, + }) + seededState = appendSeededEvent(journal, seededState, { + kind: 'checkpoint.upserted', + checkpoint: { ...checkpoint, status: 'deleted' }, + }) + appendSeededEvent(journal, seededState, { + kind: 'operation.updated', + operation: { + ...cleanupOperation, + result: { checkpoint: 'deleted', environment: 'not_requested' }, + updatedAt: AT, + }, + }) + + journal.crashAfterCleanupProgress(String(operationId)) + const crashed = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + journal, + }) + await assert.rejects( + () => + crashed.conversations.branches.cleanup({ + operationId: String(operationId), + checkpointId: String(checkpoint.id), + environmentId: String(destination.id), + }), + /simulated crash between fork and checkpoint cleanup/u, + ) + const progress = journal + .all() + .map(({ event }) => event) + .filter( + (event) => event.kind === 'operation.updated' && event.operation.id === String(operationId), + ) + .at(-1) + assert(progress) + assert.equal(progress.kind, 'operation.updated') + assert.deepEqual(progress.operation.result, { + checkpoint: 'deleted', + environment: 'deleted', + }) + assert.deepEqual( + crashed.state().operations.find((operation) => operation.id === operationId)?.result, + { + checkpoint: 'deleted', + environment: 'not_requested', + }, + ) + + const restarted = createBraidApplication({ + fixture: 'deterministic', + execution, + clock: new FixedClock(AT), + journal, + }) + const cleanup = await restarted.conversations.branches.cleanup({ + operationId: String(operationId), + checkpointId: String(checkpoint.id), + environmentId: String(destination.id), + }) + assert.deepEqual(cleanup, { checkpoint: 'deleted', environment: 'deleted' }) + assert.equal(provider.state.cleanupRequests.length, 1) + assert.deepEqual( + provider.state.cleanupRequests.map(({ kind, targetId }) => ({ kind, targetId })), + [{ kind: 'fork', targetId: 'provider-destination-environment' }], + ) + assert.equal(typeof provider.state.cleanupRequests[0]?.operationId, 'string') + assert.notEqual(provider.state.cleanupRequests[0]?.operationId, String(operationId)) + assert.equal( + restarted.state().operations.find((operation) => operation.id === operationId)?.status, + 'acknowledged', + ) +}) + test('confidential workspace fork records verification only after canonical attestation checks', async () => { const provider = workspaceProvider() const execution = executionFor({ From 6a142a4e53083999cb2a092e73a0f3ed11373af0 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Mon, 31 Aug 2026 00:42:56 -0600 Subject: [PATCH 134/136] fix(workspace): adapt providers to explicit cwd bases --- .../verification/workspace-request/120x40.png | Bin 7612 -> 7612 bytes .../verification/workspace-request/200x60.png | Bin 9320 -> 9320 bytes .../verification/workspace-request/40x12.png | Bin 6262 -> 6262 bytes .../80x24-workspace-request-keyboard.gif | Bin 53664 -> 50456 bytes .../verification/workspace-request/80x24.png | Bin 7249 -> 7249 bytes .../workspace-request/capture-manifest.json | 16 +-- docs/04-runtime-contracts.md | 28 +++-- docs/components/profiles-and-connections.md | 10 +- package.json | 8 +- pnpm-lock.yaml | 100 ++++++++++-------- pnpm-workspace.yaml | 10 +- scripts/live-required/workspace-request.mjs | 5 +- .../runtime/cli-bridge-retained-run.ts | 13 ++- .../production-tangle-sandbox-backend.ts | 25 ++++- src/bin/production-setup-validation.ts | 2 +- src/domain/workspace-request.ts | 2 +- .../tui/configuration-wizard-presentation.ts | 4 +- src/views/tui/workspace-request-form.ts | 8 +- .../tui/workspace-request-presentation.ts | 8 +- test/cli-bridge-interactions.test.ts | 24 +++++ test/configuration-session.test.ts | 8 +- test/configuration-wizard.test.ts | 2 +- test/interactive-execution-adapters.test.ts | 2 +- test/production-composition.test.ts | 4 +- test/tangle-live07-wiring.test.mjs | 17 +-- test/tangle-retained-lifecycle.test.ts | 34 ++++++ test/workspace-request.test.ts | 30 ++++-- 27 files changed, 248 insertions(+), 112 deletions(-) diff --git a/artifacts/verification/workspace-request/120x40.png b/artifacts/verification/workspace-request/120x40.png index 3b5e797c79158640a1d8c45faac5800be4854cf4..2de6201cba12470fd6d3a29f8c0e0b59a5433f52 100644 GIT binary patch delta 20 ccmdmEy~ldPV@7s14uMIJDkg1y#dt{?09p+Qu>b%7 delta 20 ccmdmEy~ldPV@7sn9Z4D4$JLu(Fhv3tv9xR(DFy2rC09rQ)6#xJL delta 20 ccmaFi@xo(6CnGzvj#R72rh}U&Fy2rC09j=SH2?qr diff --git a/artifacts/verification/workspace-request/40x12.png b/artifacts/verification/workspace-request/40x12.png index 83ce89b9bb6d9c8a12cee3e1649a1cfecc890212..92b12f96beec71f4e0e02fcd9915cc5d65900938 100644 GIT binary patch delta 20 bcmexn@XcUD2s1ky2k*xxBHo*$nWaSmR1pU2 delta 20 ccmexn@XcUD2s1mgj`;7T=V~@bGfRsC09tzo%m4rY diff --git a/artifacts/verification/workspace-request/80x24-workspace-request-keyboard.gif b/artifacts/verification/workspace-request/80x24-workspace-request-keyboard.gif index d8bec3182a056df9a9dc0e38ba98ddd03c3213d9..71f66a819ad8114f7645c7b4ec180f7c4b9588f4 100644 GIT binary patch delta 46305 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

    <|0#tI0D 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 delta 20 ccmca;anWK!B@;WdjzqT9<+qy~m@Y~J08^$1@Bjb+ diff --git a/artifacts/verification/workspace-request/capture-manifest.json b/artifacts/verification/workspace-request/capture-manifest.json index 6ca1c52f..ba8597f6 100644 --- a/artifacts/verification/workspace-request/capture-manifest.json +++ b/artifacts/verification/workspace-request/capture-manifest.json @@ -1,11 +1,11 @@ { "schemaVersion": 1, - "generatedAt": "2026-08-31T03:44:27.678Z", + "generatedAt": "2026-08-31T06:08:19.409Z", "command": "pnpm capture:workspace", "binary": "clean npm install from generated tarball", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", "tarball": "tangle-network-braid-0.3.0.tgz", - "tarballSha256": "5117dfb4026d6afbe6e10a2f8c145cef8655d920e54b9a55bdc96938d3349721", + "tarballSha256": "6257b85c8741d2813bf2a082e262028ae0a38ee37f57e6d53ceff7c0a583bf5f", "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { @@ -41,7 +41,7 @@ }, { "path": "40x12.png", - "sha256": "91791c071964bb71b46b6c96f10ce287abb748e14a87c3e24eb4f5fa9d68a0d2", + "sha256": "8052cfb33124b5abfe9edb9c2942e9ca610191c92a3aba9106b8b95eb47e52c8", "kind": "png", "columns": 40, "rows": 12 @@ -55,7 +55,7 @@ }, { "path": "80x24.png", - "sha256": "dfcb89e95fe9a060b8f439e3a4773529cb01897ead06a04da80c6df13320e7ca", + "sha256": "31ae68ba860e5a09c6edfb86e77573a61f0180bd0d074718c3f7ee338dbac68e", "kind": "png", "columns": 80, "rows": 24 @@ -69,7 +69,7 @@ }, { "path": "120x40.png", - "sha256": "f9771d51c800bacf5d21ae3a519c022043f42d89d621a1e9784b3c9b491131ad", + "sha256": "a2916dc63aab04d4bb34ccca42cb022e68482807b4b4bfe37b3c84d0562cb8d5", "kind": "png", "columns": 120, "rows": 40 @@ -83,21 +83,21 @@ }, { "path": "200x60.png", - "sha256": "953ceff671d8ef284059962ea4cfbdd95a3dd0d7d39c3a7ff8f5c81fd7269dc7", + "sha256": "28cf20ecbc7faa762f7529eddbeb7d301fcb30b748ff35f8ec6fa03249d6347d", "kind": "png", "columns": 200, "rows": 60 }, { "path": "raw/workspace-request-keyboard.cast", - "sha256": "529e17ac03492c2f7b649d3b989172b3f60ed5168a05ff63b3a23f5ced0b3884", + "sha256": "f95f760a479135c7672beb0990c99158028b4821f4b236e8420d5956d3c5fce9", "kind": "keyboard-asciicast", "columns": 80, "rows": 24 }, { "path": "80x24-workspace-request-keyboard.gif", - "sha256": "2f8a550ffcb0af4ef63024bac15a00bd81665b5b594e360d20e63fc1438b6c4b", + "sha256": "efd0abd6545aded478f5b6146dc0173647d2c11153cae64b20eadac38d08c7d3", "kind": "keyboard-flow", "columns": 80, "rows": 24 diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index 9bd3886d..9bdcac91 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -10,24 +10,32 @@ When a current package blocks a real Braid flow, Braid records the unavailable a ## Evidence baseline -The following published versions were resolved in this worktree, and their installed manifests, declarations, and implementations were inspected directly on 2026-08-29. +The following published versions were resolved in this worktree, and their installed manifests, declarations, and implementations were inspected directly on 2026-08-31. | Package | Installed version | Braid boundary | | --- | ---: | --- | -| [`@tangle-network/agent-interface`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) | `1.9.0` | Canonical profile, capabilities, environment, stream, portable context, native continuation, and interaction contracts | +| [`@tangle-network/agent-interface`](https://github.com/tangle-network/agent-sdk/tree/main/packages/agent-interface) | `2.0.0` | Canonical profile, capabilities, environment, stream, portable context, native continuation, interaction, and explicitly based workspace contracts | | [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.184.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | | [`@tangle-network/agent-eval`](https://github.com/tangle-network/agent-eval) | `0.170.0` | Run records, judges, trace analysts, comparisons, and feedback trajectories | -| `@tangle-network/agent-provider-cli-bridge` | `0.11.1` | CLI Bridge environment adapter with capability discovery, native retained sessions, bounded terminal results, live streaming, replay, retry-safe turns, retained control, durable interaction response, and explicit cancel | -| `@tangle-network/agent-provider-tangle` | `0.14.4` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, workspace branching, and interactive-agent operations | -| `@tangle-network/sandbox` | `0.34.4` | Tangle cloud client used by the provider, including keyed checkpoint/fork and interactive-agent operations | +| `@tangle-network/agent-provider-cli-bridge` | `1.0.0` | CLI Bridge environment adapter with capability discovery, native retained sessions, bounded terminal results, live streaming, replay, retry-safe turns, retained control, durable interaction response, explicit cancel, and host cwd support | +| `@tangle-network/agent-provider-tangle` | `1.0.0` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, repository-relative cwd support, workspace branching, and interactive-agent operations | +| `@tangle-network/sandbox` | `0.34.6` | Tangle cloud client used by the provider, including keyed checkpoint/fork and interactive-agent operations | -The installed runtime publishes `agent-eval >=0.170.0 <0.171.0`, `agent-interface ^1.9.0`, and `sandbox >=0.34.3 <0.35.0` as peer ranges. +The effective local Runtime installation resolves `agent-eval >=0.170.0 <0.171.0`, `agent-interface 2.0.0`, and `sandbox >=0.34.3 <0.35.0` through the workspace override. -The installed Tangle provider publishes `sandbox >=0.34.4 <1.0.0` as a peer range. +Published Runtime `0.184.0` still declares `agent-interface ^1.9.0` and its retained interactive start accepts the legacy string cwd shape. -Sandbox `0.34.4` publishes peers `@mastra/core ^1.36.0`, `@modelcontextprotocol/sdk ^1.30.0`, `ai ^6.0.175`, `openai ^6.36.0`, and `viem ^2.0.0`. +The local override proves Braid against Interface `2.0.0`; it does not establish Runtime `0.184.0` release compatibility. -Braid exercises the exact dependency cohort in the table above. +Braid release remains blocked until Runtime publishes a compatibility rerelease that accepts the explicit workspace cwd union and preserves the retained workspace path. + +The installed Tangle provider publishes `sandbox >=0.34.6 <1.0.0` as a peer range. + +Sandbox `0.34.6` publishes peers `@mastra/core ^1.36.0`, `@modelcontextprotocol/sdk ^1.30.0`, `ai ^6.0.175`, `openai ^6.36.0`, and `viem ^2.0.0`. + +Braid exercises the exact dependency cohort in the table above through the local override. + +This cohort is not a releasable public package set until the Runtime compatibility rerelease lands. The lockfile pins the registry integrity for every installed package. @@ -35,7 +43,7 @@ The lockfile pins the registry integrity for every installed package. `pnpm outdated --format json` returns `{}` for this worktree. -The workspace override pins the interface version in the table so Braid and Runtime use one canonical type copy. +The workspace override pins interface `2.0.0` so local Braid and Runtime use one canonical type copy while the public Runtime compatibility rerelease is pending. Historical snapshot: [Agent-runtime issue 803](https://github.com/tangle-network/agent-runtime/issues/803) records the interface peer mismatch fixed in Runtime `0.132.11`. diff --git a/docs/components/profiles-and-connections.md b/docs/components/profiles-and-connections.md index 913bf880..acd8c9e2 100644 --- a/docs/components/profiles-and-connections.md +++ b/docs/components/profiles-and-connections.md @@ -18,6 +18,8 @@ Use one staged configuration workflow with explicit review and commit. Show a blank Sandbox cwd as the repository root. +Represent a non-blank Sandbox cwd as a canonical repository-relative POSIX path. + ## Component map | Component | Responsibility | @@ -26,7 +28,7 @@ Show a blank Sandbox cwd as the repository root. | `ConfigurationCredential` | Collect a required credential through a bounded secret path. | | `PreparedCredential` | Hold the commit or rollback capability for a staged secret write. | | `ConfigurationReview` | Show the effective selection before durable activation. | -| `WorkspaceRequestForm` | Edit the bounded provider-neutral cloud workspace request. | +| `WorkspaceRequestForm` | Edit the repository URL, ref, and repository-relative cwd for a cloud workspace request. | | `ResponsiveText` | Present configuration detail without breaking narrow layouts. | | `ProfileEditorViewPanel` | Create or edit canonical profile fields. | | `ProfileCompatibilityPanel` | Explain supported, ignored, or blocking fields from real capability data. | @@ -42,9 +44,11 @@ A connection contains secret-free transport and account metadata plus a credenti Credential bytes live only in the operating-system credential facility or their bounded setup path. -`WorkspaceRequest` is an immutable provider-neutral startup selection, not connection metadata. +`WorkspaceRequest` is an immutable startup selection, not connection metadata. + +Sandbox `cwd` uses the shared explicit repository base and a canonical POSIX path relative to the repository root; `.` selects that root. -Sandbox `cwd` is a canonical POSIX path relative to the repository root; `.` selects that root. +The form stores this repository-relative value. The selected adapter checks its advertised cwd base before it constructs a provider request. The local `workspaceRoot` remains separate from the remote provider workspace request. diff --git a/package.json b/package.json index 96b6dd83..a2c82e5a 100644 --- a/package.json +++ b/package.json @@ -104,11 +104,11 @@ "@earendil-works/pi-tui": "0.84.4", "@napi-rs/keyring": "1.3.0", "@tangle-network/agent-eval": "0.170.0", - "@tangle-network/agent-interface": "1.9.0", - "@tangle-network/agent-provider-cli-bridge": "0.11.1", - "@tangle-network/agent-provider-tangle": "0.14.4", + "@tangle-network/agent-interface": "2.0.0", + "@tangle-network/agent-provider-cli-bridge": "1.0.0", + "@tangle-network/agent-provider-tangle": "1.0.0", "@tangle-network/agent-runtime": "0.184.0", - "@tangle-network/sandbox": "0.34.4", + "@tangle-network/sandbox": "0.34.6", "@tangle-network/tcloud-attestation": "0.1.1", "better-sqlite3-multiple-ciphers": "13.0.3", "chalk": "6.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32747750..54e9214a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 '@tangle-network/agent-knowledge': 10.8.0 hono: 4.13.0 undici: 7.29.0 @@ -27,20 +27,20 @@ importers: specifier: 0.170.0 version: 0.170.0 '@tangle-network/agent-interface': - specifier: 1.9.0 - version: 1.9.0 + specifier: 2.0.0 + version: 2.0.0 '@tangle-network/agent-provider-cli-bridge': - specifier: 0.11.1 - version: 0.11.1 + specifier: 1.0.0 + version: 1.0.0 '@tangle-network/agent-provider-tangle': - specifier: 0.14.4 - version: 0.14.4(@tangle-network/sandbox@0.34.4) + specifier: 1.0.0 + version: 1.0.0(@tangle-network/sandbox@0.34.6) '@tangle-network/agent-runtime': specifier: 0.184.0 - version: 0.184.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4) + version: 0.184.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@2.0.0)(@tangle-network/sandbox@0.34.6) '@tangle-network/sandbox': - specifier: 0.34.4 - version: 0.34.4 + specifier: 0.34.6 + version: 0.34.6 '@tangle-network/tcloud-attestation': specifier: 0.1.1 version: 0.1.1 @@ -505,9 +505,9 @@ packages: resolution: {integrity: sha512-WrOw/bcXm0f9qHkumlT1QlArXSTWqaY9sunsDpOk+yCCorCKMxvWT/a3xko4EYHVdeZoh00yI2TydXn6eyICDA==} engines: {node: '>= 10'} - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} + '@noble/hashes@2.4.0': + resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==} + engines: {node: '>= 20.19.0'} '@tangle-network/agent-core@0.9.5': resolution: {integrity: sha512-F+frKU7BqKANuXVcI4+mu93HrzCe8/hBzRz0R1UGG0poe2Rbrud4w4L3mFqd/7I06Qzi3eLnrxgXyPwBh5VKzw==} @@ -522,8 +522,8 @@ packages: engines: {node: '>=20'} hasBin: true - '@tangle-network/agent-interface@1.9.0': - resolution: {integrity: sha512-HB43+EjiMFYQ+sA4h6FNd1pP81jm6HmOfo5Enfd9FZm0NrTWufK2WbbCUpoGgrnbG1vJv8h/Ly/YevnGTZ5baw==} + '@tangle-network/agent-interface@2.0.0': + resolution: {integrity: sha512-t4oXA4y/4irRd1NmsxZcYwfabUzE//5yP/Lqg0Fz9WlV2bBfBJdZ5sHybaTecgr+p+PcWu2RG01/OsGmfdzudQ==} '@tangle-network/agent-knowledge@10.8.0': resolution: {integrity: sha512-3XJvf5mtAUpT6B1cDAzkbc1tVHhXuC56ZFU/srlecKFceEiZ5CRwH9NouBThbwNGfF8Q0qhTvfQ8fxqT4urEnQ==} @@ -531,20 +531,21 @@ packages: hasBin: true peerDependencies: '@tangle-network/agent-eval': '>=0.170.0 <0.171.0' - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 '@tangle-network/agent-profile-materialize@0.17.1': resolution: {integrity: sha512-Nk/2PhkHndabvT53Wtrpd19V7btcJiJqvWcsUyRMSZQsjwAXDT/v3ipqhV4ysbyDRidAspadpDbo86enx/eExw==} peerDependencies: - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 - '@tangle-network/agent-provider-cli-bridge@0.11.1': - resolution: {integrity: sha512-KwzNK1iBS9fZ8KgpMS+/wpBQ4EvvNwPJxioraiiJ7lbuosFesrS3v9hJb4R/02+gDNf5z7D/YS4XExc1KtFx7Q==} + '@tangle-network/agent-provider-cli-bridge@1.0.0': + resolution: {integrity: sha512-lVHwDNNtETaWg/KljrizdC7A2VgJPe8vxJpGGWOvhX5w2b5E5CRoDiF31etja3ryk0WJg3liFjF884QXOzyWxw==} + engines: {node: '>=22.19.0'} - '@tangle-network/agent-provider-tangle@0.14.4': - resolution: {integrity: sha512-3LSBaK1FZyhKOgTkLYiSJCOsUTYDnVm6YSYpjnVVQD4vI7GOQdxYgfQPHE4MLCqYk6MazjiLZ5iR8sQeaTWAqw==} + '@tangle-network/agent-provider-tangle@1.0.0': + resolution: {integrity: sha512-cQGGOGgSdBRYGxFMYBvRdYPgkQeoJruMP+iswGLZESfFSrjyoPm0Xa3XHzbfMqn+FvCyPVz9ntwhMxHhJGWJZg==} peerDependencies: - '@tangle-network/sandbox': '>=0.34.4 <1.0.0' + '@tangle-network/sandbox': '>=0.34.6 <1.0.0' '@tangle-network/agent-runtime@0.184.0': resolution: {integrity: sha512-kvkzwne6w5XS8dDbS4emNdBc8x4hQUctM0D43qgcQ5XBEs9x9NolUnmV2GqzSd1VVQSzFVXFeNG0sJY+X9tSag==} @@ -552,7 +553,7 @@ packages: hasBin: true peerDependencies: '@tangle-network/agent-eval': '>=0.170.0 <0.171.0' - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 '@tangle-network/sandbox': '>=0.34.3 <0.35.0' peerDependenciesMeta: '@tangle-network/sandbox': @@ -561,8 +562,8 @@ packages: '@tangle-network/agent-trace-contract@1.0.2': resolution: {integrity: sha512-v7uMh56jkEp4vckevEU9xKsIatbs5dqzGPp69dFLSSXUVit0RP6VD6EANMXVlTCUk+6wVKBLHJx23XspVCEiIA==} - '@tangle-network/sandbox@0.34.4': - resolution: {integrity: sha512-j0tkH1zZ0xdk718m4qaZVeUGGh2xA7LhP8uS/VivpEWyFVTrlpJWowMTUD11tNtIFjU3tWrIQRVVhNMk7rBoOw==} + '@tangle-network/sandbox@0.34.6': + resolution: {integrity: sha512-+qUGyuN8LpDzfDtAd/pseCpl7Udt/IU1nNG+o6q+2QQ4jNTRp7/NEm5ddASb0/62S8laCqY3yZzBtbd8UVDnYw==} peerDependencies: '@mastra/core': ^1.36.0 '@modelcontextprotocol/sdk': ^1.30.0 @@ -901,6 +902,9 @@ packages: zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} + snapshots: '@asteasolutions/zod-to-openapi@9.1.0(zod@4.4.3)': @@ -1157,11 +1161,11 @@ snapshots: '@napi-rs/keyring-win32-ia32-msvc': 1.3.0 '@napi-rs/keyring-win32-x64-msvc': 1.3.0 - '@noble/hashes@1.8.0': {} + '@noble/hashes@2.4.0': {} '@tangle-network/agent-core@0.9.5': dependencies: - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 zod: 4.4.3 '@tangle-network/agent-eval@0.170.0': @@ -1169,7 +1173,7 @@ snapshots: '@asteasolutions/zod-to-openapi': 9.1.0(zod@4.4.3) '@hono/node-server': 2.1.1(hono@4.13.0) '@tangle-network/agent-core': 0.9.5 - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 '@tangle-network/agent-trace-contract': 1.0.2 hono: 4.13.0 linear-sum-assignment: 1.0.9 @@ -1178,45 +1182,45 @@ snapshots: transitivePeerDependencies: - '@modelcontextprotocol/sdk' - '@tangle-network/agent-interface@1.9.0': + '@tangle-network/agent-interface@2.0.0': dependencies: - '@noble/hashes': 1.8.0 + '@noble/hashes': 2.4.0 spdx-expression-parse: 5.0.0 - zod: 4.4.3 + zod: 4.5.4 - '@tangle-network/agent-knowledge@10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)': + '@tangle-network/agent-knowledge@10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@2.0.0)': dependencies: '@tangle-network/agent-eval': 0.170.0 - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 '@types/proper-lockfile': 4.1.4 proper-lockfile: 4.1.2 zod: 4.4.3 - '@tangle-network/agent-profile-materialize@0.17.1(@tangle-network/agent-interface@1.9.0)': + '@tangle-network/agent-profile-materialize@0.17.1(@tangle-network/agent-interface@2.0.0)': dependencies: - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 - '@tangle-network/agent-provider-cli-bridge@0.11.1': + '@tangle-network/agent-provider-cli-bridge@1.0.0': dependencies: - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 undici: 7.29.0 - '@tangle-network/agent-provider-tangle@0.14.4(@tangle-network/sandbox@0.34.4)': + '@tangle-network/agent-provider-tangle@1.0.0(@tangle-network/sandbox@0.34.6)': dependencies: - '@tangle-network/agent-interface': 1.9.0 - '@tangle-network/sandbox': 0.34.4 + '@tangle-network/agent-interface': 2.0.0 + '@tangle-network/sandbox': 0.34.6 - '@tangle-network/agent-runtime@0.184.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0)(@tangle-network/sandbox@0.34.4)': + '@tangle-network/agent-runtime@0.184.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@2.0.0)(@tangle-network/sandbox@0.34.6)': dependencies: '@tangle-network/agent-core': 0.9.5 '@tangle-network/agent-eval': 0.170.0 - '@tangle-network/agent-interface': 1.9.0 - '@tangle-network/agent-knowledge': 10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@1.9.0) - '@tangle-network/agent-profile-materialize': 0.17.1(@tangle-network/agent-interface@1.9.0) + '@tangle-network/agent-interface': 2.0.0 + '@tangle-network/agent-knowledge': 10.8.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@2.0.0) + '@tangle-network/agent-profile-materialize': 0.17.1(@tangle-network/agent-interface@2.0.0) '@tangle-network/agent-trace-contract': 1.0.2 tar-stream: 3.2.1 optionalDependencies: - '@tangle-network/sandbox': 0.34.4 + '@tangle-network/sandbox': 0.34.6 transitivePeerDependencies: - '@modelcontextprotocol/sdk' - bare-abort-controller @@ -1225,10 +1229,10 @@ snapshots: '@tangle-network/agent-trace-contract@1.0.2': {} - '@tangle-network/sandbox@0.34.4': + '@tangle-network/sandbox@0.34.6': dependencies: '@tangle-network/agent-core': 0.9.5 - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 zod: 4.4.3 '@tangle-network/tcloud-attestation@0.1.1': {} @@ -1545,3 +1549,5 @@ snapshots: yaml@2.9.0: {} zod@4.4.3: {} + + zod@4.5.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2bfb3aeb..d951bfe6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,5 @@ overrides: - '@tangle-network/agent-interface': 1.9.0 + '@tangle-network/agent-interface': 2.0.0 '@tangle-network/agent-knowledge': 10.8.0 hono: 4.13.0 undici: 7.29.0 @@ -13,12 +13,12 @@ ignoreScripts: false minimumReleaseAgeExclude: - '@tangle-network/agent-runtime@0.126.0 || 0.128.0 || 0.131.0 || 0.131.1 || 0.131.2 || 0.131.3 || 0.131.4 || 0.131.5 || 0.131.6 || 0.131.7 || 0.132.0 || 0.132.4 || 0.132.6 || 0.132.9 || 0.132.10 || 0.132.11 || 0.132.12 || 0.133.6 || 0.134.2 || 0.134.4 || 0.134.5 || 0.134.9 || 0.135.0 || 0.135.3 || 0.142.0 || 0.142.1 || 0.142.3 || 0.143.0 || 0.153.2 || 0.177.0 || 0.178.0 || 0.179.0 || 0.180.0 || 0.182.0 || 0.184.0' - '@tangle-network/agent-eval@0.143.0 || 0.144.0 || 0.144.1 || 0.144.3 || 0.144.4 || 0.144.6 || 0.144.8 || 0.144.10 || 0.144.11 || 0.144.13 || 0.145.0 || 0.145.1 || 0.145.2 || 0.145.3 || 0.145.9 || 0.145.10 || 0.145.11 || 0.145.14 || 0.145.15 || 0.145.21 || 0.149.0 || 0.163.2 || 0.170.0' - - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0 || 1.7.0 || 1.7.1 || 1.8.0 || 1.9.0' + - '@tangle-network/agent-interface@0.46.0 || 0.46.1 || 0.47.0 || 0.51.0 || 0.52.0 || 0.53.0 || 0.54.0 || 1.0.0 || 1.1.0 || 1.3.0 || 1.4.0 || 1.7.0 || 1.7.1 || 1.8.0 || 1.9.0 || 2.0.0' - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0 || 10.8.0' - '@tangle-network/agent-profile-materialize@0.10.2 || 0.13.1 || 0.14.0 || 0.14.2 || 0.15.1 || 0.15.2 || 0.17.1' - - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0 || 0.11.0 || 0.11.1' - - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2 || 0.14.3 || 0.14.4' - - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0 || 0.34.3 || 0.34.4' + - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0 || 0.11.0 || 0.11.1 || 1.0.0' + - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2 || 0.14.3 || 0.14.4 || 1.0.0' + - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0 || 0.34.3 || 0.34.4 || 0.34.6' - hono@4.13.0 - '@esbuild/aix-ppc64@0.28.2' - '@esbuild/android-arm64@0.28.2' diff --git a/scripts/live-required/workspace-request.mjs b/scripts/live-required/workspace-request.mjs index cdc49f0f..f69f361f 100644 --- a/scripts/live-required/workspace-request.mjs +++ b/scripts/live-required/workspace-request.mjs @@ -9,6 +9,9 @@ export function workspaceRequestFor(environment = {}) { return { repoUrl: environment.BRAID_TANGLE_SANDBOX_REPOSITORY ?? DEFAULT_REPOSITORY, gitRef: environment.BRAID_TANGLE_SANDBOX_GIT_REF ?? DEFAULT_GIT_REF, - cwd: environment.BRAID_TANGLE_SANDBOX_CWD?.trim() || DEFAULT_WORKSPACE_CWD, + cwd: { + base: 'repository', + path: environment.BRAID_TANGLE_SANDBOX_CWD?.trim() || DEFAULT_WORKSPACE_CWD, + }, } } diff --git a/src/adapters/runtime/cli-bridge-retained-run.ts b/src/adapters/runtime/cli-bridge-retained-run.ts index 71c51347..62bf64a2 100644 --- a/src/adapters/runtime/cli-bridge-retained-run.ts +++ b/src/adapters/runtime/cli-bridge-retained-run.ts @@ -1,4 +1,4 @@ -import type { AgentExactRunControlRef } from '@tangle-network/agent-interface' +import type { AgentExactRunControlRef, WorkspaceRequest } from '@tangle-network/agent-interface' import type { CliBridgeProvider } from '@tangle-network/agent-provider-cli-bridge' import { type RetainedRunHandle, @@ -138,7 +138,7 @@ export async function startCliBridgeRetainedRun( environment: { profile: plan.prepared.profile, backend: plan.prepared.runner, - workspace: { cwd: plan.prepared.workspace }, + workspace: cliBridgeWorkspace(plan), idempotencyKey: plan.environmentIdempotencyKey, ...(input.contextTransfer === undefined ? {} @@ -185,7 +185,7 @@ async function recoverCliBridgeRetainedRun( environment: { profile: plan.prepared.profile, backend: plan.prepared.runner, - workspace: { cwd: plan.prepared.workspace }, + workspace: cliBridgeWorkspace(plan), idempotencyKey: admission.idempotencyKey, ...(plan.prepared.contextTransfer === undefined ? {} @@ -242,6 +242,13 @@ function retainedEnvironmentIdempotencyKey(providerSessionId: string): string { return stableProviderId('environment-braid-', providerSessionId) } +function cliBridgeWorkspace(plan: CliBridgeRetainedPlan): WorkspaceRequest { + if (plan.prepared.capabilities.workspace.cwdBases?.host !== true) { + throw new Error('CLI Bridge does not advertise host workspace cwd support') + } + return { cwd: { base: 'host', path: plan.prepared.workspace } } +} + function headlessRetainedAdmission( admission: RetainedRunAdmissionRecord | undefined, ): HeadlessRetainedAdmission | undefined { diff --git a/src/adapters/runtime/production-tangle-sandbox-backend.ts b/src/adapters/runtime/production-tangle-sandbox-backend.ts index ec1620c7..8fc8e11b 100644 --- a/src/adapters/runtime/production-tangle-sandbox-backend.ts +++ b/src/adapters/runtime/production-tangle-sandbox-backend.ts @@ -1,4 +1,9 @@ -import type { AgentExactRunControlRef, AgentProfile } from '@tangle-network/agent-interface' +import { + type AgentExactRunControlRef, + type AgentProfile, + type WorkspaceRequest, + workspaceCwdPathForBase, +} from '@tangle-network/agent-interface' import type { AgentEnvironmentCapabilities, AgentEnvironmentProvider, @@ -93,6 +98,7 @@ export async function resolveTangleSandboxBackend( }) const runtimeProvider = providerWithoutSandboxOptions(sdkProvider) const capabilities = capabilitiesForLifecycle(await sdkProvider.capabilities(), lifecycle) + assertTangleWorkspaceCwdCapability(workspaceRequest, capabilities) const providerSessionId = providerSessionFor(input, capabilities) const backend = Object.freeze({ kind: 'executor' as const, @@ -225,6 +231,7 @@ export async function resolveTangleSandboxRetainedConnection( : { confidentialAttestationVerifier: confidential.tangle }), }) const reportedCapabilities = await provider.capabilities() + assertTangleWorkspaceCwdCapability(workspaceRequest, reportedCapabilities) const retained = reportedCapabilities.retainedControl if ( retained?.exactRunIdentity !== true || @@ -292,6 +299,22 @@ export async function resolveTangleSandboxRetainedConnection( }) } +/** Reject a workspace path before Tangle can allocate an environment. */ +export function assertTangleWorkspaceCwdCapability( + workspaceRequest: Readonly | undefined, + capabilities: AgentEnvironmentCapabilities, +): void { + const cwd = workspaceRequest?.cwd + if (cwd === undefined) return + workspaceCwdPathForBase(cwd, 'repository', 'Tangle') + if (capabilities.workspace.cwdBases?.repository !== true) { + throw new ConnectionError( + 'CONNECTION_UNSUPPORTED', + 'Tangle does not advertise repository workspace cwd support', + ) + } +} + function sandboxLifecycle(): SandboxLifecyclePolicy { return { mode: 'ephemeral', diff --git a/src/bin/production-setup-validation.ts b/src/bin/production-setup-validation.ts index 96b1bff4..479ab2f0 100644 --- a/src/bin/production-setup-validation.ts +++ b/src/bin/production-setup-validation.ts @@ -200,7 +200,7 @@ export function describeProductionSelection( workdir: selection.workspaceRequest?.cwd === undefined ? 'repository root' - : selection.workspaceRequest.cwd, + : selection.workspaceRequest.cwd.path, ...(selection.workspaceRequest === undefined ? {} : { workspaceRequest: workspaceSummary(selection.workspaceRequest) }), diff --git a/src/domain/workspace-request.ts b/src/domain/workspace-request.ts index 683e7a77..10d4bb23 100644 --- a/src/domain/workspace-request.ts +++ b/src/domain/workspace-request.ts @@ -49,7 +49,7 @@ export function workspaceRequestDigest(request: WorkspaceRequest | undefined): s export function workspaceRequestErrorMessage(error: unknown): string { const message = error instanceof Error ? error.message : '' if ( - /Workspace cwd (?:must be relative|must use POSIX separators|cannot leave the workspace root|cannot contain control characters)/iu.test( + /Workspace cwd (?:must be relative|must use POSIX separators|cannot leave the workspace root|cannot contain control characters|must contain well-formed Unicode)|supports workspace cwd base/iu.test( message, ) ) diff --git a/src/views/tui/configuration-wizard-presentation.ts b/src/views/tui/configuration-wizard-presentation.ts index 87f7498f..83a52a8c 100644 --- a/src/views/tui/configuration-wizard-presentation.ts +++ b/src/views/tui/configuration-wizard-presentation.ts @@ -233,7 +233,7 @@ function effectiveValues( selection.connection.kind === 'tangle-sandbox' ? selection.workspaceRequest?.cwd === undefined ? 'repository root' - : selection.workspaceRequest.cwd + : selection.workspaceRequest.cwd.path : 'workspace-selected workdir', ...(selection.workspaceRequest === undefined ? {} @@ -255,7 +255,7 @@ function withWorkspaceRequest( ...confirmed, workspaceRequest: { ...(confirmed.workspaceRequest ?? {}), ...workspaceRequest }, ...(selection.connection.kind === 'tangle-sandbox' && workspaceRequest.cwd !== undefined - ? { workdir: workspaceRequest.cwd } + ? { workdir: workspaceRequest.cwd.path } : {}), } } diff --git a/src/views/tui/workspace-request-form.ts b/src/views/tui/workspace-request-form.ts index ff13e600..c1233cea 100644 --- a/src/views/tui/workspace-request-form.ts +++ b/src/views/tui/workspace-request-form.ts @@ -66,7 +66,7 @@ export class WorkspaceRequestForm extends Container implements Focusable { this.#values = Object.freeze({ repoUrl: options.initialRequest?.repoUrl ?? '', gitRef: options.initialRequest?.gitRef ?? '', - cwd: options.initialRequest?.cwd ?? '', + cwd: options.initialRequest?.cwd?.path ?? '', }) for (const field of WORKSPACE_FIELDS) { const input = new Input() @@ -139,7 +139,11 @@ export class WorkspaceRequestForm extends Container implements Focusable { ...this.#fixedRequest, ...(repoUrl === '' ? {} : { repoUrl }), ...(gitRef === '' ? {} : { gitRef }), - ...(cwd === '' ? (hasWorkspaceSource ? { cwd: '.' } : {}) : { cwd }), + ...(cwd === '' + ? hasWorkspaceSource + ? { cwd: { base: 'repository' as const, path: '.' } } + : {} + : { cwd: { base: 'repository' as const, path: cwd } }), } try { this.#onSubmit(snapshotWorkspaceRequest(request)) diff --git a/src/views/tui/workspace-request-presentation.ts b/src/views/tui/workspace-request-presentation.ts index 611a02a5..0286f231 100644 --- a/src/views/tui/workspace-request-presentation.ts +++ b/src/views/tui/workspace-request-presentation.ts @@ -10,7 +10,7 @@ export function workspaceRequestSummary( workspace.image === undefined ? undefined : `image ${workspace.image}`, workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, - workspace.cwd === undefined ? undefined : `start in repo ${workspace.cwd}`, + workspace.cwd === undefined ? undefined : workspaceCwdLabel(workspace.cwd), ].filter((value): value is string => value !== undefined) return values.length === 0 ? ['cloud workspace: provider defaults'] @@ -26,7 +26,7 @@ export function compactWorkspaceRequestSummary( workspace.image === undefined ? undefined : `image ${workspace.image}`, workspace.repoUrl === undefined ? undefined : `repo ${workspace.repoUrl}`, workspace.gitRef === undefined ? undefined : `ref ${workspace.gitRef}`, - workspace.cwd === undefined ? undefined : `start in repo ${workspace.cwd}`, + workspace.cwd === undefined ? undefined : workspaceCwdLabel(workspace.cwd), ].filter((value): value is string => value !== undefined) return [ `cloud: ${values.length > 0 ? values.map((value) => shortValue(value, 18)).join(' · ') : 'defaults'}`, @@ -38,3 +38,7 @@ function shortValue(value: string, limit: number): string { if (sanitized.length <= limit) return sanitized return `${sanitized.slice(0, Math.max(1, limit - 4))}…${sanitized.slice(-3)}` } + +function workspaceCwdLabel(cwd: NonNullable): string { + return cwd.base === 'repository' ? `start in repo ${cwd.path}` : `start in host ${cwd.path}` +} diff --git a/test/cli-bridge-interactions.test.ts b/test/cli-bridge-interactions.test.ts index d42b8186..eaeb2208 100644 --- a/test/cli-bridge-interactions.test.ts +++ b/test/cli-bridge-interactions.test.ts @@ -76,6 +76,30 @@ test('fresh CLI Bridge plans keep provider identity unknown until Runtime admiss assert.equal(recovered.environmentId, exact.environmentId) assert.equal(recovered.environmentIdempotencyKey, 'environment-braid-session-cli-identity') assert.notEqual(recovered.environmentId, recovered.environmentIdempotencyKey) + + assert.equal(prepared.capabilities.workspace.cwdBases?.host, true) + const unsupported = { + ...prepared, + capabilities: { + ...prepared.capabilities, + workspace: { + ...prepared.capabilities.workspace, + cwdBases: { repository: false, host: false }, + }, + }, + } + await assert.rejects( + startCliBridgeRetainedRun( + await createCliBridgeRetainedPlan(unsupported, 'run-cli-identity-unsupported'), + { + ...input, + runId: 'run-cli-identity-unsupported', + onRetainedAdmission: async () => {}, + }, + ), + /does not advertise host workspace cwd support/u, + ) + assert.equal(bridge.requests.length, 0) } finally { await bridge.close() } diff --git a/test/configuration-session.test.ts b/test/configuration-session.test.ts index 34d757bb..3a431ac5 100644 --- a/test/configuration-session.test.ts +++ b/test/configuration-session.test.ts @@ -83,7 +83,7 @@ test('configuration session chooses a profile and connection without persisting session.submitWorkspace({ repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: 'src', + cwd: { base: 'repository', path: 'src' }, }) assert.equal(session.state.step, 'confirm') const selected = session.confirm() @@ -111,7 +111,7 @@ test('local and inference connections skip cloud workspace setup', () => { session.selectProfile(record.id) session.selectConnection(session.state.connections[0]?.id ?? '') assert.equal(session.state.step, 'confirm') - const failed = session.submitWorkspace({ cwd: '/workspace' }) + const failed = session.submitWorkspace({ cwd: { base: 'repository', path: '/workspace' } }) assert.equal(failed.error?.code, 'CONNECTION_REQUIRED') }) @@ -126,7 +126,9 @@ test('workspace validation keeps the session open and reports the bounded field assert.equal(failed.error?.code, 'WORKSPACE_INVALID') assert.equal(failed.error?.message, 'gitRef requires repoUrl') - const failedCwd = session.submitWorkspace({ cwd: '/workspace/src' }) + const failedCwd = session.submitWorkspace({ + cwd: { base: 'repository', path: '/workspace/src' }, + }) assert.equal(failedCwd.step, 'workspace') assert.equal(failedCwd.error?.code, 'WORKSPACE_INVALID') assert.equal(failedCwd.error?.message, 'start in must be a repository-relative path') diff --git a/test/configuration-wizard.test.ts b/test/configuration-wizard.test.ts index 09fb31e6..c42accd0 100644 --- a/test/configuration-wizard.test.ts +++ b/test/configuration-wizard.test.ts @@ -502,7 +502,7 @@ test('blank Sandbox cwd is submitted as the repository root', () => { assert.deepEqual(submitted, { repoUrl: 'https://github.com/tangle-network/braid', gitRef: 'main', - cwd: '.', + cwd: { base: 'repository', path: '.' }, }) }) diff --git a/test/interactive-execution-adapters.test.ts b/test/interactive-execution-adapters.test.ts index 4a18e992..65ba050c 100644 --- a/test/interactive-execution-adapters.test.ts +++ b/test/interactive-execution-adapters.test.ts @@ -529,7 +529,7 @@ test('retained runtime receives the canonical workspace request without a provid environment: 'universal', repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: 'src', + cwd: { base: 'repository', path: 'src' }, } as const const prepared = { ...fixture.prepared, workspaceRequest } as PreparedTangleRetainedConnection diff --git a/test/production-composition.test.ts b/test/production-composition.test.ts index d774bc5d..d564c2d6 100644 --- a/test/production-composition.test.ts +++ b/test/production-composition.test.ts @@ -583,7 +583,7 @@ test('startup persists the workspace request, reloads it, and preserves legacy a workspaceRequest: { repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: 'src', + cwd: { base: 'repository' as const, path: 'src' }, providerOptions: {}, }, } @@ -595,7 +595,7 @@ test('startup persists the workspace request, reloads it, and preserves legacy a assert.deepEqual(saved.workspaceRequest, { repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: 'src', + cwd: { base: 'repository', path: 'src' }, }) assert.ok(saved.workspaceRequest) assert.equal('providerOptions' in saved.workspaceRequest, false) diff --git a/test/tangle-live07-wiring.test.mjs b/test/tangle-live07-wiring.test.mjs index c7d8f6be..afa2678e 100644 --- a/test/tangle-live07-wiring.test.mjs +++ b/test/tangle-live07-wiring.test.mjs @@ -76,13 +76,16 @@ test('live Tangle Sandbox proofs request the repository root with a portable cwd assert.deepEqual(workspaceRequestFor({}), { repoUrl: 'https://github.com/tangle-network/braid.git', gitRef: 'main', - cwd: '.', + cwd: { base: 'repository', path: '.' }, + }) + assert.deepEqual(workspaceRequestFor({ BRAID_TANGLE_SANDBOX_CWD: 'packages/braid' }).cwd, { + base: 'repository', + path: 'packages/braid', + }) + assert.deepEqual(workspaceRequestFor({ BRAID_TANGLE_SANDBOX_CWD: ' ' }).cwd, { + base: 'repository', + path: '.', }) - assert.equal( - workspaceRequestFor({ BRAID_TANGLE_SANDBOX_CWD: 'packages/braid' }).cwd, - 'packages/braid', - ) - assert.equal(workspaceRequestFor({ BRAID_TANGLE_SANDBOX_CWD: ' ' }).cwd, '.') }) test('Tangle Sandbox workspace profiles pin model identity separately from connection kind', async () => { @@ -102,7 +105,7 @@ test('Tangle Sandbox workspace profiles pin model identity separately from conne assert.deepEqual(config.workspaceRequest, { repoUrl: 'https://github.com/tangle-network/braid.git', gitRef: 'main', - cwd: '.', + cwd: { base: 'repository', path: '.' }, }) } finally { await config.cleanup() diff --git a/test/tangle-retained-lifecycle.test.ts b/test/tangle-retained-lifecycle.test.ts index f993ce9e..05a6b65d 100644 --- a/test/tangle-retained-lifecycle.test.ts +++ b/test/tangle-retained-lifecycle.test.ts @@ -6,6 +6,7 @@ import { capabilitiesForConnection } from '../src/adapters/connections/productio import { createTangleRetainedControlLookup } from '../src/adapters/connections/tangle-retained-control-lookup.js' import { safeExecutionId } from '../src/adapters/runtime/production-backend-common.js' import { + assertTangleWorkspaceCwdCapability, resolveTangleSandboxBackend, resolveTangleSandboxRetainedConnection, } from '../src/adapters/runtime/production-tangle-sandbox-backend.js' @@ -215,6 +216,39 @@ test('retained capability and resolution fail closed without exact lookup method ) }) +test('Tangle workspace cwd requires the advertised repository base', async () => { + const sandbox = new FakeTangleRetainedSandbox() + const configured = setup(sandbox) + const { connection, input, selection } = configured + const prepared = await resolveTangleSandboxRetainedConnection( + configured.options, + input, + selection, + connection.id, + ) + const unsupported = { + ...prepared.capabilities, + workspace: { + ...prepared.capabilities.workspace, + cwdBases: { repository: false, host: false }, + }, + } + + assert.throws( + () => + assertTangleWorkspaceCwdCapability({ cwd: { base: 'repository', path: 'src' } }, unsupported), + /does not advertise repository workspace cwd support/u, + ) + assert.throws( + () => + assertTangleWorkspaceCwdCapability( + { cwd: { base: 'host', path: '/workspace' } }, + prepared.capabilities, + ), + /supports workspace cwd base "repository", not "host"/u, + ) +}) + test('published Sandbox methods recover the exact retained dispatch without an injected lookup', async () => { const sandbox = new FakeTangleRetainedSandbox() const { connection, options, input, selection } = setup(sandbox) diff --git a/test/workspace-request.test.ts b/test/workspace-request.test.ts index 9a5fa433..c798f6f3 100644 --- a/test/workspace-request.test.ts +++ b/test/workspace-request.test.ts @@ -18,7 +18,7 @@ import { DEFAULT_RUN_CAPABILITIES, type ExecuteTurnInput } from '../src/ports/ex const validRequest = { repoUrl: 'https://github.com/acme/repository', gitRef: 'main', - cwd: 'src', + cwd: { base: 'repository', path: 'src' }, } as const function thrownMessage(request: unknown): string { @@ -38,21 +38,28 @@ test('workspace requests use the canonical schema and immutable snapshots', () = assert.deepEqual(snapshotWorkspaceRequest({ image: 'ubuntu:24.04' }), { image: 'ubuntu:24.04', }) - assert.deepEqual(snapshotWorkspaceRequest({ cwd: './src' }), { cwd: 'src' }) + assert.deepEqual(snapshotWorkspaceRequest({ cwd: { base: 'repository', path: './src' } }), { + cwd: { base: 'repository', path: 'src' }, + }) const input = { ...validRequest, providerOptions: {}, - } as { repoUrl: string; gitRef: string; cwd: string; providerOptions: Record } + } as { + repoUrl: string + gitRef: string + cwd: { base: 'repository'; path: string } + providerOptions: Record + } const snapshot = snapshotWorkspaceRequest(input) const digestBeforeMutation = workspaceRequestDigest(input) assert.deepEqual(snapshot, validRequest) assert.equal(Object.isFrozen(snapshot), true) assert.throws(() => { - ;(snapshot as { cwd: string }).cwd = '/mutated' + ;(snapshot as { cwd: unknown }).cwd = '/mutated' }, TypeError) - input.cwd = '/changed-after-snapshot' - assert.equal(snapshot?.cwd, validRequest.cwd) + input.cwd = { base: 'repository', path: '/changed-after-snapshot' } + assert.deepEqual(snapshot?.cwd, validRequest.cwd) assert.equal(digestBeforeMutation, workspaceRequestDigest(snapshot)) }) @@ -112,6 +119,7 @@ test('portable Sandbox cwd failures use the start-in field message', () => { 'Workspace cwd must use POSIX separators', 'Workspace cwd cannot leave the workspace root', 'Workspace cwd cannot contain control characters', + 'Workspace cwd must contain well-formed Unicode', ]) { assert.equal( workspaceRequestErrorMessage(new Error(message)), @@ -128,7 +136,10 @@ test('portable Sandbox cwd validation rejects paths that leave the repository', 'src\\win', 'src\u0000bad', ]) { - assert.equal(thrownMessage({ cwd }), 'start in must be a repository-relative path') + assert.equal( + thrownMessage({ cwd: { base: 'repository', path: cwd } }), + 'start in must be a repository-relative path', + ) } }) @@ -227,7 +238,10 @@ test('admission binds workspace selection and local root without receipt shadow assert.notEqual( digest, exactAdmissionRequestDigest( - { ...input, workspaceRequest: { ...validRequest, cwd: 'other' } }, + { + ...input, + workspaceRequest: { ...validRequest, cwd: { base: 'repository', path: 'other' } }, + }, snapshot.conversationId, snapshot.branchId, ), From 2630e63b3da0c4b36fc3764ebbecd524fccaf3ff Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Mon, 31 Aug 2026 01:52:29 -0600 Subject: [PATCH 135/136] fix(live): harden retained sandbox proof cleanup --- .../tangle-sandbox-braid-stress.mjs | 74 ++++++++++++++----- ...ngle-sandbox-braid-stress-runtime.test.mjs | 37 ++++++++++ 2 files changed, 94 insertions(+), 17 deletions(-) diff --git a/scripts/live-required/tangle-sandbox-braid-stress.mjs b/scripts/live-required/tangle-sandbox-braid-stress.mjs index 60477fbc..c8d28cfc 100644 --- a/scripts/live-required/tangle-sandbox-braid-stress.mjs +++ b/scripts/live-required/tangle-sandbox-braid-stress.mjs @@ -3,7 +3,13 @@ import { createHash, randomBytes } from 'node:crypto' import { mkdir, readFile, writeFile } from 'node:fs/promises' import { dirname, resolve } from 'node:path' import { fileURLToPath } from 'node:url' -import { Sandbox } from '@tangle-network/sandbox' +import { + NetworkError, + QuotaError, + Sandbox, + ServerError, + TimeoutError, +} from '@tangle-network/sandbox' import { sleep } from '../live-bridge/process.mjs' import { connectionConfiguration } from './configuration.mjs' import { safeJson } from './contracts.mjs' @@ -46,6 +52,9 @@ const DEFAULT_TIMEOUT_MS = 180_000 const DEFAULT_HOLD_MS = 30_000 const DEFAULT_IDLE_TTL_SECONDS = 1_800 const SANDBOX_LIST_PAGE_SIZE = 100 +const CLEANUP_RETRY_ATTEMPTS = 5 +const CLEANUP_RETRY_DELAY_MS = 1_000 +const CLEANUP_RETRY_MAX_DELAY_MS = 5_000 const BRAID_RESOURCE_OWNER = 'braid' const RETAINED_LIFECYCLE = 'retained' const SECRET_ENVIRONMENT_NAMES = [ @@ -186,7 +195,7 @@ function proofPrompts(coordinates, holdMs) { first: [ 'Use the current Tangle Sandbox working directory for every command in this turn.', `Create ${path} and write exactly ${coordinates.marker} followed by a newline.`, - `Run a shell command with append redirection (>>) that writes exactly ${coordinates.executionAttempt} followed by a newline to ${attemptPath}; never overwrite this file.`, + `Run exactly once, with no retry, this shell command: printf '%s\\n' '${coordinates.executionAttempt}' >> '${attemptPath}'. Do not use a file tool or any other command on ${attemptPath}; never overwrite this file.`, `Read ${path}, print its contents, and prove the workspace is usable with a shell command.`, 'Run git -C . rev-parse --is-inside-work-tree. If it fails, run git -C . init.', 'Then run git -C . rev-parse --is-inside-work-tree again and print its result.', @@ -194,11 +203,10 @@ function proofPrompts(coordinates, holdMs) { `Reply with exactly ${coordinates.marker}.`, ].join(' '), followUp: [ - 'Use a shell command in the existing Tangle Sandbox workspace.', - `Compute the SHA-256 digest of the exact bytes in ${challengePath}.`, - `Write only the lowercase 64-character digest followed by a newline to ${responsePath}.`, - `Read ${path} too, but do not include its contents in the response.`, - 'Reply with only the computed digest.', + 'Use the existing Tangle Sandbox workspace.', + `Perform exactly these two actions, in order, with no other command or file change: run this one shell command once: test -f '${path}' && sha256sum -- '${challengePath}' | awk '{print $1}' > '${responsePath}'; then read ${responsePath} once.`, + `Do not read, write, truncate, rename, or delete ${challengePath}; do not run the shell command again.`, + 'Reply with only the lowercase 64-character digest from the response file.', ].join(' '), cancel: [ 'Keep working in the same Tangle Sandbox workspace.', @@ -312,6 +320,36 @@ async function listAllSandboxes(client) { } } +function transientCleanupDelay(error) { + if (error instanceof QuotaError) { + const retryAfterMs = + Number.isFinite(error.retryAfterMs) && error.retryAfterMs >= 0 + ? error.retryAfterMs + : CLEANUP_RETRY_DELAY_MS + return Math.min(Math.max(CLEANUP_RETRY_DELAY_MS, retryAfterMs), CLEANUP_RETRY_MAX_DELAY_MS) + } + if (error instanceof NetworkError || error instanceof TimeoutError) { + return CLEANUP_RETRY_DELAY_MS + } + if (error instanceof ServerError && [502, 503, 504].includes(error.status)) { + return CLEANUP_RETRY_DELAY_MS + } + return undefined +} + +async function cleanupProviderCall(operation) { + for (let attempt = 1; attempt <= CLEANUP_RETRY_ATTEMPTS; attempt += 1) { + try { + return await operation() + } catch (error) { + const delayMs = transientCleanupDelay(error) + if (delayMs === undefined || attempt === CLEANUP_RETRY_ATTEMPTS) throw error + await sleep(delayMs) + } + } + throw new Error('cleanup provider call exhausted its retry budget') +} + async function verifyRetainedWorkspace(client, controlRef, coordinates, continuity) { const box = await retainedBox(client, controlRef, 'Workspace verification') const markerPath = workspaceMarkerPath(coordinates) @@ -540,7 +578,7 @@ export async function observeRetainedResource(client, controlRef) { { required: ['controlRef.environmentId', 'controlRef.sessionId'] }, ) } - const box = await client.get(controlRef.environmentId) + const box = await cleanupProviderCall(() => client.get(controlRef.environmentId)) if (!box) { throw new MissingIntegrationError( `Sandbox environment ${controlRef.environmentId} was not visible to the cleanup client`, @@ -562,7 +600,7 @@ export async function observeRetainedResource(client, controlRef) { /** Delete the exact Braid-owned retained Sandbox named by one control reference. */ export async function cleanupRetainedResourceByControlRef(client, controlRef) { const observed = await observeRetainedResource(client, controlRef) - const box = await client.get(controlRef.environmentId) + const box = await cleanupProviderCall(() => client.get(controlRef.environmentId)) if (box === null) { throw new MissingIntegrationError( `Sandbox environment ${controlRef.environmentId} disappeared before exact cleanup`, @@ -593,7 +631,7 @@ export async function cleanupRetainedResourceByRunId(client, firstRunId) { } const providerSessionId = `session-braid-${safeExecutionId(firstRunId)}` const expected = expectedResourceIdentityForSession(providerSessionId) - const matches = (await listAllSandboxes(client)).filter((box) => + const matches = (await cleanupProviderCall(() => listAllSandboxes(client))).filter((box) => matchesResourceIdentity(box, expected), ) if (matches.length !== 1) { @@ -606,7 +644,7 @@ export async function cleanupRetainedResourceByRunId(client, firstRunId) { ) } const listed = matches[0] - const exact = await client.get(listed.id) + const exact = await cleanupProviderCall(() => client.get(listed.id)) const exactExpected = expectedResourceIdentityForSession(providerSessionId, listed.id) if (!exact || !matchesResourceIdentity(exact, exactExpected)) { throw new MissingIntegrationError( @@ -618,7 +656,7 @@ export async function cleanupRetainedResourceByRunId(client, firstRunId) { ) } await exact.delete() - const remaining = await client.get(listed.id) + const remaining = await cleanupProviderCall(() => client.get(listed.id)) if (remaining !== null) { throw new Error(`Fail-safe retained Braid Sandbox ${listed.id} remained after delete`) } @@ -641,7 +679,7 @@ function ownedByOperation(box, operationId) { async function deleteOwnedResource(client, box, predicate) { const attempts = [] for (let attempt = 1; attempt <= 3; attempt += 1) { - const exact = await client.get(box.id) + const exact = await cleanupProviderCall(() => client.get(box.id)) if (exact === null) return { id: box.id, attempts, confirmed: true } if (!predicate(exact)) { throw new MissingIntegrationError( @@ -657,7 +695,9 @@ async function deleteOwnedResource(client, box, predicate) { } const deadline = performance.now() + 5_000 while (performance.now() < deadline) { - if ((await client.get(box.id)) === null) return { id: box.id, attempts, confirmed: true } + if ((await cleanupProviderCall(() => client.get(box.id))) === null) { + return { id: box.id, attempts, confirmed: true } + } await sleep(100) } } @@ -681,9 +721,9 @@ export async function cleanupOwnedRetainedResources( (expectedSessionId !== undefined && matchesResourceIdentity(box, expectedResourceIdentityForSession(expectedSessionId))) || ownedByOperation(box, operationId) - const listed = (await listAllSandboxes(client)).filter(predicate) + const listed = (await cleanupProviderCall(() => listAllSandboxes(client))).filter(predicate) if (controlRef?.environmentId) { - const exact = await client.get(controlRef.environmentId) + const exact = await cleanupProviderCall(() => client.get(controlRef.environmentId)) if (exact && !listed.some((box) => box.id === exact.id)) { if (!predicate(exact)) { throw new MissingIntegrationError( @@ -698,7 +738,7 @@ export async function cleanupOwnedRetainedResources( } const deletions = [] for (const box of listed) deletions.push(await deleteOwnedResource(client, box, predicate)) - const remaining = (await listAllSandboxes(client)).filter(predicate) + const remaining = (await cleanupProviderCall(() => listAllSandboxes(client))).filter(predicate) const confirmed = deletions.every((entry) => entry.confirmed) && remaining.length === 0 if (!confirmed) { throw new MissingIntegrationError('Exact retained Sandbox cleanup did not converge', { diff --git a/test/tangle-sandbox-braid-stress-runtime.test.mjs b/test/tangle-sandbox-braid-stress-runtime.test.mjs index a26cf579..2d5abeb6 100644 --- a/test/tangle-sandbox-braid-stress-runtime.test.mjs +++ b/test/tangle-sandbox-braid-stress-runtime.test.mjs @@ -1,11 +1,13 @@ import assert from 'node:assert/strict' import test from 'node:test' +import { NetworkError } from '@tangle-network/sandbox' import { assertExactRemoteStatus, assertRestartedCancellationRun, assertVerifiedProcessCleanup, closeBraidWithProof, + cleanupOwnedRetainedResources, telemetryDisclosure, } from '../scripts/live-required/tangle-sandbox-braid-stress.mjs' @@ -156,6 +158,41 @@ test('shutdown failures retain verified process-tree cleanup evidence', async () ) }) +test('retained cleanup retries transient provider reads before deleting the exact resource', async () => { + let listCalls = 0 + let deleted = false + const resource = { + id: controlRef.environmentId, + name: `braid-${controlRef.sessionId}`, + metadata: { + owner: 'braid', + lifecycle: 'retained', + providerSessionId: controlRef.sessionId, + }, + async delete() { + deleted = true + }, + } + const client = { + async list() { + listCalls += 1 + if (listCalls === 1) throw new NetworkError('temporary provider outage') + return deleted ? [] : [resource] + }, + async get(id) { + assert.equal(id, controlRef.environmentId) + return deleted ? null : resource + }, + } + + const result = await cleanupOwnedRetainedResources(client, { controlRef }) + + assert.equal(result.confirmed, true) + assert.equal(deleted, true) + assert.equal(listCalls, 3) + assert.deepEqual(result.remainingIds, []) +}) + test('every telemetry field is observed, unavailable, provider-default, or explicitly in flight', () => { const state = { environments: [environment()] } const complete = telemetryDisclosure(terminalRun(), state, workspaceVerification, account) From 9a62f828f9093d5a21d1db3c90b4ea996a43d1c0 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Mon, 31 Aug 2026 06:09:20 -0600 Subject: [PATCH 136/136] fix(deps): consume Tangle fork recovery release --- docs/04-runtime-contracts.md | 2 +- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- pnpm-workspace.yaml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/04-runtime-contracts.md b/docs/04-runtime-contracts.md index 9bdcac91..5e6c0b2b 100644 --- a/docs/04-runtime-contracts.md +++ b/docs/04-runtime-contracts.md @@ -18,7 +18,7 @@ The following published versions were resolved in this worktree, and their insta | [`@tangle-network/agent-runtime`](https://github.com/tangle-network/agent-runtime) | `0.184.0` | Sole execution layer; exact executor, retained-run, interactive-run, environment-provider, and terminal-monitor exports | | [`@tangle-network/agent-eval`](https://github.com/tangle-network/agent-eval) | `0.170.0` | Run records, judges, trace analysts, comparisons, and feedback trajectories | | `@tangle-network/agent-provider-cli-bridge` | `1.0.0` | CLI Bridge environment adapter with capability discovery, native retained sessions, bounded terminal results, live streaming, replay, retry-safe turns, retained control, durable interaction response, explicit cancel, and host cwd support | -| `@tangle-network/agent-provider-tangle` | `1.0.0` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, repository-relative cwd support, workspace branching, and interactive-agent operations | +| `@tangle-network/agent-provider-tangle` | `1.0.1` | Tangle environment adapter over Sandbox, including deployment-gated retained control, interaction response, repository-relative cwd support, workspace branching, and interactive-agent operations | | `@tangle-network/sandbox` | `0.34.6` | Tangle cloud client used by the provider, including keyed checkpoint/fork and interactive-agent operations | The effective local Runtime installation resolves `agent-eval >=0.170.0 <0.171.0`, `agent-interface 2.0.0`, and `sandbox >=0.34.3 <0.35.0` through the workspace override. diff --git a/package.json b/package.json index a2c82e5a..6c337439 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "@tangle-network/agent-eval": "0.170.0", "@tangle-network/agent-interface": "2.0.0", "@tangle-network/agent-provider-cli-bridge": "1.0.0", - "@tangle-network/agent-provider-tangle": "1.0.0", + "@tangle-network/agent-provider-tangle": "1.0.1", "@tangle-network/agent-runtime": "0.184.0", "@tangle-network/sandbox": "0.34.6", "@tangle-network/tcloud-attestation": "0.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 54e9214a..ae5b1a33 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,8 +33,8 @@ importers: specifier: 1.0.0 version: 1.0.0 '@tangle-network/agent-provider-tangle': - specifier: 1.0.0 - version: 1.0.0(@tangle-network/sandbox@0.34.6) + specifier: 1.0.1 + version: 1.0.1(@tangle-network/sandbox@0.34.6) '@tangle-network/agent-runtime': specifier: 0.184.0 version: 0.184.0(@tangle-network/agent-eval@0.170.0)(@tangle-network/agent-interface@2.0.0)(@tangle-network/sandbox@0.34.6) @@ -542,8 +542,8 @@ packages: resolution: {integrity: sha512-lVHwDNNtETaWg/KljrizdC7A2VgJPe8vxJpGGWOvhX5w2b5E5CRoDiF31etja3ryk0WJg3liFjF884QXOzyWxw==} engines: {node: '>=22.19.0'} - '@tangle-network/agent-provider-tangle@1.0.0': - resolution: {integrity: sha512-cQGGOGgSdBRYGxFMYBvRdYPgkQeoJruMP+iswGLZESfFSrjyoPm0Xa3XHzbfMqn+FvCyPVz9ntwhMxHhJGWJZg==} + '@tangle-network/agent-provider-tangle@1.0.1': + resolution: {integrity: sha512-Tud/tHCqmVtn8ttsMAoe3vRhcUxiuxS8d36IkagIUXjz1S/gyrK5kv0U/EVVKZ2TYb8Rvfl3aqpaTJUvUcBhDQ==} peerDependencies: '@tangle-network/sandbox': '>=0.34.6 <1.0.0' @@ -1205,7 +1205,7 @@ snapshots: '@tangle-network/agent-interface': 2.0.0 undici: 7.29.0 - '@tangle-network/agent-provider-tangle@1.0.0(@tangle-network/sandbox@0.34.6)': + '@tangle-network/agent-provider-tangle@1.0.1(@tangle-network/sandbox@0.34.6)': dependencies: '@tangle-network/agent-interface': 2.0.0 '@tangle-network/sandbox': 0.34.6 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d951bfe6..1baec71c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,7 +17,7 @@ minimumReleaseAgeExclude: - '@tangle-network/agent-knowledge@7.0.8 || 7.1.2 || 7.1.3 || 7.2.0 || 7.2.2 || 7.2.3 || 7.2.4 || 7.2.6 || 8.0.0 || 8.0.1 || 8.0.5 || 8.0.10 || 10.7.0 || 10.8.0' - '@tangle-network/agent-profile-materialize@0.10.2 || 0.13.1 || 0.14.0 || 0.14.2 || 0.15.1 || 0.15.2 || 0.17.1' - '@tangle-network/agent-provider-cli-bridge@0.4.2 || 0.4.3 || 0.5.0 || 0.6.0 || 0.6.4 || 0.7.1 || 0.7.2 || 0.7.3 || 0.7.6 || 0.8.0 || 0.8.1 || 0.9.0 || 0.9.2 || 0.9.3 || 0.9.4 || 0.9.5 || 0.9.6 || 0.10.0 || 0.11.0 || 0.11.1 || 1.0.0' - - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2 || 0.14.3 || 0.14.4 || 1.0.0' + - '@tangle-network/agent-provider-tangle@0.13.0 || 0.13.1 || 0.13.3 || 0.14.0 || 0.14.1 || 0.14.2 || 0.14.3 || 0.14.4 || 1.0.0 || 1.0.1' - '@tangle-network/sandbox@0.30.1 || 0.31.0 || 0.34.0 || 0.34.3 || 0.34.4 || 0.34.6' - hono@4.13.0 - '@esbuild/aix-ppc64@0.28.2'

    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 HmEZpj?N79H literal 14954 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 ••••••••••••••••••••••••••••••••••••••••••••••••••••••• enter continue · esc back - - - - - - - - - - - - - - - - - - - - - - - -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── -ready for a message openai/gpt-5 -Connection workflow proof · runner pi · Local CLI Bridge Ctrl+P commands diff --git a/artifacts/verification/connections/40x12.png b/artifacts/verification/connections/40x12.png index e7d76ad5d7a7264f9799d30b03fd717febbec220..0cd4bcca1a04c8197e040bbf2968c100f89cec17 100644 GIT binary patch literal 4534 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 W7-tlGzI5n!CTdV^NV$^L)Bgb2%Vv@Q literal 14619 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 ••••••••••••••••••••••••••••••••••••• enter continue · esc back - - -──────────────────────────────────────── - -──────────────────────────────────────── -ready for a message -Connection workflow proof diff --git a/artifacts/verification/connections/80x24-connection-keyboard.gif b/artifacts/verification/connections/80x24-connection-keyboard.gif index 3c729475a923c2bada0a173b934da6dd3f38dc33..4776c61d48c87c1e2de0b1675bf93ca40a988806 100644 GIT binary patch delta 75610 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 delta 71053 zcmZ_Vc{J32{4em&EXLSBW691~L&*@bgqg8#HP-CLE~zA;lG!X{tFa3)wk%PoB!wY_ z)E8~Yz9p0;6%yC)+;h+U=iWa)=e+;^ocDR1_xt&NJl`zC>w4e}Sq&!u0FEDiz!4Y* zN)r~B5tWo%UE30okQJ7Y7Z#Tlk&qJ>mlHW$A1)+hge7Iu9dALP>BA}{Xj|v2u7|Ad z-oF0K*KgkaH%NWk1qnk8jf}Q8Cw?4-1y1_Uj+MPv<8Yf^kXdP1%AQVuJStO! zkijjudAlDcrK*|g%HR7&HXC%G9q)Tw$#u_=#wj@lQ5q_36X-rFaVq1cZr-?i2KyA(EvH}L z=gO&^6Pho6uTAsZOzbguxnntJUh%bl|K)|R-eWIbpRPY$uxs-Dzp4M)+Yb%^gwpgu z=IT}w9{-$B81d=+*L#BlNneXNH(XsHvh#B^CK}AAmMEc@k0#w{8C)uTsuaQ~mmt(o zDi~7R!S@G={og7@LpfEvif(7B!X!z%@bO1|ORp*QYM^_3gHmTMq+SNim2l7~j(tFV zEKJ}cKambgtV4eB9sFLeX7QzvXUdsyg0lH**{j8){z1|Ug3DjXOWM$bAFV;XFB00c z*Tu_Qw|}#*OTb`+`eR=aFO%CjPuVPX@R}dr=n^~^y3s8XRJ+k55w*JU8l9MVi3dZH z;U_|wM=@zz?f%m%EBetl_u}tSQhM6&vCwDVe}4&k zt@>v?;`7Bn6VYGm{!GUF`Tl20_2d9Xhz8q-b-BzdO3x;o`my~b-sr^hoYb?Ib{6u2 z9_}107DoNp`N~Z6DjzGoVA=wDwWTM*s_I&Q;{hg)C zNBg_0&(`+;uD|~8-2A4rDM|cf-7V6;BFD*B|MpXGz>YcV;p%1YH+mg_dtf?SK8s>V z!W=OdQ_6(8g=v8=nTS)p9lSTzX=v^eq`5^WfBt%09U#qlt{2~5HON=JGRYS9r<3PH zeY{Px&yU_pW1X#fPOrZ*yvk@3j^N953&(VBqk0pRrd_zXJWkLDV=C*2f}I=39>J}5 z$sgQE*D~EJ6?tvZqmjRn8f;T0_PLkTqusKR7M5Bj@pU^6HoUvBmlf{oy%E=t&PbiN3+|Yx2X3xqIW+|}yKJWK(yTV_+Re?#g9PkzUnb#|Cb6+F3 zZy-?b=iR|nMXv8kwi5FV`6C1OwV(C9y>#Pe!8CWJPUhJ`IiLSxcYhWGb)pxcD)Rk3>tXcU2VQ^rKez4vdPL@_ zC9+$Obc+41r`y*03cnfY(fi%NNUQZfYCYON=>y4mTN^kd@4yE>c&x=*-N3Fm3`^l4 zG;AH87jI7a(JZGsl{4-LrP8cOR*dc^19$o!5Wm%dFU+=3d)};kj=- zdSB+S{de=?LlUX<*hDxXiu?0|O{9<>TgN|i$@WlB3;?^C%^?jVMm~e<^-F=869>1 zU}kYWF}>n&Qs=fEguTxloBF0}U~=sS<*b97#wh~_XRqeg9%?F+6qllS>?GdYHm|Va z;p3Md$L3VjPK{11y?Z|qc0F0gz@qg2BU3B8q}#c&n(D_er{ZpxUW&L$O}Jx2aM9Mo z4u6^ zyl3E}yYH3H6N|SJ^N*|RlamTBMkZd0qDND+yhwr9rsjVzvhJx9Ow=@V&8_V_Uk|o* zy){4M=H%vc;^b)s6^yd#$>Q=_J*;(lPEkf~G3KOR@7qrS=dYAhJXF-vx-gL8Sr;oI zqZl3;n{~IuJ2+bH3~pj}b#m_ewOGcz(g#MyR(39dl$3iHuUvods2OMOAS$I`<3Q9m zGSk#0ncSddJGcicV{{B~7EhkPvO42bRog_4OAEYA3VD6UAt>o~W`V7}OGnS3)4d3F zt(gG300*N+R1lvW2nioMITRj zS?dSb(QChEw(M%2Ggs5KHVQkZV`%9WRqR?89eOR^^rlx3xz5p*s2^mXP<^-`wT@ey ze)h8atY4f{NE*&Q)c;nMV}7^{=EVI6PcUZ%@R6i+3%4kr8>QBsx7@;VPZ~L9PIG#Y z#MVSGjOyx-4_qFHO!Pl}@HqvdBg*)yvHYQit5sCV!~sS@>RNK^Y<#TY7ST}WR*D2E zcUshyLjjv+%y7Nmo4_oq>=L)8lM|iY%DE4H%Ap{8 zy^t!^Y|HJ!!MyrB<+fN9uv%RbW&r5xN$GU_+?D0TajuC=;J%qAab!XmEPw|| zg&=Z89Pi>ZpHTX65(Eql6%s=P;U@%Lp3!uWNB?C#6-^2j*)oRZaf1dg+)FuVzi)dgz{y~0S-S*C;Ox<8^ph|O#~L+Z?FCR|WaLcR+o*0sq3 z-Gbvfgg-Ph3WC&nbjonM3R(A!m1=rtaeF)L(>PA_AWKLMQwjxC0TdLk&$vRkt1%or zNM@7DW8zR}TxJqwZj)SmFTor`sxtr=Js13y{Zp>@q86VY4J(Hx=3N~tsVLMM6D1BB z)}1*py^R~KxG|_Vmh?)+Ut~i)QBv^l7|SC|sTWDaM#xHI%}E5&k_*0$|b~8ai>^A{i`6M-wVO z1+l|0;Z-Hz*wMf^1|}gLCezRPZN?uepq)pgVk#vBAp&XB~Q z5(3#(A^4snT^W>Y^y&9d-fv5D3&JvV^}ttr=BKaR_~4dOXN-`m#k?B5^yT}r2s1l# z5f2N$cpNEx@5&$#tjd@13beMl(ma=Q^F;AlkG@*_KJ+-I1K8>T&m+&jse3l9azNDj z`>jM$PV>-oQ?^?tDE4Z#Tw>!`ZmlE3iNVfW%>? z5gSlQSYo=`Qveb(l=d6>sdeq`!^me>>A&g|!HJD`Q3yL0ut{VHaFaO!Ru?;oXO=4O z$N_N87yThug7eC2GQ(v>xYZ``rDPWs@oi#FvljpE*-KvWW)Q25MdaCG+Z22t zwwJcbgiQ-bn}-2V(Ix671O?6yYQ$+|3};orS;x-yF?JzX=`&E4B$CWdLqg!jve;bC zZ8m_8C$!ASGqF28I`0~8^L3Of3Q^5}tg6%ObS#8Oi29=f9%vp!NxTwosm)nx;~moR zc^QFf(9*uqKBrKoIi$Io=IC(8ce6nIx$;3*>=82^C?#7fE1EZ+uHbC5M-aN;q~1V( zD0>gh;t<#bd8yu)N8 z6H*B~Y5i4v2ALsLMTrw8bl={?kl94!c~Ca=ikvaFd%;W&G#V>#+#ghQ&9+R#^g5L3 zImLxK)i|2cRbA`*X=E~ATMQNxl%B2z0lq9R-#l#sG@uY(&sz^ z1(bXfh4ZQdWDl`0u*JFm;Rz=TThitH_q1kom9gqFF1QL57lYTcqeAa-9y2E8Hytz4 zEQRRc2IClhDnCc;FgX_8JqN(_Qv`qpnzjka(O1N|(kVP4=(tlRSdMA{;OY+swW&{J z1@qu=K{8z&>&G26AP3lly)_imk_q3DQ>ew*{RoD#{dJoM#C9xb1kx)|^W$-#{JEtC z{{pYqh;bixCtOzt-oEREB>y?~$zxI@_r+?!!G{pg5+v7kX(DA$q}%*ek#Bil_v2dG z-M;wot1l)bRm-@!09$S}H!BZvQ?-x*xfLa&sB`%SWPNhGE$=bM#&N)KU?PS;va7{OUQa2_T%okxsw_+Q)0sYCZ(d>n7MNEP3t_-UggW|LI8A<4NajA!8K3{>bR+~|D}n$b^Wq6g z>nIsdi&{Gihz(5>`j)pu(^&H!=su}N`fI)7_QlNxC@0MzTaq-5$MzO={@amBi`B#{ z5`%!P6GgHJfZZZBfirKGvqGC*BU~Dk2;W814SP$yL+Qs-?-yNbV=7#2T|x8hj9KeC zJ=h;|8<2F>ueDlw=4TprV?N}Z*vu;!IUXjpeipU}A~<7!((gz%Gl}vMq$>ynV*p!`a!3N5#$izpi}|qPC5`MtsVK6^Z9~}aC{bb{m?YZM zX_)2#afB}e&1Ra1WlO*m*=iEv6vin?W05W#9m6gkI>YOxL=^_GR}1DmzPi=zyuG@w z0lVN6s8}@$)^-uE8|8gKj6$J^_1x@dq`d`oQgl0HeU0Cwd>(16`vHC?jK-Jqgx&6y z21Z9I=Y_;#4o=5b&Tu1Hx_nNWZ>Lv!2=R63q)cdW{+DW7-%x!+<<5;WI=hrYc{OvH z$Jm~z1ls(SXURxKWKUFQ*+MGg^=U~h2qfXeJwiP)OWKii}BgoJC%oRWLu^<+?SU z-)uY1UMJqsC7yjK&e?+BE-&6=B;IS}tjl)1uTFx$OM;O|LSP;#A*4AWRL2BAk`N}6 z7_O5T;gT2`ofw^$c%wNnW+X9oJCQ6xr|Qt-T<8hWbb1~=xtX3iLce{mO=pNCW#}Yj zxg_O8C*|cOBjwCG=G!^(MbShXHyEd#YFJ?@HT)>i-1JN zOd9S3+~Tz)97{s^+y(%)Q$JI}S#Yl~_FEWuUw{#b!xH6!1vYfBjgD~mv>{5JJ=jU* z-_ji_jIDuSQIdl~?xa{_0n~F(Q~w+N~pFppCOGGr}PqA~0-c;K}! zuLuWlgn2xi1wB3(;2c2Ynt`S`0kydJ?Agr8vGwpFBj2q zmm-R)jFJ*6%XJ9HqXx6RMRWW}9Kf@0*+k_W$7|X4(A@Lc3ho*p*oTw^LM>Et*~SXF9tNLp=$U7SND8FedV(Lrsa0m|3ohZ{RaaPWN>{ln8BO zIKAZ1kTupA@6b?wtf4fgf$%9>8ig*865&`*MJD7bL3-wT@%(v|2FduO_WNA>ihDY& zd)#&~I0J$r!~Vk-jaZfhKV{C{E&f-narC{0`#|Bf8a8h8WM4c1W20h-1KaN!?M+_CMi5CCtD`49#-@NMt8Ak{(!a9ILvn!0|!$F2^C3qs_{4z}PyD{o<*fpLj1z&$6 z0^-<@=NqnEtz7dn-1MvBORo%F;1W2f4vf&NlDLj4{#|_ZeAZ<>l!yw4trhSt3^eDc z1khEH{pmk5!3sUp+4?e7y>x!g8g}(E4!bfAN|_Eb{T?R?WsnbMijj}*R14ztw3ERX zHAY>XmB4f*094tJRg(HkktJ1aTSkz$^tzvVzpm8yyNLy3fffw%^dS6QJ>q#p7F^T= zp_tBDVpVH$nb zL%_Xc6sdVj=H+}fEUEg)b&vs&bKD+Q3*H9m>mSEiNv71)w18Ka?~5EO6RxEa`0}gUPjR)3z){g+Lvufo^jJH&@hGVEbHn1*Qeee zo!r=*h}S^ku_gf9q}FH0zF`-7)5+@s%0C_qVrwu|L1_`L0ZdpuwwVKx4WDib=Xz!$ z{M@Ia^qoqj`^x?Jn|epN027XE?9O9TOVsmZkaEFUI_asfs~6%*3qrm5bV1Vv@fWM4 zlBPbfCO`M4QZr^~#k2Qf=*#ZU&vJ=;1GtI+pmUx3Ea9Q~`KHC>=bS^{LK_IvF!0jM zOD^1t;^$2Oy7eI2o994}$c}6M^xy^J&6CWTR>}0o9EgUIV|n-78-5gk%WuHh6y0fY zlqvDVsjpBCuaJ;#p7hG}5a_!vo%=UCIA=_kqDZyM$68_o zSQxI%ZR6^__g!E|K)74aOSjr!_ZN@<_I!CDbuy-dz4t|6!ui`Zp#5Hl*Nl;LH5^V> z4)!2&cEHfg>eC0qSB-=tevg0_ET}aZaT?vL#a$F0`T}5GHDr&#=SG;ljxec=F#n^M zVbho6QB_VxhyfhGI{MP~NPW<|6?_{J;Em_;tH$fU zJ|)qY>CqSIagDdf`8VQzCS{zmL%#>3>(YJ%*w@3mNBs5RK!UlYm4zf#T>$i66vE*wXfJ&-81qDVh zrT3Tg-twXfNRn*t;Z^ddVqWn{4hcy9heY0dBZ|hqZ83lT-(F1eCtcKl{opb6yo;Wn zbLfaP3|CY=T#wMoPhsbqE>yvNj`SSKSYlgfxSjhA{BQcRI&LIEax}wWG|O`|=hkT6 zz0v&E(ZY$*qJN`I$+1#{v2xF``?tob?v2&7j@3?#JtX}btC#%JXz=BU=a;5iUz+cI zX=(lPa^g$dzb`Dw@lJ#BF3<6vTjRa=#`{~x2PVef{Tm;YoESEk_~1G5>DI)^y@|2b ziSdbv$%B6r(~^_329xuilZ&?|m+nn2w@$83O#b*cxh^@iX)v|rIraP2)b_op-PWnS ziK+d6Q-IVolw>#!_nJn;P9uw^IoqbWC#QM$r$MP1e#03-ubCsUGa^MZVr?@LlQUBL zGia$$HdTn#3C+7_J=de=q zc*A)UuX(fBd5fZXtG0QY$@w$;^8~2{d&31suLb8=r3IIw1-G^ZkI4nE{RN`bqOaki zzt>`5>|$`yVo2L!=;Y$1{lze;ubG6&BP6LMs^LH)Jmh_ z$`h}Zrr4F{qLr4mm6ww%ZTl-Msnt%y)h@5qp4ipiqSgMk)q%;?cl)b@Qs0LSzkeWk zeg72ueWd97SljpU$?uc<->0R1%o_ff_xiCI`(vr-$8y_`)yW?}_J6EPt!)~vZF#Nz zj$PX>TH9?~+nZe5-(Lfy*P%x1aPM^lX&qU-&e^`sJ+;nzuntOZ@EdIidT$&dZHN?a zh_!D>Ol?RVY@nq#WsNrFy*Cv}n@Yu`O_lb|<5Qa_4mL5;KQ#`FerkIE)F%DZDgLR~ z{`2(IPs4+sSm`ai(Uyt#mKkZwqIk=yeamKQ>&(FxLHd`y(Jx2uU(TdoF2%px+JAXW z{qj2aMU?*SYxLXS`*$GecX09VkoMo9Q@<}A{0@`;6K?b;!uwAo=}&a=pBwFeVx~xc zVh{e1rMIa@+i~9838Za$@pf|icIwpj;c=89y^~?IljXgWL)ytJ-pOy@DV*9VI@n=K z@0J?vmV58sC+${w??CH!Yo~S}9_-dj|7|q-`^5Wi6X|br@!yvAzb~i$wjKOsN$+(U z?R9zY^^o>@i}(85_Xei+-W}}q6z|#$8~yv>{qGa$-$?PlG4ENngTa4?8=rLWZ`K=_ zG1{N>-d{YsA6vXXac6&VZGVpMU{>v5x_y83?7`Q|2jA`-e1CMXwsrv6VW+V`=KE*L zq~Td?4&13NPSj!1CSU8~WY=AXuV;!36q-W6IV=%MP1B@I^Buq0-&deChKe~YJJvYW zd3EP!FFNG9wZ^iEJFmJl2H?Vlf}Ov+HC>!&i`N&pNNK+IeX_gY+~twyH~;OkNw};N zJL7qz%?e#Me0$O)jS?hWH~sswRlR!(UDbXDzPo2YLP)x81rJx)7MtC3`xWx3&a*v1 z(*5^A=-AVXQ$6?G|6H1Ey>)=N?ZnF5Ld)<=d+kMUF1#)NBjxe$#_#VF?TMMuCW<5s zp5thFJ)TRg3uDZ4YQEl>&j_w=g3>CO1^6`W5#nCFgg_JFUu8sCLb52DH!oZS{aV6Q zr@Bkvq+9%5;lu$ovjn9ozcLPqJfyjV*QR>eP2N1J#j%4qB7n{Ex0gLCq(Za0cEnXa zmr7_z1W)qsG%(MVoUp)M0PP-k_&Fzl3 z=gr{L-CrMycSS-Rq;0yBZ~!i+1MX7xSLKg5j-DBParQ ze`SUS(0nxA`v-Q5Y?o@+!z}>my)Q~joe2=6W9l}Up3&*uc^dV)uZCd2k-X^yu~?ni zB=OEC5`62LJw^7M8YB^)i-IS5Mez2QX2egX7>?zY=OV~~^aF+aB1K;P>Ve5l+6eSg zobYe0P}*#88BLYHxzrkYBaBSpTXyMSiU*SCU?)smDZYRpz4SJwnbDI>O;(qu=vUF< zY?`2kM#*Ue@hem12Bsn&kwO3L(ln9qm#I)70l?7CVI8Ce6Hui>v^7nAPCUL;7cF*} z5|%Ge8%ITcyK#mj3j3Me=a)HmM4g@ni&Rq@c&|$Jj7-2xumPd|5OgjUVsY!&CkXi~ zc}ZY-|8GJ*J2R3NcA);Z^qH`JsB!poN#YjKb6ke0Cec10%CRtYdd^^&7?ja|R$-&zSgIyqcR?1*!m+Xaa<6 zM^1}BQC_4SO}VYS_XF)VUnc{0ljd#ksG&6HPC%Lm3YY$% z#=-7N5#!8Ile`9DATbs>5=&IBs#(ie5f)S=2~?)b$QUdo;55^5$d~WY8z0K?^31Yk z)i_DmV3%5&D~R7FX~>LJb!oM7kWaQGU8w!rgE@T!l_BF#N2ts4n{%QV$q{87xIn>5 z9nL@~vy2Bv)5wQ3(cssr@Z9HdR$cuWi|gh_29@G7O6GcA!|1zRWl{pZburo?@BtHt z69We+V)K&7XcIh!#Y0P_l)zZ!&PKuMDS?7nCsi$!Nujxnz~~P`a<*}*?_O&GI#9`x zXoVAev&dPYuIPi_7b~{n!{=ywPL1q+)f(6HKeuX>OT2XH4dTI%QeB#2ZkkF5l`Z#h zupXf|-OK;2vjhK7WoS=&2fo=2yaff=z8^=5^xk0fh<34yxJa<6(s9=PIkYBKx{P8p zN;;ZkUxvhWt2E9)G*?Uc=aeiIj@a?|J(&}dtBdc(+;7mXcqaUZVPS2Xppoq}cjI#! zJ-Y9L*UQvVqZ&**M8ELTPt zM?ByQ+-Du&V1cZ`w-wRdi0dZefm|pZe+ri>69Vl__BPL+6$;dW={SE)K36M?vNoN& zw`t;%QR*kVX@C@;?&@?Zsc+{|N8Ejzy7=|qxyJ@<6}cV97pY{}nf9tU5ePB(B%0)w zdi})DyXIEM+|y=(b=xB5s~B^zJs6^nWpOLA;;+XOMUmTZj>3=e{PHpgO^Y9wAcO7_ zRV5#BA`h@?7XLxkd)b6W&f&wu;BW~!9**O`svSHXF+?Ui45@AG2qrl=$nj_lnW?d? z??&d8yq_}bZ3y!fUZ0@15;eT5VTuM~%-(vtREuH4M+l z9iKmHe!btREj;I$hm0Swi|sZVDu8C|HIeB6f(O7z0t^Z3#p9HiWwl$Ry{|a6fw#Df z_?^4{OS(14fq*kt0nEKvjuP0T3zH0s`6_l1dYrUkX+%RH17lyj^GS7c3t}-pqN~!O zz8aF<;MOQ3TgBqAVX&Kx^gr-aAt;-4te2f+qE6$pkl(zfHn8w#@(K+mJFoj%Z zKY42k=DiIjwHf6jy8?u7{`jNVui|&9@#@mZQ*1Ku;MR{ z9?Z3K#F6j-H#Ru^NXP~j6vQd|)5U9rB_psI(QV!`cp1$Om<{XFPR>D?XfDmdD3M{b zdyKAbLw}co`~d^VRu3dUbV?UiN>I>NA-N)9kjH+)Q50coe%7(j6dfBn+dwYSp;I-& zSU86M>lob+3!!7M@RvI1YE-TXN$0Sh#Tp$hN-S(%u9UYCsP{QF2Im)N$5+Ysr zC;GfhvM2_srDOomA#Ma@qfEn->YTQn0+y~>J4B+RM75-pLwgd*G&4(c`dqO1&J9P`Yt~8$tr4t>Ixu=o(doOL_ zK$kKl3ey)Kp#uPoC=oKqf{<*R$=vyc{m%;r?iQqHnKe!K#ZQ~1m{`#UEdeZ?4U4pa z19D7qBGc?bm)XU*K08Oi6brBiQ!L1|q|`UhYu~(p1D)y;T|3fk-+CGTR+Vx6+#wXv zCGwFGs11-n1!+%g=zo%=SC27acx@p~G=N33Z5GdSGQX5jl}OY0xM{PJpJx3rb@yM` zyc@7dKtd?`^o9_~M>w$aTo2f0VX?^0GS~rH>GZAg-Z%@RFI~0(-8PQ-HX-c9*fQF1 z-Zl>N?ta0$@j?q~4E?kc*_J_{7_W&a(0Vj%GvLVlv^ucABMl(m9#1_(4?gp6Mmnbu z`F;KjeZ6m)Bw;ligG7Wgj}+2-S1niFk<9V77}o^l_irJ=|FO8b^m^;2`dxs7w+5jxYg$1J%R(Z#iXBf~+S(Rx+U9vN5!_d9R}}T*L36q2-_% zaHhFMrEZs{tzdt8Vz|cseGUJa)d=M7>N^Pf18vY^gIiwBbJ&WFtfq=o`d(&fHE3~* zgw*GBoZakM9e;QDJ4{q1B^vDGb;=LlnoKv(CW#Ew)-7phLgI8A-x66KIefNzm_|mN zy>`qxL!MSuZm|4;JKH9H$;#pvL0=0A8qlAKlSQ{-0-i``C!~|4snb;eiGA0+;|w4_ zU(uqU`1fMF_PO|gdlx`&$B}&LP0^s)(+r2m8uiIi$MscJFLB@|l)CHHMV5R7cqwzu7%56V`;88@vP6l(|39w3_XRcdgIVi+|D$tQhYzNUX>o7Axsf+dt5bk%oh1b!IehT z^SY|^IF5e*Yuf`;y2nCG9UEB>**EuZjH>gAN>Xy(4mh^+ws7fM%EtF` zTG-SxTV#k9vgH=?hpJ;uIHcY5U7I8j_RpQRt3rPBR58M9TjA6A7kgVQB{{$93zr5Z zq^>{fW9L8DaW^`K4wbh>e!DSsF{18EsuM@scp@0*7eyxB=))QDcQZ!!>c;x<^B-r9B-E)OW^_NgrY}voNsws<+5-!t zUnS?h+#nppFU=Ar&|fu&dgqYEHnYdHeFP2ZQ_FVJCw+B8={zUeH!mW$0+6Q#t*!EA zg?Qok1cG(OAeBkrzs+U%&~Vzp=Uc@rwbw5mn5KdxVq%_O(9>BLQzDBefW65NDOA;I zFt6YAf`(y3W005fC<0j8=`f&OputyD{mn#g@x=z=lm^k0bW27b9}{vBPF6A=Trr@# z^S<`r^-KsRC%ej}@2S_yp9yxaYAv9!hLeZf?-)b&I z>MQ920=Upd_2_ZU2o3_myX)^Qu zWOg9&UR~;^Is*8bL=JGhAMo~#S8c0tNh(0BZ^e5d(I++ZqWi1%h9FoCg*S!d{e@}G zl+?qxEI~uLY(BnzDQw@nvDO(?flRyvA<-j)Jc=w3XQs=vKO;^clO`La^cOS`0bfr!4JWUA)(Bt^GyVISJk=L74qw8LsSV5BnR;lP! z!aazCv6hqdDsALKqjqRpTj=b>EJJC@9i$0Y!6ZZk6|zr=KqhZQd>-CSu#*t%!tAhnTwQb7M=7Yx3V&vi*s^pf$gp6ADO`E8n@|3uu< zMadyKcM|}w`NHQ|li%O+C!|YSUm{Z;@m>I!7lLR_gI>8pd7-~xA<1DEnsYA9{#dbd zUT(cM?e^j+lGk%n`?7TlOe~BnkA)cPxBz|4Lsjd$*i*Sb)42F}c%%4k&7C5_ba+1V z@EvdqT)va^p!sZS4f%gtQaEr(Nx1-C0DuYnA4&Jp`jV z2IiEMA`_3KLnLb9n|Y{0<(1VA#im!_waAM7g{AL@I`U97I$nKrXf+QRr#{x^gr>oj zdz*46u&y^+4(+2~((obRJXD~E_|uEpi#l>LCmsTFa&X9!13TpV9u{2-$;N^lfZHo)48mA8}=?z+r>@of0dXDza z?itP7_TjZQAxs@Jk3)5;X5?``edgVjdB12;v*UMQ3HUUd3>!h;| zu7~6mEq82WeEJY`s-AXsihOKjN-#Zl74Mp$Pl!_1vT=@j+Sd7+{@`m`!c+~mH~G^k4?LJ_&sfIy&gk3w4Kfu?kH*C;^=9!i$9XmG83xi z6i=Ksb_^rN4;<6AmsK_F>UoRN)HT4Hd-?=fopG@A&n>B_Ii_Xmelc96R!J*+cXPpi$s=9%lIWc|c!&u6l%%IC;Q!B#s>{2MbNdr%ex)Z zzm7ZrAV>*|dS(X=R)+S-T;r4#Hgl|Mtay`)@#`1nD9M_}Uz40nf>xHxir1r7+(qBue-bOX78V&oqv1M^vSsSo%aBe%2@v`EcG{S$Rx z*9xSc1{{5qI+}VvN&cx(um0y(^JA`hW*k5Z!1i8n;K+}DJ_-$4 zbkH_zMXXLMRmhQ3lJnoC{yEWey;=J!H*i8{Q5)I)y7M19WC_LI=d)F0%I+&TWm4dz zDQ&}rKROeqp!yy>c{}?k!;eFziyQE7_8k`35Pafp&Ew|iVRHU$gf}Tx{;Bz3lAP9` zbID3|E`${HjK$0yY|&NcH+@?B#N#W*koE3!NyzXh0$ za7Re#0fM75IB6)l)XY`NaTcd}e}2x`@ZEWogk^(C0hWn5I#?70-DRY~U6lokct)>h zl**{@E|eYe-&B(pQmtJa7$9ajD3tdjob3kh(d$U(1S1$ zlOw$FyLXYd*zG-FPTGS-*C5l!>^cSKt8ni%!g;2;{ zH&$i-20FNE@mef}(AaSQ!4I>M-no9_3;&iuzH@@Eo)-QCx-P>xP*Dy3cG%7*(7H}G zQQ#3N5k)A%@by* zVA1umyaResK1&7{VAj7-XAAwFj-f2zwj4pX5Pq4)a(RpJ^PpFV6`@Ij^OvHAC7sSG z)4fG6;a6r5TQpQi8c65e@Y4Q#M+XIJs@1Vm!$=y=KTohP5Gp5oCdESl_;UK|NgqYk z5Dx!nWQQd1sUChpB;4&|e~t*B?7`U^WA8l>=YtHn@ZAZRpRyq)bnI01e}J9;sr3jB zoy&dci99Pz)VCl5ao-A`?^o{)iYk~$St3-lEPS}dMSx}!!77#Mh?Wsl_PEhFoMU(y zt=7%#mY407!Iv|+`_9{-WZ$RnmY2i6`JZ~-mtGWG?sKM%ot1_qF zjJ~_^`!SQJF4)|9Y&ie-lPcS~kaKUwKDGRQTAx-I8f5)t>|pG7Q}f%pOHpsWOz!@E z#^QMxmS{cxf4ef{i+X>a52ihgsI;C~cKg#Z@;`9+&BTuze_l-UJc@ozvi6!bqX2NM z{dGBOxE^Dn-kW^+l8lE`A1C^+;C*I`s2d?Jl94R|9U~Ya^>KP*ju7WUcdC_ z`PY7_F_duRE*m(D{}M7@^*FH_C*mNFqEh{QxuJWq3H)PWrkFiYC@MNc`qO}L_)wx@ zSO8iZjTLE}Ne+lJMUzIWOcdGxUZ|iSTGk7LLsB?owkSt<%`8xpE7KBd&98kpj480= zprXELKU_Iny$$OFjd6ss9o&jgisX54 zG7rK^RXrD7bn@Xw8e3xmW(#usxS3|!#qn(XWnJ|P7Mc~_q?jineC0fBUa8n{4~{>- zXHEm#oj3my=PB~f(YKYtj+KTolwUmShbw8_ILia53cGYR#IDt{+s~hVDGYQ(uGPQE zy5LYI20T#;yOo(X86XG$Z%+Z+bX5inx$pv$a{}Xx{pV%($8EGC2lIU5MP69@DfJbz zN6&Q)G|zICi;~7Sc*(C`g`OkIN$?z@H$1iD43~CAKhoxgM4;mBSE;}g5l7aQ&}q_H z34n$M6ghoE6Z9o!yFN9Y=*KW_pW2&29jra;-rxd|0xXdVrEXzPzs)<9dt>nWjx6Q$ z1Tn6dnWOAGSdW;sm;>SzfWC7(;IFGkrjHqu_-`f=?jRvLdMlG5w> zCE}U><6mdUk6~mf__Q{TcPhDyt4JnV%4F=+KG#Wy$xT|ZUScb67x0;NPU3+1nB-|_eb+0qe1e{l{A5#K`|&f zued#cXT!@mO&F=y6Dz;uXZYWF;QGPWGGdI60Q~oJ(&hBfiTZceI{$uj3$0#h5AgW7 zAN0Eial_}*y}}gFozbB47d}U_vjeri{eZCOOcLHk_;o1I8*}T_^`)m|g!(O#IUr~O zets4Mgs)D2y<73KpPIJ=Gd~hIn5ryb+z74}6 zpAh`kFi6%j@a>XUB|XV_B&MeM_V*F?HIX~SsyjcBcLIXrEwg#Tesht$!Qj6mccz}D zfaZw`BLQ5>3|I&E*fi(0M4{0<_AeH+Uz@>i!Smvy>CL|BB9_sDcO=2R=$fv~_P%#!Xv|fUpmHko| z;F0B$t2dAVa)3eTdKe%V2652^S;~dP=LN0b3I;?A&teMsX5eyRz*#Kh(NIpqbwFUy zs{BBdjfV(_r$YrW{0bNd`ykA05W|51xQTE}23!~eKD}P>+!E|bD(vUT*-0vRGjlJQ z1Qb1h-fMj>`cgLsK2-S8vJmQ%&((lH5nyn2h~GEnCrgmOKOZ1NU_>QIOEHWBv1dXo zF%{=3^nC;f4`FVfFM#$33*9K;wkm^dly03bK5lhSTm@ViEn2e# zEtiXUVC7IBxEKLu7zWg03z7Y#f&xedbf~!Rc_H_evKdRzgA>4ul|k+9XTh?SreTt3 zm>H%3s0YLVHhHu-RW_d!fN@~Nl&4`kvv3#zc7X+P2JYV+tK@`N!466)W0osZ`@z#7 z#EFdLU?QWGK_m#N9TZPwBG`QLqnSqZ!7`Z!Hl9J~1vEr!nsjXAI?@aam9J;p!B<8m zSGHQx4!XdaPrf7uXlsPC6P=a6JbsCSAj80o zYO_;sg7uDpc`m-FtEk$0Rnetr69l0~Y^7Se zsMTffRlBsPDvGMrYEepc_~rBc-uG|Z=iK)n_y0M`IoG*PPV&B9kJl6bq|OK4l=20< z{@a2W*b?@;sf4dtxW73pvXO1-1v9?!b!=+`fv+`H;wigT{mFc#$7oCHheoLN3oxMc z;**vV?Y6A8R%MB%Y}j*)5a1U0G-D54CJPCT$ydNpKeeE$7a`A2hyC3?HJUy8seMwS zgP|Bnf69q~VM_}fOOi&L5+uMgI67!3N_`F76KkZKg2EagG?+(1Zs15{v4~E`7@_6C zZ#8g?t7iR+)L?#7)Q67w(c-O9ZacSP00)VJ19M+GHUq)LKp{v?r-%*|gGJC!8lP?N zhDLWGp7vmptv^eE3$%c!diSHf?rpW6^HKc5k{AKWmjjo&XtcY2M)r3_<9&LH0SCJtbeoOczJ|DNf=d48wYW1Q7Bi;3a+Z zuun}Ly%ktFmQ%ja`!a~5@Xs*RdNhF>(@@hF7X|j2jXJjv8SLUTx;vi*j!m@;rPK^I z(hnp@jXnE1*3mN5N7oGFd(1g`(L|yv0Dx81^ch=qxT#Kj{xgUyo`8mC$Et(N1>mQG zSJMlxUWNjnX>AGI+Fh^8>Q)cNQK1v31=-LmrA=e6R+5|O#ldg%z;4Yj2J*aV7rk#b z@m>AZaZPP`4UiN$NrypjFT8w(s9UA8hwE zfPHHn(X4Ma4DERf;3rLkUZBj!bqa^!>C=HD4dCE2<*2mNK#4TWP?$p_mQ)+Qq3S25&^hvSE z3aCn=JpB3R9sDU!Z3@P0Pd^@kR+~VD2+P$qg%uMFi_oWw=L)jNQ!HO!k;+sDSEc3< z)=SG$M!U|97#TWE9MIRh?9@Ha6q`tHgS^eN(J2lBYKLDywXuJx0K`BT;p1Q;TH z`M7E=?aR}4@lO?!B{p@_){LJpLMkJFr=c76CE#l3N19^b{V()FVspO+m~y(i0(0Xs?xq!W{M&nY&zIcb&r)Vvo=aQ9(qMfsI3&Hb;cWWs?gnK7 z|DJb!eCZ2Dt^A@mLhC_XN$1Af)UB|8<-OxmM^WEIrFItoeQo&MGaYc5V6&Zt-lKUH zdHE>y`yL261Gd!7d_Q*i|2NC||1!#XcL0vqg}~jR*dmOu6`+&$<4f5ObuCcyHHIK! z1?Zic8JuS}{dfR@qm3rvDh&*3=RqA;K+6@xyFqz(p}IvpPzZ!K1X|(-M1;WLn8R`g zvV{N5hu{Sua6TI1GRWu#m`x&(MQ9n|Ldf}}>*v99RzUJHWCBlfz8l?+1H}O- zFA)(2FxZ?^GPD9jLJ(>MBH~iofwLB9zYNg}L6mnhe!zjC6@-5m;$K8#H2Kra72Lui z#qmfjEKLdJ`~sHN;|*M-`{-;Djg}R10{0sT`Q6g>yMqZx{0>Y`!udlGSS*_S9g;yo zdY^WqjIa&&uPR1RV6aeR@p;hL61-;x6ogPe1Gt9;m9(t@H5?e+1-`ZdUIT!P6;O=@ z0qw`eVgQ1HS8}rmsE<*j{ewp>UyAkxG+E~002%{S0cW!W#Z7u794z!RPn!4%4BN{N zpiMLrjX4pYSCNPowg+`Y@qjI8pCg@vXZty>&rL7CC7XrWRxT&IYoi<(!)#31Bzvzo+;sSS z(G79xEN@Mao(SIR#yceej$KGF@~3`B)Zch<2fN#sHJV$`b8u2mMmJ`p^%|YmBm7Y&($S5Z2Ak5b$8=x3XBi&T17uyYq zh9L8&IHS5ET^bgMatV!u!sNNgfB+Y?Xp7>Z_;W)Nz0@J!QJytIwoEqW|3ethAQ|KsvT$H4l5)JqRb z+`R0Ax)4fEp|6CRgs$A+FM;A^#hVDuw?4)xx!m3;Z*qzJKA_}!=jd~jE8!HO>=sQU z-0T+1WT5OG$HZLZo^Z}Z*&|V;BCj>!JZq6hiqd+sXE82*&NJOmxWy|Ae{;?&+urAr z$9WsajmPdb6aGxenA^sA*0dOWUJe1Ny4lB@+Ix>e2ovypXeFaxA-T(8>{mrNeO$pQ zQj$`^;a`5sLsi%xUQ`nB^wq!nw3_sZTLI+KU7rj|w>@2SY)At!$y&0z{7h{7<{;E2 z1jGl&W~8E0l_rK)8C*TKBfhnMpNI@jz9T&p(tlRT581F|B#7arf2O`SKv(i1xcyMk zFU?PKb1+o_ujO?8neXF82W2|~rik%|RfzFURxHXZUbO6XX>MgG-kZn2!l67hruu#? zJGyd+e>WDTWrUVGX7@}A+-7eqA2hbS`)eIz0}VQ$?g5IFRuCCTl^L}15!`7x;*HwR z_FeiFlQkT}CWvKFS}4UH1wQ&0(1b@qt9eF@NC-bGhMeO%cZ^H|FhlpbJft{jQZc;(n;hv+16F%& znc*4=@Gn}uhLPb1D06smyD7uoaF}?=Q)W8xafaqfm%d3mU0ZfRM(E^aeh+u>YEc7r zPL9l~9!l}62_?jv7hL9`3p1GJvARQ(F2J)>*`lE*NI_N!{2C)00PGBmqAFh6%>Mc& zcFfv7eOzojcJkyIevWA@1gPL6Vkr~QdvF-APNa`T^`!trPi_1ai9E0p= zj9*;>eIL72VEBjzEjD`_B*HCN%}f>F-k*$)<%uDIQl1WFJV2ia1h?D1jo}eTWQnP+v@Oh4vE zq17Sx`fopfsHyKS@X9^_n!*op96C+X-QnFqnX`{vW~zYZ&Q{mXHdjzu20ps?edaIO`~`+8hz}R zs&Ku8YvJpaufH6U5)xIah?aaibY_1LEiEQ0-LwG5Xz$hS*0*vy)Rf_zftW}D<-CP zA|@SYB&J@J)ZhMCP4U-6l)}Q;$0GE@;^Ce}#) z_GRqqG0H>oK_-2hAdG)5gc3)Xb&p*>!U`IkqB9sgJYw5{A!K_06UJ3~F*Xt-&282* z*W1hb|2Pb}26Lom{%{u(C>sOZ!n7Z_KRT9&Fr!xVkallAd`Yo(So8$*7@$NkLimN*v|3MASbnvBOxE3$tS+Pi+oX}-To01{hsia=ZqYX97K`J zbnHhM%KNI3`^ET`Bzwu} zQfZ?qInChD;aHjt=^=2AJ6#`-r9n`BXeV7~%|*rIxNp;4or`0M4SB5Ix0+;-e}N*( zf<4R7BoBB#EY+n}Nmasn5muw}KNP{D{5V^(4ILrO2zc9fd;fh>cC{ z-U-O$k4KLevC;M9smBbrMwraLRa8VK3Zyb8v@7%Vwdx=^Ejb;#^bCpiO7Hltmk^m2 zbgx({1FVFJFyV`8hcSc;Y~o#~ka2@a*0H4&*W>69+ovJcqAHK+AxUMKAY9U0VlGT^>Fp~a8LK}to867 z^qhnD24L#3g1v{Fz5IGQKU8}Ky?Vbp_6n19zAyu7WGE#%^*=w+@My_tov`~HAHq`4 z6X12CQEg&1I>|C9PEo$oEGyl92Lyi-S&1b{QIb}bJ1MLctu}^M7t}42)0L1!X{e*L zS(4~uBuKb^6(`*itX}O(qCpK>^K0K>M%9brUZuQfg}ivYBN;aU4n@%nA>2;P0|}6U+9aN_ z;RoYe4@7JdJ+9|jd2lsFbMQOIjnP}@09BNjccJQ$l*4BR0h7>7bn5@H-EM8s}P zw&S3_9@)C&!D-@G4ks4k@%=|95I|d$PAe9vC%A)5hPDis@V`=kJVvEiiZyqa&{566h2br_y_nC9UZbN zD11ttPlXVT+UfgWCJR1!Q98&BERoPUe@bx7#J1_uM>;&A;$%ffGu?avJ(G!Stlmd? z@-oS2R}!`7Wk?DipHnxOkUVcT&!2tV7tc2yqiU}BXGBt&96Vw;fkLdA!RK@6tV-od>0Jn}`*C zBk;F|jI~^5nTWy0-;gD}Q9@)YoU zBOg~T1GnKzncCqOjrhtVem##{fs79^&6>PG0!*Kpor}byJw)NT*aW@2x>)6DJ!cyd zd8{>gA_m9l4F$Yphc)%dIXYI85oj|7a$G>A^niFj92i*Of;3Q1KP&I=PPdSzWe5?| z!^yVB`ZL+sY2}$Z6H?-Fzcoh%S?5Y32%+cya_0KAn zM(_d0*P@dSsTy_{^ak9+1s{HZu?@wzpx`EmCv`P(*BmTk!{6t{y^BRbU8iHNd6o8X zB1>hA(-s{d%7gFrYw}Z!c8?v3vr9U*C9L(Iba2%4%9{1t)I-zg&i)YEBeiJrq1{!x!LpPC#6ZJ)avYZW$j=JNOC>m$tf6OX-sfeBB<^k~4=$Fj6lRVCEQrKh zZmRNijSZ1ED(L=lE%Qs?3;d|E#l6ItQMKP4nQEhQ8=qXhBU}mN%_xIiz_%!tZJE?* zie8PBBl&$aDtN)^)vX^X1DkZUej-nER~~h@UGulxi4^&i3WznxU-Z#)GfVp>G%{8Y z*<*+bh>*UGkXMeAIF3FOzVx4=&$~T70$To`o*%z#bmMAlEKtuQrvL{}1schhM_)R> zO*$LA!j|gZP6z?~{Gga-C}@Ps8KNicy8FRaIS)F$M-@+n>oj6fpZp3M`34(fC?0I_ zEABEY+#2S<9X@cr+;zAK!;BzKkM2Z`(FU8%%2CbuUH;pfkxRjlp~W zS&oA1$?jGofnIT*%?x7Xn9|nIJ5McgG~(sF?hu}I#TI$ZSfOwCeLAS7`v)b09NMG? z?<^zrSU2@!q1GX;)>= zB;c>+pk;P*gi=v8KN#MTH#mpSa{DI+bZ$f;iKlm@Q{E~o*fh#VX_D`(`_{#7EGuWK z8jx?^^xdCNi*d+ylqOzg%+8wi9{A!-@9x?o;YEy3l*JJxOnrp^wUI^r0p%^f*|WKG zYq6*e7sd7;%Ac+_z9`|{(D}BN>Eb(~Mp#Q1uICUVqwh0l@^;)f(}7Rzc(1#K!Qcp~ z9~Uwc?Zczr2cc#B)?$@A$PL?szHF|inK_&47XP*_S(_PUnqu7o%O@J!eOh!<18a~N zjB%n`MZkW{8CjV#3*iV!B1yssraI(4ToE+t)3|rW^9Ky@yc;JGjLb@{+>^eR7GYGY-DTRJCtEpxBVQ1po@^RtLD@8KX zZblZdb3nM>(fDj75>N%;Fccyb_3g{VH}_~fjM9xl0!FAfeLBpuf1l|Wx*3BKuj~R$ zQD}xWe1GQ|R|uT&yxQU;Q9SbFH6Zf|i{V^tMJ<0Q5zt2m`*I0CRNp0X zlnV#uUz30FL$fJS<#QP6Buq=>Ag?k^`|%GQ`|FQFe(2x2F1PW+F!%bCmVM)uCNLhSVw1|$p z!CiCX;jwdJgI@{YAB$gdezdTKxG8Ut?0z0auXOXsCK~Dn4GfQF^HW#rlhaT`-NZv- zA;`E*#?Po$n!B#Q{g>Nx6pTPM`y1t=DCKSA*=w>?uYE(d?wn4$^t%6HtHf=ab!VP-*tQiMvK2_lL4Ev|Re>d^`>=oZLpG1D_NEpN9 za+JMu!&leC74NpwHXkb?iOLlos_REjL^TM$^?r{tVu@ak>0SUO*8f@-`Mh_J1-WWT zsn|{_@l1r3uyU*^VLJBHNef9++4NI-7z zb{OmWH5YV(BC6tFOX>Q0h1N>B;_pE^pBCkfOLo3b?9u775eG>(g)CD4&a2eNDi?M6 zk!LsWyZlZMlpRn?Ph@RN68^>8=l5KBk@%ZjX9pB+&{YW1A3PfzO#LgwZ$)7c$fG|BzQu) zi{`s;uGOu@o2LZn&7F@(t;0a*Pnhb-#+73lvi^VerD50g%OtK}XK}CwyAy=dcx~WT zOnL*!oJwI|H}?dFDEx*QlK%UGBU$41&w{r0g~sw^ec#j!+vxWti;rz~XT&nzPk5}u z5%ROLJ1u5`7I!6}b~%X~sqQ8EV=_8A0g8_CDiiUXt|DBd)7cHt$%33w634mFcbb_E%Q=9%jeU$-u7r(X&(1sq5IzXzg$yUNyAflzOBE6AFTJd z8{$}g9}Mq*UYkfHtY7#faZh%_~W2(k-9!Bc)rns@tU7 zc3OW+x9^Rpo$olDk38S`YrE}y*WZ)h=er?v>bM>R7a+pOQv-&e zbj*YR;;;1>-`U!XVXUh|A0X+e_`=XIjno5JO#j&rwKA-DZp=&tj*|{_Qi@YxnxKM- zvF8xs#oKJ2BH0C4jWtD5pkY@JMW=ocBB05Q)rSf^4K*_2Dl3A}1qoiF3~-;rY11%u z@H8zTI8vKeS%h|9VvGetqYYCe_QThhoF5*q0$Fm@#}aO!Hg(A&@6m#+J2nn!Jf;Kv zM5D~8q95|(4+zbAq^`E`@)oImF{V2l7s{82;e1V(o_ zGsTVW_$>-*v2{{oq*;D_Z6#OnzJ_bBr`#KoN*&NE=$ zec2GI$AFqNg0i8ANEZ;mJa9vd4yDW4Ovcn+z`}UuTBYQR5P=jtLk$vmS!@Z)?iJIW z>(vv{u})$tF6G&)e3gpbC#2q%L~*|oHT-9tp1|Z^#!m+|!fN&tX&xjqpYyl}nJd9! zrUht`lQEP(+8DmmXdRAsZgCg)uL855x&c9o-ZKc0Q=2Iy1!+*pk1Gpr8uQkUx&*pu z>OnA8cvS5VidC4`wf3*%Gr~C-PgZztYZ;1Fu0)^V+p~MFYy5@;gG(lIcD2|l`gH?~ zOO#sydWD|J-6|3pFNE~){@ADM5}qofFrn-YK%8)Xc1y> zO+=vdC8t>tB;*27jE2}H0`3Wj8l5xJn7L??%o&I z748_BiZQ1l_3(rWxsD1$fRmY74^K;P#VZsUF|cCo^^EqM8_&0Y1@fGq1~(59_lL?-%Qg^5U1)9CKT+pLg8PS39SWmD(uT^wZNo zYyx$PtIbX7iGzwx3`|m6kP{d%Sf=~%)^4qP=HR>$i<2tNRTBLfWjGz)e&Us0G)yzR znDqEGUw<~3{RzD{PXA!k_0#}YV=WMCdhALFS=!`JSx>17G9|~6* zX^6u*H09%$`Qx8A0Og6HG`an`-?MOJT^X5)aMupxXlO13jJ&_9KZ_GQI2Pbz*N(|; zrxJq}e&4&h_5wBQZ#r%ZTnvYzCz~u3T{&dq7-W>I=5?91%Eq~d0}SZ@QY5uVqj`t2 zd9KML5Yqjr%Y)K73N^1Ysh&S9&bUyQEjq!=u^2NcpYxI)F#K_K0wH$8K&LR>fWC+@ zW?O+i!QnCLg6{Nz4p6q%WCO+HWr0Ay?nI4e(a2>8!g>>+&q8j-tmX5M2LF6s%Ak9S zBETo#-Bf&$J?mOtzRWoCr16S-H%vCj4f;*A*8QCmxNMg_Ih{(ZGq1s1XCuAqL^d{v z83mOXTP+WKyH!u%`C1%W_F9<>UoU(0%Q^#@aN)ZDo@WZp{2A98FKEX`I&@7{L)Z0yqbcCG&R z;*ZXw&Qp!u*z;LXt>-xQP zs(IXZ{@-3^*PnGQt&_KzmF`81#b;gkSbd6FgZbEQ7PIAUi$DYjT>G$%_r<*PMJnC# zTH$)UBmL)|^<%^IuoL}SA$t5i{d{(MeA_F$>Lg~Ap&)C&puwP~6?{XX#B;4rcT?9i zWYy4XRhQzSz05>?y*MYoabC&v4j+)LZ8GQhF3&*tjfWw5^;Ve&-_ol0aS7Lwu7MMO z80cvN^5`GLniGf~V)G=~XM@x+dih=tBW$6mEx&?KsiGZ8!38NBEYNw~GdkQu8z-PV zpP(GjFE7es*x%z7b><%Bv`0>MRsEr-K5oRQTU&pbU%&aG_pU(1W{HN2kt*_@1Y=nM zi{P~yex2YX9YsMsgEBn}L4CV2eHTH4?Iqp$WrK=-Rl<^y;Rp#=V`wztW?W5@oES2; z7&6RoWTLLmQ;FB?M46?g->X?O4TnW+t_8T2$~2NK-ykhjkrog2%o~lYT?Vaa4bQn4 zm;{rgcOVbFUa=4H<9Q7)u0IIz`h2mZ%rL||T<^1OfS!GD`Ne9ux?TSTX_SLayu&jA z+X%f&VFW$B@>C;~XV`MNY1wDp&2sPK&)SLomZ@;JpXDZF0MOiho4&#rTj4RN=RWV^ zWf!lOuV>>j=xyieZ8K8TGRCJrLB}A?ztZ?R6>$3*bo#X{izEx*Oa5ts|9_ChQz-NQO%|!$ z3u^R&Di*2r3#wS8xTCTDlMc!L@E-bYC)yUsL+uL5~=+MDt#1_ zQlzTBa{>~4!qQZ&N40(ODtc6gN6i^fMWK+mEEOC6hxc8%E2pAOWq4F6NVSnl`c719 zNA-mc!I>O91OaL+focp>p6y=t3^lO7MolhIxt^dHj;aN@`9(F&eX=|Lah?;Q>N_f{ zqnbft(gUjY6UQl2IiQA#CsoE7U%pLkU64|XsZub#=_i%#QF-3Y?4h)mKd8k9ah#fr zBK~4Ps)c(@Wd3VvLc-kEO~ufes{Nd<6qAtrgREODpNxv{Gu|Rk>$DJa^>N#&;^Z zv-VDiB;}S?JjrT3xt88%>)<>#IosOVe=CwWJHOmJIHs(wYjNSyox-8PL67b+@OJbQ-J?bJr=BFT+%FCo@X zSNg~hBOY?RS4mnVd*iN(@@jcf+!=x;>uqi9y*MMqK>7!HZr(AuY(CQCtqK>aqTv&K z$Kmb|W1k?B2FdX5N90Fn=1}L*riqC&>E~=aLzB80frw1`i7eHrm{^FO!9F}i^{c_uk!qc87&e0kmCfGtXnQ$S|iVPI%F=Q2Ss&sx@| zll3aXf9DZhA+bcvJn~>liFSBb!amVHQ*t(zdNb<1ceVAl6RTQUr(bj{qagU5469mivhJ{$MeT zZyqcXKs&y92tC~Tq_-^Nh$#b%lGZb;51ljl8EgqBFWED4F+7R;ElEDyi0cf!(*@<{ zKVH5zA-Kby{#rdV66u>-G*LOjs!7~>x8+J`MII z`A)L5(i4l>SArCVM@mt>B(^s+AevtQ)$c9|L1IJ|jVFDJoxa+5&_wK%15SFEMUFux;n zL}cI_|ITd%Qk(t*IlaSu!_-_QQ*wQ^!D^JBH+fc3YN6QPkzN7z!Lunui{g$Q-sg{IcF>AAo7o=EJQ|| z4`4aej^&=fic3xyJh+KD`)rb52NHu8+V5c)3AswMRX{mi>!q+J?UIemRvUEuC@m;! zLZVf23Cm-n0ddE@B!{sQ)~2BW>4?31ZuF)9XPD}Lb*YSAsm|}EhL8P!bg2wf_o-c~ zGC>jJVH3ywjJ&ZjVWr_=i-`TqBKmSsL*o&f{Qay-vvP5J!tjV)>wb1aa=E0h@u=hc zeopgPx%92!QJ0hb+-~}c{~4w-t1yCgj{%}TQpS^o<+S+CeS-z_nbU&$D zDiKv%W`t_?Oz43)tYtGh0R1REe=k1sq9>JI1F5bq@8U+ zeUrY1R{!Yi-PrRe3P(~C`-r}L+{->eOaxp?E$r_VgN-d=C|371ufldR*Rxj)2p=TeGDgr@-PK-i+rB<;Ssg`oW< zXKUfQ%;#fIj~v;aJ@2@h#}@T5q5D>470*|rd{v*B;9I9vzCY`W7~sw;cOsX4~U$l+p!# zKGkuYy)ejDevKhO%2l-} zA%n)jyD87lE@~~^sJXZp6z#q+J&^LN{EX)Ji;+$*WGh+*C0sU>trp&VI4fy3Rk*!B ze|dQ;=Xu2~&Fhv&^Y1=gQ5|Yy+<2A$Ztcn4*2#|fuXhYPUaHW1BVeTc@4SCMWR|NM z%+wj;AmY3c6CbfyFt*eF>du;DMJwetf%iBlr(^GKeQhbv{;s8(%XfX}+hgauzV(j& z*;Q!WpF3h@Fuh}>cE%4eH@rL=x|`~%x@Gmqv*2nDvGJn`5b!? zcOGHJ-e)YAn3@$tz8=-?9jl}q{sZAjNFl`vu#$9?NqP<>ga1x3G?UEcNEXK=EB3hm zPBGYp$2sK1IX3@Sis3lUjXnOqQw%=g@qT&#RbrTn4?h0CN(_llZ|opR*Yjj=|=q}La(6XOZx z$JbhfZ#K&`CPZ#0I3&LdOKxQg&Jl5r-b@xa3VJD;G7n8`7ETO# z=ls4oWrcu9VO~#p4Rs!DB)cmmGtVWj54ldFVz!T^E1Pd08F{MDMgJa3E169@Ri?l% zQINMOC^2KzY|74a3O!n#@fRiIOnUzm9EJnbvFTIK!gtFO195=PGI7NaWKB$Gv_`Pq zPB+Cei{8%=+v4M$$`G%@oLSCbyMzEwrw~K}1&OUnKb*DZ@yDFw$QXSE2H^nvhRZ_t z(;4_OVGS94D_Q5!%ogZucI!;V#7ssEOxie0b1QtS5)-bRHJ1Py-bQe1LoF{cI~hZT zi*xMmW3Gr{JaK^4e)e!9Whc+pd>0mihlb*iI_?PAF5ELD3x)+vt&o=igiALe3n+ri z0*D|G=2exKyp?BmDO0ux>58S1!Gi8?nQVzUKsQW!7&co5*TJE!D6BHnwW(XFtPU|y znOt~JejU01)^q-4QR?sk6jLm%QVg{& zqEY3DU(T?y${T9Qfu}!`Zh6F1TnqpuY>7oPw+o@gC1S%R1S)*{c|SuzwdkBGfaEMK z;Cm!pm8}?&uB;ljgZ3$7zXNnWl+o8+6pgV73wI zdM)M7C*|&rnXY)68zJe6P{8-TFWavoV3H=libj$`&9uO{yo(=)``=IjY*)*gRDfV( zFueM46ycP!Tx-7Ksw$A;{wRDB${q0lmi_=9UExAoA(d2#=&1;%eGJ=!!HQT5Q~{^? zD);(2KSpsZhxR!YChU29^R~ zl{_KiL`~k=4;DUfl8Bx(TE20 zm+GPXnloQ&j^-PdRBNtN_mAGIMcs?*Y7HuPNSr9EP4s>MpDH>*1AZat)T3y=Ey6R2 z(}?Z{C;8;w73fD z{#>cLp_sGKS`AQ>04q43J~qyu6$d3hJo70)YUMw7YkP_;ere^{+>V z(}%V)wKf3Ph|uo-c&{-^4P*@JR({geMB6IW&~B#Eb9dyS!{gi@S_i%S49Bf%OE(AZ z?F?ru=o*nO=vJh6zn37^(z|l6Tg*Ry$28v^Xb|%+%2BHkt3nRZ#Bk77qkH<;w)%cu zZdFsOWJ_#$Lf6kG)(>F&*jjq&qqFr}`)S9z;qC)4;y{ZU=$1U7Ko1B+WpbJ1JD9~| z&1{Ct;Q?40L4ZaFmp4IYVY-ZPZ9s(X!u0!~XBrSelQg*m4j^*j72%Yd!&eg2Cer9m z)+h%x-p13|?IO;*pfqR3WTYgo5D*TK9%8 z{3(q3`ii&!I-2!XOLn@Lfz;KE`f`JfHA5{aYK>=luL5 zbNJx(p9Sjvy4L{DqzNl==kOt#iZLm$1UJ~2HQ{VD04)L-+@YAFm@Pp{HFSzugBfcD z1tCx<_y!jSGyP2|x~gQBrFfcWZ`xV|)W!l%Zp0$`>PpkLu|r)7ZJ zk^!+(k`#mpC76DB3R(>101>PqFbC>h7A)k_GT;kN{WO}gU53B`D011%97M2#<{aI? zt(^HM8s@bO*0^N=ZUqwqxoPmgxE=&b0buR`lnAglK)BqXjM@-v5rhi|ZPR|Alky%O zN<)tan28WV{Id_Rl@HxgVDG85nex%$$KsCE65(tp%;v8U)NS?)!_qeffH(Lf;I@pE z`S|e4D&5pOAcW>D9`T)L(Ls0V7X!dv1TnzRYY;z;j4w>^$PmWw(y>8RaEPlffpc!a zR66ARU6^!{6%!*8S`2W4(8x)sA{GLJz@Q;e6Cy$mm}l~aLc0OlN$AyONW2c5moRCT z@^_92u}Q12>3V7d;qQhbix8#^K%0j70?z_;8On|;7o7wpiy(2-KocHefdl>O)~PZO z8V$wl0+J0h21MA2Iq>1{hpgbOJVv0jbNvb9gys(6v21-kVkrapmmb3frR`0)Wn-e?Rn&2EG zFr>M0BlQ!_)H?4H;|nQ zT|BLIxQPXB0)Q&ssxCK?9C3Ts^zHNhTCSwkv6eQl5ieNMkX zi9g{}KebN@2lUbKFap?HdlboZkd8jm*8+{YrlJVPmaePS0)U#wj{Tiw8tWfQ=Rt;V zAkz|usuikpWgZ#*>qH7jC&-sE0ZO~y@13V|%%7H8$0)vq(icdE z)$N@JYhQy-&WFqgCn0HnEYl!RHz99nFyPS}0_wtNeqXW&5h9HR#PFcOX*Y1h`{u$& zxZE;wtRGOsfhssCya(XNf|`^6pgjoVM^52O%n&PB(RnNSqJO|Lln;L$z~He!47~yB zIwl4S@CdOgV%(?~8VVCb88u82iAXw)yH0cbbkt!`&2{#b^k@{o1g`{C(h1$Y_c+kO zUpF!3COI-1tt2$F$WS4jJ#=^K48R7VMX^fF{lLe?dElhYdU`|vkWq`%9n|i2V5hT0 z&7D|B6L|n-H(=SISEs>anE8R@p*XSC6On~z(5^ClOr0ZErgigk9HhG%j-AudBhhiH z#C(l>=lL$pm`zry{YC9R5Wv_pZS25!4y+ zZong$^G$5H50X9e0$dWy-m6WVLb0A8n4*gSk zMBV-Sg-+>#qBI?g*E7HK1Mpo&CAd>19$>3DW+b#f?Z2iAuzHk`g<(o2)EdNqXH73% zoDL|67J(Dn<0d4&>Ot^hl%o8GHzOhw>KUo3Kuuq2(evQTPimV0DtgTLF|G3(z0Gr?N*c5xW@kWa!%4 z@e9TwzIygHLNA?ZHGqb{L-WfooGNK}Bx7&7+&QyeZ5ng@S#f-nd$M>s*b_P@@b3CP zE72`MNZ#wewBI750*m#Utwq{rr^|LwdqAC?QiREZ^V7<`FzOXRaqkWjn2ON+s~7Zi zdCtm=@Z?zZaXl(I+axg5ngEV6Iux zsD1p~*(*DZFlnxxVlC!~;u5-2uChpmKlpoLJP%uZfZ+HXTAM|0Iv4&Fvnam7y?o=r zCw`4i!(0JyESdm&Rj@)>LTTQ*8qK!4u--n7D7sqm_pCXv$wCJ3fRQWtD9-6jY|+bZ zt67cAG(*kXpJR3JE9cUgzxQV2E&@=9U^0M?$(UP)3UThPyu&c=Mev>FH;RcDW0wlu51XxF`S-!7;zS0o_@{^y$dJKUp9jN57yrLtEzy1+uSGUaMKNk zZUjVHO1c|Fln`kU1d%>;$Dva~=?-b6q(KA(1VjNvN~94%;LLuW@4McaHEVvDHEaF^ z&RVR!_x-u=>*7PB;MBAVM8wvlBzz%ZT#JhE=SI_bLemjgCgHwYoA(PZ7q{dn&DUT8 zj*5tMTz~+ojnJNsUd*=j{8=iC;MQIzG{YO9OF9fX%CovAWWP_g;GvQ0WrW}ZyR-X} z0=^+u>nZhNcNBEhk6y1(^wRV&lL)a}B-kdeIpA`lP-wgxHa3#4ZTFKK6o9wR#Qo-L zNSG{O!vbTc8HtemJC+>$_GHX)o59m|7WpNEmmif_M>z(8G4VDZXzor6071PYrqSF>lo~-UA zmWAc_;;=QnuTJ7>Rz~DJ|3a zDzl-gXVOdA8;p9WfC}Kq17X@|KVRdZ^6Mz!&|tN%{)y9FI$SZptP@)Mnf&H^Q-C&W z0>t`pMOqTAU;$9x#IG2??wND#U<E;h zkEpmm&*-w;?8yxI_|?U$ROZpH>1TB3=R^YUjMzu}KG56`r{1llYyL3v^MBWVX%gSM ztNz#8FF^ixE-^CLhS)ElQWojRN(AqNKWYn@hkg9qhbJc-P(55B*W$we+wFEH8zXE8 z#yt?+c{ujEE036c@jc5;UD&G;YXK?AF2DKPQRi_Hsw* zER)|d@3m#gkpjd;55g%E(%7y!u>fL4x#Y7f2cd_C9xiQzMzTjgjJg7bq||TujT>^G zcCinagB+l;LlIK9!${`5LMU(+G4`s>xhJuJaQu?wQ#r5P94|XTjwKy<2f|rotyf~} z!BlQSK@!E+r!1c&&}s3(B1xS0b_SF_i`O@ay*B!jLIk}A8%@Kv%VrTAZ~JiY?!*J; zs>o6N2%HC!{o`Ou$Sqm`Uwt$LFGQh5mEVC~s84~&LKubPh(ZQ9hLSMzVp>or;~_bp zCQgNIE4+Zkfji<&8HrhhnB_TXS`;Ch$G|;Wo5*S0khcWrR|Puu(!D~}2gz;A^S(yQ z-_8qay67ww%u{Ij85E2!u#3d3fHx|n(*6Pbh7Dx5v&qkWoX&)_#?uk^Vt?jH2PhS} zZ1ULP`e^GlFV%V`A^LuxdL`AxdtB1cfoyP8dp}uwtNdQpMugl&%u~0MmqtsQV{?9| zhxfc+Z#_iM>}{Th>0PBnRp7C?<&7)UeCMKI_=$q4k51i7%{hjB{halHQZp)z);`No z($-ARmikRvwc1lQD)Xs1w+r&T`1(mgQZvKdyLZ`mz1BsRu6S$W6R5W{OO)h zL+`mf{@D26Uh(;{o|CdG`SX9jcB%vZw8`sVerr59uRBNMF$#aNjLtQ0m+N$K%<^kVnLLY?QA4Pn!w+FlVxW1b!w6;)CnmWrvBvu=PR6FeolT{7w7GvCN(MG8Bqz%|x45sEQsXiHm#S25zy-dbB z6$7s1(?)g22)H#;O~2XpvNz0FzOJeph32}LmlZkdUEzL`I4bq5rgA5a$CEA;s z(vRb{3LheswXyS0en{ngcbHOLKxnT8&>4 zBD6=xYxl;l;X2r*h>;{@Pm$5Y-09fcL9uyP?e8V;PER`LIkcA3b=R77s*nV^Z#D7- zrV{??kRWvD?51Y-KD^8uz=msexPCZ{?;)QP$;_WR@2+`bIj&MU8lNzBd5P8;$k&n} z9=_3@`qZtE;5rx;@pe^4v+PviukrNP<>z z(}Ob8w`D2UET_q@>-tWo{v!3M?#@uZx=ndjOLbS8{KX7?sSs_8Hhs$sQ=$sv&lwgR z!?(vXD9%~7+7i~gvmAo6kBn#0TrUijY-YJLW_ep0FeS76Lxw^tqXIu?g?_&?yb@Xz z5u%6*k)z|geKw2bp`v>(A|UR@Hc0nLbSU+Xijk1XCyb}jz_`&bHlsU&CDLCF2oon? zc9Y1)-x1{iIE+NYP$3kd41n;QSl)ePWpkHCyu!nB#V47p{GyWv#u84(XaYauUJqKi zlRL_HdDJ8CXfUO#m%@^Z0B|~lgcdf&hOezt`{E0sXla-=Jk)SGlYgRVy4^(ar0~wW zaKZ*&g-814SB4HRvRu=|MfX|_Wm;6VWle7~}diF8|E@ujf#t{?dwiZfPYu291%7Lxj9O!&h{c zJa1g2=QQT2u^6@{sVpK4!^otZE!DIT``Z#1#SlF7yKgy0RCgByXqO^|v)v*&6t;_3R{!zLw!kxEZElFm2NZD?>-HC+`D=LF);7l?k8FJ zK{@OtJDRwXBUs^g56y-dj~Tm88=I%VW0jmZd-y{t>u;azhx=b6^(n+3hz>>SCA3&1 zCT6znT28xt#wL$uYy9LYETYB;KTKBqf^Yeyl{2PI<#C=Q1K>z~#GbQy9h1zOxqkL# zgf*t`1I-Hq^1aBfv6ZyTwU1s0nx3?ftS)^WloL|Q@r>yQhVlDH`U3kFADYbU^?$rwG>N(}y@Y4jAtCdkBHm>i* zY^fGmnnWCvtYHfMxc)_FkG_z6TYdR^mAa~kXdIsymy%dDM18mD78^d9snW2d`Au<# z>?IYGY3?0Pj>=bSXjF^!@Zx*o#}6Y6D>A-whlQ=KfXY}zh;TaB*sLYsVcW1&K#@W+ z+QQ{JTlQwR9IN=i7Qj?___y=5l8EAP*}&x`(|N)?e#BgV65y?3=bGi%{2^bUE04RO zSf;JWwQ=7^3lbyQ_-S9Dj1xXhDyVP6JW29X-_Cu)snz1-ZJ)W%<}>C^x?!bl|4Lvzx86h{?sb+o_~e59D@E8MoF- zwu8hS=Iu5yKDvLDozfr+>W#kZ!X}za&joio+;mDMP%8(WelIW6K}Fl%Ysv{N{*#bt z&YF47MO?qsbgXK@;ElMG<$_^Q-P`Kn-8ZdYjdZo^?bT~whfN%LOH6g6~!LhICc>?e|88YY2T@ zN6Yr=dX^I&p?{4pxTX@gK#AH%p`-QKwd7{ndCkC>AAnq5ss!p}F9g3vZeyYd4Mfc{bM` z5cy#d*ZJM-F*cxVvykfqb>788`HPcfYTI&(Zgr}hORvn>i(};ImH09D`P0b~uaIvi zBhW6Jg2q`O!btKwQoC|Ixk4SDsw>l1beAiZJ7z3O1*T}I3MF1(OOD> zE-(L4BYNw0bekNW77^agrtCJ6s{@18&WE&3^xVfPT<2f;p6V38Pm(Q{e zBdNz!l26T9{$g2J&WR z9~-D$+HH0CYMsm8cH(|{62&qZtGfd}J#(RXZpC8YJ)-_pZ_FWRpXk+vdfrDzW~bVo z=R#_uqAYq(_r3j^_tUKoyFdSXxAm{*{2#R5>!Z2q=e`<{xO%U4HE4D<ciI6)cMs%yz6P2>lyCrS&8dUYS(jS*Ygh73ooxfM_(^y zT`!eiFSlKP8M(%;e7^p=b^Y!9dKK?xjpk;Z`{ujE%@4Jk4YQk{4mX=GZ?>XuwzF<_ z%5QetZhnp2?0vrZy>+vHesh3_J*2@Nabu4qxUeT`*i$p?nFIFEOYC_x_HP#Uq8xkK zhW$5!z50y3-ooCTW3g$k%xP(B9FN$B{~xA(SvJftW@16-Q=Zup%`8#3-P5#lbA2>4 zyR#1~7xmiT>)@#P_*yMZ=<9si&Ri9qL`NLG`pRdNnn?P)OL6y@+V{A^Cgd;n*9Jbe z(z-*lyTYz;A^9#TsnhM*a-;g2){f)kcpkZ|Z3gzk#IHKDs^-CKzQ1-qZ%w|vl>PVj zxHNc`wt)ZY;&NV-{_mI#2N{*bOo%@kr-3Dm;J>pwT$7@3GR^;)-LXc|Ik*3JcE=jS z8YlVR*&SOPZ&mw$W_J~oM7LA334HWtc-WJqcDGGJWVqT0j1+J=OSF`2P2L!)nwHra zsrwI?80hbFaB3Qx{FsuW!Cho`wzyajL1po&D6})3#~b#oBkfI`rZjJ9^hM>5Qj#<7X*7)p z{cIWFeQ8kf=Cv`ORt0GZpK+nmP?b_n6D51eNWUgZE!y6wL>G~R5kT|145uKFeF&{y7qHrbz}bX*RcGO}_*UK&>Jv-dQ#L@G+e5YDz^I(|cf(Nk+sMr7g?}j2oOXU5{=nKD>W4!O z?B@ZA#ieynW1L4&4C+!tmGHTx?^B;v^o%T^-gsS8S8z-|IwJm=cYxe|Efx-e#jjgX zA3Qt1)bx?7p?!?Kd$5wKPC~=)v8m6_QE#6(JTrdi0CmG1UA@XkpKsBMj|-jq|(7tvRi(|PLYAFuHIfq%{vm-JngKr5&T&MhZ#$4t#_ zDow}GT;#4ShlHrChOJdY2vi9V3X9{rF9Ydibge^dS|cLMzYD7WNBsiHRzlx=+1fp@ zZVH8(*-$N;9hR2)nksGigb>ZQQQY`uBpG!-j!~njWGs!xsLFEezfu*l=L!E?sxsDG z{;^PjX^L3$?SISJnpf9yk%*h{{#HHd7DAK%PTgervRu%;&2`QEI z1r?iciw)=f$!j0h`JU_w?%EW8PWCc3E&V&RZXK%Y@(22dqg}TOjc2%(aCPLVlH|HY z?oBUgza9|{<1nSAU*CFHVN_i=>di(UiEgQ3-nJE=8Du$*du9HGgX#+|8o{F5-Tqjk z>R>hjhC08$IYp#|u2|o2j~K^e+sgUcetxjlC5Bx=2D=XYLI&s|Pg-Sld05}bIpWi> z`^W6kZKCBzA8!Pm1GqeEiu~L25z7Bqjp_Bc)aOu2w?vI!X>1GPr$^pmiqQ{4_-xzg zWN6zhMYB4oe>dW0wzG{BX!V`t6zd-`SDwMiuzDFIWxVPJ=S{&7<8W?1!Q9hCng;Uz zHvg0;B)-F;(v&lot9qA~^`T33N~@+KkuKn zI29-{)>TgD>1|eS6;S()Z54*#@@*G=gZNCvFmhNKi6JGWX8>$Klj4|C zT+snxF0SE1Gk2!&EIQq10bQB+p(RALZlQm=?8bdn)P{&M8zEQonXn$ z@C&gLKG}q?B6I3bI8M^v`$_zRlIsHYmMH|mGH?A>Tv$Ng2y5vWd# zGQ8o1YO@jYj#e8@N6z6bgSyWLWMk&13e;WuGn4OsF?Ut9U}N+T=y{k(9;$J^6qEV0 z=JXLu!;%#Fe-2G4T)`-g` z)AXhV(Ri94MZnX?xc7KE%hE9sd~=q>PffU(b3w7b7+G@9Z3Q-eFws68#q4IFZYDY# znLdZ2#sO5xp3mBqvGUU2ChbElmKK7>9%_K@zfOH{4^T|@dta%!|K~NWCmW_=&~2e;9oF`u4O86 z;86BIQx0L?fN#({+e3)E<rA29<$24Ol`tU zylEozF)8-=;jp6b5yGU?th{$Ulxit;)gtDrLeCT}-N;NRbVVEPj8+&KZDgM=OYS_( zFXJa~vy>TJ^iyojQy+y{u#}+Tulc=|Q1&j$G{_11{;$mwCEaRf$Ys)h&(1|Ew zMc(s|+O%LQtKQ&>yBB^Jp6J0pHsvq7U+z>A!4KBk^R$)TXcVT*K8qQwUAr&1Ef zGXllP{_Mm@S=JR}-KGDXpuau%(M8XA-}5y>nBQPhdf1~ogWnmjdL83vv#I0EuB)HI z$sLmpx+l3-zxfM;V@B_Ut*4x>uu|*BjJYvWT$p@e*J6%Ir)&BlLd3BHHU1~uuV~6C zUU8WAs%MX_{0vvno5F|v3tI|28{yq3of_*1k>Buc$qM3r9~{u2e^0ujjqew)LF-rk z3@=yq(r?7DZY87@=*b>|J`6Y?9pF9onA?**Qkjw5;6@LQ7~LFaf9&3rC~N_IZ%zvJ z$^liq%UJ~RX$4Ktjv2()ie`RQ?Qq>|iM{k1{&w129t0Sp17L3p{&e?VA3S2YTI`J{ z181)HZB_$Tw;)WldLJBr?IKheeTmy42Wz^0{hLDh-^xfZRuSEYz21*r{r8im_w0jw z@Sl3C>jO3P)t6i7P>lTbF<#&GmLB%%zzT&uM_+CQUzvsA;)ft5L(a-WZn8p%eS@#@ zLdjy#xxJx-$?Jp zC_l+)-^J($?a_}aqJtfy!f0axB_p{O{c#k)TMdCYXso{fi3pgi?w`T~rb+r|_{PHZ zV}YXB{O#CO{8%I`u2?;`G$!^9Ph4h2T(x6dd3$XA-`E;_phP{s**v~=JFX)pu5mHG zXECn3J-*>@{6KbW+h|;ScEYG{LZ^AcU`0YFequjQ;(PprdG*95+QdoPgek|wCCS99 z?3feu0D&MaKq3qhL(C5ae+an$OVaH&yWpq2fA zrL1(V2kAdX()D)I4Jy-D@iI(!Gt4wH7927j#%2Jc8CE+PHkBDqmeTDWWIk}pbk4~% zTFP`E%Y5XQsm`0}<(GM1BkQG8mi2=y7rLyVoh%Q6?9j2SXR(>#8rfkv*-;(n?1b3t z#GI^WJ88RN@YHQ^+$^x^v(P(2pQ^#%>@8rH2^Xp#9gM8aRO5OW3_#mV8Ys36gN^jaDFF!6jyyARX*sBz7 z?^~YUHr$f9Galz}z2PuBA;b$b@sSHIw$b+o9ofnSnZD^$py-tb!W%&OncB+1IDOLY z`|K+g(uEd^hvuJc_y{S!+}b3&iKWO`@Ffftz2qXh;(h5E%~yb%4_vY?RD$5bgw8wL6jCFv4nixO4;67}2?P3R)BT%vnfqEBCHC|zm{u><`}&2vjFI!i5= zOCMjBTGK;(qB1*+GJF63T*I6@%UqYs+%L;K=*yo=mwQ{3`}mjp=9c?+mIp4E2Va(l z&{u>>S43D;MEO_5pmQtYIx7;e%N0qN6&U);RO!lei^@#@%Iw_A+|J7U<;sG~$|Cxz z*V0ub7FA{bRTa5aRh?Be%T;xkRSopjP14nGEvj4ntJ`y{J3Fhpm#cd&tNZ9{2Bd2S zEoz4SYoL z|GMqmy4}vYz2&<7%eq7Q`eW((Q;YgP{`G%z>n}U&ua=>Ayn2A40WQ;keAs{+(14%U zK-ksrF5)F|UU`HEXetceR>31|#HY>!J*Nq1QW^sqK(YWI0Mm#PX{0h}q_%1LV8>%) zOM}bGP0)zu#F=41uJf2<&A{7Kcoiwlw`_1A7QA#GXv*#RZMd0YyEh1Bn4HI5~y8W z?io+fF+oxFtE9_?qBoDiN~W|wkNm4a_pQ9{@viR4FWpoB_{;kdZ4>ej88qjK$UhPB zp+6HTcy-Z#B@$l3@+%6tfIl9BHsq~L20fgtG&Hl|-b2cRFW@decrwAsV9+(nKp{EX zDnZtRBjp)2M6G{CXP&(tk|7WF6R&!^a)p!i}#c{hRg&J~|v0=d*4e~u?8 zKS|zFO>w`5U9^~mqp_77)=Ut_tYS&dLp%ib_X-{jS{n2l5c56ACpWz!hYOIi)Ck+` zF+IE@mtiD-QX}xR8w{V|yE}f{&9Xq!bGYSrScGhZDP@>aaVRgWL)B))iJCGH9Z2RM z2zp!cMh23H>veOu&45E4qrmi#mpyr!&nUsVD+{Br-<$>aKRF8*q%87+2g4%O z^tEXiSfN=w6rRvAad7DKitq|a2#Lu-`}gp~Vki?4lU8A7@|w_09@@Lx zIQc$x3o?9QuVM5ANrDJd;0uc)j_t4z61wSRDUbbNAp_UHWX#pS=N>l>&; zLYOvw!Xhpu=%KJnCPhv>roas=t!bWp^MCWLLc8rwY^F*`8ChHu^l5E_aW~v;PGdfe zVW|Ly)A+5Xx;sv`rr&5iOS05`!TY((Zma2$#<|F9d72EIUh7um$B(_emDd`O<~bw> ztcVU>IfJ3Xe1#<=!V46(S0gA*9oHji?JL&Jmo&_=k77H+9;IFS;p;12%3yXm*?re-eGW3S|GhcZYhjY#atiP z=xk^_nHy1CzG3%ZKjr%!9&EIbxSSblL1D^UZ`N!20N05=BpE`uk&=Oe_4k1OqJM3#GG@+`fewLrF3bP% zUn4m|H!->ozE?K$oScBc^Mpp`SD@BMOU$0yxI*;(6Q;ja#45A*wiu&7H82K6%^Bzm zMo*i3GCrl&&zgBbcN_gKa?&a0I(o^=+D&8jmI$i#i&28h8U2!}?BI&cTrKW$&>>Uw z@|~0qv2z9DKs6X;_WhhWz85B`gCpDT!-O{d~~NxuAL_qWQX zK{ua2*;m4D>46&YBmWPole*Z0s-ol+ncu2=a>`xJ=te2B9+~y?mU_I8GUQ=2asDlZ zt|UVz({CPLpDjAnU;kNoc@QLXEAaNsUyHkP-3;sTiuW$m@?|5bXTz@|-dhi{@O<#S zwGw!3f*yQ^CdU#{f2zXB{}Gv@Mt)hXoWyO@2PeJr238Ni_IGDb2f|{UX>bGZaDTG) zhqn-o9}iN=xW-P0{9nU>QzO7${XYG$2gThjKE;3?n9*{Q^pPpO1f{3>Ptwa*vpdv(iq-cdypotY$6`s;hu;0_Ai)lQ9|7m-Z2%GZ=pkJ0_eZHI?I;lteoY4g#ss z`-Y;avFRn85_F^5K1~=USryW;zoS~gp6MlGcF~%ZVmd(GOaiG8?*| z(!c1Ku>3xo^$y9!%S2Za-Uugy)9Ffh%<0)YRb9T;JI%l^xP6^Yy zGED<%LtFp!67204JDNIGhAGUHWp{=uRUh~p$!dC&bM=w3$rEV3hBsBH>+Bjt?`V{Y z&R4{{RvGd0&X?;_rRkSCn>KbDSNoV$o4w-TenoH66gFS&DClA~e`$iQvp6eH8fBwc zuOj0Uimuc4Mm|0nk9l`IudI4i&2hzNevNExNJa_R5)>~EN&jiYB-Yq*YdtV^oW6Cy z#xw;t=x(Rt4N>EvAKFm3J+0aQ)>Ja~pIF2)dZ;+W&e6=JQ25Ju5{9y2Xa={msE;5x z^l{hS`_F=8BG(Oh+Vw-wMPwCtD_tZ?9gjoyBOxvC8xb>tND7u0^LSCeZO47uF4qV; zOb5P@LuoW((1vD?zji^R*!%u=&DX#4a$lCud;Wf?4?dq*y}3N^1xOo0@U+(^7hCl4 zdX&S6Cf9BYwD*JiE)m?8@pwl6Ymoha?y=RhzoW_X{toi!HpZDvey8sGJ0zUcnBbuO zgZ|6kVach+q?eOFnE(A9Q6O!?L~C!bFo%okO>S_>T#V@_HKjw9&$v!}a_Y>X zVAWGLQ@f6FYf>+(9)V3!n%GIPrsLdMYm`{LjY_D;o&0jJT+oai|G$qn@&7#Dyn+5S zOd$jMe-JNFwhysdpl1{mz(cGT2O)i)2>k-lTc8LZ zddfkzc_`P1o`ev+1!B8EgcpeRqHSo+#(kSt@GgXI5xOG_p<9?(dH98;Ah|t+hJmgG z5F-Zi$3x^8FLYoMgmr-+E_bDsA*>68Yf;iLhHxzq=mkQnxcS6D=obho!z&~Xh3-&_ z58-5tEF2+yJ(TN1l$PkKp9bdk5XJ?9ycj=pgn%scEL_|IVs1WBkntWeuFI?H$Jgyb z3i-alF-*(p+V?GPelaNQ&nqn1{e28^SJ2|Js*v(tOj0f|ItL=jK-d|GIiqUk4N+vE zn}mvnp2%HkJ<})URrL_H26CaZu=7F07D&jRonNf+U(O3ebuoQlH8rzP__{nGZ~C5+ z&iBn9BJP z3W`cVCl^Q_Z)Ra_>WUGT(S@)vkR*O|at6Z8xW%?X?s=(u_akGIp_7oTrtPo&ldhik z4=in~>YAY|h@q`REQH0$$}M8$5eo{7jwoC6@b+(R?SgPN_q6Q<#MK~^yrYZfV;cv^ zMK39*VQFnYJ+~yMqz2jFp>qYgZ~=OU`Lg;0Ix<1#cxQJntw%vhDq0HnHHJq&7+X5M zNE=LJbxuqZ5u(Nsr4t6!(;8oMp;d7YrP^n|e<)N4CuI81r6OJGCG-DaWZ3XX)R9_* zL!pg(6_ui6wt2An642hs0O@{ExLStzpf&=AEfOpVi}(x)btB}dK^)o+jJ*`?m&=_@6iu{oZ+8ksrK$~ z$}Sn~2-BlA@98Sp9}B!5r(3fN@(ds4fGgmr@#NR)M|9Dg`o!p6j7esRzA6gAcuYn7 zhE7C_$^<|C6N-035j_kf;73?P10RDSzz#$i2 z_hYX$z$&l#j9l7L65-*xcS$fl@5&`-%o`{-rdFxkrGL$t z%jcBShbA!|2PPIp6a)ZknUGd+-ft^=4Ofk&p6!y*_1%+-33tVP@$qkObO=v>7p%+0 z-)_O@t~pd(pnl85>n^+=#aZa#Vp|#ZQ<;!JgVdWrETtkPOyQQA>=8FNd?yA&?-ghh zb)v*@($A@-eUyx-Xcx6F^(Q<`Bqwd~9Kn5fhW<66&ducZ9(mOG7)6Z;5do|oN$3;y zrifxbwR?_E`xU-2X$f4Uayyt*MfBZue2f6ZRUAtH=BXc zj|7kK6j@svBEZ0P;zXYN^rq8M@^e-c%T0OFkw-262S~R@ea?Jj`M7~W%?U##T<1W!KQTm1P+#4QkrDCO(8*p zc3dxFL4(wkG>3?vd{1e|h0Bh!Er~aIWh(E}Yc^)&_?HU4;?-iEBFm{_v=?0GnM?~L zPwiW=zpI0<_1JzkWSwJ6Ofg%><#BTkYLH#*?$EH}bBdH7gJse~=vb_p-($~L=#4UZyg8&1gnCbJJPULUZOLdZwW38uUi~B9A|krb#{{MouhrP8$Y>fwexEI9 z=`PW@%cqs9?|@&x9qZM2dl8^I5)f5w%ZX5=% z&I~ZHg~iy^)ZHymu@-66Tynz(ALh5uy8=q_1DPS2gs+G2opjp2bx^Br^fMsC&KgE(pkqa%K=g0Dp0uP`)4VW>BV&#&UVe8`K6yUG2q) zhG)H1TZ-?II7^S}QO2yPkn8Fb^ud9JY~3^Viwg&Vk3QK;-FxYu{C+x%f2kb0DNAwt z_ao2HYl$`DSiO+R?J2q%)0}k|0hht^+ado z0bAdExfz9?g&H#g2<*p0y0^ke?alxcvtAYBkbkCPCmI2ONJ$(nc6o3ZOZVF`OKPDof1_DVe@h3q>|=PxrHSoA(_E6INTcs* z-lv!O?2Y*C%1(CAQDhz}qn(-U50f$}iUeH2G_nGG~J8sN0qm;y0+%b?#@5 zr(4_REwM$`QLYEQh&pY%v6=)is|P*DH{n785yFIyp9$Uzg8^qgh82pqZSJX=xB(vC zL8D$jvBu$xcriP7Vz@@awbb2rxa9F2&`R0S=J4VeGVh4$j0p1>PhB4QINC^Vb+E`6 zH1my(D8qRhqEQ zgoe0pA_TJG_Knva5T8yCoERUO$^lLFG z@iPvUPZDJg=Bh1OTawtf$R)1LG@i;a`h9CEZlwPpZURY*+jOgO4(G#t zY(zq{M6&;O0-=5`)VsJ)6@Y9RJhqJ65os9e+iEI(s0ZxwYI~Z-+#Hj{&zXDM;`Uk>)C!=&ExXWBu zdHx#SQ6tJ_x2r*>T%OJ-xIg=*H zt4Rs+6%$p-a#xWFI)nVnAd3Zslrv=)0r_2evOAqqwxR`25^B8BqIj#k^mq<0iyZ{T?H6W1mhD1 ziTYqXC|Jx8u1X(pgn*&-qp;0oZkJ_jsB#|VGIaoOlm>CIMaA@*phN=zKqpaXx=Gc5 zi_-u|gKywul|FH>RZcK*w*ubqq(HN>xQfiw0(`SuA+rgPO~YsaoW({^jSwJ3LFGIE zi~~gaU|>kb1G?&Fi|Tim)&0_7IV7U*FNL@_wuC^8f0+{>n3Y?Zr&&x0`;TNEDN-A+ z2~q+u#v*7cPurGTjqc(Dry%N%blFqQT2hg^pZ?H+rF0)U$I#cWJJ)7cRpt}c&HLB% z@zns+RrH-tsx82Y+$#7{2_YH$j)MHt=~4m8qP|!;Dd|U+od~rCHYF5jHVtD{fImec zTu`7(CsI})AjH50KsYdspa9^mSZhe2`x>5tkip2Ibx^=dR1-Xu$)(6Cln)U2)g;W{ z%+B8opb(L38XUQDw^5*F0}S^NU!xDsrf+0}0*EniL2G!ve+v|#Kjeqwh?LmJw^}{~ zEvuSudA@;*l($xKmZ#Ee*SaK|WnW8t{WJ^V$Nww81@rFs=3|mlkvM zuU2Onkm+9|2iTG?{5}rW>@LEH#r84+50;Yh3_)6>m41hQrDFFPi z2Ld25#L2O*!Rk%Gn|MVRzTQ&?;G789osjw+&SpaVt51w zyaR)-KmT=YjQBd^g$|m7r_2#sEOzrP>|3^Z2!Ilu3nn_?avn%_NG#+5C{H7;JP>|Q zXHLRr)+=Y+?kO-?Bk*9ecLirT9^s?;Ky4IYdbKE?fOB^`A4xV22#>Rq0QK+uRWy+d z!XTmM9F4+9iM~n*_Tt7gj}Z9^pILdAFz*tu#DtxNv!NTh2pf@m+K3RXg?5r}Q(8-1 zabKT4`r7X@5BFTbJ6id+GDz5u+`R{$x`Eq!2wcT)2%B$VB&$~>U%;bPYuB}t#5G)- zRjlg@>0@wP=bgmvx8-}_t3*&}4N16$P+G&A^+UgcomUxvr@_ z1`Ve+z660L1rYrWNfJ6Gv+%hq?i*s}r_+aTfX7c@y5ID}cbuc|`0E=+NvlLQn{e0` z-uh6N4rna|+PZ%@4%$-L2mO22LUlJhu{Y=qk+`jppvepp;Gz4Q6{eqBJ)5`%-$_CN zoCaLj8sOvaQ}GTY5r%158{ZrJj%N&K4nfHFA-Nl1iie}kB*0J*{BA(A2moV4;;^9r zn-H)r$+iF0NORDqSqq>>h_=C9DM}bd8Y0&hkDw`n^IGFuPcPg?0rExN`Fy|8bMC)! zzwMDKfY27^v(Tz10~w#dJ~9+wm_}$r%%uh#l70k55mFn4NAK~?@$tgJ6!KX2ATfUP zC+WW1)LK=+UOn?K0Q36`bEo%XaG&%5CSO+lZI`IGlX0z+Ljh*ua`3nAAmjHYPRb!| z?_PJ;k?ZtPpVl$b=D05Dm=ulu_?wvUgid}bR0rG>+QBh6++toS`3Ab8091&a6(nR2 zMU)T%6v5wP?tumk2f-h}ipL5N$DaqXx`ccXmD>O?0Fgd$H>4bAeFgf-Za)BBb`e95 zS707z4|>naZt$r+V7R$-`T#C720`~2Mh_M*#hv?qJSTp9j)RsK<;9!_6t17|e#I?5 zEs zwLWfOR^dgS9$4RdhGT;dIpgX3+JUu;qT81^!P`K?zs7p7=hoH0>SbN>S;MnR^sNTU zsw)TGOD%253wA8xA}MaIs`oE3^BK-yn}(UReHQGoJoeNI`v;Bv zTZp~v#a^vqZ=f;7hc+=ZgX*Y)a2Sw_>#*Q0Ie<_{!s&&(dDrYd7E<1#G{^r`IvcO} z$b#citn^coL8*A+15D_2_(PW6jh#=$W-;WH`fsI=9A|4tKRmaKOWB)`ak|%2`hReB z-~Uwq@x#a8XL0PeEvs{6?~KUm5M?{|2$@A$4YJQU92|Q`B(sc=wCoNtGLKQV%svt! zR5V=g@AtZXy8eZ8b30z=^}0Ww50jv8ms-P=zkL{dg`G~1;)GwL*q1FQ+&nM+g9*5` zMov-H8__%}ThD=M5d^rF;V*pv71T?iD#v}@B1?TPiW|}Ggn`FUeQjy1p{oGSbeFoV4vV6lcByow6V+C|CkM)-Hi=nN;T(=p?9Luxp1I38@)c;Op&hYrGB++;Id6M*bHda#T4SwQbHlQRLmWAVfWrEzmVuyf?B|;2| z10>Rswvx}3+GOXuA>-FT9BcY1ky%Xk2@D5S=2<6<(A2ML=Ny624^$<`uiXuORYZ`unYVb78|edFSI^a0eu%i zT3xue#A|%=Gd3hGI=rAJ0bnGBpgYUH?M3rO^7s4{utIt$h(55mOCV<_WkWOXI{nLt z^trCjcYnT|G)z;4bD`P2FyIL<1At&+2l(m6;Y)XSW4UE14373{-1je$;aDtO=)0Pz z86Jb4?nEM&kok2q3~xpWE~x}rk97-!>?82m4iw5?VjZ<40US8pIQ4#vwCM^516)6b z`8mZt5({_`)Iq_`j06^`Rn`c@#unARM1ZowMOcH0tKgD&-iw?>^XUVj(El}T3Dadm z&FDiD40~ui6Dy7^9=S}H;fc4G^~oUHeq%~O;OPCpOs0NT^#U8T8!qv6Ov?9!M>)%- zihPCwJkL-fRh$BEFSngwchb;Cw)>Gmpokwah4AL(qk7_b(3(R(kACkokaFGRd;ohc z%Dqd*^L>U-*NIXn;>)^1;rn>FK8$6htpBXo`N3Tme+H=K+^!MUVN+Id)q@&ZjEKQk`G*pho$IxF`>8xgU~e@pZD&RGR)wZ8NcIW1@C%um%8h) z5E{uMT%u(T`!kELFIBnUI0z`gdQ8X9(7xt!0bFAJMnAc%fZf!a!-5n8+az4trHV@A zk)*DE#yEM!hECbxBA=AVL`*|Yu*xebpkV5esEAP|ga3a<1$RLt7sia0GFr|&PGpc> z#(1fIb!(bLnyulS#dZPKP%4?z4}&H!g^_@0P;!ZCTYvYJj4n;1uxaE~{XHQHR(uKQ z`ghoH0)PM2_0Rx3hXx)pzOQ0oZy*UPmLkDvJzcIrhnR;%>+j=ZX6c5YSWt}wb^&PHxTNG+(ykla*eym-B}n13`F*7vZrnykMl5NG zYEUR>$o2W@yCU!>|)Y zfEh-D`%s;1V&QyR8L^LcKXxNsDN#9009ShGd$Z`YF@({ zpP!>5|2*W<4;!$R??+X5fxH*j2F>Mn6A0(7iF9uu1oL%KUd}1kcs@;yrJpl$&1UvB zws(>i&8G^niujt`o1G|*r?4{Oui^7%C;8oDm|Y`5%k1OHXYq$ot4o6pQ?nl#8G4Wy z{JGd6D8fS*(g1DP_TZhH?z&nQ=pW}aC{J8xk zjJINO)J{$7Ow5B2wz!Nvx~8_1L$e)Hpynse<)7`Bzkee}%v}UI3;{9%Sb>i7(i&q_ zcAJfImBd`uV?3FUqbTX>yuNJGFU>=ta->}U3MQecCo@(cv?JSfX2$&9wTs{9GX|Y& z%Ebs5g;~pTWE73sd|wXTv0yw9Y`OXsB9h3WbUn1jvC}jd>={}mT{s`ZCp(14$ zclG1Ks?M{9#KHdx(%XvXvrnFlrAN)jDLA!O#w#^)KfI2F&Gu{jt4P1cB675vkCWf~ z878B(elwzZKaNeQCb)KCTZcO6@xul18&a11iZ}{hvGBB7IGR+`0pMy)=?15P>o3#^ zE!y3IWy4njRfVM9_~td8%3uDV4Avd9veyqv^8JUd zS$t52Sjtsdn|DBw3?J;z;Td zsV1|aMxwe#1>3(m&H z`m)f489PW+#GzY`HB+6{XiuLl?mrd(B?nB)a-#=)1?5IV+bjIu9A>?b*_AIy9C+?5 z-+rS$>(9B|r&8gX@GP2rs&U8>~&1>Yd;2WDOs{iGTe3^XhJg2((Ze(k6 zWP5D{D*o;uM|ZhK_e4j(tBmgJj~>{J9(s-bxI6ljJo+nV^oUR~di-+q_q)+QlcRsv zM*kg*o*-!eHw`96gR9aI1~jBC4dqRv3#QS>(a^axhQ~CP$2bkfxNOI`y~lWj804uB`hUgoNy1^jP^sTl_|{du%NcoJQHnY#=w1G| zyTt3%$1=|eD%iN!A9gL@R0*UsrpABjtdBJF zN;%JyO4?3Vp0menXv8nEGv7*2efm&-xOtx8?O~H8YgyuMmBzn@GpDLx5+%@mCQ)?- zt?}0?)^MVz5R9R!=RC~-zObuh+o+4_As=K`9#|C#5GZPO59LxtPk+$twdT6?9QP<} z+;Tf(`X&#FQl?ecPHJk8!{@pC=FJRp=}Ud+6F_T9>pz#awlh$GIlzS_0hA$(r~h<1 z&9+a|R=sgd^S!p4QTrPKijy~QJk`zvMht)vJI~l&Z?|)QZ#Q4ad4olqR~5I;c>%~c z)vRwzs9x5|SuViJp-*K<#(=n{%)&S~=`7#A4u-eF;Zv@4R&G#DSLowIEWGy=Y^_EF z7CL@H=9}J&wFjtEF%I@$lE-3x*%QnP9UUY>uP@GZAjgRZ55@gUN9P~#h*XzvKiim0HoGeo z+h4A|S(bBbdR2Qo#_i%`6!0XMxn+Se`VQ7D$HIFa+bGzr3@5e)qu-06HOO}72P6jw z+ibm$MY!d93(w5*7dXcJnrF3?H9JkBvqu)0Irp+c@2THCv@?UF+1mlfM}jh$YM`6ZQOhR*qLIk(HXN`K}^b#BLO z>`}$ws9;?TxYW1eTC)cPs8E{jqQ5ICtR%f(g)hX^F2ovgD|5=ebNtlxmy%*kLg`Qt ztg?;Bfjk@TDd}g+WwzXDOQ*`^%I~^XAp!I?caBHK2hvZ)QNt|d4WnCUIT6>)Pj|S8 z>%kd^UVQSSTwr>!Ao_ywi3@3WZtM6N((Y>4`T|?Lv5>k4IcUhd=dAh}w0HT-@7T#?T;20s%2bXD`w>UZ*p4&B<*h7lo_HJ0p#T|NS& zzajb!P0vH4_OYoYkOYU&9HitRF$du|Xn;O0y&QsakeGvFX^^3Va2&+wAVUXPIRg`W zCl5%oML|FfLU#W*oCb+G5eYd6!9myz;&PCigBYEZoC-8B4{<~5&*XXm1n_(^ z7cZGQID6f;x?L-M&P-HZ7jk{)3~%VWq&_Gr!%Clra2y2oUN^sm6!*t z{DG*Rd&1~xab?KzL!j_(*)b#lAqWULLdeQdp8lt(a$XVVs%;%1CZzx^QJ5oqTD?`Y z@9TFvk{BT?frg^m$zQp$Qmv`H6I50qjX9iPGnR$(Mm zZUu*Xr%XX`5ORnR>Vps=B;yP{bK|O3v`xImKFmTo5VCyzgJZJL3I+pw-}@0a@&LsA z#Lr%WDB(q?1O*j>4rJ}{0hP-7UiaJnwLXOzX+eHZTkjIyE8fEIu}4G&1Pa|eZxD*7plTi7|B36p61=@v zQd*An^&~y(0CRVeiEFeP^haS~qiGpRD4m8nX zKM+IfcJ^*N+p6;SCWi_VCz^okx)N<&yWgWHB|t%g}- zoHpnjNDpUWR+?+WS#UM& zqWpOve1H3%E~&Ep9N^!|q6XX+u=%x|sId5JHItC@@(UsUO#Lrh5gRL&s}{^kknY~F zrj4_vj$eFB*B+4Zfn`h!Jd4y7u^IOwTTa*~ z!q3?xc_FkPLidndj+TD>OHUQJEbvYlhyax`gpr{MxC3{z`?MSK%d~+6AIICH4;HTP zXg!kV1U%WBiv_R^f~y;!jqzLZxW&I#LQn5Ng`O!$a9_;dt;-pIxV;Gf(_vP~?_>$t zjTJt-_+8Xcmx)zBj*ZJu=)}#EER_>;%^Cw8C-l(QG5QHeUEzy4yu>p#de`A3VXSB; z^R>w{iHPM>>}VjBH5ALXj-X;5may3Ph!6yQMN44pRa95+Zi3UDM>ykUvb5;CIONPH zO*Ed7^io9d9p@!!ohg!*qz5+gz*BcNLmu0~9E-#!;9l$YzxTGnJd~{vIrXJq`^R27 zZ{+ekQtv%!aye^lLKM)O0XH67Ve#*-iote`!wj;pjt%)7CZ9pCKdXs(wFN_2gv$*! z%rO`m;<8>S9qS2$7mM$FH|qIOyCq{qX8QaGhKGtOfUF-T34`OrA3cxZ!?MkS6y@== z;6+($Oafnz-gxuLNX(K)fDQ(CsJKBUG3(_cRjU-Y!_=bS#NsWj{(t|@XAoIcVj0^X z>iK=iaJI6+@I+NC z+jr{=j(Dsc&njBnW_;avPEm{G6AM&Ps{YwYf$qO7PP@N&G>2A9iPKW8LHWMZhLt3T zo7U5x(!S~RX27R$iOiHt^1*fJMg|q1_7#bD$qR8ybmDUy+cR%hIBHP!U1J6&buxAOx zL(iAYmLmx#xXEIGyUOV>3E%rT_cgkC`^KD6Mmii*5o&hxvR1*|CPN-(kl2G8dF%iv z+F=`fYHqso_w-8-&{<}rL0 zgH>Ewj=`+f1JrB56TS`cNacqBWp)x1@oI&qsqKM~;Rzj~%Z%ic-RGO5*w8D96Y^vM zKJ+7G@SQ1!^9md-p`UG53zED%OFBk|z~&>9@^UkC+Wz-aTgF z0UJ6><+>FCqm(QA@e(z)PW#yyuW-4-5T$o#I~JJTAc{->Xcu>L9CZHCSYNY@Y=Yz5 z)KNH5;RNP@{vRPXeaM_>K+UhE?zPC`Y}BrQ;cXUQc*CNCh{0u5 z&$OA5_;W>J+c#rOvD4l1KkRNsYzuoughZL|-+n_VaQC};1v63qLv5-gDQJt-f@1j8 zU_r~EZYPKC-oDa;{QR1SaL;WSqn~-_#v<1)p0}oO~pdnx1;)b z1y9a3Cu(3)WPcI)S{t4XSgggpc$^xlJPOgak^M)%|NMtzYoR5WA1D~;0yw-OLPRl> z9t{v+tj#ez*JugQcpn=6i>lj;A=XESnwrnXV6i9Kba)Eokw?HkUwTE`#A zXTDNfqj#si<0>hMlgUu~%IHo+3EqZ*k=Z>MB@w{kmWJXwujjQDC^fo&y!c~}>iYLak@;8nZPo!_dA)O>UaVoR~IF8C@ zaorHjh`(KXPZ(PqXt+%8fq>b#VVFQFLSGlgh}6YAS3~bau|>W{l$>h6+;swrVIvCa zW0*ynfX)kgze%PzfE56?{nH~Bn8=6qy#0Ryi+__M0f;vs7-=4uB^VvSlK9;|;?H$L z%@oJ≻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 diff --git a/artifacts/verification/w6/states/command-palette-120.txt b/artifacts/verification/w6/states/command-palette-120.txt index 91ece18b..b4654a1c 100644 --- a/artifacts/verification/w6/states/command-palette-120.txt +++ b/artifacts/verification/w6/states/command-palette-120.txt @@ -8,7 +8,7 @@ /runner Set the runner for this branch /model Set the model for this branch /effort Set reasoning effort for this branch - /branch Create a branch at a message boundary + /branch Create and open a branch at a message boundary (1/31) ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── type to filter · enter to choose · ←/esc close diff --git a/artifacts/verification/w6/states/command-palette-40.json b/artifacts/verification/w6/states/command-palette-40.json index a9b929f4..899380e8 100644 --- a/artifacts/verification/w6/states/command-palette-40.json +++ b/artifacts/verification/w6/states/command-palette-40.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 40, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -288,10 +288,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -324,6 +334,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -355,12 +384,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -379,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } } diff --git a/artifacts/verification/w6/states/command-palette-40.png b/artifacts/verification/w6/states/command-palette-40.png index b728c7729ad4dbd070e0984ff284b944b23dbab6..fe435ce5e89c7d8bb4869631d8bd4e7a7df13748 100644 GIT binary patch delta 18 ZcmeD3>hhY9%`Pr0ZjzMSv$1G~3IIDj24nyL delta 18 ZcmeD3>hhY9&CaE)?C^F|`o^LeDgZ!e2Ot0d diff --git a/artifacts/verification/w6/states/command-palette-80.json b/artifacts/verification/w6/states/command-palette-80.json index 49356d10..8b3623be 100644 --- a/artifacts/verification/w6/states/command-palette-80.json +++ b/artifacts/verification/w6/states/command-palette-80.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 1, - "frame": " Commands\n────────────────────────────────────────────────────────────────────────────────\n>\n→ /new Create an empty conversation\n /open Search and open conversations\n /profile Inspect, select, import, or edit a profile\n /connection Inspect and manage connections\n /runner Set the runner for this branch\n /model Set the model for this branch\n /effort Set reasoning effort for this branch\n /branch Create a branch at a message boundary\n (1/31)\n────────────────────────────────────────────────────────────────────────────────\n type to filter · enter to choose · ←/esc close\n", + "frame": " Commands\n────────────────────────────────────────────────────────────────────────────────\n>\n→ /new Create an empty conversation\n /open Search and open conversations\n /profile Inspect, select, import, or edit a profile\n /connection Inspect and manage connections\n /runner Set the runner for this branch\n /model Set the model for this branch\n /effort Set reasoning effort for this branch\n /branch Create and open a branch at a message bound…\n (1/31)\n────────────────────────────────────────────────────────────────────────────────\n type to filter · enter to choose · ←/esc close\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -288,10 +288,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -324,6 +334,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -355,12 +384,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -379,7 +408,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } } diff --git a/artifacts/verification/w6/states/command-palette-80.png b/artifacts/verification/w6/states/command-palette-80.png index 1835713f3aa3b501e206e5a6e4c314c4a555a3d3..f5f9cf4159d8a4898befdec8052530524998e3aa 100644 GIT binary patch literal 35276 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 aX~<$@ic}iU_zZuABOxMt`?b*BhyMp`$$wh_ literal 35226 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 z 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 L-cA?N{Of-K-4_11 diff --git a/artifacts/verification/w6/states/command-palette-80.txt b/artifacts/verification/w6/states/command-palette-80.txt index 3c32b96d..755d14af 100644 --- a/artifacts/verification/w6/states/command-palette-80.txt +++ b/artifacts/verification/w6/states/command-palette-80.txt @@ -8,7 +8,7 @@ /runner Set the runner for this branch /model Set the model for this branch /effort Set reasoning effort for this branch - /branch Create a branch at a message boundary + /branch Create and open a branch at a message bound… (1/31) ──────────────────────────────────────────────────────────────────────────────── type to filter · enter to choose · ←/esc close diff --git a/artifacts/verification/w6/states/comparison.json b/artifacts/verification/w6/states/comparison.json index c3359a89..6c4e4996 100644 --- a/artifacts/verification/w6/states/comparison.json +++ b/artifacts/verification/w6/states/comparison.json @@ -4,8 +4,8 @@ "source": { "binary": "packed real binary from clean npm install", "binarySha256": "141288e0fe917635d723b4b70d464dc49baff14cc356f54de1d3f8faa5d8254f", - "tarball": "tangle-network-braid-0.2.2.tgz", - "tarballSha256": "05758395a4c14b77ee4df05cb8d547c97ba362d65b73fb4078297957a28a88f9" + "tarball": "tangle-network-braid-0.3.0.tgz", + "tarballSha256": "af16b86949ffe8c7a0c36366daa5db5d13b6e2c374a230fc756c8323cb6bac12" }, "dimensions": { "columns": 80, @@ -14,7 +14,7 @@ "terminal": "node-pty/xterm-256color", "provenance": { "renderer": { - "package": "@earendil-works/pi-tui@0.84.2", + "package": "@earendil-works/pi-tui@0.84.3", "pty": "node-pty@1.1.0", "emulator": "@xterm/headless@6.0.0", "node": "v24.18.0", @@ -30,7 +30,7 @@ }, "capturePhase": "atomic-signal-frame", "captureRevision": 1, - "frame": " analyses › /compare · frozen runs\n────────────────────────────────────────────────────────────────────────────────\n saved result: replayed from the local journal\n baseline run: run-route-serial\n baseline source: 9ee7d219c8b0092…8c519924\n baseline outcome: completed · cost: 0.014 · source: frozen run field\n run.cost_usd\n candidate run: run-route-parallel\n candidate source: 0328e6889082b14…86b0ff3d\n candidate outcome: completed · cost: 0.009 · source: frozen run field\n run.cost_usd\n sample: 1 paired · 0 baseline-only · 0 candidate-only\n ! One pair is descriptive; it cannot support a reliable general conclusion.\n captured fields · baseline | candidate | availability\n run.status: completed | completed | none\n run.cost_usd: 0.014 | 0.009 | none\n run.wall_time_ms: 18200 | 12100 | none\n run.input_tokens: 7420 | 6910 | none\n paired measurements · candidate minus baseline where applicable\n paired.correctness.b01: 0\n paired.correctness.b10: 0\n paired.correctness.mcnemar.b: 0\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ previous/next · PgUp/PgDn page · ←/esc back · page 1/4 · tab: analyses\n", + "frame": " analyses › /compare · frozen runs\n────────────────────────────────────────────────────────────────────────────────\n saved result: replayed from the local journal\n baseline run: run-route-serial\n baseline source: 9ee7d219c8b0092…8c519924\n baseline outcome: completed · cost: 0.014 · source: frozen run field\n run.cost_usd\n candidate run: run-route-parallel\n candidate source: 0328e6889082b14…86b0ff3d\n candidate outcome: completed · cost: 0.009 · source: frozen run field\n run.cost_usd\n sample: 1 paired · 0 baseline-only · 0 candidate-only\n ! One pair is descriptive; it cannot support a reliable general conclusion.\n captured fields · baseline | candidate | availability\n run.status: completed | completed | none\n run.cost_usd: 0.014 | 0.009 | none\n run.wall_time_ms: 18200 | 12100 | none\n run.input_tokens: 7420 | 6910 | none\n paired measurements · candidate minus baseline where applicable\n paired.correctness.b01: 0\n paired.correctness.b10: 0\n paired.correctness.mcnemar.b: 0\n────────────────────────────────────────────────────────────────────────────────\n ↑↓ · Pg · ←/esc back · page 1/4 · p promote · x cancel · r\n", "packedState": { "schemaVersion": 2, "capturePhase": "atomic-signal-frame", @@ -38,7 +38,7 @@ "schemaVersion": 2, "revision": 1, "sequence": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "conversationId": "conv-1", "branchId": "branch-1", "conversations": [ @@ -122,7 +122,7 @@ }, "view": { "revision": 1, - "workspace": "/home/drew/code/.worktrees/braid-10-multirun", + "workspace": "/home/drew/code/.worktrees/braid-10-complete", "profileName": "Braid starter", "profileDigest": "44ed91c937fd4079fe01c49f6bc76413656886e5aa8b2351590d3a888cfa0a14", "runner": "pi", @@ -375,10 +375,20 @@ "source": "application", "reason": "Native terminal attachment requires an interactive TUI and a retained session" }, + "supervisor.worker.attach": { + "available": false, + "source": "runtime", + "reason": "Worker terminal attachment requires the interactive TUI; Runtime retains the exact worker binding" + }, "export.create": { "available": true, "source": "application" }, + "analysis.cancel": { + "available": false, + "source": "application", + "reason": "There is no running analysis to cancel" + }, "application.quit": { "available": true, "source": "local" @@ -411,6 +421,25 @@ "available": true, "source": "local" }, + "supervisor.refresh": { + "available": true, + "source": "runtime" + }, + "supervisor.worker.steer": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to steer" + }, + "supervisor.worker.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervised worker to cancel" + }, + "supervisor.cancel": { + "available": false, + "source": "runtime", + "reason": "There is no running supervisor to cancel" + }, "draft.write": { "available": true, "source": "application" @@ -442,12 +471,12 @@ "run.reconnect": { "available": false, "source": "provider", - "reason": "There is no detached run to reconnect" + "reason": "There is no recoverable run to reconnect" }, "run.reconcile": { "available": false, "source": "provider", - "reason": "There is no detached run to reconcile" + "reason": "There is no recoverable run to reconcile" } }, "draft": "", @@ -467,7 +496,7 @@ "payload": { "value": { "kind": "workspace.opened", - "workspace": "/home/drew/code/.worktrees/braid-10-multirun" + "workspace": "/home/drew/code/.worktrees/braid-10-complete" } } } diff --git a/artifacts/verification/w6/states/comparison.png b/artifacts/verification/w6/states/comparison.png index 118ec49f2f7a8ce7bbd278101d96e07989e7130e..0340989affd2ab683d06f279b9861450428abaf9 100644 GIT binary patch literal 64782 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